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();
}
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);
}
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");
}
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");
}
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);
}
Aggregations