|
19 | 19 | */ |
20 | 20 | package org.sonar.cxx.parser; |
21 | 21 |
|
| 22 | +import org.sonar.cxx.CxxConfiguration; |
| 23 | + |
22 | 24 | import com.sonar.sslr.impl.Parser; |
23 | 25 | import com.sonar.sslr.squid.SquidAstVisitorContext; |
24 | 26 | import org.apache.commons.io.FileUtils; |
25 | 27 | import org.junit.Test; |
26 | 28 | import com.sonar.sslr.api.Grammar; |
| 29 | +import java.net.URISyntaxException; |
27 | 30 |
|
28 | 31 | import java.io.File; |
29 | 32 | import java.util.Collection; |
| 33 | +import java.util.ArrayList; |
| 34 | +import java.util.List; |
30 | 35 |
|
31 | 36 | import static org.mockito.Mockito.mock; |
| 37 | +import static org.junit.Assert.fail; |
| 38 | + |
32 | 39 |
|
33 | | -public class CxxParserTest { |
| 40 | +public class CxxParserTest extends ParserBaseTest { |
| 41 | + String errSources = "/parser/bad/error_recovery_declaration.cc"; |
| 42 | + String[] goodFiles = {"own", "examples"}; |
| 43 | + String rootDir = "src/test/resources/parser"; |
| 44 | + File erroneousSources = null; |
34 | 45 |
|
35 | | - private Parser<Grammar> parser = CxxParser.create(mock(SquidAstVisitorContext.class)); |
| 46 | + public CxxParserTest(){ |
| 47 | + super(); |
| 48 | + try{ |
| 49 | + erroneousSources = new File(CxxParserTest.class.getResource(errSources).toURI()); |
| 50 | + } catch (java.net.URISyntaxException e) {} |
| 51 | + } |
36 | 52 |
|
37 | 53 | @Test |
38 | | - public void test() { |
| 54 | + public void testParsingOnDiverseSourceFiles() { |
39 | 55 | Collection<File> files = listFiles(); |
40 | 56 | for (File file : files) { |
41 | | - parser.parse(file); |
| 57 | + p.parse(file); |
42 | 58 | CxxParser.finishedParsing(file); |
43 | 59 | } |
44 | 60 | } |
45 | 61 |
|
46 | | - private static Collection<File> listFiles() { |
47 | | - File dir = new File("src/test/resources/parser/"); |
48 | | - return FileUtils.listFiles(dir, new String[] {"cc", "cpp", "hpp"}, true); |
| 62 | + @Test |
| 63 | + public void testParseErrorRecovery() { |
| 64 | + // The error recovery works, if: |
| 65 | + // - a syntacticly incorrect file causes a parse error when recovery is disabled |
| 66 | + // - but doesnt cause such an error if we run with default settings |
| 67 | + |
| 68 | + try{ |
| 69 | + p.parse(erroneousSources); |
| 70 | + fail("Parser could not recognize the syntax error"); |
| 71 | + } |
| 72 | + catch(com.sonar.sslr.api.RecognitionException re){ |
| 73 | + } |
| 74 | + |
| 75 | + conf.setErrorRecoveryEnabled(true); |
| 76 | + p = CxxParser.create(mock(SquidAstVisitorContext.class), conf); |
| 77 | + p.parse(erroneousSources); //<-- this shouldnt throw now |
| 78 | + } |
| 79 | + |
| 80 | + |
| 81 | + private Collection<File> listFiles() { |
| 82 | + List<File> files = new ArrayList<File>(); |
| 83 | + for(String dir: goodFiles){ |
| 84 | + files.addAll(FileUtils.listFiles(new File(rootDir, dir), |
| 85 | + new String[] {"cc", "cpp", "hpp"}, true)); |
| 86 | + } |
| 87 | + return files; |
49 | 88 | } |
50 | 89 |
|
51 | 90 | } |
0 commit comments