From 08b240eed46c3e13e8f5779a9b3609425b8f3924 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Thu, 9 Dec 2021 19:37:26 +0100 Subject: [PATCH] added more test cases for context analysis --- .../hoisting/HoistingProcessorTest.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java index ed6a3ac2f..a9faf69d5 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/xtext/generator/hoisting/HoistingProcessorTest.java @@ -787,6 +787,7 @@ public class HoistingProcessorTest extends AbstractXtextTests { assertEquals("((" + getSyntaxForKeywordToken("b", 3) + " || ((p0) && (p2))) && (" + getSyntaxForKeywordToken("c", 3) + " || ((p0) && (p3))) && (" + getSyntaxForKeywordToken("d", 3) + " || (p1)))", guard.render()); } + @Test public void testAlternativeEmptyAndNonEmptyPaths_expectEofCheck() throws Exception { // @formatter:off String model = @@ -803,6 +804,7 @@ public class HoistingProcessorTest extends AbstractXtextTests { assertEquals("((" + getSyntaxForKeywordToken("a", 1) + " || (p0)) && (" + getSyntaxForEofToken(1) + " || (p1)))", guard.render()); } + @Test public void testAlternativeWithPrefixPath_expectEofCheck() throws Exception { // @formatter:off String model = @@ -819,6 +821,60 @@ public class HoistingProcessorTest extends AbstractXtextTests { assertEquals("((" + getSyntaxForEofToken(3) + " || (p0)) && (" + getSyntaxForKeywordToken("c", 3) + " || (p1)))", guard.render()); } + @Test + public void testAlternativeWithPrefixPathAndContextWithSimilarities_expectLookAheadContextCheck() throws Exception { + // @formatter:off + String model = + MODEL_PREAMBLE + + "S: a=A 'c' 'd' ;\n" + + "A: {A} $$ p0 $$?=> 'a' 'b' \n" + + " | {A} $$ p1 $$?=> 'a' 'b' 'c' ;"; + // @formatter:off + XtextResource resource = getResourceFromString(model); + Grammar grammar = ((Grammar) resource.getContents().get(0)); + hoistingProcessor.init(grammar); + AbstractRule rule = getRule(grammar, "A"); + + HoistingGuard guard = hoistingProcessor.findHoistingGuard(rule.getAlternatives()); + assertEquals("((" + getSyntaxForKeywordToken("d", 4) + " || (p0)) && (" + getSyntaxForKeywordToken("c", 4) + " || (p1)))", guard.render()); + } + + @Test + public void testAlternativeWithPrefixPathAndMultipleContexts_expectNonTrivialContextCheck() throws Exception { + // @formatter:off + String model = + MODEL_PREAMBLE + + "S: a=A 'c' \n" + + " | a=A 'd' ;\n" + + "A: {A} $$ p0 $$?=> 'a' \n" + + " | {A} $$ p1 $$?=> 'a' 'b' ;"; + // @formatter:off + XtextResource resource = getResourceFromString(model); + Grammar grammar = ((Grammar) resource.getContents().get(0)); + hoistingProcessor.init(grammar); + AbstractRule rule = getRule(grammar, "A"); + + HoistingGuard guard = hoistingProcessor.findHoistingGuard(rule.getAlternatives()); + assertEquals("(((" + getSyntaxForKeywordToken("c", 2) + " && " + getSyntaxForKeywordToken("d", 2) + ") || (p0)) && (" + getSyntaxForKeywordToken("b", 2) + " || (p1)))", guard.render()); + } + + @Test(expected = TokenAnalysisAbortedException.class) + public void testAlternativeWithPrefixPathAndContextIsNotDistince_expectTokenAnalysisAbortedException() throws Exception { + // @formatter:off + String model = + MODEL_PREAMBLE + + "S: a=A 'b' 'b' 'b' 'b' 'b' 'b' 'b' 'b' 'b';\n" + + "A: {A} $$ p0 $$?=> 'a' \n" + + " | {A} $$ p1 $$?=> 'a' 'b' ;"; + // @formatter:off + XtextResource resource = getResourceFromString(model); + Grammar grammar = ((Grammar) resource.getContents().get(0)); + hoistingProcessor.init(grammar); + AbstractRule rule = getRule(grammar, "A"); + + hoistingProcessor.findHoistingGuard(rule.getAlternatives()); + } + @Test(expected = TokenAnalysisAbortedException.class) public void testAlternativeIdenticalPathsInTokenLimit_expectTokenAnalysisAbortedException() throws Exception { // this test shouldn't make problems for symbolic analysis