From faa6fe36b9a7b0bc510b85a9190fee04ee0047f1 Mon Sep 17 00:00:00 2001 From: schristou88 Date: Tue, 16 Jul 2013 07:49:27 -0500 Subject: [PATCH] Fix issue #42 --- cobertura/src/main/javacc/Java1.1.jj | 2 +- .../cobertura/bugs/GithubIssue42.java | 29 +++++++++ .../test/AbstractCoberturaTestCase.java | 63 +++++++++++++++---- 3 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java diff --git a/cobertura/src/main/javacc/Java1.1.jj b/cobertura/src/main/javacc/Java1.1.jj index 8f1d30607..886117a1b 100644 --- a/cobertura/src/main/javacc/Java1.1.jj +++ b/cobertura/src/main/javacc/Java1.1.jj @@ -2365,7 +2365,7 @@ void EqualityExpression() : void EqualityExpression() : {} { - AssigmentExpression() ( ( "==" | "!=" ) AssigmentExpression() )* + AssigmentExpression() ( ( "==" | "!=" | "+=" | "-=" | "*=" | "/=" | "&=" | "|=" | "^=" | "%=" | "<<=" | ">>=" | ">>>=") AssigmentExpression() )* } void AssigmentExpression() : diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java new file mode 100644 index 000000000..60cfae860 --- /dev/null +++ b/cobertura/src/test/java/net/sourceforge/cobertura/bugs/GithubIssue42.java @@ -0,0 +1,29 @@ +package net.sourceforge.cobertura.bugs; + +import java.io.IOException; + +import org.junit.Test; + +import net.sourceforge.cobertura.test.AbstractCoberturaTestCase; + +public class GithubIssue42 extends AbstractCoberturaTestCase { + + @Test + public void testPlusEqualsParsing() throws IOException { + String imports = ""; + String method = "\n public void foo() {" + "\n int yyn = 0;" + + "\n int yychar = 1;" + "\n if ((yyn += yychar) >= 0)" + + "\n {} " + "\n if ((yyn -= yychar) >= 0)" + "\n {} " + + "\n if ((yyn *= yychar) >= 0)" + "\n {} " + + "\n if ((yyn /= yychar) >= 0)" + "\n {} " + + "\n if ((yyn &= yychar) >= 0)" + "\n {} " + + "\n if ((yyn |= yychar) >= 0)" + "\n {} " + + "\n if ((yyn ^= yychar) >= 0)" + "\n {} " + + "\n if ((yyn %= yychar) >= 0)" + "\n {} " + + "\n if ((yyn <<= yychar) >= 0)" + "\n {} " + + "\n if ((yyn >>= yychar) >= 0)" + "\n {} " + + "\n if ((yyn >>>= yychar) >= 0)" + "\n {} " + "\n }"; + + super.parseIssueTester(imports, method); + } +} \ No newline at end of file diff --git a/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java b/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java index 3f3e0d9c7..ec9edd3fb 100644 --- a/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java +++ b/cobertura/src/test/java/net/sourceforge/cobertura/test/AbstractCoberturaTestCase.java @@ -7,23 +7,17 @@ import net.sourceforge.cobertura.ant.ReportTask; import net.sourceforge.cobertura.test.util.TestUtils; import org.apache.commons.io.FileUtils; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Java; -import org.apache.tools.ant.types.DirSet; -import org.apache.tools.ant.types.Path; import org.junit.After; import org.junit.Before; -import org.xml.sax.SAXException; - -import com.sun.corba.se.impl.oa.poa.AOMEntry; - import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.util.List; -import javax.xml.parsers.ParserConfigurationException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; /** * @author schristou88 @@ -35,7 +29,7 @@ public class AbstractCoberturaTestCase { public static File reportDir; public static File instrumentDir; File mainSourceFile; - File datafile; + public static File datafile; @Before public void setUp() throws Exception { @@ -107,4 +101,51 @@ public Node createAndExecuteMainMethod(String packageName, String fileName, return TestUtils.getXMLReportDOM(srcDir.getAbsolutePath() + "/coverage.xml"); } + + /** + * + * @param method method with the parsing issue + * @throws IOException + */ + public static void parseIssueTester(String imports, String method) + throws IOException { + String wrapper = "\n package mypackage;" + "\n " + imports + + "\n public class FooMain {" + method + "\n }"; + + FileUtils.write(new File(srcDir, "mypackage/FooMain.java"), wrapper); + + TestUtils.compileSource(TestUtils.antBuilder, srcDir); + + TestUtils.instrumentClasses(TestUtils.antBuilder, srcDir, datafile, + instrumentDir); + + DefaultLogger fileLogger = new DefaultLogger(); + fileLogger.setErrorPrintStream(new PrintStream(new File(reportDir, + "error.log"))); + fileLogger.setOutputPrintStream(new PrintStream(new File(reportDir, + "std.log"))); + fileLogger.setMessageOutputLevel(Project.MSG_INFO); + TestUtils.project.addBuildListener(fileLogger); + + ReportTask reportTask = new ReportTask(); + reportTask.setProject(TestUtils.project); + reportTask.setDataFile(datafile.getAbsolutePath()); + reportTask.setFormat("xml"); + reportTask.setSrcDir(srcDir.getAbsolutePath()); + reportTask.setDestDir(reportDir); + reportTask.setFailonerror(true); + reportTask.execute(); + + TestUtils.project.removeBuildListener(fileLogger); + + if (FileUtils.readFileToString(new File(reportDir, "error.log")) + .contains("JavaNCSS got an error while parsing the java file")) + fail("JavaNCSS Error, see console output or file: " + + new File(reportDir, "error.log").getAbsolutePath()); + + if (FileUtils.readFileToString(new File(reportDir, "std.log")) + .contains("JavaNCSS got an error while parsing the java file")) + fail("JavaNCSS Error, see console output or file: " + + new File(reportDir, "std.log").getAbsolutePath()); + } }