This is an automated email from the ASF dual-hosted git repository. mariofusco pushed a commit to branch dev-new-parser in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git
commit de0ce2e38f26438a364abd7c7785c7c0fe43b077 Author: Toshiya Kobayashi <[email protected]> AuthorDate: Mon Aug 15 16:51:01 2022 +0900 Enhance test/grammar coverage. dialect, invalid lhs (#10) --- drools-drl/drools-drl10-parser/pom.xml | 5 ++ .../src/main/antlr4/org/drools/parser/DRLParser.g4 | 2 +- .../java/org/drools/parser/DRLVisitorImpl.java | 31 ++++++++++-- .../{StringUtils.java => ParserStringUtils.java} | 4 +- .../java/org/drools/parser/MiscDRLParserTest.java | 56 ++++++++++++++++++---- .../resources/org/drools/parser/empty_rule.drl | 21 ++++++++ 6 files changed, 102 insertions(+), 17 deletions(-) diff --git a/drools-drl/drools-drl10-parser/pom.xml b/drools-drl/drools-drl10-parser/pom.xml index 93eefbc5d0..31e015289c 100644 --- a/drools-drl/drools-drl10-parser/pom.xml +++ b/drools-drl/drools-drl10-parser/pom.xml @@ -20,6 +20,11 @@ <artifactId>drools-drl-ast</artifactId> <version>${version.drools-drl-ast}</version> </dependency> + <dependency> + <groupId>org.drools</groupId> + <artifactId>drools-util</artifactId> + <version>${version.drools-drl-ast}</version> + </dependency> <!-- External dependencies --> <dependency> diff --git a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 index b68437835f..2551a83593 100644 --- a/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 +++ b/drools-drl/drools-drl10-parser/src/main/antlr4/org/drools/parser/DRLParser.g4 @@ -5,7 +5,7 @@ options { tokenVocab=DRLLexer; } import JavaParser; -compilationUnit : packagedef? unitdef? importdef* globaldef* ruledef* ; +compilationUnit : packagedef? unitdef? importdef* attributes* globaldef* ruledef* ; packagedef : PACKAGE name=qualifiedName SEMI? ; diff --git a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java index 5706ddd9db..8caa78a977 100644 --- a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java +++ b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/DRLVisitorImpl.java @@ -9,10 +9,27 @@ import java.util.stream.Collectors; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; -import org.drools.drl.ast.descr.*; +import org.drools.drl.ast.descr.AnnotationDescr; +import org.drools.drl.ast.descr.AttributeDescr; +import org.drools.drl.ast.descr.BaseDescr; +import org.drools.drl.ast.descr.ConditionalElementDescr; +import org.drools.drl.ast.descr.ExistsDescr; +import org.drools.drl.ast.descr.ExprConstraintDescr; +import org.drools.drl.ast.descr.FromDescr; +import org.drools.drl.ast.descr.FunctionImportDescr; +import org.drools.drl.ast.descr.GlobalDescr; +import org.drools.drl.ast.descr.ImportDescr; +import org.drools.drl.ast.descr.MVELExprDescr; +import org.drools.drl.ast.descr.NotDescr; +import org.drools.drl.ast.descr.OrDescr; +import org.drools.drl.ast.descr.PackageDescr; +import org.drools.drl.ast.descr.PatternDescr; +import org.drools.drl.ast.descr.RuleDescr; +import org.drools.drl.ast.descr.UnitDescr; import static org.drools.parser.DRLParserHelper.getTextWithoutErrorNode; -import static org.drools.parser.StringUtils.safeStripStringDelimiters; +import static org.drools.parser.ParserStringUtils.safeStripStringDelimiters; +import static org.drools.util.StringUtils.unescapeJava; public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> { @@ -197,9 +214,15 @@ public class DRLVisitorImpl extends DRLParserBaseVisitor<Object> { public Object visitAttribute(DRLParser.AttributeContext ctx) { AttributeDescr attributeDescr = new AttributeDescr(ctx.getChild(0).getText()); if (ctx.getChildCount() > 1) { - attributeDescr.setValue(ctx.getChild(1).getText()); + // TODO : will likely split visitAttribute methods using labels (e.g. #stringAttribute) + String value = unescapeJava(safeStripStringDelimiters(ctx.getChild(1).getText())); + attributeDescr.setValue(value); + } + if (currentRule != null) { + currentRule.addAttribute(attributeDescr); + } else { + packageDescr.addAttribute(attributeDescr); } - currentRule.addAttribute(attributeDescr); return super.visitAttribute(ctx); } diff --git a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java similarity index 86% rename from drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java rename to drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java index 22f8adf4c8..966a68b90c 100644 --- a/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/StringUtils.java +++ b/drools-drl/drools-drl10-parser/src/main/java/org/drools/parser/ParserStringUtils.java @@ -3,9 +3,9 @@ package org.drools.parser; /** * will be merged in drools-util */ -public class StringUtils { +public class ParserStringUtils { - private StringUtils() { + private ParserStringUtils() { } public static String safeStripStringDelimiters(String value) { diff --git a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java index c105a4a29f..baaaa5a5e4 100644 --- a/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java +++ b/drools-drl/drools-drl10-parser/src/test/java/org/drools/parser/MiscDRLParserTest.java @@ -12,6 +12,7 @@ import java.nio.file.Paths; import junit.framework.TestCase; import org.assertj.core.api.Assertions; import org.drools.drl.ast.descr.AndDescr; +import org.drools.drl.ast.descr.AttributeDescr; import org.drools.drl.ast.descr.BaseDescr; import org.drools.drl.ast.descr.ExprConstraintDescr; import org.drools.drl.ast.descr.FromDescr; @@ -47,7 +48,7 @@ public class MiscDRLParserTest extends TestCase { super.tearDown(); } - private PackageDescr parseResource(final String filename) throws Exception { + private String readResource(final String filename) throws Exception { Path path = Paths.get(getClass().getResource(filename).toURI()); final StringBuilder sb = new StringBuilder(); try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { @@ -57,7 +58,7 @@ public class MiscDRLParserTest extends TestCase { } catch (IOException e) { e.printStackTrace(); } - return parser.parse(sb.toString()); + return sb.toString(); } @Test @@ -210,26 +211,27 @@ public class MiscDRLParserTest extends TestCase { @Test public void testGlobalWithOrWithoutSemi() throws Exception { - PackageDescr pack = parseResource("globals.drl"); + String source = readResource("globals.drl"); + PackageDescr pkg = parser.parse(source); assertEquals(1, - pack.getRules().size()); + pkg.getRules().size()); - final RuleDescr rule = (RuleDescr) pack.getRules().get(0); + final RuleDescr rule = (RuleDescr) pkg.getRules().get(0); assertEquals(1, rule.getLhs().getDescrs().size()); assertEquals(1, - pack.getImports().size()); + pkg.getImports().size()); assertEquals(2, - pack.getGlobals().size()); + pkg.getGlobals().size()); - final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get(0); + final GlobalDescr foo = (GlobalDescr) pkg.getGlobals().get(0); assertEquals("java.lang.String", foo.getType()); assertEquals("foo", foo.getIdentifier()); - final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get(1); + final GlobalDescr bar = (GlobalDescr) pkg.getGlobals().get(1); assertEquals("java.lang.Integer", bar.getType()); assertEquals("bar", @@ -238,7 +240,8 @@ public class MiscDRLParserTest extends TestCase { @Test public void testFunctionImportWithNotExist() throws Exception { - PackageDescr pkg = (PackageDescr) parseResource("test_FunctionImport.drl"); + String source = readResource("test_FunctionImport.drl"); + PackageDescr pkg = parser.parse(source); assertEquals(2, pkg.getFunctionImports().size()); @@ -458,4 +461,37 @@ public class MiscDRLParserTest extends TestCase { assertEquals( "type matches \"\\..*\\\\.\"", constraint.getDescrs().get( 0 ).toString() ); } + + @Test + public void testDialect() throws Exception { + final String source = "dialect 'mvel'"; + PackageDescr pkg = parser.parse(source); + AttributeDescr attr = (AttributeDescr) pkg.getAttributes().get(0); + assertEquals("dialect", + attr.getName()); + assertEquals("mvel", + attr.getValue()); + } + + @Test + public void testDialect2() throws Exception { + final String source = "dialect \"mvel\""; + PackageDescr pkg = parser.parse(source); + AttributeDescr attr = pkg.getAttributes().get(0); + assertEquals("dialect", + attr.getName()); + assertEquals("mvel", + attr.getValue()); + } + + @Test + public void testEmptyRuleWithoutWhen() throws Exception { + String source = readResource("empty_rule.drl"); // without WHEN + PackageDescr pkg = parser.parse(source); + + assertTrue(parser.getErrors().toString(), + parser.hasErrors()); + + // Note : RuleParserTest.testEmptyRule allows this DRL, but I think is doesn't make sense to pass this DRL + } } diff --git a/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl b/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl new file mode 100644 index 0000000000..406037fbbd --- /dev/null +++ b/drools-drl/drools-drl10-parser/src/test/resources/org/drools/parser/empty_rule.drl @@ -0,0 +1,21 @@ +/* + * Copyright 2015 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + + +rule empty + +then + +end \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
