diff --git a/doc/building-antlr.md b/doc/building-antlr.md index d46609621..effd39821 100644 --- a/doc/building-antlr.md +++ b/doc/building-antlr.md @@ -38,17 +38,24 @@ Checking connectivity... done. $ cd antlr4 $ mvn compile .. +[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] -[INFO] ANTLR 4 ............................................ SUCCESS [ 0.447 s] -[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.113 s] -[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 14.408 s] -[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.276 s] -[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [ 0.773 s] -[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 6.920 s] +[INFO] ANTLR 4 ............................................ SUCCESS [ 0.432 s] +[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 4.334 s] +[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.686 s] +[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.654 s] +[INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.096 s] +[INFO] ANTLR 4 Runtime Test Processors .................... SUCCESS [ 0.025 s] +[INFO] ANTLR 4 Runtime Tests (2nd generation) ............. SUCCESS [ 1.932 s] +[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 0.018 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS -... +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 10.324 s +[INFO] Finished at: 2016-11-16T13:49:38-08:00 +[INFO] Final Memory: 42M/488M +[INFO] ------------------------------------------------------------------------ ``` # Testing tool and targets @@ -81,38 +88,119 @@ antlr reports warnings from [-visitor, -Dlanguage=CSharp, -o, /var/folders/s1/h3 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] -[INFO] ANTLR 4 ............................................ SUCCESS [ 0.462 s] -[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 9.163 s] -[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 3.683 s] -[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.897 s] -[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [07:11 min] -[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 16.694 s] +[INFO] ANTLR 4 ............................................ SUCCESS [ 0.445 s] +[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.392 s] +[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.373 s] +[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.519 s] +[INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.086 s] +[INFO] ANTLR 4 Runtime Test Processors .................... SUCCESS [ 0.014 s] +[INFO] ANTLR 4 Runtime Tests (2nd generation) ............. SUCCESS [06:39 min] +[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 6.922 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ -[INFO] Total time: 07:43 min -... +[INFO] Total time: 06:53 min +[INFO] Finished at: 2016-11-16T15:36:56-08:00 +[INFO] Final Memory: 44M/458M +[INFO] ------------------------------------------------------------------------ ``` -You should see these jars (building 4.5.2-SNAPSHOT): +Note: That is actually result of running the much faster: + +`mvn -Dparallel=methods -DthreadCount=4 install` + + +You should see these jars (when building 4.6-SNAPSHOT): ```bash /Users/parrt/.m2/repository/org/antlr $ find antlr4* -name '*.jar' -antlr4/4.5/antlr4-4.5.jar -antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT-tests.jar -antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT.jar -antlr4-maven-plugin/4.5/antlr4-maven-plugin-4.5.jar -antlr4-maven-plugin/4.5.2-SNAPSHOT/antlr4-maven-plugin-4.5.2-SNAPSHOT.jar -antlr4-runtime/4.5/antlr4-runtime-4.5.jar -antlr4-runtime/4.5.2-SNAPSHOT/antlr4-runtime-4.5.2-SNAPSHOT.jar -antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT-tests.jar -antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT.jar -antlr4-tool-testsuite/4.5.2-SNAPSHOT/antlr4-tool-testsuite-4.5.2-SNAPSHOT.jar +antlr4-maven-plugin/4.6-SNAPSHOT/antlr4-maven-plugin-4.6-SNAPSHOT.jar +antlr4-runtime-test-annotation-processors/4.6-SNAPSHOT/antlr4-runtime-test-annotation-processors-4.6-SNAPSHOT.jar +antlr4-runtime-test-annotations/4.6-SNAPSHOT/antlr4-runtime-test-annotations-4.6-SNAPSHOT.jar +antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT-tests.jar +antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT.jar +antlr4-runtime/4.6-SNAPSHOT/antlr4-runtime-4.6-SNAPSHOT.jar +antlr4-tool-testsuite/4.6-SNAPSHOT/antlr4-tool-testsuite-4.6-SNAPSHOT.jar +antlr4/4.6-SNAPSHOT/antlr4-4.6-SNAPSHOT-tests.jar +antlr4/4.6-SNAPSHOT/antlr4-4.6-SNAPSHOT.jar ``` -Note that ANTLR is written in itself, which is why maven downloads antlr4-4.5.jar for boostrapping 4.5.2-SNAPSHOT purposes. +Note that ANTLR is written in itself, which is why maven downloads antlr4-4.5.jar for boostrapping 4.6-SNAPSHOT purposes. + +## Running test subsets + +### Run one test group across targets + +```bash +$ mvn -Dtest=TestParserExec test +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.antlr.v4.test.runtime.cpp.TestParserExec +... +Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 114.283 sec +Running org.antlr.v4.test.runtime.csharp.TestParserExec +... +``` + +Or run all lexer related tests: + +``` +$ mvn -Dtest=Test*Lexer* test +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.antlr.v4.test.runtime.cpp.TestCompositeLexers +... +``` + +### Run all tests for a single target + +```bash +$ mvn -Dtest=java.* test +... +``` + +Or run all lexer related tests in Java target only: + +```bash +$ mvn -Dtest=java.*Lexer* test +... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Running org.antlr.v4.test.runtime.java.TestCompositeLexers +Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.277 sec +Running org.antlr.v4.test.runtime.java.TestLexerErrors +Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.376 sec +Running org.antlr.v4.test.runtime.java.TestLexerExec +Tests run: 38, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.07 sec +Running org.antlr.v4.test.runtime.java.TestSemPredEvalLexer +Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.255 sec + +Results : + +Tests run: 59, Failures: 0, Errors: 0, Skipped: 0 +``` + +## Testing in parallel + +Use this to run tests in parallel: + +```bash +$ mvn -Dparallel=methods -DthreadCount=4 test +... +------------------------------------------------------- + T E S T S +------------------------------------------------------- +Concurrency config is parallel='methods', perCoreThreadCount=true, threadCount=4, useUnlimitedThreads=false +... +``` + +This can be combined with other `-D` above. ## Building without testing + To build without running the tests (saves a lot of time), do this: ```bash diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java index aa7394f70..acc894fdd 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java @@ -125,10 +125,11 @@ public abstract class BaseRuntimeTest { descriptor.getInput(), descriptor.showDiagnosticErrors() ); - if(delegate instanceof RuntimeTestAssert) { + if ( delegate instanceof RuntimeTestAssert ) { ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); - } else { + } + else { assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getErrors(), delegate.getParseErrors()); } @@ -165,11 +166,12 @@ public abstract class BaseRuntimeTest { grammar = grammarST.render(); String found = delegate.execLexer(grammarName+".g4", grammar, grammarName, descriptor.getInput(), descriptor.showDFA()); - if(delegate instanceof RuntimeTestAssert) { + if ( delegate instanceof RuntimeTestAssert ) { ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors()); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); - } else { + } + else { assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors()); assertEquals(descriptor.getErrors(), delegate.getParseErrors()); diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java index 5ae2d0533..5b87f7318 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java @@ -1,5 +1,8 @@ package org.antlr.v4.test.runtime; +/** This interface acts like a tag on a Base*Test class that wants + * to use its own assertEquals() instead of jUnit's. + */ public interface RuntimeTestAssert { void assertEqualStrings(String expected, String actual); } diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java deleted file mode 100644 index 59a1e24ea..000000000 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.antlr.v4.test.runtime; - -import org.antlr.v4.test.runtime.descriptors.ParserExecDescriptors; -import org.junit.runner.JUnitCore; -import org.junit.runner.Result; -import org.junit.runner.notification.Failure; - -public class TestRunner { - public static void main(String[] args) { - Result result = JUnitCore.runClasses(ParserExecDescriptors.class); - - for (Failure failure : result.getFailures()) { - System.out.println(failure.toString()); - } - - System.out.println(result.wasSuccessful()); - } -} diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java index d909e6f7b..017a96c56 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java @@ -93,6 +93,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; +import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -124,10 +125,13 @@ public class BaseCppTest implements RuntimeTestSupport { // new output dir for each test String propName = getPropertyPrefix() + "-test-dir"; String prop = System.getProperty(propName); - if(prop!=null && prop.length()>0) + if(prop!=null && prop.length()>0) { tmpdir = prop; - else - tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+"-"+System.currentTimeMillis()).getAbsolutePath(); + } + else { + tmpdir = new File(System.getProperty("java.io.tmpdir"), + getClass().getSimpleName()+"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis()).getAbsolutePath(); + } antlrToolErrors = new StringBuilder(); } @@ -363,7 +367,9 @@ public class BaseCppTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { @@ -645,7 +651,7 @@ public class BaseCppTest implements RuntimeTestSupport { return true; } - static boolean runtimeBuiltOnce = false; + static Boolean runtimeBuiltOnce = false; public String execModule(String fileName) { String runtimePath = locateRuntime(); @@ -654,22 +660,24 @@ public class BaseCppTest implements RuntimeTestSupport { String inputPath = new File(new File(tmpdir), "input").getAbsolutePath(); // Build runtime using cmake once. - if (!runtimeBuiltOnce) { - try { - String command[] = { "clang++", "--version" }; - String output = runCommand(command, tmpdir, "printing compiler version"); - System.out.println("Compiler version is: " + output); - } - catch (Exception e) { - System.err.println("Can't get compiler version"); - } + synchronized (runtimeBuiltOnce) { + if ( !runtimeBuiltOnce ) { + try { + String command[] = {"clang++", "--version"}; + String output = runCommand(command, tmpdir, "printing compiler version"); + System.out.println("Compiler version is: "+output); + } + catch (Exception e) { + System.err.println("Can't get compiler version"); + } - runtimeBuiltOnce = true; - if (!buildRuntime()) { - System.out.println("C++ runtime build failed\n"); - return null; + runtimeBuiltOnce = true; + if ( !buildRuntime() ) { + System.out.println("C++ runtime build failed\n"); + return null; + } + System.out.println("C++ runtime build succeeded\n"); } - System.out.println("C++ runtime build succeeded\n"); } // Create symlink to the runtime. Currently only used on OSX. diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java index 9ddfadd68..8a5c39447 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java @@ -57,7 +57,6 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; - import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; @@ -75,6 +74,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -162,7 +162,7 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { public void testSetUp() throws Exception { if (CREATE_PER_TEST_DIRECTORIES) { // new output dir for each test - String testDirectory = getClass().getSimpleName() + "-" + System.currentTimeMillis(); + String testDirectory = getClass().getSimpleName() + "-"+Thread.currentThread().getName()+ "-" + System.currentTimeMillis(); tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath(); } else { @@ -265,7 +265,9 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { @@ -908,7 +910,7 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { public void assertEqualStrings(String a, String b) { assertEquals(a, b); } - + protected static void assertEquals(String a, String b) { a = absorbExpectedDifferences(a); b = absorbActualDifferences(b); @@ -928,19 +930,20 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { a = a.replaceAll("\\^", ""); // work around the algo difference for full context a = stripOutUnwantedLinesWith(a, "reportAttemptingFullContext","reportContextSensitivity", "reportAmbiguity"); - if(a.isEmpty()) + if(a.isEmpty()) { a = null; + } return a; } private static String absorbActualDifferences(String a) { - if(a==null) - return a; + if(a==null) return a; // work around the algo difference for full context // work around the algo difference for semantic predicates a = stripOutUnwantedLinesWith(a, "reportContextSensitivity","eval=false"); - if(a.isEmpty()) + if(a.isEmpty()) { a = null; + } return a; } diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java index 39722f62f..e3d487542 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java @@ -95,13 +95,10 @@ import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; +import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock; import static org.junit.Assert.assertArrayEquals; public class BaseGoTest implements RuntimeTestSupport { - // -J-Dorg.antlr.v4.test.BaseTest.level=FINE - // private static final Logger LOGGER = - // Logger.getLogger(BaseTest.class.getName()); - public File overall_tmpdir = null; public File tmpdir = null; // this is where the parser package is stored, typically inside the tmpdir private static File tmpGopath = null; @@ -209,11 +206,14 @@ public class BaseGoTest implements RuntimeTestSupport { public void testSetUp() throws Exception { // new output dir for each test String prop = System.getProperty("antlr-go-test-dir"); - if (prop != null && prop.length() > 0) + if (prop != null && prop.length() > 0) { overall_tmpdir = new File(prop); - else + } + else { + String threadName = Thread.currentThread().getName(); overall_tmpdir = new File(System.getProperty("java.io.tmpdir"), - getClass().getSimpleName() + "-" + System.currentTimeMillis()); + getClass().getSimpleName()+"-"+threadName+"-"+System.currentTimeMillis()); + } if ( overall_tmpdir.exists()) this.eraseDirectory(overall_tmpdir); @@ -348,7 +348,9 @@ public class BaseGoTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java index bf3cce751..12479ac87 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java @@ -88,7 +88,6 @@ import java.io.StringReader; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -100,8 +99,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.logging.Level; -import java.util.logging.Logger; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; @@ -110,9 +107,6 @@ import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertArrayEquals; public class BaseJavaTest implements RuntimeTestSupport { - // -J-Dorg.antlr.v4.test.BaseTest.level=FINE - private static final Logger LOGGER = Logger.getLogger(BaseJavaTest.class.getName()); - public static final String newline = System.getProperty("line.separator"); public static final String pathSep = System.getProperty("path.separator"); @@ -143,7 +137,7 @@ public class BaseJavaTest implements RuntimeTestSupport { * directories for all tests which completed successfully, and preserving * the directories for tests which failed.
*/ - public static final boolean PRESERVE_TEST_DIR = Boolean.parseBoolean(System.getProperty("antlr.preserve-test-dir")); + public static final boolean PRESERVE_TEST_DIR = true; //Boolean.parseBoolean(System.getProperty("antlr.preserve-test-dir")); /** * The base test directory is the directory where generated files get placed @@ -204,9 +198,12 @@ public class BaseJavaTest implements RuntimeTestSupport { @Override public void testSetUp() throws Exception { +// STGroup.verbose = true; +// System.err.println("testSetUp "+Thread.currentThread().getName()); if ( CREATE_PER_TEST_DIRECTORIES ) { // new output dir for each test - String testDirectory = getClass().getSimpleName()+"-"+System.currentTimeMillis(); + String threadName = Thread.currentThread().getName(); + String testDirectory = getClass().getSimpleName()+"-"+threadName+"-"+System.nanoTime(); tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath(); } else { @@ -250,11 +247,6 @@ public class BaseJavaTest implements RuntimeTestSupport { return tool; } - protected Tool newTool() { - org.antlr.v4.Tool tool = new Tool(new String[]{"-o", tmpdir}); - return tool; - } - protected ATN createATN(Grammar g, boolean useSerializer) { if ( g.atn==null ) { semanticProcess(g); @@ -507,7 +499,9 @@ public class BaseJavaTest implements RuntimeTestSupport { if ( defaultListener ) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i