Search in sources :

Example 16 with FileText

use of com.puppycrawl.tools.checkstyle.api.FileText in project checkstyle by checkstyle.

the class JavaAstVisitorTest method testNoStackOverflowOnDeepStringConcat.

/**
 * This test exists to kill surviving mutation from pitest removing expression AST building
 * optimization in {@link JavaAstVisitor#visitBinOp(JavaLanguageParser.BinOpContext)}.
 * We do not use {@link JavaParser#parse(FileContents)} here due to DFA clearing hack.
 *
 * <p>
 * Reason: we have iterative expression AST building to avoid stackoverflow
 * in {@link JavaAstVisitor#visitBinOp(JavaLanguageParser.BinOpContext)}. In actual
 * generated parser, we avoid stackoverflow thanks to the left recursive expression
 * rule (eliminating unnecessary recursive calls to hierarchical expression production rules).
 * However, ANTLR's ParserATNSimulator has no such optimization. So, the number of recursive
 * calls to ParserATNSimulator#closure when calling ParserATNSimulator#clearDFA causes a
 * StackOverflow error. We avoid this by using the single argument constructor (thus not
 * forcing DFA clearing) in this test.
 * </p>
 *
 * @throws Exception if input file does not exist
 */
@Test
public void testNoStackOverflowOnDeepStringConcat() throws Exception {
    final File file = new File(getPath("InputJavaAstVisitorNoStackOverflowOnDeepStringConcat.java"));
    final FileText fileText = new FileText(file, StandardCharsets.UTF_8.name());
    final FileContents contents = new FileContents(fileText);
    final String fullText = contents.getText().getFullText().toString();
    final CharStream codePointCharStream = CharStreams.fromString(fullText);
    final JavaLanguageLexer lexer = new JavaLanguageLexer(codePointCharStream, true);
    lexer.setCommentListener(contents);
    final CommonTokenStream tokenStream = new CommonTokenStream(lexer);
    final JavaLanguageParser parser = new JavaLanguageParser(tokenStream);
    final JavaLanguageParser.CompilationUnitContext compilationUnit = parser.compilationUnit();
    // We restrict execution to use limited resources here, so that we can
    // kill surviving pitest mutation from removal of nested binary operation
    // optimization in JavaAstVisitor#visitBinOp. Limited resources (small stack size)
    // ensure that we throw a StackOverflowError if optimization is removed.
    final DetailAST root = TestUtil.getResultWithLimitedResources(() -> new JavaAstVisitor(tokenStream).visit(compilationUnit));
    assertWithMessage("File parsing and AST building should complete successfully.").that(root).isNotNull();
}
Also used : CommonTokenStream(org.antlr.v4.runtime.CommonTokenStream) JavaLanguageParser(com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageParser) FileContents(com.puppycrawl.tools.checkstyle.api.FileContents) JavaLanguageLexer(com.puppycrawl.tools.checkstyle.grammar.java.JavaLanguageLexer) DetailAST(com.puppycrawl.tools.checkstyle.api.DetailAST) FileText(com.puppycrawl.tools.checkstyle.api.FileText) File(java.io.File) CharStream(org.antlr.v4.runtime.CharStream) Test(org.junit.jupiter.api.Test)

Example 17 with FileText

use of com.puppycrawl.tools.checkstyle.api.FileText in project checkstyle by checkstyle.

the class RegexpOnFilenameCheckTest method testException.

@Test
public void testException() throws Exception {
    // escape character needed for testing IOException from File.getCanonicalPath on all OSes
    final File file = new File(getPath("") + "\u0000" + File.separatorChar + "Test");
    final RegexpOnFilenameCheck check = new RegexpOnFilenameCheck();
    check.setFileNamePattern(Pattern.compile("BAD"));
    final CheckstyleException ex = assertThrows(CheckstyleException.class, () -> check.process(file, new FileText(file, Collections.emptyList())), "CheckstyleException expected");
    assertWithMessage("Invalid exception message").that(ex).hasMessageThat().isEqualTo("unable to create canonical path names for " + file);
}
Also used : CheckstyleException(com.puppycrawl.tools.checkstyle.api.CheckstyleException) FileText(com.puppycrawl.tools.checkstyle.api.FileText) File(java.io.File) Test(org.junit.jupiter.api.Test)

Example 18 with FileText

use of com.puppycrawl.tools.checkstyle.api.FileText in project checkstyle by checkstyle.

the class SuppressWithNearbyCommentFilterTest method getTagsAfterExecution.

/**
 * Calls the filter with a minimal set of inputs and returns a list of
 * {@link SuppressWithNearbyCommentFilter} internal type {@code Tag}.
 * Our goal is 100% test coverage, for this we use white-box testing.
 * So we need access to the implementation details. For this reason,
 * it is necessary to use reflection to gain access to the inner field here.
 *
 * @return {@code Tag} list
 */
private static List<?> getTagsAfterExecution(SuppressWithNearbyCommentFilter filter, String filename, String... lines) {
    final FileContents contents = new FileContents(new FileText(new File(filename), Arrays.asList(lines)));
    contents.reportSingleLineComment(1, 0);
    final TreeWalkerAuditEvent dummyEvent = new TreeWalkerAuditEvent(contents, filename, new Violation(1, null, null, null, null, Object.class, null), null);
    filter.accept(dummyEvent);
    return TestUtil.getInternalState(filter, "tags");
}
Also used : Violation(com.puppycrawl.tools.checkstyle.api.Violation) FileContents(com.puppycrawl.tools.checkstyle.api.FileContents) TreeWalkerAuditEvent(com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent) FileText(com.puppycrawl.tools.checkstyle.api.FileText) File(java.io.File)

Example 19 with FileText

use of com.puppycrawl.tools.checkstyle.api.FileText in project checkstyle by checkstyle.

the class SuppressionCommentFilterTest method getTagsAfterExecution.

/**
 * Calls the filter with a minimal set of inputs and returns a list of
 * {@link SuppressionCommentFilter} internal type {@code Tag}.
 * Our goal is 100% test coverage, for this we use white-box testing.
 * So we need access to the implementation details. For this reason,
 * it is necessary to use reflection to gain access to the inner field here.
 *
 * @return {@code Tag} list
 */
private static List<Comparable<Object>> getTagsAfterExecution(SuppressionCommentFilter filter, String filename, String... lines) {
    final FileContents contents = new FileContents(new FileText(new File(filename), Arrays.asList(lines)));
    for (int lineNo = 0; lineNo < lines.length; lineNo++) {
        final int colNo = lines[lineNo].indexOf("//");
        if (colNo >= 0) {
            contents.reportSingleLineComment(lineNo + 1, colNo);
        }
    }
    final TreeWalkerAuditEvent dummyEvent = new TreeWalkerAuditEvent(contents, filename, new Violation(1, null, null, null, null, Object.class, ""), null);
    filter.accept(dummyEvent);
    return TestUtil.getInternalState(filter, "tags");
}
Also used : Violation(com.puppycrawl.tools.checkstyle.api.Violation) FileContents(com.puppycrawl.tools.checkstyle.api.FileContents) TreeWalkerAuditEvent(com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent) FileText(com.puppycrawl.tools.checkstyle.api.FileText) File(java.io.File)

Example 20 with FileText

use of com.puppycrawl.tools.checkstyle.api.FileText in project checkstyle by checkstyle.

the class AstRegressionTest method verifyAstRaw.

private static void verifyAstRaw(String expectedTextPrintFileName, String actualJava, JavaParser.Options withComments) throws Exception {
    final File expectedFile = new File(expectedTextPrintFileName);
    final String expectedContents = new FileText(expectedFile, System.getProperty("file.encoding", StandardCharsets.UTF_8.name())).getFullText().toString().replace("\r", "");
    final FileText actualFileContents = new FileText(new File(""), Arrays.asList(actualJava.split("\\n|\\r\\n?")));
    final String actualContents = AstTreeStringPrinter.printAst(actualFileContents, withComments);
    assertWithMessage("Generated AST from Java code should match pre-defined AST").that(actualContents).isEqualTo(expectedContents);
}
Also used : FileText(com.puppycrawl.tools.checkstyle.api.FileText) File(java.io.File)

Aggregations

FileText (com.puppycrawl.tools.checkstyle.api.FileText)49 File (java.io.File)41 Test (org.junit.jupiter.api.Test)29 FileContents (com.puppycrawl.tools.checkstyle.api.FileContents)18 DetailAST (com.puppycrawl.tools.checkstyle.api.DetailAST)15 CheckstyleException (com.puppycrawl.tools.checkstyle.api.CheckstyleException)7 Violation (com.puppycrawl.tools.checkstyle.api.Violation)7 ArrayList (java.util.ArrayList)6 TreeWalkerAuditEvent (com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent)5 DefaultConfiguration (com.puppycrawl.tools.checkstyle.DefaultConfiguration)4 TypeNameCheck (com.puppycrawl.tools.checkstyle.checks.naming.TypeNameCheck)3 BeforeEach (org.junit.jupiter.api.BeforeEach)3 TestLoggingReporter (com.puppycrawl.tools.checkstyle.internal.testmodules.TestLoggingReporter)2 IOException (java.io.IOException)2 Field (java.lang.reflect.Field)2 RecognitionException (antlr.RecognitionException)1 TokenStreamException (antlr.TokenStreamException)1 TokenStreamRecognitionException (antlr.TokenStreamRecognitionException)1 ClassPath (com.google.common.reflect.ClassPath)1 LineColumn (com.puppycrawl.tools.checkstyle.api.LineColumn)1