[jboss-svn-commits] JBL Code SVN: r20051 - labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 19 13:51:44 EDT 2008
Author: porcelli
Date: 2008-05-19 13:51:44 -0400 (Mon, 19 May 2008)
New Revision: 20051
Modified:
labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
Log:
Necessary changes to work with the new parser structure (Parser + TreeWalker)
Modified: labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java
===================================================================
--- labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java 2008-05-19 17:45:31 UTC (rev 20050)
+++ labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/MVELDumperTest.java 2008-05-19 17:51:44 UTC (rev 20051)
@@ -1,12 +1,15 @@
package org.drools.lang;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
import junit.framework.TestCase;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.TokenStream;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
import org.drools.base.evaluators.MatchesEvaluatorsDefinition;
import org.drools.base.evaluators.SetEvaluatorsDefinition;
import org.drools.lang.descr.FieldConstraintDescr;
@@ -33,8 +36,7 @@
public void testDump() throws Exception {
String input = "Cheese( price > 10 && < 20 || == $val || == 30 )";
String expected = "( ( price > 10 && price < 20 ) || price == $val || price == 30 )" ;
- DRLParser parser = parse( input );
- PatternDescr pattern = (PatternDescr) parser.fact( null );
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
String result = dumper.dump( fieldDescr );
@@ -45,8 +47,7 @@
public void testDumpMatches() throws Exception {
String input = "Cheese( type.toString matches \"something\\swith\\tsingle escapes\" )";
String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
- DRLParser parser = parse( input );
- PatternDescr pattern = (PatternDescr) parser.fact( null );
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
String result = dumper.dump( fieldDescr );
@@ -57,9 +58,8 @@
public void testDumpMatches2() throws Exception {
String input = "Cheese( type.toString matches 'something\\swith\\tsingle escapes' )";
String expected = "type.toString ~= \"something\\\\swith\\\\tsingle escapes\"" ;
- DRLParser parser = parse( input );
- PatternDescr pattern = (PatternDescr) parser.fact( null );
-
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
+
FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
String result = dumper.dump( fieldDescr );
@@ -69,8 +69,7 @@
public void testDumpMatches3() throws Exception {
String input = "Map( this[\"content\"] matches \"hello ;=\" )";
String expected = "this[\"content\"] ~= \"hello ;=\"" ;
- DRLParser parser = parse( input );
- PatternDescr pattern = (PatternDescr) parser.fact( null );
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
String result = dumper.dump( fieldDescr );
@@ -81,8 +80,7 @@
public void testDumpWithDateAttr() throws Exception {
String input = "Person( son.birthDate == \"01-jan-2000\" )";
String expected = "son.birthDate == org.drools.util.DateUtils.parseDate( \"01-jan-2000\" )" ;
- DRLParser parser = parse( input );
- PatternDescr pattern = (PatternDescr) parser.fact( null );
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", input);
FieldConstraintDescr fieldDescr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
String result = dumper.dump( fieldDescr, true );
@@ -90,26 +88,87 @@
assertEquals( expected, result );
}
- private DRLParser parse(final String text) throws Exception {
- return newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- }
+ private Object parse(String parserRuleName, String treeRuleName,
+ final String text) throws Exception {
+ return newParser(parserRuleName, treeRuleName, newCharStream(text));
+ }
- private CharStream newCharStream(final String text) {
- return new ANTLRStringStream( text );
- }
+ private CharStream newCharStream(final String text) {
+ return new ANTLRStringStream(text);
+ }
- private DRLLexer newLexer(final CharStream charStream) {
- return new DRLLexer( charStream );
- }
+ private Object newParser(String parserRuleName, String treeRuleName,
+ final CharStream charStream) {
+ return execTreeParser(parserRuleName, treeRuleName, charStream);
+ }
- private TokenStream newTokenStream(final Lexer lexer) {
- return new CommonTokenStream( lexer );
- }
+ public Object execTreeParser(String testRuleName, String testTreeRuleName,
+ CharStream charStream) {
+ Object treeRuleReturn = null;
+ try {
+ DRLLexer lexer = new DRLLexer(charStream);
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
+ DRLParser parser = new DRLParser(tokens);
+ parser.setTreeAdaptor(new DroolsTreeAdaptor());
+ /** Use Reflection to get rule method from parser */
+ Method ruleName = Class.forName("org.drools.lang.NewDRLParser")
+ .getMethod(testRuleName);
- private DRLParser newParser(final TokenStream tokenStream) {
- final DRLParser p = new DRLParser( tokenStream );
- //p.setParserDebug( true );
- return p;
- }
-
+ /** Invoke grammar rule, and get the return value */
+ Object ruleReturn = ruleName.invoke(parser);
+
+ if (!parser.hasErrors()){
+ Class _return = Class.forName("org.drools.lang.NewDRLParser" + "$"
+ + testRuleName + "_return");
+ Method returnName = _return.getMethod("getTree");
+ DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn);
+
+ // Walk resulting tree; create tree nodes stream first
+ CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
+ // AST nodes have payload that point into token stream
+ nodes.setTokenStream(tokens);
+ // Create a tree walker attached to the nodes stream
+ DescrBuilderTree walker = new DescrBuilderTree(nodes);
+ /** Invoke the tree rule, and store the return value if there is */
+ Method treeRuleName = Class.forName(
+ "org.drools.lang.DescrBuilderTree").getMethod(
+ testTreeRuleName);
+ treeRuleReturn = treeRuleName.invoke(walker);
+ }
+
+ if (treeRuleReturn != null) {
+ /** If return object is instanceof AST, get the toStringTree */
+ if (treeRuleReturn.toString().indexOf(
+ testTreeRuleName + "_return") > 0) {
+ try { // NullPointerException may happen here...
+ Class _treeReturn = Class
+ .forName("org.drools.lang.DescrBuilderTree"
+ + "$" + testTreeRuleName + "_return");
+ Field[] fields = _treeReturn.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getType().getName().contains(
+ "org.drools.lang.descr.")) {
+ return field.get(treeRuleReturn);
+ }
+ }
+ } catch (Exception e) {
+ System.err.println(e);
+ }
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return treeRuleReturn;
+ }
}
Modified: labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java
===================================================================
--- labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2008-05-19 17:45:31 UTC (rev 20050)
+++ labs/jbossrules/branches/parser-rewrite/drools-compiler/src/test/java/org/drools/lang/RuleParserTest.java 2008-05-19 17:51:44 UTC (rev 20051)
@@ -1,3901 +1,3389 @@
-package org.drools.lang;
-
-/*
- * Copyright 2005 JBoss Inc
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * 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.
- */
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.antlr.runtime.ANTLRStringStream;
-import org.antlr.runtime.CharStream;
-import org.antlr.runtime.CommonToken;
-import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Lexer;
-import org.antlr.runtime.MismatchedTokenException;
-import org.antlr.runtime.NoViableAltException;
-import org.antlr.runtime.RecognitionException;
-import org.antlr.runtime.TokenStream;
-import org.drools.compiler.DrlParser;
-import org.drools.lang.DRLParser.paren_chunk_return;
-import org.drools.lang.descr.AccessorDescr;
-import org.drools.lang.descr.AccumulateDescr;
-import org.drools.lang.descr.AndDescr;
-import org.drools.lang.descr.AttributeDescr;
-import org.drools.lang.descr.CollectDescr;
-import org.drools.lang.descr.EntryPointDescr;
-import org.drools.lang.descr.EvalDescr;
-import org.drools.lang.descr.ExistsDescr;
-import org.drools.lang.descr.FactTemplateDescr;
-import org.drools.lang.descr.FieldAccessDescr;
-import org.drools.lang.descr.FieldBindingDescr;
-import org.drools.lang.descr.FieldConstraintDescr;
-import org.drools.lang.descr.FieldTemplateDescr;
-import org.drools.lang.descr.ForallDescr;
-import org.drools.lang.descr.FromDescr;
-import org.drools.lang.descr.FunctionDescr;
-import org.drools.lang.descr.FunctionImportDescr;
-import org.drools.lang.descr.GlobalDescr;
-import org.drools.lang.descr.ImportDescr;
-import org.drools.lang.descr.LiteralRestrictionDescr;
-import org.drools.lang.descr.NotDescr;
-import org.drools.lang.descr.OrDescr;
-import org.drools.lang.descr.PackageDescr;
-import org.drools.lang.descr.PatternDescr;
-import org.drools.lang.descr.PredicateDescr;
-import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
-import org.drools.lang.descr.QueryDescr;
-import org.drools.lang.descr.RestrictionConnectiveDescr;
-import org.drools.lang.descr.ReturnValueRestrictionDescr;
-import org.drools.lang.descr.RuleDescr;
-import org.drools.lang.descr.TypeDeclarationDescr;
-import org.drools.lang.descr.VariableRestrictionDescr;
-import org.drools.lang.dsl.DefaultExpander;
-
-public class RuleParserTest extends TestCase {
-
- private DRLParser parser;
-
- protected void setUp() throws Exception {
- super.setUp();
- this.parser = null;
- }
-
- protected void tearDown() throws Exception {
- this.parser = null;
- super.tearDown();
- }
-
- public void testPackage_OneSegment() throws Exception {
- final String packageName = parse( "package foo" ).package_statement();
- assertEquals( "foo",
- packageName );
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testPackage_MultipleSegments() throws Exception {
- final String packageName = parse( "package foo.bar.baz;" ).package_statement();
- assertEquals( "foo.bar.baz",
- packageName );
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testEmptyPackage() throws Exception {
- final String source = "package foo.bar.baz";
- final DrlParser parser = new DrlParser();
- final PackageDescr pkg = parser.parse( new StringReader( source ) );
- assertFalse( parser.hasErrors() );
- assertEquals( "foo.bar.baz",
- pkg.getName() );
- }
-
- public void testCompilationUnit() throws Exception {
- final String source = "package foo; import com.foo.Bar; import com.foo.Baz;";
- parse( source ).compilation_unit();
- assertEquals( "foo",
- this.parser.getPackageDescr().getName() );
- assertEquals( 2,
- this.parser.getPackageDescr().getImports().size() );
- ImportDescr impdescr = (ImportDescr) this.parser.getPackageDescr().getImports().get( 0 );
- assertEquals( "com.foo.Bar",
- impdescr.getTarget() );
- assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
- impdescr.getStartCharacter() );
- assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
- impdescr.getEndCharacter() );
-
- impdescr = (ImportDescr) this.parser.getPackageDescr().getImports().get( 1 );
- assertEquals( "com.foo.Baz",
- impdescr.getTarget() );
- assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
- impdescr.getStartCharacter() );
- assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
- impdescr.getEndCharacter() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testEmptyRule() throws Exception {
- final RuleDescr rule = parseResource( "empty_rule.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "empty",
- rule.getName() );
- assertNotNull( rule.getLhs() );
- assertNotNull( rule.getConsequence() );
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
- }
-
- public void testKeywordCollisions() throws Exception {
- final DRLParser parser = parseResource( "eol_funny_business.drl" );
-
- parser.compilation_unit();
- final PackageDescr pkg = parser.getPackageDescr();
-
- assertEquals( 1,
- pkg.getRules().size() );
-
- assertFalse( parser.getErrors().toString(),
- parser.hasErrors() );
-
- }
-
- public void testPartialAST() throws Exception {
- parseResource( "pattern_partial.drl" );
-
- this.parser.compilation_unit();
-
- assertTrue( this.parser.hasErrors() );
-
- final PackageDescr pkg = this.parser.getPackageDescr();
- assertEquals( 1,
- pkg.getRules().size() );
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
- assertNotNull( pattern );
- assertEquals( "Bar",
- pattern.getObjectType() );
- assertEquals( "foo3",
- pattern.getIdentifier() );
-
- }
-
- public void testTemplates() throws Exception {
-
- final DRLParser parser = parseResource( "test_Templates.drl" );
-
- parser.compilation_unit();
- final PackageDescr pkg = parser.getPackageDescr();
-
- if ( parser.hasErrors() ) {
- System.err.println( "FACT TEMPLATES FAILED: " + parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
-
- assertEquals( 1,
- pkg.getRules().size() );
- assertEquals( 2,
- pkg.getFactTemplates().size() );
-
- FactTemplateDescr fact1 = (FactTemplateDescr) pkg.getFactTemplates().get( 0 );
- assertEquals( "Cheese",
- fact1.getName() );
- assertEquals( 2,
- fact1.getFields().size() );
-
- assertEquals( "name",
- ((FieldTemplateDescr) fact1.getFields().get( 0 )).getName() );
- assertEquals( "String",
- ((FieldTemplateDescr) fact1.getFields().get( 0 )).getClassType() );
-
- assertEquals( "age",
- ((FieldTemplateDescr) fact1.getFields().get( 1 )).getName() );
- assertEquals( "Integer",
- ((FieldTemplateDescr) fact1.getFields().get( 1 )).getClassType() );
-
- fact1 = null;
-
- final FactTemplateDescr fact2 = (FactTemplateDescr) pkg.getFactTemplates().get( 1 );
- assertEquals( "Wine",
- fact2.getName() );
- assertEquals( 3,
- fact2.getFields().size() );
-
- assertEquals( "name",
- ((FieldTemplateDescr) fact2.getFields().get( 0 )).getName() );
- assertEquals( "String",
- ((FieldTemplateDescr) fact2.getFields().get( 0 )).getClassType() );
-
- assertEquals( "year",
- ((FieldTemplateDescr) fact2.getFields().get( 1 )).getName() );
- assertEquals( "String",
- ((FieldTemplateDescr) fact2.getFields().get( 1 )).getClassType() );
-
- assertEquals( "accolades",
- ((FieldTemplateDescr) fact2.getFields().get( 2 )).getName() );
- assertEquals( "String[]",
- ((FieldTemplateDescr) fact2.getFields().get( 2 )).getClassType() );
- }
-
- public void testTernaryExpression() throws Exception {
-
- final DRLParser parser = parseResource( "ternary_expression.drl" );
-
- parser.compilation_unit();
- final PackageDescr pkg = parser.getPackageDescr();
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 1,
- pkg.getRules().size() );
-
- assertFalse( parser.hasErrors() );
- assertEqualsIgnoreWhitespace( "if (speed > speedLimit ? true : false;) pullEmOver();",
- (String) rule.getConsequence() );
- }
-
- public void FIXME_testLatinChars() throws Exception {
- final DrlParser parser = new DrlParser();
- final Reader drl = new InputStreamReader( this.getClass().getResourceAsStream( "latin-sample.dslr" ) );
- final Reader dsl = new InputStreamReader( this.getClass().getResourceAsStream( "latin.dsl" ) );
-
- final PackageDescr pkg = parser.parse( drl,
- dsl );
-
- //MN: will get some errors due to the char encoding on my FC5 install
- //others who use the right encoding may not see this, feel free to uncomment
- //the following assertion.
- assertFalse( parser.hasErrors() );
-
- assertEquals( "br.com.auster.drools.sample",
- pkg.getName() );
- assertEquals( 1,
- pkg.getRules().size() );
-
- }
-
- public void testFunctionWithArrays() throws Exception {
- final DRLParser parser = parseResource( "function_arrays.drl" );
-
- parser.compilation_unit();
- final PackageDescr pkg = parser.getPackageDescr();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
- assertEquals( "foo",
- pkg.getName() );
- assertEquals( 1,
- pkg.getRules().size() );
-
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
- assertEqualsIgnoreWhitespace( "yourFunction(new String[3] {\"a\",\"b\",\"c\"});",
- (String) rule.getConsequence() );
- final FunctionDescr func = (FunctionDescr) pkg.getFunctions().get( 0 );
-
- assertEquals( "String[]",
- func.getReturnType() );
- assertEquals( "args[]",
- func.getParameterNames().get( 0 ) );
- assertEquals( "String",
- func.getParameterTypes().get( 0 ) );
- }
-
- public void testAlmostEmptyRule() throws Exception {
- final RuleDescr rule = parseResource( "almost_empty_rule.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "almost_empty",
- rule.getName() );
- assertNotNull( rule.getLhs() );
- assertEquals( "",
- ((String) rule.getConsequence()).trim() );
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testQuotedStringNameRule() throws Exception {
- final RuleDescr rule = parseResource( "quoted_string_name_rule.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "quoted string name",
- rule.getName() );
- assertNotNull( rule.getLhs() );
- assertEquals( "",
- ((String) rule.getConsequence()).trim() );
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testNoLoop() throws Exception {
- final RuleDescr rule = parseResource( "no-loop.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "rule1",
- rule.getName() );
- final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
- assertEquals( "false",
- att.getValue() );
- assertEquals( "no-loop",
- att.getName() );
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- }
-
- public void testAutofocus() throws Exception {
- final RuleDescr rule = parseResource( "autofocus.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "rule1",
- rule.getName() );
- final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
- assertEquals( "true",
- att.getValue() );
- assertEquals( "auto-focus",
- att.getName() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testRuleFlowGroup() throws Exception {
- final RuleDescr rule = parseResource( "ruleflowgroup.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "rule1",
- rule.getName() );
- final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
- assertEquals( "a group",
- att.getValue() );
- assertEquals( "ruleflow-group",
- att.getName() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testConsequenceWithDeclaration() throws Exception {
- final RuleDescr rule = parseResource( "declaration-in-consequence.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "myrule",
- rule.getName() );
-
- final String expected = "int i = 0; i = 1; i / 1; i == 1; i(i); i = 'i'; i.i.i; i\\i; i<i; i>i; i=\"i\"; ++i;" + "i++; --i; i--; i += i; i -= i; i *= i; i /= i;" + "int i = 5;" + "for(int j; j<i; ++j) {" + "System.out.println(j);}"
- + "Object o = new String(\"Hello\");" + "String s = (String) o;";
-
- assertEqualsIgnoreWhitespace( expected,
- (String) rule.getConsequence() );
- assertTrue( ((String) rule.getConsequence()).indexOf( "++" ) > 0 );
- assertTrue( ((String) rule.getConsequence()).indexOf( "--" ) > 0 );
- assertTrue( ((String) rule.getConsequence()).indexOf( "+=" ) > 0 );
- assertTrue( ((String) rule.getConsequence()).indexOf( "==" ) > 0 );
-
- //System.out.println(( String ) rule.getConsequence());
- //note, need to assert that "i++" is preserved as is, no extra spaces.
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testRuleParseLhs() throws Exception {
- final String text = "Person(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\") \n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
- }
-
- public void testLiteralBoolAndNegativeNumbersRule() throws Exception {
- final DRLParser parser = parseResource( "literal_bool_and_negative.drl" );
- final RuleDescr rule = parser.rule();
- assertFalse( parser.hasErrors() );
-
- assertNotNull( rule );
-
- assertEquals( "simple_rule",
- rule.getName() );
- assertNotNull( rule.getLhs() );
- assertEqualsIgnoreWhitespace( "cons();",
- (String) rule.getConsequence() );
-
- final AndDescr lhs = rule.getLhs();
- assertEquals( 3,
- lhs.getDescrs().size() );
-
- PatternDescr pattern = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
- AndDescr fieldAnd = (AndDescr) pattern.getConstraint();
- FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
- LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "false",
- lit.getText() );
- assertEquals( "bar",
- fld.getFieldName() );
-
- pattern = (PatternDescr) lhs.getDescrs().get( 1 );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- fieldAnd = (AndDescr) pattern.getConstraint();
- fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( ">",
- lit.getEvaluator() );
- assertEquals( "-42",
- lit.getText() );
- assertEquals( "boo",
- fld.getFieldName() );
-
- pattern = (PatternDescr) lhs.getDescrs().get( 2 );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- //lit = (LiteralDescr) col.getDescrs().get( 0 );
-
- fieldAnd = (AndDescr) pattern.getConstraint();
- fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( ">",
- lit.getEvaluator() );
- assertEquals( "-42.42",
- lit.getText() );
- assertEquals( "boo",
- fld.getFieldName() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testChunkWithoutParens() throws Exception {
- String input = "( foo )";
- paren_chunk_return ret = parse( input ).paren_chunk();
- final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
- ((CommonToken) ret.stop).getStopIndex() + 1 );
-
- assertEquals( "( foo )",
- chunk );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testChunkWithParens() throws Exception {
- String input = "(fnord())";
- paren_chunk_return ret = parse( input ).paren_chunk();
- final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
- ((CommonToken) ret.stop).getStopIndex() + 1 );
-
- assertEqualsIgnoreWhitespace( "(fnord())",
- chunk );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testChunkWithParensAndQuotedString() throws Exception {
- String input = "( fnord( \"cheese\" ) )";
- paren_chunk_return ret = parse( input ).paren_chunk();
- final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
- ((CommonToken) ret.stop).getStopIndex() + 1 );
-
- assertEqualsIgnoreWhitespace( "( fnord( \"cheese\" ) )",
- chunk );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testChunkWithRandomCharac5ters() throws Exception {
- String input = "( %*9dkj)";
- paren_chunk_return ret = parse( input ).paren_chunk();
- final String chunk = input.substring( ((CommonToken) ret.start).getStartIndex(),
- ((CommonToken) ret.stop).getStopIndex() + 1 );
-
- assertEqualsIgnoreWhitespace( "( %*9dkj)",
- chunk );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testEmptyPattern() throws Exception {
- parseResource( "test_EmptyPattern.drl" );
- this.parser.compilation_unit();
- final PackageDescr packageDescr = this.parser.getPackageDescr();
- assertEquals( 1,
- packageDescr.getRules().size() );
- final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
- assertEquals( "simple rule",
- ruleDescr.getName() );
- assertNotNull( ruleDescr.getLhs() );
- assertEquals( 1,
- ruleDescr.getLhs().getDescrs().size() );
- final PatternDescr patternDescr = (PatternDescr) ruleDescr.getLhs().getDescrs().get( 0 );
- assertEquals( 0,
- patternDescr.getConstraint().getDescrs().size() ); //this may be null, not sure as the test doesn't get this far...
- assertEquals( "Cheese",
- patternDescr.getObjectType() );
-
- }
-
- public void testSimpleMethodCallWithFrom() throws Exception {
-
- final RuleDescr rule = parseResource( "test_SimpleMethodCallWithFrom.drl" ).rule();
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FromDescr from = (FromDescr) pattern.getSource();
- final AccessorDescr method = (AccessorDescr) from.getDataSource();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertEquals( "something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
- method.toString() );
- }
-
- public void testSimpleFunctionCallWithFrom() throws Exception {
-
- final RuleDescr rule = parseResource( "test_SimpleFunctionCallWithFrom.drl" ).rule();
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FromDescr from = (FromDescr) pattern.getSource();
- final AccessorDescr func = (AccessorDescr) from.getDataSource();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertEquals( "doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
- func.toString() );
- }
-
- public void testSimpleAccessorWithFrom() throws Exception {
-
- final RuleDescr rule = parseResource( "test_SimpleAccessorWithFrom.drl" ).rule();
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FromDescr from = (FromDescr) pattern.getSource();
- final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
-
- assertEquals( "something.doIt",
- accessor.toString() );
- }
-
- public void testSimpleAccessorAndArgWithFrom() throws Exception {
-
- final RuleDescr rule = parseResource( "test_SimpleAccessorArgWithFrom.drl" ).rule();
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FromDescr from = (FromDescr) pattern.getSource();
- final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertNotNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
-
- assertEquals( "something.doIt[\"key\"]",
- accessor.toString() );
- }
-
- public void testComplexChainedAcessor() throws Exception {
- final RuleDescr rule = parseResource( "test_ComplexChainedCallWithFrom.drl" ).rule();
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FromDescr from = (FromDescr) pattern.getSource();
- final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertEquals( "doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]",
- accessor.toString() );
- }
-
- // public void testFrom() throws Exception {
- // final RuleDescr rule = parseResource( "from.drl" ).rule();
- //
- // if(parser.hasErrors()) {
- // System.err.println(parser.getErrorMessages());
- // }
- // assertFalse(parser.hasErrors());
- //
- // assertNotNull( rule );
- //
- // assertEquals( "using_from",
- // rule.getName() );
- //
- // assertEquals(9, rule.getLhs().getDescrs().size());
- //
- // FromDescr from = (FromDescr) rule.getLhs().getDescrs().get(0);
- //
- // assertEquals(3, from.getLine());
- //
- // assertEquals("Foo", from.getReturnedPattern().getObjectType());
- // assertTrue(from.getDataSource() instanceof FieldAccessDescr);
- // assertEquals("baz", ((FieldAccessDescr) from.getDataSource()).getFieldName());
- // assertEquals("bar", ((FieldAccessDescr) from.getDataSource()).getVariableName());
- //
- //
- // ArgumentValueDescr arg = null;
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(1);
- // assertEquals("Foo", from.getReturnedPattern().getObjectType());
- // assertEquals(0, from.getReturnedPattern().getDescrs().size());
- // FieldAccessDescr fieldAccess = ( FieldAccessDescr ) from.getDataSource();
- // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
- // assertEquals(ArgumentValueDescr.STRING, arg.getType() );
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(2);
- // fieldAccess = ( FieldAccessDescr ) from.getDataSource();
- // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
- // assertEquals(ArgumentValueDescr.VARIABLE, arg.getType() );
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(3);
- // fieldAccess = ( FieldAccessDescr ) from.getDataSource();
- // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
- // assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType() );
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(4);
- // assertEquals("Whee", from.getReturnedColumn().getObjectType());
- // assertEquals(1, from.getReturnedColumn().getDescrs().size());
- // assertTrue(from.getDataSource() instanceof FunctionCallDescr);
- // assertEquals("whee", ((FunctionCallDescr) from.getDataSource()).getName());
- // assertEquals(1, ((FunctionCallDescr) from.getDataSource()).getArguments().size());
- // arg = ( (ArgumentValueDescr )((FunctionCallDescr) from.getDataSource()).getArguments().get(0));
- // assertEquals("y", arg.getValue());
- // assertEquals(ArgumentValueDescr.STRING, arg.getType());
- //
- // assertEquals(7, from.getLine());
- // assertEquals(7, from.getReturnedColumn().getLine());
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(5);
- // assertEquals("Foo", from.getReturnedColumn().getObjectType());
- // assertEquals(1, from.getReturnedColumn().getDescrs().size());
- // assertEquals("f", from.getReturnedColumn().getIdentifier());
- // assertTrue(from.getDataSource() instanceof MethodAccessDescr);
- // assertEquals("bar", ((MethodAccessDescr) from.getDataSource()).getVariableName());
- // assertEquals("la", ((MethodAccessDescr) from.getDataSource()).getMethodName());
- // assertEquals(1, ((MethodAccessDescr) from.getDataSource()).getArguments().size());
- // arg = (ArgumentValueDescr) ((MethodAccessDescr) from.getDataSource()).getArguments().get(0);
- //
- //
- // assertEquals("x", arg.getValue());
- // assertEquals(ArgumentValueDescr.VARIABLE, arg.getType());
- //
- // assertEqualsIgnoreWhitespace("whee();", ( String ) rule.getConsequence());
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(6);
- // assertEquals("wa", ((FunctionCallDescr)from.getDataSource()).getName());
- //
- // from = (FromDescr) rule.getLhs().getDescrs().get(7);
- // MethodAccessDescr meth = (MethodAccessDescr)from.getDataSource();
- // assertEquals("wa", meth.getMethodName());
- // assertEquals("la", meth.getVariableName());
- //
- // arg = (ArgumentValueDescr) meth.getArguments().get(0);
- // assertEquals("42", arg.getValue());
- // assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType());
- //
- // arg = (ArgumentValueDescr) meth.getArguments().get(1);
- // assertEquals("42.42", arg.getValue());
- // assertEquals(ArgumentValueDescr.DECIMAL, arg.getType());
- //
- // arg = (ArgumentValueDescr) meth.getArguments().get(2);
- // assertEquals("false", arg.getValue());
- // assertEquals(ArgumentValueDescr.BOOLEAN, arg.getType());
- //
- // arg = (ArgumentValueDescr) meth.getArguments().get(3);
- // assertEquals("null", arg.getValue());
- // assertEquals(ArgumentValueDescr.NULL, arg.getType());
- //
- // assertEquals("Bam", ((PatternDescr)rule.getLhs().getDescrs().get(8)).getObjectType());
- // }
-
- public void testSimpleRule() throws Exception {
- final RuleDescr rule = parseResource( "simple_rule.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "simple_rule",
- rule.getName() );
-
- assertEquals( 7,
- rule.getConsequenceLine() );
- assertEquals( 2,
- rule.getConsequencePattern() );
-
- final AndDescr lhs = rule.getLhs();
-
- assertNotNull( lhs );
-
- assertEquals( 3,
- lhs.getDescrs().size() );
-
- //System.err.println( lhs.getDescrs() );
-
- // Check first pattern
- final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "foo3",
- first.getIdentifier() );
- assertEquals( "Bar",
- first.getObjectType() );
-
- assertEquals( 1,
- first.getConstraint().getDescrs().size() );
-
- AndDescr fieldAnd = (AndDescr) first.getConstraint();
- FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
- LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "3",
- constraint.getText() );
-
- // Check second pattern
- final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
- assertEquals( "foo4",
- second.getIdentifier() );
- assertEquals( "Bar",
- second.getObjectType() );
-
- //System.err.println( second.getDescrs() );
-
- fieldAnd = (AndDescr) second.getConstraint();
- assertEquals( 2,
- fieldAnd.getDescrs().size() );
-
- final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) fieldAnd.getDescrs().get( 0 );
- assertEquals( "a",
- fieldBindingDescr.getFieldName() );
- assertEquals( "a4",
- fieldBindingDescr.getIdentifier() );
-
- fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 1 );
- constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "4",
- constraint.getText() );
-
- // Check third pattern
- final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
- assertNull( third.getIdentifier() );
- assertEquals( "Baz",
- third.getObjectType() );
-
- assertEqualsIgnoreWhitespace( "if ( a == b ) { " + " assert( foo3 );" + "} else {" + " retract( foo4 );" + "}" + " System.out.println( a4 );",
- (String) rule.getConsequence() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testRestrictionsMultiple() throws Exception {
- final RuleDescr rule = parseResource( "restrictions_test.drl" ).rule();
-
- assertFalse( this.parser.getErrors().toString(),
- this.parser.hasErrors() );
- assertNotNull( rule );
-
- assertEqualsIgnoreWhitespace( "consequence();",
- (String) rule.getConsequence() );
- assertEquals( "simple_rule",
- rule.getName() );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- //The first pattern, with 2 restrictions on a single field (plus a connective)
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- pattern.getObjectType() );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- AndDescr and = (AndDescr) pattern.getConstraint();
- FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
- assertEquals( RestrictionConnectiveDescr.AND,
- ((RestrictionConnectiveDescr) fld.getRestriction()).getConnective() );
- assertEquals( 2,
- fld.getRestrictions().size() );
- assertEquals( "age",
- fld.getFieldName() );
-
- LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( ">",
- lit.getEvaluator() );
- assertEquals( "30",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "40",
- lit.getText() );
-
- //the second col, with 2 fields, the first with 2 restrictions, the second field with one
- pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Vehicle",
- pattern.getObjectType() );
- assertEquals( 2,
- pattern.getConstraint().getDescrs().size() );
-
- and = (AndDescr) pattern.getConstraint();
- fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( 1,
- fld.getRestrictions().size() );
- RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
- assertEquals( RestrictionConnectiveDescr.OR,
- or.getConnective() );
- assertEquals( 2,
- or.getRestrictions().size() );
- lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "sedan",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "wagon",
- lit.getText() );
-
- //now the second field
- fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
- assertEquals( 1,
- fld.getRestrictions().size() );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "3",
- lit.getText() );
-
- }
-
- public void testLineNumberInAST() throws Exception {
- //also see testSimpleExpander to see how this works with an expander (should be the same).
-
- final RuleDescr rule = parseResource( "simple_rule.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "simple_rule",
- rule.getName() );
-
- assertEquals( 7,
- rule.getConsequenceLine() );
- assertEquals( 2,
- rule.getConsequencePattern() );
-
- final AndDescr lhs = rule.getLhs();
-
- assertNotNull( lhs );
-
- assertEquals( 3,
- lhs.getDescrs().size() );
-
- // Check first pattern
- final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "foo3",
- first.getIdentifier() );
- assertEquals( "Bar",
- first.getObjectType() );
- assertEquals( 1,
- first.getConstraint().getDescrs().size() );
-
- // Check second pattern
- final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
- assertEquals( "foo4",
- second.getIdentifier() );
- assertEquals( "Bar",
- second.getObjectType() );
-
- final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
- assertEquals( "Baz",
- third.getObjectType() );
-
- assertEquals( 4,
- first.getLine() );
- assertEquals( 5,
- second.getLine() );
- assertEquals( 6,
- third.getLine() );
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testLineNumberIncludingCommentsInRHS() throws Exception {
- parseResource( "test_CommentLineNumbersInConsequence.drl" ).compilation_unit();
-
- assertFalse( this.parser.hasErrors() );
- final String rhs = (String) ((RuleDescr) this.parser.getPackageDescr().getRules().get( 0 )).getConsequence();
- String expected = " \t//woot\n \tfirst\n \t\n \t//\n \t\n \t/* lala\n \t\n \t*/\n \tsecond \n";
- assertEquals( expected,
- rhs );
- }
-
- public void testLhsSemicolonDelim() throws Exception {
- final RuleDescr rule = parseResource( "lhs_semicolon_delim.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "simple_rule",
- rule.getName() );
-
- final AndDescr lhs = rule.getLhs();
-
- assertNotNull( lhs );
-
- assertEquals( 3,
- lhs.getDescrs().size() );
-
- //System.err.println( lhs.getDescrs() );
-
- // Check first pattern
- final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "foo3",
- first.getIdentifier() );
- assertEquals( "Bar",
- first.getObjectType() );
-
- assertEquals( 1,
- first.getConstraint().getDescrs().size() );
-
- //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
- AndDescr and = (AndDescr) first.getConstraint();
- FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
- LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "3",
- constraint.getText() );
-
- // Check second pattern
- final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
- assertEquals( "foo4",
- second.getIdentifier() );
- assertEquals( "Bar",
- second.getObjectType() );
-
- and = (AndDescr) second.getConstraint();
- assertEquals( 2,
- and.getDescrs().size() );
-
- //System.err.println( second.getDescrs() );
-
- final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
- assertEquals( "a",
- fieldBindingDescr.getFieldName() );
- assertEquals( "a4",
- fieldBindingDescr.getIdentifier() );
-
- fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
-
- constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "4",
- constraint.getText() );
-
- // Check third pattern
- final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
- assertNull( third.getIdentifier() );
- assertEquals( "Baz",
- third.getObjectType() );
-
- assertEqualsIgnoreWhitespace( "if ( a == b ) { " + " assert( foo3 );" + "} else {" + " retract( foo4 );" + "}" + " System.out.println( a4 );",
- (String) rule.getConsequence() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testNotNode() throws Exception {
- final RuleDescr rule = parseResource( "rule_not.drl" ).rule();
-
- assertNotNull( rule );
- assertEquals( "simple_rule",
- rule.getName() );
-
- final AndDescr lhs = rule.getLhs();
- assertEquals( 1,
- lhs.getDescrs().size() );
- final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
- assertEquals( 1,
- not.getDescrs().size() );
- final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
-
- assertEquals( "Cheese",
- pattern.getObjectType() );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- final AndDescr and = (AndDescr) pattern.getConstraint();
- final FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
- final LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "stilton",
- lit.getText() );
- assertEquals( "type",
- fld.getFieldName() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testFunctionImport() throws Exception {
- final DRLParser parser = parseResource( "test_FunctionImport.drl" );
- parser.compilation_unit();
- assertFalse( parser.hasErrors() );
-
- final PackageDescr pkg = parser.getPackageDescr();
- assertEquals( 2,
- pkg.getFunctionImports().size() );
-
- assertEquals( "abd.def.x",
- ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getTarget() );
- assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getStartCharacter() == -1 );
- assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getEndCharacter() == -1 );
- assertEquals( "qed.wah.*",
- ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getTarget() );
- assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getStartCharacter() == -1 );
- assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getEndCharacter() == -1 );
- }
-
- public void testNotExistWithBrackets() throws Exception {
-
- final DRLParser parser = parseResource( "not_exist_with_brackets.drl" );
-
- parser.compilation_unit();
- final PackageDescr pkg = parser.getPackageDescr();
-
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
- assertNotNull( rule );
- assertEquals( "simple_rule",
- rule.getName() );
-
- final AndDescr lhs = rule.getLhs();
- assertEquals( 2,
- lhs.getDescrs().size() );
- final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
- assertEquals( 1,
- not.getDescrs().size() );
- final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
-
- assertEquals( "Cheese",
- pattern.getObjectType() );
-
- final ExistsDescr ex = (ExistsDescr) lhs.getDescrs().get( 1 );
- assertEquals( 1,
- ex.getDescrs().size() );
- final PatternDescr exPattern = (PatternDescr) ex.getDescrs().get( 0 );
- assertEquals( "Foo",
- exPattern.getObjectType() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testNotBindindShouldBarf() throws Exception {
- final DRLParser parser = parseResource( "not_with_binding_error.drl" );
- parser.compilation_unit();
- assertTrue( parser.hasErrors() );
- }
-
- public void testSimpleQuery() throws Exception {
- final QueryDescr query = parseResource( "simple_query.drl" ).query();
-
- assertNotNull( query );
-
- assertEquals( "simple_query",
- query.getName() );
-
- final AndDescr lhs = query.getLhs();
-
- assertNotNull( lhs );
-
- assertEquals( 3,
- lhs.getDescrs().size() );
-
- // Check first pattern
- final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "foo3",
- first.getIdentifier() );
- assertEquals( "Bar",
- first.getObjectType() );
-
- assertEquals( 1,
- first.getConstraint().getDescrs().size() );
-
- AndDescr and = (AndDescr) first.getConstraint();
- FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
- LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "3",
- constraint.getText() );
-
- // Check second pattern
- final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
- assertEquals( "foo4",
- second.getIdentifier() );
- assertEquals( "Bar",
- second.getObjectType() );
-
- and = (AndDescr) second.getConstraint();
- assertEquals( 2,
- and.getDescrs().size() );
- //check it has field bindings.
- final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
- assertEquals( "a",
- fieldBindingDescr.getFieldName() );
- assertEquals( "a4",
- fieldBindingDescr.getIdentifier() );
-
- fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
-
- constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertNotNull( constraint );
-
- assertEquals( "a",
- fld.getFieldName() );
- assertEquals( "==",
- constraint.getEvaluator() );
- assertEquals( "4",
- constraint.getText() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testQueryRuleMixed() throws Exception {
- final DRLParser parser = parseResource( "query_and_rule.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 4,
- pack.getRules().size() ); //as queries are rules
- RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( "bar",
- rule.getName() );
-
- QueryDescr query = (QueryDescr) pack.getRules().get( 1 );
- assertEquals( "simple_query",
- query.getName() );
-
- rule = (RuleDescr) pack.getRules().get( 2 );
- assertEquals( "bar2",
- rule.getName() );
-
- query = (QueryDescr) pack.getRules().get( 3 );
- assertEquals( "simple_query2",
- query.getName() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testMultipleRules() throws Exception {
- final DRLParser parser = parseResource( "multiple_rules.drl" );
- parser.compilation_unit();
-
- final PackageDescr pkg = parser.getPackageDescr();
- final List rules = pkg.getRules();
-
- assertEquals( 2,
- rules.size() );
-
- final RuleDescr rule0 = (RuleDescr) rules.get( 0 );
- assertEquals( "Like Stilton",
- rule0.getName() );
-
- final RuleDescr rule1 = (RuleDescr) rules.get( 1 );
- assertEquals( "Like Cheddar",
- rule1.getName() );
-
- //checkout the first rule
- AndDescr lhs = rule1.getLhs();
- assertNotNull( lhs );
- assertEquals( 1,
- lhs.getDescrs().size() );
- assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
- (String) rule0.getConsequence() );
-
- // Check first pattern
- PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "Cheese",
- first.getObjectType() );
-
- //checkout the second rule
- lhs = rule1.getLhs();
- assertNotNull( lhs );
- assertEquals( 1,
- lhs.getDescrs().size() );
- assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
- (String) rule1.getConsequence() );
-
- // Check first pattern
- first = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "Cheese",
- first.getObjectType() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testExpanderErrorsAfterExpansion() throws Exception {
-
- final String name = "expander_post_errors.dslr";
- final Expander expander = new DefaultExpander();
- final String expanded = expander.expand( this.getReader( name ) );
-
- final DRLParser parser = parse( name,
- expanded );
- parser.compilation_unit();
- assertTrue( parser.hasErrors() );
-
- final RecognitionException err = (RecognitionException) parser.getErrors().get( 0 );
- assertEquals( 1,
- parser.getErrors().size() );
-
- assertEquals( 5,
- err.line );
- }
-
- public void testExpanderLineSpread() throws Exception {
- final DrlParser parser = new DrlParser();
- final PackageDescr pkg = parser.parse( this.getReader( "expander_spread_lines.dslr" ),
- this.getReader( "complex.dsl" ) );
-
- assertFalse( parser.getErrors().toString(),
- parser.hasErrors() );
-
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
- assertNotNull( (String) rule.getConsequence() );
-
- }
-
- public void testExpanderMultipleConstraints() throws Exception {
- final DrlParser parser = new DrlParser();
- final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints.dslr" ),
- this.getReader( "multiple_constraints.dsl" ) );
-
- assertFalse( parser.getErrors().toString(),
- parser.hasErrors() );
-
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- pattern.getObjectType() );
-
- assertEquals( 2,
- pattern.getConstraint().getDescrs().size() );
- assertEquals( "age",
- ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
- assertEquals( "location",
- ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
-
- pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Bar",
- pattern.getObjectType() );
-
- assertNotNull( (String) rule.getConsequence() );
-
- }
-
- public void testExpanderMultipleConstraintsFlush() throws Exception {
- final DrlParser parser = new DrlParser();
- //this is similar to the other test, but it requires a flush to add the constraints
- final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints_flush.dslr" ),
- this.getReader( "multiple_constraints.dsl" ) );
-
- assertFalse( parser.getErrors().toString(),
- parser.hasErrors() );
-
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- pattern.getObjectType() );
-
- assertEquals( 2,
- pattern.getConstraint().getDescrs().size() );
- assertEquals( "age",
- ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
- assertEquals( "location",
- ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
-
- assertNotNull( (String) rule.getConsequence() );
-
- }
-
- // public void testExpanderUnExpandableErrorLines() throws Exception {
- //
- // //stubb expander
- // final ExpanderResolver res = new ExpanderResolver() {
- // public Expander get(String name,
- // String config) {
- // return new Expander() {
- // public String expand(String scope,
- // String pattern) {
- // if ( pattern.startsWith( "Good" ) ) {
- // return pattern;
- // } else {
- // throw new IllegalArgumentException( "whoops" );
- // }
- //
- // }
- // };
- // }
- // };
- //
- // final DRLParser parser = parseResource( "expander_line_errors.dslr" );
- // parser.setExpanderResolver( res );
- // parser.compilation_unit();
- // assertTrue( parser.hasErrors() );
- //
- // final List messages = parser.getErrorMessages();
- // assertEquals( messages.size(),
- // parser.getErrors().size() );
- //
- // assertEquals( 4,
- // parser.getErrors().size() );
- // assertEquals( ExpanderException.class,
- // parser.getErrors().get( 0 ).getClass() );
- // assertEquals( 8,
- // ((RecognitionException) parser.getErrors().get( 0 )).line );
- // assertEquals( 10,
- // ((RecognitionException) parser.getErrors().get( 1 )).line );
- // assertEquals( 12,
- // ((RecognitionException) parser.getErrors().get( 2 )).line );
- // assertEquals( 13,
- // ((RecognitionException) parser.getErrors().get( 3 )).line );
- //
- // final PackageDescr pack = parser.getPackageDescr();
- // assertNotNull( pack );
- //
- // final ExpanderException ex = (ExpanderException) parser.getErrors().get( 0 );
- // assertTrue( ex.getMessage().indexOf( "whoops" ) > -1 );
- //
- // }
-
- public void testBasicBinding() throws Exception {
- final DRLParser parser = parseResource( "basic_binding.drl" );
- parser.compilation_unit();
-
- final PackageDescr pkg = parser.getPackageDescr();
- final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
-
- final AndDescr lhs = ruleDescr.getLhs();
- assertEquals( 1,
- lhs.getDescrs().size() );
- final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( 1,
- cheese.getConstraint().getDescrs().size() );
- assertEquals( "Cheese",
- cheese.getObjectType() );
- assertEquals( 1,
- lhs.getDescrs().size() );
- final FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
- assertEquals( "type",
- fieldBinding.getFieldName() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testBoundVariables() throws Exception {
- final DRLParser parser = parseResource( "bindings.drl" );
- parser.compilation_unit();
-
- final PackageDescr pkg = parser.getPackageDescr();
- final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
-
- final AndDescr lhs = ruleDescr.getLhs();
- assertEquals( 2,
- lhs.getDescrs().size() );
- final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
- assertEquals( "Cheese",
- cheese.getObjectType() );
- assertEquals( 2,
- lhs.getDescrs().size() );
- FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
- assertEquals( "type",
- fieldBinding.getFieldName() );
-
- FieldConstraintDescr fld = (FieldConstraintDescr) cheese.getConstraint().getDescrs().get( 1 );
- LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- //LiteralDescr literalDescr = (LiteralDescr) cheese.getDescrs().get( 1 );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( "==",
- literalDescr.getEvaluator() );
- assertEquals( "stilton",
- literalDescr.getText() );
-
- final PatternDescr person = (PatternDescr) lhs.getDescrs().get( 1 );
- fieldBinding = (FieldBindingDescr) person.getConstraint().getDescrs().get( 0 );
- assertEquals( "name",
- fieldBinding.getFieldName() );
-
- fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 1 );
- literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "name",
- fld.getFieldName() );
- assertEquals( "==",
- literalDescr.getEvaluator() );
- assertEquals( "bob",
- literalDescr.getText() );
-
- fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 2 );
- final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "likes",
- fld.getFieldName() );
- assertEquals( "==",
- variableDescr.getEvaluator() );
- assertEquals( "$type",
- variableDescr.getIdentifier() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testOrNesting() throws Exception {
- final DRLParser parser = parseResource( "or_nesting.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertNotNull( pack );
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( "simple_rule",
- rule.getName() );
-
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
-
- final PatternDescr first = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Person",
- first.getObjectType() );
-
- final AndDescr and = (AndDescr) or.getDescrs().get( 1 );
- assertEquals( 2,
- and.getDescrs().size() );
-
- final PatternDescr left = (PatternDescr) and.getDescrs().get( 0 );
- assertEquals( "Person",
- left.getObjectType() );
-
- final PatternDescr right = (PatternDescr) and.getDescrs().get( 1 );
- assertEquals( "Cheese",
- right.getObjectType() );
- }
-
- /** Test that explicit "&&", "||" works as expected */
- public void testAndOrRules() throws Exception {
- final DRLParser parser = parseResource( "and_or_rule.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertNotNull( pack );
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( "simple_rule",
- rule.getName() );
-
- //we will have 2 children under the main And node
- final AndDescr and = rule.getLhs();
- assertEquals( 2,
- and.getDescrs().size() );
-
- //check the "&&" part
- final AndDescr join = (AndDescr) and.getDescrs().get( 0 );
- assertEquals( 2,
- join.getDescrs().size() );
-
- PatternDescr left = (PatternDescr) join.getDescrs().get( 0 );
- PatternDescr right = (PatternDescr) join.getDescrs().get( 1 );
- assertEquals( "Person",
- left.getObjectType() );
- assertEquals( "Cheese",
- right.getObjectType() );
-
- assertEquals( 1,
- left.getConstraint().getDescrs().size() );
-
- FieldConstraintDescr fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
- LiteralRestrictionDescr literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- literal.getEvaluator() );
- assertEquals( "name",
- fld.getFieldName() );
- assertEquals( "mark",
- literal.getText() );
-
- assertEquals( 1,
- right.getConstraint().getDescrs().size() );
-
- fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
- literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- literal.getEvaluator() );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( "stilton",
- literal.getText() );
-
- //now the "||" part
- final OrDescr or = (OrDescr) and.getDescrs().get( 1 );
- assertEquals( 2,
- or.getDescrs().size() );
- left = (PatternDescr) or.getDescrs().get( 0 );
- right = (PatternDescr) or.getDescrs().get( 1 );
- assertEquals( "Person",
- left.getObjectType() );
- assertEquals( "Cheese",
- right.getObjectType() );
- assertEquals( 1,
- left.getConstraint().getDescrs().size() );
-
- fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
- literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- literal.getEvaluator() );
- assertEquals( "name",
- fld.getFieldName() );
- assertEquals( "mark",
- literal.getText() );
-
- assertEquals( 1,
- right.getConstraint().getDescrs().size() );
-
- fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
- literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "==",
- literal.getEvaluator() );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( "stilton",
- literal.getText() );
-
- assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" );",
- (String) rule.getConsequence() );
-
- assertFalse( parser.hasErrors() );
- }
-
- /** test basic foo : Fact() || Fact() stuff */
- public void testOrWithBinding() throws Exception {
- final DRLParser parser = parseResource( "or_binding.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
-
- final PatternDescr leftPattern = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Person",
- leftPattern.getObjectType() );
- assertEquals( "foo",
- leftPattern.getIdentifier() );
-
- final PatternDescr rightPattern = (PatternDescr) or.getDescrs().get( 1 );
- assertEquals( "Person",
- rightPattern.getObjectType() );
- assertEquals( "foo",
- rightPattern.getIdentifier() );
-
- final PatternDescr cheeseDescr = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Cheese",
- cheeseDescr.getObjectType() );
- assertEquals( null,
- cheeseDescr.getIdentifier() );
-
- assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
- (String) rule.getConsequence() );
-
- assertFalse( parser.hasErrors() );
- }
-
- /** test basic foo : Fact() || Fact() stuff binding to an "or"*/
- public void testOrBindingComplex() throws Exception {
- final DRLParser parser = parseResource( "or_binding_complex.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
-
- //first fact
- final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Person",
- firstFact.getObjectType() );
- assertEquals( "foo",
- firstFact.getIdentifier() );
-
- //second "option"
- final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 1 );
- assertEquals( "Person",
- secondFact.getObjectType() );
- assertEquals( 1,
- secondFact.getConstraint().getDescrs().size() );
- assertEquals( "foo",
- secondFact.getIdentifier() );
-
- assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
- (String) rule.getConsequence() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testOrBindingWithBrackets() throws Exception {
- final DRLParser parser = parseResource( "or_binding_with_brackets.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
-
- //first fact
- final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Person",
- firstFact.getObjectType() );
- assertEquals( "foo",
- firstFact.getIdentifier() );
-
- //second "option"
- final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Person",
- secondFact.getObjectType() );
- assertEquals( "foo",
- secondFact.getIdentifier() );
-
- assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
- (String) rule.getConsequence() );
-
- assertFalse( parser.hasErrors() );
- }
-
- /** */
- public void testBracketsPrecedence() throws Exception {
- final DRLParser parser = parseResource( "brackets_precedence.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
-
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final AndDescr rootAnd = (AndDescr) rule.getLhs().getDescrs().get( 0 );
-
- assertEquals( 2,
- rootAnd.getDescrs().size() );
-
- final OrDescr leftOr = (OrDescr) rootAnd.getDescrs().get( 0 );
-
- assertEquals( 2,
- leftOr.getDescrs().size() );
- final NotDescr not = (NotDescr) leftOr.getDescrs().get( 0 );
- final PatternDescr foo1 = (PatternDescr) not.getDescrs().get( 0 );
- assertEquals( "Foo",
- foo1.getObjectType() );
- final PatternDescr foo2 = (PatternDescr) leftOr.getDescrs().get( 1 );
- assertEquals( "Foo",
- foo2.getObjectType() );
-
- final OrDescr rightOr = (OrDescr) rootAnd.getDescrs().get( 1 );
-
- assertEquals( 2,
- rightOr.getDescrs().size() );
- final PatternDescr shoes = (PatternDescr) rightOr.getDescrs().get( 0 );
- assertEquals( "Shoes",
- shoes.getObjectType() );
- final PatternDescr butt = (PatternDescr) rightOr.getDescrs().get( 1 );
- assertEquals( "Butt",
- butt.getObjectType() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testEvalMultiple() throws Exception {
- final DRLParser parser = parseResource( "eval_multiple.drl" );
- parser.compilation_unit();
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 4,
- rule.getLhs().getDescrs().size() );
-
- final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 0 );
- assertEqualsIgnoreWhitespace( "abc(\"foo\") + 5",
- (String) eval.getContent() );
-
- final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Foo",
- pattern.getObjectType() );
-
- }
-
- public void testWithEval() throws Exception {
- final DRLParser parser = parseResource( "with_eval.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 3,
- rule.getLhs().getDescrs().size() );
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Foo",
- pattern.getObjectType() );
- pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Bar",
- pattern.getObjectType() );
-
- final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 2 );
- assertEqualsIgnoreWhitespace( "abc(\"foo\")",
- (String) eval.getContent() );
- assertEqualsIgnoreWhitespace( "Kapow",
- (String) rule.getConsequence() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testWithRetval() throws Exception {
- final DRLParser parser = parseResource( "with_retval.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
-
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
- final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 1,
- col.getConstraint().getDescrs().size() );
- assertEquals( "Foo",
- col.getObjectType() );
- final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
- final ReturnValueRestrictionDescr retval = (ReturnValueRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "a + b",
- retval.getContent() );
- assertEquals( "name",
- fld.getFieldName() );
- assertEquals( "==",
- retval.getEvaluator() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testWithPredicate() throws Exception {
- final DRLParser parser = parseResource( "with_predicate.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
-
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
- final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- AndDescr and = (AndDescr) col.getConstraint();
- assertEquals( 2,
- and.getDescrs().size() );
-
- final FieldBindingDescr field = (FieldBindingDescr) and.getDescrs().get( 0 );
- final PredicateDescr pred = (PredicateDescr) and.getDescrs().get( 1 );
- assertEquals( "age",
- field.getFieldName() );
- assertEquals( "$age2",
- field.getIdentifier() );
- assertEqualsIgnoreWhitespace( "$age2 == $age1+2",
- (String) pred.getContent() );
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
- }
-
- public void testNotWithConstraint() throws Exception {
- final DRLParser parser = parseResource( "not_with_constraint.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
-
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final FieldBindingDescr fieldBinding = (FieldBindingDescr) pattern.getConstraint().getDescrs().get( 0 );
- assertEquals( "$likes",
- fieldBinding.getIdentifier() );
-
- final NotDescr not = (NotDescr) rule.getLhs().getDescrs().get( 1 );
- pattern = (PatternDescr) not.getDescrs().get( 0 );
-
- final FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
- final VariableRestrictionDescr boundVariable = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( "==",
- boundVariable.getEvaluator() );
- assertEquals( "$likes",
- boundVariable.getIdentifier() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testGlobal() throws Exception {
- final DRLParser parser = parseResource( "globals.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
-
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- assertEquals( 1,
- pack.getImports().size() );
- assertEquals( 2,
- pack.getGlobals().size() );
-
- final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get( 0 );
- assertEquals( "java.lang.String",
- foo.getType() );
- assertEquals( "foo",
- foo.getIdentifier() );
- final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get( 1 );
- assertEquals( "java.lang.Integer",
- bar.getType() );
- assertEquals( "bar",
- bar.getIdentifier() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testFunctions() throws Exception {
- final DRLParser parser = parseResource( "functions.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 2,
- pack.getRules().size() );
-
- final List functions = pack.getFunctions();
- assertEquals( 2,
- functions.size() );
-
- FunctionDescr func = (FunctionDescr) functions.get( 0 );
- assertEquals( "functionA",
- func.getName() );
- assertEquals( "String",
- func.getReturnType() );
- assertEquals( 2,
- func.getParameterNames().size() );
- assertEquals( 2,
- func.getParameterTypes().size() );
- assertEquals( 4,
- func.getLine() );
- assertEquals( 0,
- func.getColumn() );
-
- assertEquals( "String",
- func.getParameterTypes().get( 0 ) );
- assertEquals( "s",
- func.getParameterNames().get( 0 ) );
-
- assertEquals( "Integer",
- func.getParameterTypes().get( 1 ) );
- assertEquals( "i",
- func.getParameterNames().get( 1 ) );
-
- assertEqualsIgnoreWhitespace( "foo();",
- func.getText() );
-
- func = (FunctionDescr) functions.get( 1 );
- assertEquals( "functionB",
- func.getName() );
- assertEqualsIgnoreWhitespace( "bar();",
- func.getText() );
-
- assertFalse( parser.hasErrors() );
- }
-
- public void testComment() throws Exception {
- final DRLParser parser = parseResource( "comment.drl" );
- parser.compilation_unit();
-
- final PackageDescr pack = parser.getPackageDescr();
- assertNotNull( pack );
-
- assertEquals( "foo.bar",
- pack.getName() );
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
- }
-
- public void testAttributes() throws Exception {
- final RuleDescr rule = parseResource( "rule_attributes.drl" ).rule();
- assertEquals( "simple_rule",
- rule.getName() );
- assertEqualsIgnoreWhitespace( "bar();",
- (String) rule.getConsequence() );
-
- final List attrs = rule.getAttributes();
- assertEquals( 6,
- attrs.size() );
-
- AttributeDescr at = (AttributeDescr) attrs.get( 0 );
- assertEquals( "salience",
- at.getName() );
- assertEquals( "42",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 1 );
- assertEquals( "agenda-group",
- at.getName() );
- assertEquals( "my_group",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 2 );
- assertEquals( "no-loop",
- at.getName() );
- assertEquals( "true",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 3 );
- assertEquals( "duration",
- at.getName() );
- assertEquals( "42",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 4 );
- assertEquals( "activation-group",
- at.getName() );
- assertEquals( "my_activation_group",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 5 );
- assertEquals( "lock-on-active",
- at.getName() );
- assertEquals( "true",
- at.getValue() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testAttributes_alternateSyntax() throws Exception {
- final RuleDescr rule = parseResource( "rule_attributes_alt.drl" ).rule();
- assertEquals( "simple_rule",
- rule.getName() );
- assertEqualsIgnoreWhitespace( "bar();",
- (String) rule.getConsequence() );
-
- final List attrs = rule.getAttributes();
- assertEquals( 6,
- attrs.size() );
-
- AttributeDescr at = (AttributeDescr) attrs.get( 0 );
- assertEquals( "salience",
- at.getName() );
- assertEquals( "42",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 1 );
- assertEquals( "agenda-group",
- at.getName() );
- assertEquals( "my_group",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 2 );
- assertEquals( "no-loop",
- at.getName() );
- assertEquals( "true",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 3 );
- assertEquals( "lock-on-active",
- at.getName() );
- assertEquals( "true",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 4 );
- assertEquals( "duration",
- at.getName() );
- assertEquals( "42",
- at.getValue() );
-
- at = (AttributeDescr) attrs.get( 5 );
- assertEquals( "activation-group",
- at.getName() );
- assertEquals( "my_activation_group",
- at.getValue() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testEnumeration() throws Exception {
- final RuleDescr rule = parseResource( "enumeration.drl" ).rule();
- assertEquals( "simple_rule",
- rule.getName() );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
- final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Foo",
- col.getObjectType() );
- assertEquals( 1,
- col.getConstraint().getDescrs().size() );
- final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
- final QualifiedIdentifierRestrictionDescr lit = (QualifiedIdentifierRestrictionDescr) fld.getRestrictions().get( 0 );
-
- assertEquals( "bar",
- fld.getFieldName() );
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "Foo.BAR",
- lit.getText() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testInvalidSyntax_Catches() throws Exception {
- parseResource( "invalid_syntax.drl" ).compilation_unit();
- assertTrue( this.parser.hasErrors() );
- }
-
- public void testMultipleErrors() throws Exception {
- parseResource( "multiple_errors.drl" ).compilation_unit();
- assertTrue( this.parser.hasErrors() );
- assertEquals( 2,
- this.parser.getErrors().size() );
- }
-
- public void testExtraLhsNewline() throws Exception {
- parseResource( "extra_lhs_newline.drl" ).compilation_unit();
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testPackageGarbage() throws Exception {
-
- parseResource( "package_garbage.drl" ).compilation_unit();
- assertTrue( this.parser.hasErrors() );
- }
-
- public void testSoundsLike() throws Exception {
- parseResource( "soundslike_operator.drl" ).compilation_unit();
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- RuleDescr rule = (RuleDescr) this.parser.getPackageDescr().getRules().get( 0 );
- PatternDescr pat = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
- pat.getConstraint();
- }
-
- public void testPackageAttributes() throws Exception {
- parseResource( "package_attributes.drl" ).compilation_unit();
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- PackageDescr pkg = this.parser.getPackageDescr();
- AttributeDescr at = (AttributeDescr) pkg.getAttributes().get( 0 );
- assertEquals( "agenda-group",
- at.getName() );
- assertEquals( "x",
- at.getValue() );
- at = (AttributeDescr) pkg.getAttributes().get( 1 );
- assertEquals( "dialect",
- at.getName() );
- assertEquals( "java",
- at.getValue() );
-
- assertEquals( 2,
- pkg.getRules().size() );
-
- assertEquals( 2,
- pkg.getImports().size() );
-
- RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( "bar",
- rule.getName() );
- at = (AttributeDescr) rule.getAttributes().get( 0 );
- assertEquals( "agenda-group",
- at.getName() );
- assertEquals( "x",
- at.getValue() );
- at = (AttributeDescr) rule.getAttributes().get( 1 );
- assertEquals( "dialect",
- at.getName() );
- assertEquals( "java",
- at.getValue() );
-
- rule = (RuleDescr) pkg.getRules().get( 1 );
- assertEquals( "baz",
- rule.getName() );
- at = (AttributeDescr) rule.getAttributes().get( 0 );
- assertEquals( "dialect",
- at.getName() );
- assertEquals( "mvel",
- at.getValue() );
- at = (AttributeDescr) rule.getAttributes().get( 1 );
- assertEquals( "agenda-group",
- at.getName() );
- assertEquals( "x",
- at.getValue() );
-
- }
-
- public void testStatementOrdering1() throws Exception {
- parseResource( "statement_ordering_1.drl" );
- this.parser.compilation_unit();
-
- final PackageDescr pkg = this.parser.getPackageDescr();
-
- assertEquals( 2,
- pkg.getRules().size() );
-
- assertEquals( "foo",
- ((RuleDescr) pkg.getRules().get( 0 )).getName() );
- assertEquals( "bar",
- ((RuleDescr) pkg.getRules().get( 1 )).getName() );
-
- assertEquals( 2,
- pkg.getFunctions().size() );
-
- assertEquals( "cheeseIt",
- ((FunctionDescr) pkg.getFunctions().get( 0 )).getName() );
- assertEquals( "uncheeseIt",
- ((FunctionDescr) pkg.getFunctions().get( 1 )).getName() );
-
- assertEquals( 4,
- pkg.getImports().size() );
- assertEquals( "im.one",
- ((ImportDescr) pkg.getImports().get( 0 )).getTarget() );
- assertEquals( "im.two",
- ((ImportDescr) pkg.getImports().get( 1 )).getTarget() );
- assertEquals( "im.three",
- ((ImportDescr) pkg.getImports().get( 2 )).getTarget() );
- assertEquals( "im.four",
- ((ImportDescr) pkg.getImports().get( 3 )).getTarget() );
-
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testRuleNamesStartingWithNumbers() throws Exception {
- parseResource( "rule_names_number_prefix.drl" ).compilation_unit();
-
- assertFalse( this.parser.getErrors().toString(),
- this.parser.hasErrors() );
-
- final PackageDescr pkg = this.parser.getPackageDescr();
-
- assertEquals( 2,
- pkg.getRules().size() );
-
- assertEquals( "1. Do Stuff!",
- ((RuleDescr) pkg.getRules().get( 0 )).getName() );
- assertEquals( "2. Do More Stuff!",
- ((RuleDescr) pkg.getRules().get( 1 )).getName() );
- }
-
- public void testEvalWithNewline() throws Exception {
- parseResource( "eval_with_newline.drl" ).compilation_unit();
-
- if ( this.parser.hasErrors() ) {
- System.err.println( this.parser.getErrorMessages() );
- }
- assertFalse( this.parser.hasErrors() );
- }
-
- public void testEvalWithSemicolon() throws Exception {
- parseResource( "eval_with_semicolon.drl" ).compilation_unit();
-
- assertTrue( this.parser.hasErrors() );
- assertEquals( 1,
- this.parser.getErrorMessages().size() );
- assertTrue( ((String) this.parser.getErrorMessages().get( 0 )).indexOf( "Trailing semi-colon not allowed" ) >= 0 );
- }
-
- public void testEndPosition() throws Exception {
- parseResource( "test_EndPosition.drl" ).compilation_unit();
- final RuleDescr rule = (RuleDescr) this.parser.getPackageDescr().getRules().get( 0 );
- final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( 6,
- col.getLine() );
-
- assertEquals( 8,
- col.getEndLine() );
-
- }
-
- public void testQualifiedClassname() throws Exception {
- parseResource( "qualified_classname.drl" ).compilation_unit();
-
- assertFalse( this.parser.hasErrors() );
-
- final PackageDescr pkg = this.parser.getPackageDescr();
- final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
-
- final PatternDescr p = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
-
- assertEquals( "com.cheeseco.Cheese",
- p.getObjectType() );
- }
-
- public void testAccumulate() throws Exception {
- final DRLParser parser = parseResource( "accumulate.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
- assertEqualsIgnoreWhitespace( "int x = 0 ;",
- accum.getInitCode() );
- assertEqualsIgnoreWhitespace( "x++;",
- accum.getActionCode() );
- assertNull( accum.getReverseCode() );
- assertEqualsIgnoreWhitespace( "new Integer(x)",
- accum.getResultCode() );
-
- assertFalse( accum.isExternalFunction() );
-
- final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- }
-
- public void testAccumulateWithBindings() throws Exception {
- final DRLParser parser = parseResource( "accumulate_with_bindings.drl" );
- parser.compilation_unit();
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
- assertEqualsIgnoreWhitespace( "$counter",
- outPattern.getIdentifier() );
- assertEqualsIgnoreWhitespace( "int x = 0 ;",
- accum.getInitCode() );
- assertEqualsIgnoreWhitespace( "x++;",
- accum.getActionCode() );
- assertEqualsIgnoreWhitespace( "new Integer(x)",
- accum.getResultCode() );
-
- final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- }
-
- public void testCollect() throws Exception {
- final DRLParser parser = parseResource( "collect.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final CollectDescr collect = (CollectDescr) outPattern.getSource();
-
- final PatternDescr pattern = (PatternDescr) collect.getInputPattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- }
-
- public void testPredicate() throws Exception {
- final PatternDescr pattern = new PatternDescr();
- parse( "$var : attr -> ( $var.equals(\"xyz\") )" ).constraints( pattern );
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- final List constraints = pattern.getConstraint().getDescrs();
- assertEquals( 2,
- constraints.size() );
-
- final FieldBindingDescr field = (FieldBindingDescr) constraints.get( 0 );
- final PredicateDescr predicate = (PredicateDescr) constraints.get( 1 );
- assertEquals( "$var",
- field.getIdentifier() );
- assertEquals( "attr",
- field.getFieldName() );
- assertEquals( " $var.equals(\"xyz\") ",
- predicate.getContent() );
- }
-
- public void testPredicate2() throws Exception {
- final PatternDescr pattern = new PatternDescr();
- // predicates are also prefixed by the eval keyword
- parse( "eval( $var.equals(\"xyz\") )" ).constraints( pattern );
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- final List constraints = pattern.getConstraint().getDescrs();
- assertEquals( 1,
- constraints.size() );
-
- final PredicateDescr predicate = (PredicateDescr) constraints.get( 0 );
- assertEquals( " $var.equals(\"xyz\") ",
- predicate.getContent() );
- }
-
- public void testEscapedStrings() throws Exception {
- final RuleDescr rule = parseResource( "escaped-string.drl" ).rule();
-
- assertNotNull( rule );
-
- assertEquals( "test_Quotes",
- rule.getName() );
-
- final String expected = "String s = \"\\\"\\n\\t\\\\\";";
-
- assertEqualsIgnoreWhitespace( expected,
- (String) rule.getConsequence() );
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
- }
-
- public void testNestedCEs() throws Exception {
- final RuleDescr rule = parseResource( "nested_conditional_elements.drl" ).rule();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- assertNotNull( rule );
-
- final AndDescr root = rule.getLhs();
- final NotDescr not1 = (NotDescr) root.getDescrs().get( 0 );
- final AndDescr and1 = (AndDescr) not1.getDescrs().get( 0 );
-
- final PatternDescr state = (PatternDescr) and1.getDescrs().get( 0 );
- final NotDescr not2 = (NotDescr) and1.getDescrs().get( 1 );
- final AndDescr and2 = (AndDescr) not2.getDescrs().get( 0 );
- final PatternDescr person = (PatternDescr) and2.getDescrs().get( 0 );
- final PatternDescr cheese = (PatternDescr) and2.getDescrs().get( 1 );
-
- final PatternDescr person2 = (PatternDescr) root.getDescrs().get( 1 );
- final OrDescr or = (OrDescr) root.getDescrs().get( 2 );
- final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 0 );
- final PatternDescr cheese3 = (PatternDescr) or.getDescrs().get( 1 );
-
- assertEquals( state.getObjectType(),
- "State" );
- assertEquals( person.getObjectType(),
- "Person" );
- assertEquals( cheese.getObjectType(),
- "Cheese" );
- assertEquals( person2.getObjectType(),
- "Person" );
- assertEquals( cheese2.getObjectType(),
- "Cheese" );
- assertEquals( cheese3.getObjectType(),
- "Cheese" );
- }
-
- public void testForall() throws Exception {
- final DRLParser parser = parseResource( "forall.drl" );
- parser.compilation_unit();
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final ForallDescr forall = (ForallDescr) rule.getLhs().getDescrs().get( 0 );
-
- assertEquals( 2,
- forall.getDescrs().size() );
- final PatternDescr pattern = forall.getBasePattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- final List remaining = forall.getRemainingPatterns();
- assertEquals( 1,
- remaining.size() );
- final PatternDescr cheese = (PatternDescr) remaining.get( 0 );
- assertEquals( "Cheese",
- cheese.getObjectType() );
- }
-
- public void testMemberof() throws Exception {
- final String text = "Country( $cities : city )\nPerson( city memberOf $cities )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
-
- assertEquals( 2,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
- assertEquals( "memberOf",
- restr.getEvaluator() );
- assertFalse( restr.isNegated() );
- assertEquals( "$cities",
- restr.getIdentifier() );
- }
-
- public void testNotMemberof() throws Exception {
- final String text = "Country( $cities : city )\nPerson( city not memberOf $cities )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
-
- assertEquals( 2,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
- assertEquals( "memberOf",
- restr.getEvaluator() );
- assertTrue( restr.isNegated() );
- assertEquals( "$cities",
- restr.getIdentifier() );
- }
-
- public void testInOperator() throws Exception {
- final RuleDescr rule = parseResource( "in_operator_test.drl" ).rule();
-
- assertFalse( this.parser.getErrors().toString(),
- this.parser.hasErrors() );
- assertNotNull( rule );
-
- assertEqualsIgnoreWhitespace( "consequence();",
- (String) rule.getConsequence() );
- assertEquals( "simple_rule",
- rule.getName() );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- //The first pattern, with 2 restrictions on a single field (plus a connective)
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- pattern.getObjectType() );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
- assertEquals( RestrictionConnectiveDescr.AND,
- fld.getRestriction().getConnective() );
- assertEquals( 2,
- fld.getRestrictions().size() );
- assertEquals( "age",
- fld.getFieldName() );
-
- LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( ">",
- lit.getEvaluator() );
- assertEquals( "30",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "40",
- lit.getText() );
-
- //the second col, with 2 fields, the first with 2 restrictions, the second field with one
- pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Vehicle",
- pattern.getObjectType() );
- assertEquals( 2,
- pattern.getConstraint().getDescrs().size() );
-
- fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( 1,
- fld.getRestrictions().size() );
-
- RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
- assertEquals( RestrictionConnectiveDescr.OR,
- or.getConnective() );
- assertEquals( 2,
- or.getRestrictions().size() );
-
- lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "sedan",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
- assertEquals( "==",
- lit.getEvaluator() );
- assertEquals( "wagon",
- lit.getText() );
-
- //now the second field
- fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
- assertEquals( 1,
- fld.getRestrictions().size() );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "3",
- lit.getText() );
-
- }
-
- public void testNotInOperator() throws Exception {
- final RuleDescr rule = parseResource( "notin_operator_test.drl" ).rule();
-
- assertFalse( this.parser.getErrors().toString(),
- this.parser.hasErrors() );
- assertNotNull( rule );
-
- assertEqualsIgnoreWhitespace( "consequence();",
- (String) rule.getConsequence() );
- assertEquals( "simple_rule",
- rule.getName() );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- //The first pattern, with 2 restrictions on a single field (plus a connective)
- PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- pattern.getObjectType() );
- assertEquals( 1,
- pattern.getConstraint().getDescrs().size() );
-
- FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
- assertEquals( 2,
- fld.getRestrictions().size() );
- assertEquals( "age",
- fld.getFieldName() );
-
- LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( ">",
- lit.getEvaluator() );
- assertEquals( "30",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "40",
- lit.getText() );
-
- //the second col, with 2 fields, the first with 2 restrictions, the second field with one
- pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "Vehicle",
- pattern.getObjectType() );
- assertEquals( 2,
- pattern.getConstraint().getDescrs().size() );
-
- fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
- assertEquals( 2,
- fld.getRestrictions().size() );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( "type",
- fld.getFieldName() );
- assertEquals( "!=",
- lit.getEvaluator() );
- assertEquals( "sedan",
- lit.getText() );
-
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
- assertEquals( "!=",
- lit.getEvaluator() );
- assertEquals( "wagon",
- lit.getText() );
-
- //now the second field
- fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
- assertEquals( 1,
- fld.getRestrictions().size() );
- lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
- assertEquals( "<",
- lit.getEvaluator() );
- assertEquals( "3",
- lit.getText() );
-
- }
-
- public void testConstraintAndConnective() throws Exception {
- final String text = "Person( age < 42 && location==\"atlanta\")";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 2,
- pattern.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- fcd = (FieldConstraintDescr) pattern.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- }
-
- public void testConstraintOrConnective() throws Exception {
- final String text = "Person( age < 42 || location==\"atlanta\")";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) or.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- fcd = (FieldConstraintDescr) or.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- }
-
- public void testConstraintConnectivesPrecedence() throws Exception {
- final String text = "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
- assertEquals( 3,
- or.getDescrs().size() );
-
- AndDescr and = (AndDescr) or.getDescrs().get( 0 );
- assertEquals( 2,
- and.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( "<",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "42",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "atlanta",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- and = (AndDescr) or.getDescrs().get( 1 );
- assertEquals( 2,
- and.getDescrs().size() );
- fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( ">",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "20",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "Seatle",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- fcd = (FieldConstraintDescr) or.getDescrs().get( 2 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "Chicago",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- }
-
- public void testConstraintConnectivesPrecedenceWithBracks() throws Exception {
- final String text = "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
- assertEquals( 2,
- or1.getDescrs().size() );
-
- AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
- assertEquals( 2,
- and1.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( "<",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "42",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- OrDescr or2 = (OrDescr) and1.getDescrs().get( 1 );
- fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "atlanta",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- AndDescr and2 = (AndDescr) or2.getDescrs().get( 1 );
- assertEquals( 2,
- and2.getDescrs().size() );
- fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( ">",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "20",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "Seatle",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- fcd = (FieldConstraintDescr) or1.getDescrs().get( 1 );
- assertEquals( "location",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "Chicago",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- }
-
- public void testConstraintConnectivesPrecedenceWithBracks2() throws Exception {
- final String text = "Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) )";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
- assertEquals( 3,
- or1.getDescrs().size() );
-
- AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
- AndDescr and2 = (AndDescr) or1.getDescrs().get( 1 );
- AndDescr and3 = (AndDescr) or1.getDescrs().get( 2 );
-
- assertEquals( 2,
- and1.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "70",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) and1.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "black",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- assertEquals( 2,
- and2.getDescrs().size() );
- fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "40",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "pink",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- assertEquals( 2,
- and3.getDescrs().size() );
- fcd = (FieldConstraintDescr) and3.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "12",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- OrDescr or2 = (OrDescr) and3.getDescrs().get( 1 );
- fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
- assertEquals( "hair",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "yellow",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- fcd = (FieldConstraintDescr) or2.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "blue",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
- }
-
- public void testRestrictionConnectives() throws Exception {
-
- // the expression bellow must generate the following tree:
- //
- // AND
- // |
- // OR
- // /---------------+-------------------\
- // AND AND AND
- // /---+---\ /---+---\ /---+---\
- // FC FC FC FC FC OR
- // /---+---\
- // FC FC
- //
- final String text = "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
-
- OrDescr orConstr = (OrDescr) pattern.getDescrs().get( 0 );
-
- assertEquals( 3,
- orConstr.getDescrs().size() );
-
- AndDescr andConstr1 = (AndDescr) orConstr.getDescrs().get( 0 );
-
- FieldConstraintDescr fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
- RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestriction().getRestrictions().get( 0 );
- RestrictionConnectiveDescr and1 = (RestrictionConnectiveDescr) or.getRestrictions().get( 0 );
- RestrictionConnectiveDescr and2 = (RestrictionConnectiveDescr) or.getRestrictions().get( 1 );
-
- assertEquals( ">",
- ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "60",
- ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getText() );
-
- assertEquals( "<",
- ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getEvaluator() );
- assertEquals( "70",
- ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getText() );
-
- assertEquals( ">",
- ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "50",
- ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getText() );
-
- assertEquals( "<",
- ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getEvaluator() );
- assertEquals( "55",
- ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getText() );
-
- fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "black",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- AndDescr andConstr2 = (AndDescr) orConstr.getDescrs().get( 1 );
- assertEquals( 2,
- andConstr2.getDescrs().size() );
- fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "40",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "pink",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- AndDescr andConstr3 = (AndDescr) orConstr.getDescrs().get( 2 );
- assertEquals( 2,
- andConstr3.getDescrs().size() );
- fcd = (FieldConstraintDescr) andConstr3.getDescrs().get( 0 );
- assertEquals( "age",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "12",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- OrDescr orConstr2 = (OrDescr) andConstr3.getDescrs().get( 1 );
-
- fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 0 );
- assertEquals( "hair",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "yellow",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 1 );
- assertEquals( "hair",
- fcd.getFieldName() );
-
- assertEquals( "==",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "blue",
- ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
-
- }
-
- public void testConstraintConnectivesMatches() throws Exception {
- final String text = "Person( name matches \"mark\" || matches \"bob\" )";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.fact( null );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
- assertEquals( "name",
- fcd.getFieldName() );
-
- RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestrictions().get( 0 );
-
- assertEquals( 2,
- or.getRestrictions().size() );
-
- assertEquals( "matches",
- ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getEvaluator() );
- assertEquals( "mark",
- ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getText() );
-
- assertEquals( "matches",
- ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getEvaluator() );
- assertEquals( "bob",
- ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getText() );
-
- }
-
- public void testNotContains() throws Exception {
- final String text = "City( $city : city )\nCountry( cities not contains $city )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 2,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
- assertEquals( "contains",
- restr.getEvaluator() );
- assertTrue( restr.isNegated() );
- assertEquals( "$city",
- restr.getIdentifier() );
- }
-
- public void testNotMatches() throws Exception {
- final String text = "Message( text not matches '[abc]*' )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- LiteralRestrictionDescr restr = (LiteralRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
- assertEquals( "matches",
- restr.getEvaluator() );
- assertTrue( restr.isNegated() );
- assertEquals( "[abc]*",
- restr.getText() );
- }
-
- public void testRestrictions() throws Exception {
- final String text = "Foo( bar > 1 || == 1 )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fieldConstr.getRestrictions().get( 0 );
- LiteralRestrictionDescr gt1 = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
- LiteralRestrictionDescr eq1 = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
-
- assertEquals( ">",
- gt1.getEvaluator() );
- assertEquals( false,
- gt1.isNegated() );
- assertEquals( 1,
- ((Number) eq1.getValue()).intValue() );
- assertEquals( "==",
- eq1.getEvaluator() );
- assertEquals( false,
- eq1.isNegated() );
- assertEquals( 1,
- ((Number) eq1.getValue()).intValue() );
-
- }
-
- public void testSemicolon() throws Exception {
- parseResource( "semicolon.drl" );
-
- this.parser.compilation_unit();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- final PackageDescr pkg = this.parser.getPackageDescr();
- assertEquals( "org.drools",
- pkg.getName() );
- assertEquals( 1,
- pkg.getGlobals().size() );
- assertEquals( 3,
- pkg.getRules().size() );
-
- final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 2,
- rule1.getLhs().getDescrs().size() );
-
- final RuleDescr query1 = (RuleDescr) pkg.getRules().get( 1 );
- assertEquals( 3,
- query1.getLhs().getDescrs().size() );
-
- final RuleDescr rule2 = (RuleDescr) pkg.getRules().get( 2 );
- assertEquals( 2,
- rule2.getLhs().getDescrs().size() );
- }
-
- public void testEval() throws Exception {
- parseResource( "eval_parsing.drl" );
-
- this.parser.compilation_unit();
-
- assertFalse( this.parser.getErrorMessages().toString(),
- this.parser.hasErrors() );
-
- final PackageDescr pkg = this.parser.getPackageDescr();
- assertEquals( "org.drools",
- pkg.getName() );
- assertEquals( 1,
- pkg.getRules().size() );
-
- final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
- assertEquals( 1,
- rule1.getLhs().getDescrs().size() );
- }
-
- public void testAccumulateReverse() throws Exception {
- final DRLParser parser = parseResource( "accumulateReverse.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accum = (AccumulateDescr) out.getSource();
- assertEqualsIgnoreWhitespace( "int x = 0 ;",
- accum.getInitCode() );
- assertEqualsIgnoreWhitespace( "x++;",
- accum.getActionCode() );
- assertEqualsIgnoreWhitespace( "x--;",
- accum.getReverseCode() );
- assertEqualsIgnoreWhitespace( "new Integer(x)",
- accum.getResultCode() );
- assertFalse( accum.isExternalFunction() );
-
- final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- }
-
- public void testAccumulateExternalFunction() throws Exception {
- final DRLParser parser = parseResource( "accumulateExternalFunction.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accum = (AccumulateDescr) out.getSource();
- assertEqualsIgnoreWhitespace( "$age",
- accum.getExpression() );
- assertEqualsIgnoreWhitespace( "average",
- accum.getFunctionIdentifier() );
- assertTrue( accum.isExternalFunction() );
-
- final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
- assertEquals( "Person",
- pattern.getObjectType() );
- }
-
- public void testCollectWithNestedFrom() throws Exception {
- final DRLParser parser = parseResource( "collect_with_nested_from.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final CollectDescr collect = (CollectDescr) out.getSource();
-
- PatternDescr person = (PatternDescr) collect.getInputPattern();
- assertEquals( "Person",
- person.getObjectType() );
-
- final CollectDescr collect2 = (CollectDescr) person.getSource();
-
- final PatternDescr people = collect2.getInputPattern();
- assertEquals( "People",
- people.getObjectType() );
- }
-
- public void testAccumulateWithNestedFrom() throws Exception {
- final DRLParser parser = parseResource( "accumulate_with_nested_from.drl" );
- parser.compilation_unit();
-
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
-
- assertFalse( parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accumulate = (AccumulateDescr) out.getSource();
-
- PatternDescr person = (PatternDescr) accumulate.getInputPattern();
- assertEquals( "Person",
- person.getObjectType() );
-
- final CollectDescr collect2 = (CollectDescr) person.getSource();
-
- final PatternDescr people = collect2.getInputPattern();
- assertEquals( "People",
- people.getObjectType() );
- }
-
- public void testAccessorPaths() throws Exception {
- final String text = "org . drools/*comment*/\t .Message( text not matches $c#comment\n. property )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- descrs.getDescrs().size() );
- PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
- assertEquals( "org.drools.Message",
- pat.getObjectType() );
-
- FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
- QualifiedIdentifierRestrictionDescr restr = (QualifiedIdentifierRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
-
- assertEquals( "matches",
- restr.getEvaluator() );
- assertTrue( restr.isNegated() );
- assertEquals( "$c.property",
- restr.getText() );
- }
-
- public void testOrCE() throws Exception {
- final DRLParser parser = parseResource( "or_ce.drl" );
- parser.compilation_unit();
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 2,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr person = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "Person",
- person.getObjectType() );
- assertEquals( "$p",
- person.getIdentifier() );
-
- final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( 2,
- or.getDescrs().size() );
-
- final PatternDescr cheese1 = (PatternDescr) or.getDescrs().get( 0 );
- assertEquals( "Cheese",
- cheese1.getObjectType() );
- assertEquals( "$c",
- cheese1.getIdentifier() );
- final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 1 );
- assertEquals( "Cheese",
- cheese2.getObjectType() );
- assertNull( cheese2.getIdentifier() );
- }
-
- public void testRuleParseLhs2() throws Exception {
- final String text = "Message( Message.HELLO )\n";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- assertTrue( parser.hasErrors() );
- }
-
- public void testRuleSingleLine() throws Exception {
- final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( 10 );
- RuleDescr rule = parser.rule();
-
- assertFalse( parser.hasErrors() );
- assertEquals( "another test",
- rule.getName() );
- assertEquals( "System.out.println(1); ",
- rule.getConsequence() );
- }
-
- public void testRuleTwoLines() throws Exception {
- final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\n end";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( 10 );
- RuleDescr rule = parser.rule();
-
- assertFalse( parser.hasErrors() );
- assertEquals( "another test",
- rule.getName() );
- assertEquals( "System.out.println(1);\n ",
- rule.getConsequence() );
- }
-
- public void testRuleParseLhs3() throws Exception {
- final String text = "(or\nnot Person()\n(and Cheese()\nMeat()\nWine()))";
- final AndDescr descrs = new AndDescr();
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
- parser.setLineOffset( descrs.getLine() );
- parser.normal_lhs_block( descrs );
- if ( parser.hasErrors() ) {
- System.err.println( parser.getErrorMessages() );
- }
- assertFalse( parser.hasErrors() );
- assertEquals( 1,
- descrs.getDescrs().size() );
- OrDescr or = (OrDescr) descrs.getDescrs().get( 0 );
- assertEquals( 2,
- or.getDescrs().size() );
- NotDescr not = (NotDescr) or.getDescrs().get( 0 );
- AndDescr and = (AndDescr) or.getDescrs().get( 1 );
- assertEquals( 1,
- not.getDescrs().size() );
- PatternDescr person = (PatternDescr) not.getDescrs().get( 0 );
- assertEquals( "Person",
- person.getObjectType() );
- assertEquals( 3,
- and.getDescrs().size() );
- PatternDescr cheese = (PatternDescr) and.getDescrs().get( 0 );
- assertEquals( "Cheese",
- cheese.getObjectType() );
- PatternDescr meat = (PatternDescr) and.getDescrs().get( 1 );
- assertEquals( "Meat",
- meat.getObjectType() );
- PatternDescr wine = (PatternDescr) and.getDescrs().get( 2 );
- assertEquals( "Wine",
- wine.getObjectType() );
-
- }
-
- public void testAccumulateMultiPattern() throws Exception {
- final DRLParser parser = parseResource( "accumulate_multi_pattern.drl" );
- parser.compilation_unit();
-
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 1,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
- assertEqualsIgnoreWhitespace( "$counter",
- outPattern.getIdentifier() );
- assertEqualsIgnoreWhitespace( "int x = 0 ;",
- accum.getInitCode() );
- assertEqualsIgnoreWhitespace( "x++;",
- accum.getActionCode() );
- assertEqualsIgnoreWhitespace( "new Integer(x)",
- accum.getResultCode() );
-
- final AndDescr and = (AndDescr) accum.getInput();
- assertEquals( 2,
- and.getDescrs().size() );
- final PatternDescr person = (PatternDescr) and.getDescrs().get( 0 );
- final PatternDescr cheese = (PatternDescr) and.getDescrs().get( 1 );
- assertEquals( "Person",
- person.getObjectType() );
- assertEquals( "Cheese",
- cheese.getObjectType() );
- }
-
- public void testErrorMessageForMisplacedParenthesis() throws Exception {
- final DRLParser parser = parseResource( "misplaced_parenthesis.drl" );
- parser.compilation_unit();
-
- assertTrue( "Parser should have raised errors",
- parser.hasErrors() );
-
- for ( Iterator it = parser.getErrors().iterator(); it.hasNext(); ) {
- Object error = it.next();
- if ( !(error instanceof MismatchedTokenException) ) {
- fail( "Error should be an instance of MismatchedTokenException" );
- }
- }
-
- }
-
- public void testNPEOnParser() throws Exception {
- final DRLParser parser = parseResource( "npe_on_parser.drl" );
- parser.compilation_unit();
-
- assertTrue( "Parser should have raised errors",
- parser.hasErrors() );
-
- List errors = parser.getErrors();
- assertEquals( 2,
- errors.size() );
-
- assertTrue( errors.get( 0 ) instanceof MismatchedTokenException ); // "action" is a reserved word
- assertTrue( errors.get( 1 ) instanceof NoViableAltException ); // no title in the rule
-
- }
-
- public void testCommaMisuse() throws Exception {
- final DRLParser parser = parseResource( "comma_misuse.drl" );
- try {
- parser.compilation_unit();
-
- assertTrue( "Parser should have raised errors",
- parser.hasErrors() );
- assertEquals( 3,
- parser.getErrors().size() );
-
- } catch ( NullPointerException npe ) {
- fail( "Should not raise NPE" );
- }
- }
-
- public void testPluggableOperators() throws Exception {
- final DRLParser parser = parseResource( "pluggable_operators.drl" );
- parser.compilation_unit();
-
- assertFalse( "Parser should not have raised errors: " + parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
- assertEquals( 1,
- pack.getRules().size() );
- final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
- assertEquals( 5,
- rule.getLhs().getDescrs().size() );
-
- final PatternDescr eventA = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
- assertEquals( "$a",
- eventA.getIdentifier() );
- assertEquals( "EventA",
- eventA.getObjectType() );
-
- final PatternDescr eventB = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
- assertEquals( "$b",
- eventB.getIdentifier() );
- assertEquals( "EventB",
- eventB.getObjectType() );
- assertEquals( 1,
- eventB.getConstraint().getDescrs().size() );
- final FieldConstraintDescr fcdB = (FieldConstraintDescr) eventB.getConstraint().getDescrs().get( 0 );
- assertEquals( 1,
- fcdB.getRestrictions().size() );
- assertTrue( fcdB.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
- final VariableRestrictionDescr rb = (VariableRestrictionDescr) fcdB.getRestrictions().get( 0 );
- assertEquals( "after",
- rb.getEvaluator() );
- assertEquals( "$a",
- rb.getText() );
- assertEquals( "1,10",
- rb.getParameterText() );
- assertFalse( rb.isNegated() );
-
- final PatternDescr eventC = (PatternDescr) rule.getLhs().getDescrs().get( 2 );
- assertEquals( "$c",
- eventC.getIdentifier() );
- assertEquals( "EventC",
- eventC.getObjectType() );
- assertEquals( 1,
- eventC.getConstraint().getDescrs().size() );
- final FieldConstraintDescr fcdC = (FieldConstraintDescr) eventC.getConstraint().getDescrs().get( 0 );
- assertEquals( 1,
- fcdC.getRestrictions().size() );
- assertTrue( fcdC.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
- final VariableRestrictionDescr rc = (VariableRestrictionDescr) fcdC.getRestrictions().get( 0 );
- assertEquals( "finishes",
- rc.getEvaluator() );
- assertEquals( "$b",
- rc.getText() );
- assertNull( rc.getParameterText() );
- assertFalse( rc.isNegated() );
-
- final PatternDescr eventD = (PatternDescr) rule.getLhs().getDescrs().get( 3 );
- assertEquals( "$d",
- eventD.getIdentifier() );
- assertEquals( "EventD",
- eventD.getObjectType() );
- assertEquals( 1,
- eventD.getConstraint().getDescrs().size() );
- final FieldConstraintDescr fcdD = (FieldConstraintDescr) eventD.getConstraint().getDescrs().get( 0 );
- assertEquals( 1,
- fcdD.getRestrictions().size() );
- assertTrue( fcdD.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
- final VariableRestrictionDescr rd = (VariableRestrictionDescr) fcdD.getRestrictions().get( 0 );
- assertEquals( "starts",
- rd.getEvaluator() );
- assertEquals( "$a",
- rd.getText() );
- assertNull( rd.getParameterText() );
- assertTrue( rd.isNegated() );
-
- final PatternDescr eventE = (PatternDescr) rule.getLhs().getDescrs().get( 4 );
- assertEquals( "$e",
- eventE.getIdentifier() );
- assertEquals( "EventE",
- eventE.getObjectType() );
- assertEquals( 1,
- eventE.getConstraint().getDescrs().size() );
- final FieldConstraintDescr fcdE = (FieldConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );
- assertEquals( 1,
- fcdE.getRestrictions().size() );
- assertTrue( fcdE.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
- final VariableRestrictionDescr re = (VariableRestrictionDescr) fcdE.getRestrictions().get( 0 );
- assertEquals( "before",
- re.getEvaluator() );
- assertEquals( "$b",
- re.getText() );
- assertEquals( "1, 10",
- re.getParameterText() );
- assertTrue( re.isNegated() );
- }
-
- public void testTypeDeclaration() throws Exception {
- final DRLParser parser = parseResource( "declare_type.drl" );
- parser.compilation_unit();
-
- assertFalse( "Parser should not raise errors: " + parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- final PackageDescr pack = parser.getPackageDescr();
-
- final List<TypeDeclarationDescr> declarations = pack.getTypeDeclarations();
-
- assertEquals( 1,
- declarations.size() );
-
- final TypeDeclarationDescr descr = declarations.get( 0 );
- assertEquals( "event",
- descr.getAttribute( "type" ) );
- assertEquals( "org.drools.events.Call",
- descr.getAttribute( "class" ) );
- assertEquals( "duration",
- descr.getAttribute( "duration_attribute" ) );
- assertEquals( "pseudo",
- descr.getAttribute( "clock_strategy" ) );
- }
-
- public void testEntryPoint() throws Exception {
- final String text = "StockTick( symbol==\"ACME\") from entry-point StreamA";
- final CharStream charStream = new ANTLRStringStream( text );
- final DRLLexer lexer = new DRLLexer( charStream );
- final TokenStream tokenStream = new CommonTokenStream( lexer );
- final DRLParser parser = new DRLParser( tokenStream );
-
- PatternDescr pattern = (PatternDescr) parser.pattern_source();
- assertFalse( parser.getErrorMessages().toString(),
- parser.hasErrors() );
-
- assertEquals( 1,
- pattern.getDescrs().size() );
- FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
- assertEquals( "symbol",
- fcd.getFieldName() );
-
- assertNotNull( pattern.getSource() );
- EntryPointDescr entry = (EntryPointDescr) pattern.getSource();
- assertEquals( "StreamA",
- entry.getEntryId() );
- }
-
- private DRLParser parse(final String text) throws Exception {
- this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- return this.parser;
- }
-
- private DRLParser parse(final String source,
- final String text) throws Exception {
- this.parser = newParser( newTokenStream( newLexer( newCharStream( text ) ) ) );
- this.parser.setSource( source );
- return this.parser;
- }
-
- private Reader getReader(final String name) throws Exception {
- final InputStream in = getClass().getResourceAsStream( name );
-
- return new InputStreamReader( in );
- }
-
- private DRLParser parseResource(final String name) throws Exception {
-
- // System.err.println( getClass().getResource( name ) );
- final Reader reader = getReader( name );
-
- final StringBuffer text = new StringBuffer();
-
- final char[] buf = new char[1024];
- int len = 0;
-
- while ( (len = reader.read( buf )) >= 0 ) {
- text.append( buf,
- 0,
- len );
- }
-
- return parse( name,
- text.toString() );
- }
-
- private CharStream newCharStream(final String text) {
- return new ANTLRStringStream( text );
- }
-
- private DRLLexer newLexer(final CharStream charStream) {
- return new DRLLexer( charStream );
- }
-
- private TokenStream newTokenStream(final Lexer lexer) {
- return new CommonTokenStream( lexer );
- }
-
- private DRLParser newParser(final TokenStream tokenStream) {
- final DRLParser p = new DRLParser( tokenStream );
- //p.setParserDebug( true );
- return p;
- }
-
- private void assertEqualsIgnoreWhitespace(final String expected,
- final String actual) {
- final String cleanExpected = expected.replaceAll( "\\s+",
- "" );
- final String cleanActual = actual.replaceAll( "\\s+",
- "" );
-
- assertEquals( cleanExpected,
- cleanActual );
- }
-
- private void prettyPrintErrors() {
- final List msgs = this.parser.getErrorMessages();
- for ( final Iterator iter = msgs.iterator(); iter.hasNext(); ) {
- final String err = (String) iter.next();
- System.out.println( err );
-
- }
- }
-
+package org.drools.lang;
+
+/*
+ * Copyright 2005 JBoss Inc
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 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.
+ */
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.antlr.runtime.ANTLRStringStream;
+import org.antlr.runtime.CharStream;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.drools.compiler.DrlParser;
+import org.drools.lang.descr.AccessorDescr;
+import org.drools.lang.descr.AccumulateDescr;
+import org.drools.lang.descr.AndDescr;
+import org.drools.lang.descr.AttributeDescr;
+import org.drools.lang.descr.CollectDescr;
+import org.drools.lang.descr.EntryPointDescr;
+import org.drools.lang.descr.EvalDescr;
+import org.drools.lang.descr.ExistsDescr;
+import org.drools.lang.descr.FactTemplateDescr;
+import org.drools.lang.descr.FieldAccessDescr;
+import org.drools.lang.descr.FieldBindingDescr;
+import org.drools.lang.descr.FieldConstraintDescr;
+import org.drools.lang.descr.FieldTemplateDescr;
+import org.drools.lang.descr.ForallDescr;
+import org.drools.lang.descr.FromDescr;
+import org.drools.lang.descr.FunctionDescr;
+import org.drools.lang.descr.FunctionImportDescr;
+import org.drools.lang.descr.GlobalDescr;
+import org.drools.lang.descr.ImportDescr;
+import org.drools.lang.descr.LiteralRestrictionDescr;
+import org.drools.lang.descr.NotDescr;
+import org.drools.lang.descr.OrDescr;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.lang.descr.PatternDescr;
+import org.drools.lang.descr.PredicateDescr;
+import org.drools.lang.descr.QualifiedIdentifierRestrictionDescr;
+import org.drools.lang.descr.QueryDescr;
+import org.drools.lang.descr.RestrictionConnectiveDescr;
+import org.drools.lang.descr.ReturnValueRestrictionDescr;
+import org.drools.lang.descr.RuleDescr;
+import org.drools.lang.descr.VariableRestrictionDescr;
+
+public class RuleParserTest extends TestCase {
+
+ private DescrBuilderTree walker;
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ this.walker = null;
+ }
+
+ protected void tearDown() throws Exception {
+ this.walker = null;
+ super.tearDown();
+ }
+
+ public void testPackage_OneSegment() throws Exception {
+ final String packageName = (String) parse("package_statement","package_statement", "package foo" );
+ assertEquals( "foo",
+ packageName );
+ }
+
+ public void testPackage_MultipleSegments() throws Exception {
+ final String packageName = (String) parse("package_statement","package_statement", "package foo.bar.baz;" );
+ assertEquals( "foo.bar.baz",
+ packageName );
+ }
+
+ public void testEmptyPackage() throws Exception {
+ final String source = "package foo.bar.baz";
+ final DrlParser parser = new DrlParser();
+ final PackageDescr pkg = parser.parse( new StringReader( source ) );
+ assertFalse( parser.hasErrors() );
+ assertEquals( "foo.bar.baz",
+ pkg.getName() );
+ }
+
+ public void testCompilationUnit() throws Exception {
+ final String source = "package foo; import com.foo.Bar; import com.foo.Baz;";
+ parse("compilation_unit","compilation_unit", source );
+ assertEquals( "foo",
+ this.walker.getPackageDescr().getName() );
+ assertEquals( 2,
+ this.walker.getPackageDescr().getImports().size() );
+ ImportDescr impdescr = (ImportDescr) this.walker.getPackageDescr().getImports().get( 0 );
+ assertEquals( "com.foo.Bar",
+ impdescr.getTarget() );
+ assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
+ impdescr.getStartCharacter() );
+ assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
+ impdescr.getEndCharacter() );
+
+ impdescr = (ImportDescr) this.walker.getPackageDescr().getImports().get( 1 );
+ assertEquals( "com.foo.Baz",
+ impdescr.getTarget() );
+ assertEquals( source.indexOf( "import " + impdescr.getTarget() ),
+ impdescr.getStartCharacter() );
+ assertEquals( source.indexOf( "import " + impdescr.getTarget() ) + ("import " + impdescr.getTarget()).length() - 1,
+ impdescr.getEndCharacter() );
+ }
+
+ public void testEmptyRule() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "empty_rule.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "empty",
+ rule.getName() );
+ assertNotNull( rule.getLhs() );
+ assertNotNull( rule.getConsequence() );
+ }
+
+// //FIXME Keywords END and THEN should not be used as identifiers: try to enable it
+// public void testKeywordCollisions() throws Exception {
+// parseResource("compilation_unit","compilation_unit", "eol_funny_business.drl" );
+//
+// final PackageDescr pkg = walker.getPackageDescr();
+//
+// assertEquals( 1,
+// pkg.getRules().size() );
+// }
+
+
+ public void testTemplates() throws Exception {
+
+ parseResource("compilation_unit","compilation_unit", "test_Templates.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+
+ assertEquals( 1,
+ pkg.getRules().size() );
+ assertEquals( 2,
+ pkg.getFactTemplates().size() );
+
+ FactTemplateDescr fact1 = (FactTemplateDescr) pkg.getFactTemplates().get( 0 );
+ assertEquals( "Cheese",
+ fact1.getName() );
+ assertEquals( 2,
+ fact1.getFields().size() );
+
+ assertEquals( "name",
+ ((FieldTemplateDescr) fact1.getFields().get( 0 )).getName() );
+ assertEquals( "String",
+ ((FieldTemplateDescr) fact1.getFields().get( 0 )).getClassType() );
+
+ assertEquals( "age",
+ ((FieldTemplateDescr) fact1.getFields().get( 1 )).getName() );
+ assertEquals( "Integer",
+ ((FieldTemplateDescr) fact1.getFields().get( 1 )).getClassType() );
+
+ fact1 = null;
+
+ final FactTemplateDescr fact2 = (FactTemplateDescr) pkg.getFactTemplates().get( 1 );
+ assertEquals( "Wine",
+ fact2.getName() );
+ assertEquals( 3,
+ fact2.getFields().size() );
+
+ assertEquals( "name",
+ ((FieldTemplateDescr) fact2.getFields().get( 0 )).getName() );
+ assertEquals( "String",
+ ((FieldTemplateDescr) fact2.getFields().get( 0 )).getClassType() );
+
+ assertEquals( "year",
+ ((FieldTemplateDescr) fact2.getFields().get( 1 )).getName() );
+ assertEquals( "String",
+ ((FieldTemplateDescr) fact2.getFields().get( 1 )).getClassType() );
+
+ assertEquals( "accolades",
+ ((FieldTemplateDescr) fact2.getFields().get( 2 )).getName() );
+ assertEquals( "String[]",
+ ((FieldTemplateDescr) fact2.getFields().get( 2 )).getClassType() );
+ }
+
+ public void testTernaryExpression() throws Exception {
+
+ parseResource("compilation_unit","compilation_unit", "ternary_expression.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 1,
+ pkg.getRules().size() );
+
+ assertEqualsIgnoreWhitespace( "if (speed > speedLimit ? true : false;) pullEmOver();",
+ (String) rule.getConsequence() );
+ }
+
+ public void FIXME_testLatinChars() throws Exception {
+ final DrlParser parser = new DrlParser();
+ final Reader drl = new InputStreamReader( this.getClass().getResourceAsStream( "latin-sample.dslr" ) );
+ final Reader dsl = new InputStreamReader( this.getClass().getResourceAsStream( "latin.dsl" ) );
+
+ final PackageDescr pkg = parser.parse( drl,
+ dsl );
+
+ //MN: will get some errors due to the char encoding on my FC5 install
+ //others who use the right encoding may not see this, feel free to uncomment
+ //the following assertion.
+ assertFalse( parser.hasErrors() );
+
+ assertEquals( "br.com.auster.drools.sample",
+ pkg.getName() );
+ assertEquals( 1,
+ pkg.getRules().size() );
+
+ }
+
+ public void testFunctionWithArrays() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "function_arrays.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+
+ assertEquals( "foo",
+ pkg.getName() );
+ assertEquals( 1,
+ pkg.getRules().size() );
+
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+ assertEqualsIgnoreWhitespace( "yourFunction(new String[3] {\"a\",\"b\",\"c\"});",
+ (String) rule.getConsequence() );
+ final FunctionDescr func = (FunctionDescr) pkg.getFunctions().get( 0 );
+
+ assertEquals( "String[]",
+ func.getReturnType() );
+ assertEquals( "args[]",
+ func.getParameterNames().get( 0 ) );
+ assertEquals( "String",
+ func.getParameterTypes().get( 0 ) );
+ }
+
+ public void testAlmostEmptyRule() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "almost_empty_rule.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "almost_empty",
+ rule.getName() );
+ assertNotNull( rule.getLhs() );
+ assertEquals( "",
+ ((String) rule.getConsequence()).trim() );
+ }
+
+ public void testQuotedStringNameRule() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "quoted_string_name_rule.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "quoted string name",
+ rule.getName() );
+ assertNotNull( rule.getLhs() );
+ assertEquals( "",
+ ((String) rule.getConsequence()).trim() );
+ }
+
+ public void testNoLoop() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "no-loop.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "rule1",
+ rule.getName() );
+ final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+ assertEquals( "false",
+ att.getValue() );
+ assertEquals( "no-loop",
+ att.getName() );
+ }
+
+ public void testAutofocus() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "autofocus.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "rule1",
+ rule.getName() );
+ final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+ assertEquals( "true",
+ att.getValue() );
+ assertEquals( "auto-focus",
+ att.getName() );
+ }
+
+ public void testRuleFlowGroup() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "ruleflowgroup.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "rule1",
+ rule.getName() );
+ final AttributeDescr att = (AttributeDescr) rule.getAttributes().get( 0 );
+ assertEquals( "a group",
+ att.getValue() );
+ assertEquals( "ruleflow-group",
+ att.getName() );
+ }
+
+ public void testConsequenceWithDeclaration() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "declaration-in-consequence.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "myrule",
+ rule.getName() );
+
+ final String expected = "int i = 0; i = 1; i / 1; i == 1; i(i); i = 'i'; i.i.i; i\\i; i<i; i>i; i=\"i\"; ++i;" + "i++; --i; i--; i += i; i -= i; i *= i; i /= i;" + "int i = 5;" + "for(int j; j<i; ++j) {" + "System.out.println(j);}"
+ + "Object o = new String(\"Hello\");" + "String s = (String) o;";
+
+ assertEqualsIgnoreWhitespace( expected,
+ (String) rule.getConsequence() );
+ assertTrue( ((String) rule.getConsequence()).indexOf( "++" ) > 0 );
+ assertTrue( ((String) rule.getConsequence()).indexOf( "--" ) > 0 );
+ assertTrue( ((String) rule.getConsequence()).indexOf( "+=" ) > 0 );
+ assertTrue( ((String) rule.getConsequence()).indexOf( "==" ) > 0 );
+
+ //System.out.println(( String ) rule.getConsequence());
+ //note, need to assert that "i++" is preserved as is, no extra spaces.
+ }
+
+ public void testRuleParseLhs() throws Exception {
+ final String text = "Person(age < 42, location==\"atlanta\") \nor\nPerson(name==\"bob\") \n";
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+ }
+
+ public void testLiteralBoolAndNegativeNumbersRule() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "literal_bool_and_negative.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertNotNull( rule.getLhs() );
+ assertEqualsIgnoreWhitespace( "cons();",
+ (String) rule.getConsequence() );
+
+ final AndDescr lhs = rule.getLhs();
+ assertEquals( 3,
+ lhs.getDescrs().size() );
+
+ PatternDescr pattern = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+ AndDescr fieldAnd = (AndDescr) pattern.getConstraint();
+ FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+ LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "false",
+ lit.getText() );
+ assertEquals( "bar",
+ fld.getFieldName() );
+
+ pattern = (PatternDescr) lhs.getDescrs().get( 1 );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ fieldAnd = (AndDescr) pattern.getConstraint();
+ fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( ">",
+ lit.getEvaluator() );
+ assertEquals( "-42",
+ lit.getText() );
+ assertEquals( "boo",
+ fld.getFieldName() );
+
+ pattern = (PatternDescr) lhs.getDescrs().get( 2 );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ //lit = (LiteralDescr) col.getDescrs().get( 0 );
+
+ fieldAnd = (AndDescr) pattern.getConstraint();
+ fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( ">",
+ lit.getEvaluator() );
+ assertEquals( "-42.42",
+ lit.getText() );
+ assertEquals( "boo",
+ fld.getFieldName() );
+ }
+
+ public void testChunkWithoutParens() throws Exception {
+ String input = "( foo )";
+ ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+ assertEquals( "( foo )",
+ input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+ }
+
+ public void testChunkWithParens() throws Exception {
+ String input = "(fnord())";
+ ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+ assertEquals( "(fnord())",
+ input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+ }
+
+ public void testChunkWithParensAndQuotedString() throws Exception {
+ String input = "( fnord( \"cheese\" ) )";
+ ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+ assertEquals( "( fnord( \"cheese\" ) )",
+ input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+ }
+
+ public void testChunkWithRandomCharac5ters() throws Exception {
+ String input = "( %*9dkj)";
+ ReturnValueRestrictionDescr returnData = (ReturnValueRestrictionDescr) parse("paren_chunk", "fact_expression", input );
+
+ assertEquals( "( %*9dkj)",
+ input.substring(returnData.getStartCharacter(), returnData.getEndCharacter()));
+ }
+
+ public void testEmptyPattern() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "test_EmptyPattern.drl" );
+
+ final PackageDescr packageDescr = this.walker.getPackageDescr();
+ assertEquals( 1,
+ packageDescr.getRules().size() );
+ final RuleDescr ruleDescr = (RuleDescr) packageDescr.getRules().get( 0 );
+ assertEquals( "simple rule",
+ ruleDescr.getName() );
+ assertNotNull( ruleDescr.getLhs() );
+ assertEquals( 1,
+ ruleDescr.getLhs().getDescrs().size() );
+ final PatternDescr patternDescr = (PatternDescr) ruleDescr.getLhs().getDescrs().get( 0 );
+ assertEquals( 0,
+ patternDescr.getConstraint().getDescrs().size() ); //this may be null, not sure as the test doesn't get this far...
+ assertEquals( "Cheese",
+ patternDescr.getObjectType() );
+
+ }
+
+ public void testSimpleMethodCallWithFrom() throws Exception {
+
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "test_SimpleMethodCallWithFrom.drl" );
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FromDescr from = (FromDescr) pattern.getSource();
+ final AccessorDescr method = (AccessorDescr) from.getDataSource();
+
+ assertEquals( "something.doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
+ method.toString() );
+ }
+
+ public void testSimpleFunctionCallWithFrom() throws Exception {
+
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "test_SimpleFunctionCallWithFrom.drl" );
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FromDescr from = (FromDescr) pattern.getSource();
+ final AccessorDescr func = (AccessorDescr) from.getDataSource();
+
+ assertEquals( "doIt( foo,bar,42,\"hello\",{ a => \"b\", \"something\" => 42, \"a\" => foo, x => {x=>y}},\"end\", [a, \"b\", 42] )",
+ func.toString() );
+ }
+
+ public void testSimpleAccessorWithFrom() throws Exception {
+
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "test_SimpleAccessorWithFrom.drl" );
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FromDescr from = (FromDescr) pattern.getSource();
+ final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+ assertNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
+
+ assertEquals( "something.doIt",
+ accessor.toString() );
+ }
+
+ public void testSimpleAccessorAndArgWithFrom() throws Exception {
+
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "test_SimpleAccessorArgWithFrom.drl" );
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FromDescr from = (FromDescr) pattern.getSource();
+ final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+ assertNotNull( ((FieldAccessDescr) accessor.getInvokers().get( 0 )).getArgument() );
+
+ assertEquals( "something.doIt[\"key\"]",
+ accessor.toString() );
+ }
+
+ public void testComplexChainedAcessor() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "test_ComplexChainedCallWithFrom.drl" );
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FromDescr from = (FromDescr) pattern.getSource();
+ final AccessorDescr accessor = (AccessorDescr) from.getDataSource();
+
+ assertEquals( "doIt1( foo,bar,42,\"hello\",{ a => \"b\"}, [a, \"b\", 42] ).doIt2(bar, [a, \"b\", 42]).field[\"key\"]",
+ accessor.toString() );
+ }
+
+ // public void testFrom() throws Exception {
+ // final RuleDescr rule = parseResource( "from.drl" ).rule();
+ //
+ // if(parser.hasErrors()) {
+ // System.err.println(parser.getErrorMessages());
+ // }
+ // assertFalse(parser.hasErrors());
+ //
+ // assertNotNull( rule );
+ //
+ // assertEquals( "using_from",
+ // rule.getName() );
+ //
+ // assertEquals(9, rule.getLhs().getDescrs().size());
+ //
+ // FromDescr from = (FromDescr) rule.getLhs().getDescrs().get(0);
+ //
+ // assertEquals(3, from.getLine());
+ //
+ // assertEquals("Foo", from.getReturnedPattern().getObjectType());
+ // assertTrue(from.getDataSource() instanceof FieldAccessDescr);
+ // assertEquals("baz", ((FieldAccessDescr) from.getDataSource()).getFieldName());
+ // assertEquals("bar", ((FieldAccessDescr) from.getDataSource()).getVariableName());
+ //
+ //
+ // ArgumentValueDescr arg = null;
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(1);
+ // assertEquals("Foo", from.getReturnedPattern().getObjectType());
+ // assertEquals(0, from.getReturnedPattern().getDescrs().size());
+ // FieldAccessDescr fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+ // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+ // assertEquals(ArgumentValueDescr.STRING, arg.getType() );
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(2);
+ // fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+ // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+ // assertEquals(ArgumentValueDescr.VARIABLE, arg.getType() );
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(3);
+ // fieldAccess = ( FieldAccessDescr ) from.getDataSource();
+ // arg = ( ArgumentValueDescr ) fieldAccess.getArgument();
+ // assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType() );
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(4);
+ // assertEquals("Whee", from.getReturnedColumn().getObjectType());
+ // assertEquals(1, from.getReturnedColumn().getDescrs().size());
+ // assertTrue(from.getDataSource() instanceof FunctionCallDescr);
+ // assertEquals("whee", ((FunctionCallDescr) from.getDataSource()).getName());
+ // assertEquals(1, ((FunctionCallDescr) from.getDataSource()).getArguments().size());
+ // arg = ( (ArgumentValueDescr )((FunctionCallDescr) from.getDataSource()).getArguments().get(0));
+ // assertEquals("y", arg.getValue());
+ // assertEquals(ArgumentValueDescr.STRING, arg.getType());
+ //
+ // assertEquals(7, from.getLine());
+ // assertEquals(7, from.getReturnedColumn().getLine());
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(5);
+ // assertEquals("Foo", from.getReturnedColumn().getObjectType());
+ // assertEquals(1, from.getReturnedColumn().getDescrs().size());
+ // assertEquals("f", from.getReturnedColumn().getIdentifier());
+ // assertTrue(from.getDataSource() instanceof MethodAccessDescr);
+ // assertEquals("bar", ((MethodAccessDescr) from.getDataSource()).getVariableName());
+ // assertEquals("la", ((MethodAccessDescr) from.getDataSource()).getMethodName());
+ // assertEquals(1, ((MethodAccessDescr) from.getDataSource()).getArguments().size());
+ // arg = (ArgumentValueDescr) ((MethodAccessDescr) from.getDataSource()).getArguments().get(0);
+ //
+ //
+ // assertEquals("x", arg.getValue());
+ // assertEquals(ArgumentValueDescr.VARIABLE, arg.getType());
+ //
+ // assertEqualsIgnoreWhitespace("whee();", ( String ) rule.getConsequence());
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(6);
+ // assertEquals("wa", ((FunctionCallDescr)from.getDataSource()).getName());
+ //
+ // from = (FromDescr) rule.getLhs().getDescrs().get(7);
+ // MethodAccessDescr meth = (MethodAccessDescr)from.getDataSource();
+ // assertEquals("wa", meth.getMethodName());
+ // assertEquals("la", meth.getVariableName());
+ //
+ // arg = (ArgumentValueDescr) meth.getArguments().get(0);
+ // assertEquals("42", arg.getValue());
+ // assertEquals(ArgumentValueDescr.INTEGRAL, arg.getType());
+ //
+ // arg = (ArgumentValueDescr) meth.getArguments().get(1);
+ // assertEquals("42.42", arg.getValue());
+ // assertEquals(ArgumentValueDescr.DECIMAL, arg.getType());
+ //
+ // arg = (ArgumentValueDescr) meth.getArguments().get(2);
+ // assertEquals("false", arg.getValue());
+ // assertEquals(ArgumentValueDescr.BOOLEAN, arg.getType());
+ //
+ // arg = (ArgumentValueDescr) meth.getArguments().get(3);
+ // assertEquals("null", arg.getValue());
+ // assertEquals(ArgumentValueDescr.NULL, arg.getType());
+ //
+ // assertEquals("Bam", ((PatternDescr)rule.getLhs().getDescrs().get(8)).getObjectType());
+ // }
+
+ public void testSimpleRule() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "simple_rule.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ assertEquals( 7,
+ rule.getConsequenceLine() );
+ assertEquals( 2,
+ rule.getConsequencePattern() );
+
+ final AndDescr lhs = rule.getLhs();
+
+ assertNotNull( lhs );
+
+ assertEquals( 3,
+ lhs.getDescrs().size() );
+
+ //System.err.println( lhs.getDescrs() );
+
+ // Check first pattern
+ final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "foo3",
+ first.getIdentifier() );
+ assertEquals( "Bar",
+ first.getObjectType() );
+
+ assertEquals( 1,
+ first.getConstraint().getDescrs().size() );
+
+ AndDescr fieldAnd = (AndDescr) first.getConstraint();
+ FieldConstraintDescr fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 0 );
+ LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "3",
+ constraint.getText() );
+
+ // Check second pattern
+ final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+ assertEquals( "foo4",
+ second.getIdentifier() );
+ assertEquals( "Bar",
+ second.getObjectType() );
+
+ //System.err.println( second.getDescrs() );
+
+ fieldAnd = (AndDescr) second.getConstraint();
+ assertEquals( 2,
+ fieldAnd.getDescrs().size() );
+
+ final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) fieldAnd.getDescrs().get( 0 );
+ assertEquals( "a",
+ fieldBindingDescr.getFieldName() );
+ assertEquals( "a4",
+ fieldBindingDescr.getIdentifier() );
+
+ fld = (FieldConstraintDescr) fieldAnd.getDescrs().get( 1 );
+ constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "4",
+ constraint.getText() );
+
+ // Check third pattern
+ final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+ assertNull( third.getIdentifier() );
+ assertEquals( "Baz",
+ third.getObjectType() );
+
+ assertEqualsIgnoreWhitespace( "if ( a == b ) { " + " assert( foo3 );" + "} else {" + " retract( foo4 );" + "}" + " System.out.println( a4 );",
+ (String) rule.getConsequence() );
+ }
+
+ public void testRestrictionsMultiple() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "restrictions_test.drl" );
+
+ assertNotNull( rule );
+
+ assertEqualsIgnoreWhitespace( "consequence();",
+ (String) rule.getConsequence() );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ //The first pattern, with 2 restrictions on a single field (plus a connective)
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ AndDescr and = (AndDescr) pattern.getConstraint();
+ FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ assertEquals( RestrictionConnectiveDescr.AND,
+ ((RestrictionConnectiveDescr) fld.getRestriction()).getConnective() );
+ assertEquals( 2,
+ fld.getRestrictions().size() );
+ assertEquals( "age",
+ fld.getFieldName() );
+
+ LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( ">",
+ lit.getEvaluator() );
+ assertEquals( "30",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "40",
+ lit.getText() );
+
+ //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+ pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Vehicle",
+ pattern.getObjectType() );
+ assertEquals( 2,
+ pattern.getConstraint().getDescrs().size() );
+
+ and = (AndDescr) pattern.getConstraint();
+ fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( 1,
+ fld.getRestrictions().size() );
+ RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
+ assertEquals( RestrictionConnectiveDescr.OR,
+ or.getConnective() );
+ assertEquals( 2,
+ or.getRestrictions().size() );
+ lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "sedan",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "wagon",
+ lit.getText() );
+
+ //now the second field
+ fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+ assertEquals( 1,
+ fld.getRestrictions().size() );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "3",
+ lit.getText() );
+
+ }
+
+ public void testLineNumberInAST() throws Exception {
+ //also see testSimpleExpander to see how this works with an expander (should be the same).
+
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "simple_rule.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ assertEquals( 7,
+ rule.getConsequenceLine() );
+ assertEquals( 2,
+ rule.getConsequencePattern() );
+
+ final AndDescr lhs = rule.getLhs();
+
+ assertNotNull( lhs );
+
+ assertEquals( 3,
+ lhs.getDescrs().size() );
+
+ // Check first pattern
+ final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "foo3",
+ first.getIdentifier() );
+ assertEquals( "Bar",
+ first.getObjectType() );
+ assertEquals( 1,
+ first.getConstraint().getDescrs().size() );
+
+ // Check second pattern
+ final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+ assertEquals( "foo4",
+ second.getIdentifier() );
+ assertEquals( "Bar",
+ second.getObjectType() );
+
+ final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+ assertEquals( "Baz",
+ third.getObjectType() );
+
+ assertEquals( 4,
+ first.getLine() );
+ assertEquals( 5,
+ second.getLine() );
+ assertEquals( 6,
+ third.getLine() );
+ }
+
+ public void testLineNumberIncludingCommentsInRHS() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "test_CommentLineNumbersInConsequence.drl" );
+
+ final String rhs = (String) ((RuleDescr) this.walker.getPackageDescr().getRules().get( 0 )).getConsequence();
+ String expected = " \t//woot\n \tfirst\n \t\n \t//\n \t\n \t/* lala\n \t\n \t*/\n \tsecond \n";
+ assertEquals( expected,
+ rhs );
+ }
+
+ public void testLhsSemicolonDelim() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "lhs_semicolon_delim.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ final AndDescr lhs = rule.getLhs();
+
+ assertNotNull( lhs );
+
+ assertEquals( 3,
+ lhs.getDescrs().size() );
+
+ //System.err.println( lhs.getDescrs() );
+
+ // Check first pattern
+ final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "foo3",
+ first.getIdentifier() );
+ assertEquals( "Bar",
+ first.getObjectType() );
+
+ assertEquals( 1,
+ first.getConstraint().getDescrs().size() );
+
+ //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
+ AndDescr and = (AndDescr) first.getConstraint();
+ FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "3",
+ constraint.getText() );
+
+ // Check second pattern
+ final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+ assertEquals( "foo4",
+ second.getIdentifier() );
+ assertEquals( "Bar",
+ second.getObjectType() );
+
+ and = (AndDescr) second.getConstraint();
+ assertEquals( 2,
+ and.getDescrs().size() );
+
+ //System.err.println( second.getDescrs() );
+
+ final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
+ assertEquals( "a",
+ fieldBindingDescr.getFieldName() );
+ assertEquals( "a4",
+ fieldBindingDescr.getIdentifier() );
+
+ fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+
+ constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "4",
+ constraint.getText() );
+
+ // Check third pattern
+ final PatternDescr third = (PatternDescr) lhs.getDescrs().get( 2 );
+ assertNull( third.getIdentifier() );
+ assertEquals( "Baz",
+ third.getObjectType() );
+
+ assertEqualsIgnoreWhitespace( "if ( a == b ) { " + " assert( foo3 );" + "} else {" + " retract( foo4 );" + "}" + " System.out.println( a4 );",
+ (String) rule.getConsequence() );
+ }
+
+ public void testNotNode() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "rule_not.drl" );
+
+ assertNotNull( rule );
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ final AndDescr lhs = rule.getLhs();
+ assertEquals( 1,
+ lhs.getDescrs().size() );
+ final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
+ assertEquals( 1,
+ not.getDescrs().size() );
+ final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+ assertEquals( "Cheese",
+ pattern.getObjectType() );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ final AndDescr and = (AndDescr) pattern.getConstraint();
+ final FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ final LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "stilton",
+ lit.getText() );
+ assertEquals( "type",
+ fld.getFieldName() );
+ }
+
+ public void testFunctionImport() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "test_FunctionImport.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+ assertEquals( 2,
+ pkg.getFunctionImports().size() );
+
+ assertEquals( "abd.def.x",
+ ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getTarget() );
+ assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getStartCharacter() == -1 );
+ assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 0 )).getEndCharacter() == -1 );
+ assertEquals( "qed.wah.*",
+ ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getTarget() );
+ assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getStartCharacter() == -1 );
+ assertFalse( ((FunctionImportDescr) pkg.getFunctionImports().get( 1 )).getEndCharacter() == -1 );
+ }
+
+ public void testNotExistWithBrackets() throws Exception {
+
+ parseResource("compilation_unit","compilation_unit", "not_exist_with_brackets.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+ assertNotNull( rule );
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ final AndDescr lhs = rule.getLhs();
+ assertEquals( 2,
+ lhs.getDescrs().size() );
+ final NotDescr not = (NotDescr) lhs.getDescrs().get( 0 );
+ assertEquals( 1,
+ not.getDescrs().size() );
+ final PatternDescr pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+ assertEquals( "Cheese",
+ pattern.getObjectType() );
+
+ final ExistsDescr ex = (ExistsDescr) lhs.getDescrs().get( 1 );
+ assertEquals( 1,
+ ex.getDescrs().size() );
+ final PatternDescr exPattern = (PatternDescr) ex.getDescrs().get( 0 );
+ assertEquals( "Foo",
+ exPattern.getObjectType() );
+ }
+
+
+ public void testSimpleQuery() throws Exception {
+ final QueryDescr query = (QueryDescr) parseResource("query", "query", "simple_query.drl" );
+
+ assertNotNull( query );
+
+ assertEquals( "simple_query",
+ query.getName() );
+
+ final AndDescr lhs = query.getLhs();
+
+ assertNotNull( lhs );
+
+ assertEquals( 3,
+ lhs.getDescrs().size() );
+
+ // Check first pattern
+ final PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "foo3",
+ first.getIdentifier() );
+ assertEquals( "Bar",
+ first.getObjectType() );
+
+ assertEquals( 1,
+ first.getConstraint().getDescrs().size() );
+
+ AndDescr and = (AndDescr) first.getConstraint();
+ FieldConstraintDescr fld = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ LiteralRestrictionDescr constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ //LiteralDescr constraint = (LiteralDescr) first.getDescrs().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "3",
+ constraint.getText() );
+
+ // Check second pattern
+ final PatternDescr second = (PatternDescr) lhs.getDescrs().get( 1 );
+ assertEquals( "foo4",
+ second.getIdentifier() );
+ assertEquals( "Bar",
+ second.getObjectType() );
+
+ and = (AndDescr) second.getConstraint();
+ assertEquals( 2,
+ and.getDescrs().size() );
+ //check it has field bindings.
+ final FieldBindingDescr fieldBindingDescr = (FieldBindingDescr) and.getDescrs().get( 0 );
+ assertEquals( "a",
+ fieldBindingDescr.getFieldName() );
+ assertEquals( "a4",
+ fieldBindingDescr.getIdentifier() );
+
+ fld = (FieldConstraintDescr) and.getDescrs().get( 1 );
+
+ constraint = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertNotNull( constraint );
+
+ assertEquals( "a",
+ fld.getFieldName() );
+ assertEquals( "==",
+ constraint.getEvaluator() );
+ assertEquals( "4",
+ constraint.getText() );
+ }
+
+ public void testQueryRuleMixed() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "query_and_rule.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 4,
+ pack.getRules().size() ); //as queries are rules
+ RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( "bar",
+ rule.getName() );
+
+ QueryDescr query = (QueryDescr) pack.getRules().get( 1 );
+ assertEquals( "simple_query",
+ query.getName() );
+
+ rule = (RuleDescr) pack.getRules().get( 2 );
+ assertEquals( "bar2",
+ rule.getName() );
+
+ query = (QueryDescr) pack.getRules().get( 3 );
+ assertEquals( "simple_query2",
+ query.getName() );
+ }
+
+ public void testMultipleRules() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "multiple_rules.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+ final List rules = pkg.getRules();
+
+ assertEquals( 2,
+ rules.size() );
+
+ final RuleDescr rule0 = (RuleDescr) rules.get( 0 );
+ assertEquals( "Like Stilton",
+ rule0.getName() );
+
+ final RuleDescr rule1 = (RuleDescr) rules.get( 1 );
+ assertEquals( "Like Cheddar",
+ rule1.getName() );
+
+ //checkout the first rule
+ AndDescr lhs = rule1.getLhs();
+ assertNotNull( lhs );
+ assertEquals( 1,
+ lhs.getDescrs().size() );
+ assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
+ (String) rule0.getConsequence() );
+
+ // Check first pattern
+ PatternDescr first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "Cheese",
+ first.getObjectType() );
+
+ //checkout the second rule
+ lhs = rule1.getLhs();
+ assertNotNull( lhs );
+ assertEquals( 1,
+ lhs.getDescrs().size() );
+ assertEqualsIgnoreWhitespace( "System.out.println(\"I like \" + t);",
+ (String) rule1.getConsequence() );
+
+ // Check first pattern
+ first = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "Cheese",
+ first.getObjectType() );
+ }
+
+ public void testExpanderLineSpread() throws Exception {
+ final DrlParser parser = new DrlParser();
+ final PackageDescr pkg = parser.parse( this.getReader( "expander_spread_lines.dslr" ),
+ this.getReader( "complex.dsl" ) );
+
+ assertFalse( parser.getErrors().toString(),
+ parser.hasErrors() );
+
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+ assertNotNull( (String) rule.getConsequence() );
+
+ }
+
+ public void testExpanderMultipleConstraints() throws Exception {
+ final DrlParser parser = new DrlParser();
+ final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints.dslr" ),
+ this.getReader( "multiple_constraints.dsl" ) );
+
+ assertFalse( parser.getErrors().toString(),
+ parser.hasErrors() );
+
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ pattern.getObjectType() );
+
+ assertEquals( 2,
+ pattern.getConstraint().getDescrs().size() );
+ assertEquals( "age",
+ ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
+ assertEquals( "location",
+ ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
+
+ pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Bar",
+ pattern.getObjectType() );
+
+ assertNotNull( (String) rule.getConsequence() );
+
+ }
+
+ public void testExpanderMultipleConstraintsFlush() throws Exception {
+ final DrlParser parser = new DrlParser();
+ //this is similar to the other test, but it requires a flush to add the constraints
+ final PackageDescr pkg = parser.parse( this.getReader( "expander_multiple_constraints_flush.dslr" ),
+ this.getReader( "multiple_constraints.dsl" ) );
+
+ assertFalse( parser.getErrors().toString(),
+ parser.hasErrors() );
+
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ pattern.getObjectType() );
+
+ assertEquals( 2,
+ pattern.getConstraint().getDescrs().size() );
+ assertEquals( "age",
+ ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 )).getFieldName() );
+ assertEquals( "location",
+ ((FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 )).getFieldName() );
+
+ assertNotNull( (String) rule.getConsequence() );
+
+ }
+
+ // public void testExpanderUnExpandableErrorLines() throws Exception {
+ //
+ // //stubb expander
+ // final ExpanderResolver res = new ExpanderResolver() {
+ // public Expander get(String name,
+ // String config) {
+ // return new Expander() {
+ // public String expand(String scope,
+ // String pattern) {
+ // if ( pattern.startsWith( "Good" ) ) {
+ // return pattern;
+ // } else {
+ // throw new IllegalArgumentException( "whoops" );
+ // }
+ //
+ // }
+ // };
+ // }
+ // };
+ //
+ // final DRLParser parser = parseResource( "expander_line_errors.dslr" );
+ // parser.setExpanderResolver( res );
+ // parser.compilation_unit();
+ // assertTrue( parser.hasErrors() );
+ //
+ // final List messages = parser.getErrorMessages();
+ // assertEquals( messages.size(),
+ // parser.getErrors().size() );
+ //
+ // assertEquals( 4,
+ // parser.getErrors().size() );
+ // assertEquals( ExpanderException.class,
+ // parser.getErrors().get( 0 ).getClass() );
+ // assertEquals( 8,
+ // ((RecognitionException) parser.getErrors().get( 0 )).line );
+ // assertEquals( 10,
+ // ((RecognitionException) parser.getErrors().get( 1 )).line );
+ // assertEquals( 12,
+ // ((RecognitionException) parser.getErrors().get( 2 )).line );
+ // assertEquals( 13,
+ // ((RecognitionException) parser.getErrors().get( 3 )).line );
+ //
+ // final PackageDescr pack = parser.getPackageDescr();
+ // assertNotNull( pack );
+ //
+ // final ExpanderException ex = (ExpanderException) parser.getErrors().get( 0 );
+ // assertTrue( ex.getMessage().indexOf( "whoops" ) > -1 );
+ //
+ // }
+
+ public void testBasicBinding() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "basic_binding.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+ final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
+
+ final AndDescr lhs = ruleDescr.getLhs();
+ assertEquals( 1,
+ lhs.getDescrs().size() );
+ final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( 1,
+ cheese.getConstraint().getDescrs().size() );
+ assertEquals( "Cheese",
+ cheese.getObjectType() );
+ assertEquals( 1,
+ lhs.getDescrs().size() );
+ final FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
+ assertEquals( "type",
+ fieldBinding.getFieldName() );
+ }
+
+ public void testBoundVariables() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "bindings.drl" );
+
+ final PackageDescr pkg = walker.getPackageDescr();
+ final RuleDescr ruleDescr = (RuleDescr) pkg.getRules().get( 0 );
+
+ final AndDescr lhs = ruleDescr.getLhs();
+ assertEquals( 2,
+ lhs.getDescrs().size() );
+ final PatternDescr cheese = (PatternDescr) lhs.getDescrs().get( 0 );
+ assertEquals( "Cheese",
+ cheese.getObjectType() );
+ assertEquals( 2,
+ lhs.getDescrs().size() );
+ FieldBindingDescr fieldBinding = (FieldBindingDescr) cheese.getConstraint().getDescrs().get( 0 );
+ assertEquals( "type",
+ fieldBinding.getFieldName() );
+
+ FieldConstraintDescr fld = (FieldConstraintDescr) cheese.getConstraint().getDescrs().get( 1 );
+ LiteralRestrictionDescr literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ //LiteralDescr literalDescr = (LiteralDescr) cheese.getDescrs().get( 1 );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( "==",
+ literalDescr.getEvaluator() );
+ assertEquals( "stilton",
+ literalDescr.getText() );
+
+ final PatternDescr person = (PatternDescr) lhs.getDescrs().get( 1 );
+ fieldBinding = (FieldBindingDescr) person.getConstraint().getDescrs().get( 0 );
+ assertEquals( "name",
+ fieldBinding.getFieldName() );
+
+ fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 1 );
+ literalDescr = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "name",
+ fld.getFieldName() );
+ assertEquals( "==",
+ literalDescr.getEvaluator() );
+ assertEquals( "bob",
+ literalDescr.getText() );
+
+ fld = (FieldConstraintDescr) person.getConstraint().getDescrs().get( 2 );
+ final VariableRestrictionDescr variableDescr = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "likes",
+ fld.getFieldName() );
+ assertEquals( "==",
+ variableDescr.getEvaluator() );
+ assertEquals( "$type",
+ variableDescr.getIdentifier() );
+ }
+
+ public void testOrNesting() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "or_nesting.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertNotNull( pack );
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+
+ final PatternDescr first = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Person",
+ first.getObjectType() );
+
+ final AndDescr and = (AndDescr) or.getDescrs().get( 1 );
+ assertEquals( 2,
+ and.getDescrs().size() );
+
+ final PatternDescr left = (PatternDescr) and.getDescrs().get( 0 );
+ assertEquals( "Person",
+ left.getObjectType() );
+
+ final PatternDescr right = (PatternDescr) and.getDescrs().get( 1 );
+ assertEquals( "Cheese",
+ right.getObjectType() );
+ }
+
+ /** Test that explicit "&&", "||" works as expected */
+ public void testAndOrRules() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "and_or_rule.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertNotNull( pack );
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( "simple_rule",
+ rule.getName() );
+
+ //we will have 2 children under the main And node
+ final AndDescr and = rule.getLhs();
+ assertEquals( 2,
+ and.getDescrs().size() );
+
+ //check the "&&" part
+ final AndDescr join = (AndDescr) and.getDescrs().get( 0 );
+ assertEquals( 2,
+ join.getDescrs().size() );
+
+ PatternDescr left = (PatternDescr) join.getDescrs().get( 0 );
+ PatternDescr right = (PatternDescr) join.getDescrs().get( 1 );
+ assertEquals( "Person",
+ left.getObjectType() );
+ assertEquals( "Cheese",
+ right.getObjectType() );
+
+ assertEquals( 1,
+ left.getConstraint().getDescrs().size() );
+
+ FieldConstraintDescr fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
+ LiteralRestrictionDescr literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ literal.getEvaluator() );
+ assertEquals( "name",
+ fld.getFieldName() );
+ assertEquals( "mark",
+ literal.getText() );
+
+ assertEquals( 1,
+ right.getConstraint().getDescrs().size() );
+
+ fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
+ literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ literal.getEvaluator() );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( "stilton",
+ literal.getText() );
+
+ //now the "||" part
+ final OrDescr or = (OrDescr) and.getDescrs().get( 1 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+ left = (PatternDescr) or.getDescrs().get( 0 );
+ right = (PatternDescr) or.getDescrs().get( 1 );
+ assertEquals( "Person",
+ left.getObjectType() );
+ assertEquals( "Cheese",
+ right.getObjectType() );
+ assertEquals( 1,
+ left.getConstraint().getDescrs().size() );
+
+ fld = (FieldConstraintDescr) left.getConstraint().getDescrs().get( 0 );
+ literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ literal.getEvaluator() );
+ assertEquals( "name",
+ fld.getFieldName() );
+ assertEquals( "mark",
+ literal.getText() );
+
+ assertEquals( 1,
+ right.getConstraint().getDescrs().size() );
+
+ fld = (FieldConstraintDescr) right.getConstraint().getDescrs().get( 0 );
+ literal = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "==",
+ literal.getEvaluator() );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( "stilton",
+ literal.getText() );
+
+ assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" );",
+ (String) rule.getConsequence() );
+ }
+
+ /** test basic foo : Fact() || Fact() stuff */
+ public void testOrWithBinding() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "or_binding.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+
+ final PatternDescr leftPattern = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Person",
+ leftPattern.getObjectType() );
+ assertEquals( "foo",
+ leftPattern.getIdentifier() );
+
+ final PatternDescr rightPattern = (PatternDescr) or.getDescrs().get( 1 );
+ assertEquals( "Person",
+ rightPattern.getObjectType() );
+ assertEquals( "foo",
+ rightPattern.getIdentifier() );
+
+ final PatternDescr cheeseDescr = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Cheese",
+ cheeseDescr.getObjectType() );
+ assertEquals( null,
+ cheeseDescr.getIdentifier() );
+
+ assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+ (String) rule.getConsequence() );
+ }
+
+ /** test basic foo : Fact() || Fact() stuff binding to an "or"*/
+ public void testOrBindingComplex() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "or_binding_complex.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+
+ //first fact
+ final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Person",
+ firstFact.getObjectType() );
+ assertEquals( "foo",
+ firstFact.getIdentifier() );
+
+ //second "option"
+ final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 1 );
+ assertEquals( "Person",
+ secondFact.getObjectType() );
+ assertEquals( 1,
+ secondFact.getConstraint().getDescrs().size() );
+ assertEquals( "foo",
+ secondFact.getIdentifier() );
+
+ assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+ (String) rule.getConsequence() );
+ }
+
+ public void testOrBindingWithBrackets() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "or_binding_with_brackets.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+
+ //first fact
+ final PatternDescr firstFact = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Person",
+ firstFact.getObjectType() );
+ assertEquals( "foo",
+ firstFact.getIdentifier() );
+
+ //second "option"
+ final PatternDescr secondFact = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Person",
+ secondFact.getObjectType() );
+ assertEquals( "foo",
+ secondFact.getIdentifier() );
+
+ assertEqualsIgnoreWhitespace( "System.out.println( \"Mark and Michael\" + bar );",
+ (String) rule.getConsequence() );
+ }
+
+ /** */
+ public void testBracketsPrecedence() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "brackets_precedence.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final AndDescr rootAnd = (AndDescr) rule.getLhs().getDescrs().get( 0 );
+
+ assertEquals( 2,
+ rootAnd.getDescrs().size() );
+
+ final OrDescr leftOr = (OrDescr) rootAnd.getDescrs().get( 0 );
+
+ assertEquals( 2,
+ leftOr.getDescrs().size() );
+ final NotDescr not = (NotDescr) leftOr.getDescrs().get( 0 );
+ final PatternDescr foo1 = (PatternDescr) not.getDescrs().get( 0 );
+ assertEquals( "Foo",
+ foo1.getObjectType() );
+ final PatternDescr foo2 = (PatternDescr) leftOr.getDescrs().get( 1 );
+ assertEquals( "Foo",
+ foo2.getObjectType() );
+
+ final OrDescr rightOr = (OrDescr) rootAnd.getDescrs().get( 1 );
+
+ assertEquals( 2,
+ rightOr.getDescrs().size() );
+ final PatternDescr shoes = (PatternDescr) rightOr.getDescrs().get( 0 );
+ assertEquals( "Shoes",
+ shoes.getObjectType() );
+ final PatternDescr butt = (PatternDescr) rightOr.getDescrs().get( 1 );
+ assertEquals( "Butt",
+ butt.getObjectType() );
+ }
+
+ public void testEvalMultiple() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "eval_multiple.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 4,
+ rule.getLhs().getDescrs().size() );
+
+ final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEqualsIgnoreWhitespace( "abc(\"foo\") + 5",
+ (String) eval.getContent() );
+
+ final PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Foo",
+ pattern.getObjectType() );
+
+ }
+
+ public void testWithEval() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "with_eval.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 3,
+ rule.getLhs().getDescrs().size() );
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Foo",
+ pattern.getObjectType() );
+ pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Bar",
+ pattern.getObjectType() );
+
+ final EvalDescr eval = (EvalDescr) rule.getLhs().getDescrs().get( 2 );
+ assertEqualsIgnoreWhitespace( "abc(\"foo\")",
+ (String) eval.getContent() );
+ assertEqualsIgnoreWhitespace( "Kapow",
+ (String) rule.getConsequence() );
+ }
+
+ public void testWithRetval() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "with_retval.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+ final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( 1,
+ col.getConstraint().getDescrs().size() );
+ assertEquals( "Foo",
+ col.getObjectType() );
+ final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
+ final ReturnValueRestrictionDescr retval = (ReturnValueRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "a + b",
+ retval.getContent() );
+ assertEquals( "name",
+ fld.getFieldName() );
+ assertEquals( "==",
+ retval.getEvaluator() );
+ }
+
+ public void testWithPredicate() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "with_predicate.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+ final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ AndDescr and = (AndDescr) col.getConstraint();
+ assertEquals( 2,
+ and.getDescrs().size() );
+
+ final FieldBindingDescr field = (FieldBindingDescr) and.getDescrs().get( 0 );
+ final PredicateDescr pred = (PredicateDescr) and.getDescrs().get( 1 );
+ assertEquals( "age",
+ field.getFieldName() );
+ assertEquals( "$age2",
+ field.getIdentifier() );
+ assertEqualsIgnoreWhitespace( "$age2 == $age1+2",
+ (String) pred.getContent() );
+ }
+
+ public void testNotWithConstraint() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "not_with_constraint.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final FieldBindingDescr fieldBinding = (FieldBindingDescr) pattern.getConstraint().getDescrs().get( 0 );
+ assertEquals( "$likes",
+ fieldBinding.getIdentifier() );
+
+ final NotDescr not = (NotDescr) rule.getLhs().getDescrs().get( 1 );
+ pattern = (PatternDescr) not.getDescrs().get( 0 );
+
+ final FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ final VariableRestrictionDescr boundVariable = (VariableRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( "==",
+ boundVariable.getEvaluator() );
+ assertEquals( "$likes",
+ boundVariable.getIdentifier() );
+ }
+
+ public void testGlobal() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "globals.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ assertEquals( 1,
+ pack.getImports().size() );
+ assertEquals( 2,
+ pack.getGlobals().size() );
+
+ final GlobalDescr foo = (GlobalDescr) pack.getGlobals().get( 0 );
+ assertEquals( "java.lang.String",
+ foo.getType() );
+ assertEquals( "foo",
+ foo.getIdentifier() );
+ final GlobalDescr bar = (GlobalDescr) pack.getGlobals().get( 1 );
+ assertEquals( "java.lang.Integer",
+ bar.getType() );
+ assertEquals( "bar",
+ bar.getIdentifier() );
+ }
+
+ public void testFunctions() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "functions.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 2,
+ pack.getRules().size() );
+
+ final List functions = pack.getFunctions();
+ assertEquals( 2,
+ functions.size() );
+
+ FunctionDescr func = (FunctionDescr) functions.get( 0 );
+ assertEquals( "functionA",
+ func.getName() );
+ assertEquals( "String",
+ func.getReturnType() );
+ assertEquals( 2,
+ func.getParameterNames().size() );
+ assertEquals( 2,
+ func.getParameterTypes().size() );
+ assertEquals( 4,
+ func.getLine() );
+ assertEquals( 0,
+ func.getColumn() );
+
+ assertEquals( "String",
+ func.getParameterTypes().get( 0 ) );
+ assertEquals( "s",
+ func.getParameterNames().get( 0 ) );
+
+ assertEquals( "Integer",
+ func.getParameterTypes().get( 1 ) );
+ assertEquals( "i",
+ func.getParameterNames().get( 1 ) );
+
+ assertEqualsIgnoreWhitespace( "foo();",
+ func.getText() );
+
+ func = (FunctionDescr) functions.get( 1 );
+ assertEquals( "functionB",
+ func.getName() );
+ assertEqualsIgnoreWhitespace( "bar();",
+ func.getText() );
+ }
+
+ public void testComment() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "comment.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertNotNull( pack );
+
+ assertEquals( "foo.bar",
+ pack.getName() );
+ }
+
+ public void testAttributes() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "rule_attributes.drl" );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEqualsIgnoreWhitespace( "bar();",
+ (String) rule.getConsequence() );
+
+ final List attrs = rule.getAttributes();
+ assertEquals( 6,
+ attrs.size() );
+
+ AttributeDescr at = (AttributeDescr) attrs.get( 0 );
+ assertEquals( "salience",
+ at.getName() );
+ assertEquals( "42",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 1 );
+ assertEquals( "agenda-group",
+ at.getName() );
+ assertEquals( "my_group",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 2 );
+ assertEquals( "no-loop",
+ at.getName() );
+ assertEquals( "true",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 3 );
+ assertEquals( "duration",
+ at.getName() );
+ assertEquals( "42",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 4 );
+ assertEquals( "activation-group",
+ at.getName() );
+ assertEquals( "my_activation_group",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 5 );
+ assertEquals( "lock-on-active",
+ at.getName() );
+ assertEquals( "true",
+ at.getValue() );
+ }
+
+ public void testAttributes_alternateSyntax() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "rule_attributes_alt.drl" );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEqualsIgnoreWhitespace( "bar();",
+ (String) rule.getConsequence() );
+
+ final List attrs = rule.getAttributes();
+ assertEquals( 6,
+ attrs.size() );
+
+ AttributeDescr at = (AttributeDescr) attrs.get( 0 );
+ assertEquals( "salience",
+ at.getName() );
+ assertEquals( "42",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 1 );
+ assertEquals( "agenda-group",
+ at.getName() );
+ assertEquals( "my_group",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 2 );
+ assertEquals( "no-loop",
+ at.getName() );
+ assertEquals( "true",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 3 );
+ assertEquals( "lock-on-active",
+ at.getName() );
+ assertEquals( "true",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 4 );
+ assertEquals( "duration",
+ at.getName() );
+ assertEquals( "42",
+ at.getValue() );
+
+ at = (AttributeDescr) attrs.get( 5 );
+ assertEquals( "activation-group",
+ at.getName() );
+ assertEquals( "my_activation_group",
+ at.getValue() );
+ }
+
+ public void testEnumeration() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "enumeration.drl" );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+ final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Foo",
+ col.getObjectType() );
+ assertEquals( 1,
+ col.getConstraint().getDescrs().size() );
+ final FieldConstraintDescr fld = (FieldConstraintDescr) col.getConstraint().getDescrs().get( 0 );
+ final QualifiedIdentifierRestrictionDescr lit = (QualifiedIdentifierRestrictionDescr) fld.getRestrictions().get( 0 );
+
+ assertEquals( "bar",
+ fld.getFieldName() );
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "Foo.BAR",
+ lit.getText() );
+ }
+ public void testExtraLhsNewline() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "extra_lhs_newline.drl" );
+ }
+
+ public void testSoundsLike() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "soundslike_operator.drl" );
+
+ RuleDescr rule = (RuleDescr) this.walker.getPackageDescr().getRules().get( 0 );
+ PatternDescr pat = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+
+ pat.getConstraint();
+ }
+
+ public void testPackageAttributes() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "package_attributes.drl" );
+
+ PackageDescr pkg = this.walker.getPackageDescr();
+ AttributeDescr at = (AttributeDescr) pkg.getAttributes().get( 0 );
+ assertEquals( "agenda-group",
+ at.getName() );
+ assertEquals( "x",
+ at.getValue() );
+ at = (AttributeDescr) pkg.getAttributes().get( 1 );
+ assertEquals( "dialect",
+ at.getName() );
+ assertEquals( "java",
+ at.getValue() );
+
+ assertEquals( 2,
+ pkg.getRules().size() );
+
+ assertEquals( 2,
+ pkg.getImports().size() );
+
+ RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( "bar",
+ rule.getName() );
+ at = (AttributeDescr) rule.getAttributes().get( 0 );
+ assertEquals( "agenda-group",
+ at.getName() );
+ assertEquals( "x",
+ at.getValue() );
+ at = (AttributeDescr) rule.getAttributes().get( 1 );
+ assertEquals( "dialect",
+ at.getName() );
+ assertEquals( "java",
+ at.getValue() );
+
+ rule = (RuleDescr) pkg.getRules().get( 1 );
+ assertEquals( "baz",
+ rule.getName() );
+ at = (AttributeDescr) rule.getAttributes().get( 0 );
+ assertEquals( "dialect",
+ at.getName() );
+ assertEquals( "mvel",
+ at.getValue() );
+ at = (AttributeDescr) rule.getAttributes().get( 1 );
+ assertEquals( "agenda-group",
+ at.getName() );
+ assertEquals( "x",
+ at.getValue() );
+
+ }
+
+ public void testStatementOrdering1() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "statement_ordering_1.drl" );
+
+ final PackageDescr pkg = this.walker.getPackageDescr();
+
+ assertEquals( 2,
+ pkg.getRules().size() );
+
+ assertEquals( "foo",
+ ((RuleDescr) pkg.getRules().get( 0 )).getName() );
+ assertEquals( "bar",
+ ((RuleDescr) pkg.getRules().get( 1 )).getName() );
+
+ assertEquals( 2,
+ pkg.getFunctions().size() );
+
+ assertEquals( "cheeseIt",
+ ((FunctionDescr) pkg.getFunctions().get( 0 )).getName() );
+ assertEquals( "uncheeseIt",
+ ((FunctionDescr) pkg.getFunctions().get( 1 )).getName() );
+
+ assertEquals( 4,
+ pkg.getImports().size() );
+ assertEquals( "im.one",
+ ((ImportDescr) pkg.getImports().get( 0 )).getTarget() );
+ assertEquals( "im.two",
+ ((ImportDescr) pkg.getImports().get( 1 )).getTarget() );
+ assertEquals( "im.three",
+ ((ImportDescr) pkg.getImports().get( 2 )).getTarget() );
+ assertEquals( "im.four",
+ ((ImportDescr) pkg.getImports().get( 3 )).getTarget() );
+ }
+
+ public void testRuleNamesStartingWithNumbers() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "rule_names_number_prefix.drl" );
+
+ final PackageDescr pkg = this.walker.getPackageDescr();
+
+ assertEquals( 2,
+ pkg.getRules().size() );
+
+ assertEquals( "1. Do Stuff!",
+ ((RuleDescr) pkg.getRules().get( 0 )).getName() );
+ assertEquals( "2. Do More Stuff!",
+ ((RuleDescr) pkg.getRules().get( 1 )).getName() );
+ }
+
+ public void testEvalWithNewline() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "eval_with_newline.drl" );
+ }
+
+ public void testEndPosition() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "test_EndPosition.drl" );
+ final RuleDescr rule = (RuleDescr) this.walker.getPackageDescr().getRules().get( 0 );
+ final PatternDescr col = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+// assertEquals( 6,
+// col.getLine() );
+//
+// assertEquals( 8,
+// col.getEndLine() );
+ }
+
+ public void testQualifiedClassname() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "qualified_classname.drl" );
+
+ final PackageDescr pkg = this.walker.getPackageDescr();
+ final RuleDescr rule = (RuleDescr) pkg.getRules().get( 0 );
+
+ final PatternDescr p = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+
+ assertEquals( "com.cheeseco.Cheese",
+ p.getObjectType() );
+ }
+
+ public void testAccumulate() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "accumulate.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+ assertEqualsIgnoreWhitespace( "int x = 0 ;",
+ accum.getInitCode() );
+ assertEqualsIgnoreWhitespace( "x++;",
+ accum.getActionCode() );
+ assertNull( accum.getReverseCode() );
+ assertEqualsIgnoreWhitespace( "new Integer(x)",
+ accum.getResultCode() );
+
+ assertFalse( accum.isExternalFunction() );
+
+ final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ }
+
+ public void testAccumulateWithBindings() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "accumulate_with_bindings.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+ assertEqualsIgnoreWhitespace( "$counter",
+ outPattern.getIdentifier() );
+ assertEqualsIgnoreWhitespace( "int x = 0 ;",
+ accum.getInitCode() );
+ assertEqualsIgnoreWhitespace( "x++;",
+ accum.getActionCode() );
+ assertEqualsIgnoreWhitespace( "new Integer(x)",
+ accum.getResultCode() );
+
+ final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ }
+
+ public void testCollect() throws Exception {
+ parseResource("compilation_unit","compilation_unit", "collect.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final CollectDescr collect = (CollectDescr) outPattern.getSource();
+
+ final PatternDescr pattern = (PatternDescr) collect.getInputPattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ }
+
+ public void testPredicate() throws Exception {
+ final PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", "Foo ($var : attr -> ( $var.equals(\"xyz\") ))" );
+
+ final List constraints = pattern.getConstraint().getDescrs();
+ assertEquals( 2,
+ constraints.size() );
+
+ final FieldBindingDescr field = (FieldBindingDescr) constraints.get( 0 );
+ final PredicateDescr predicate = (PredicateDescr) constraints.get( 1 );
+ assertEquals( "$var",
+ field.getIdentifier() );
+ assertEquals( "attr",
+ field.getFieldName() );
+ assertEquals( " $var.equals(\"xyz\") ",
+ predicate.getContent() );
+ }
+
+ public void testPredicate2() throws Exception {
+ // predicates are also prefixed by the eval keyword
+ final PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", "Foo(eval( $var.equals(\"xyz\") ))" );
+
+ final List constraints = pattern.getConstraint().getDescrs();
+ assertEquals( 1,
+ constraints.size() );
+
+ final PredicateDescr predicate = (PredicateDescr) constraints.get( 0 );
+ assertEquals( " $var.equals(\"xyz\") ",
+ predicate.getContent() );
+ }
+
+ public void testEscapedStrings() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "escaped-string.drl" );
+
+ assertNotNull( rule );
+
+ assertEquals( "test_Quotes",
+ rule.getName() );
+
+ final String expected = "String s = \"\\\"\\n\\t\\\\\";";
+
+ assertEqualsIgnoreWhitespace( expected,
+ (String) rule.getConsequence() );
+ }
+
+ public void testNestedCEs() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "nested_conditional_elements.drl" );
+
+ assertNotNull( rule );
+
+ final AndDescr root = rule.getLhs();
+ final NotDescr not1 = (NotDescr) root.getDescrs().get( 0 );
+ final AndDescr and1 = (AndDescr) not1.getDescrs().get( 0 );
+
+ final PatternDescr state = (PatternDescr) and1.getDescrs().get( 0 );
+ final NotDescr not2 = (NotDescr) and1.getDescrs().get( 1 );
+ final AndDescr and2 = (AndDescr) not2.getDescrs().get( 0 );
+ final PatternDescr person = (PatternDescr) and2.getDescrs().get( 0 );
+ final PatternDescr cheese = (PatternDescr) and2.getDescrs().get( 1 );
+
+ final PatternDescr person2 = (PatternDescr) root.getDescrs().get( 1 );
+ final OrDescr or = (OrDescr) root.getDescrs().get( 2 );
+ final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 0 );
+ final PatternDescr cheese3 = (PatternDescr) or.getDescrs().get( 1 );
+
+ assertEquals( state.getObjectType(),
+ "State" );
+ assertEquals( person.getObjectType(),
+ "Person" );
+ assertEquals( cheese.getObjectType(),
+ "Cheese" );
+ assertEquals( person2.getObjectType(),
+ "Person" );
+ assertEquals( cheese2.getObjectType(),
+ "Cheese" );
+ assertEquals( cheese3.getObjectType(),
+ "Cheese" );
+ }
+
+ public void testForall() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "forall.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final ForallDescr forall = (ForallDescr) rule.getLhs().getDescrs().get( 0 );
+
+ assertEquals( 2,
+ forall.getDescrs().size() );
+ final PatternDescr pattern = forall.getBasePattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ final List remaining = forall.getRemainingPatterns();
+ assertEquals( 1,
+ remaining.size() );
+ final PatternDescr cheese = (PatternDescr) remaining.get( 0 );
+ assertEquals( "Cheese",
+ cheese.getObjectType() );
+ }
+
+ public void testMemberof() throws Exception {
+ final String text = "Country( $cities : city )\nPerson( city memberOf $cities )\n";
+ AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 2,
+ descrs.getDescrs().size() );
+ PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+ VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+ assertEquals( "memberOf",
+ restr.getEvaluator() );
+ assertFalse( restr.isNegated() );
+ assertEquals( "$cities",
+ restr.getIdentifier() );
+ }
+
+ public void testNotMemberof() throws Exception {
+ final String text = "Country( $cities : city )\nPerson( city not memberOf $cities )\n";
+ AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 2,
+ descrs.getDescrs().size() );
+ PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+ VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+ assertEquals( "memberOf",
+ restr.getEvaluator() );
+ assertTrue( restr.isNegated() );
+ assertEquals( "$cities",
+ restr.getIdentifier() );
+ }
+
+ public void testInOperator() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule", "rule", "in_operator_test.drl" );
+
+ assertNotNull( rule );
+
+ assertEqualsIgnoreWhitespace( "consequence();",
+ (String) rule.getConsequence() );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ //The first pattern, with 2 restrictions on a single field (plus a connective)
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ assertEquals( RestrictionConnectiveDescr.AND,
+ fld.getRestriction().getConnective() );
+ assertEquals( 2,
+ fld.getRestrictions().size() );
+ assertEquals( "age",
+ fld.getFieldName() );
+
+ LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( ">",
+ lit.getEvaluator() );
+ assertEquals( "30",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "40",
+ lit.getText() );
+
+ //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+ pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Vehicle",
+ pattern.getObjectType() );
+ assertEquals( 2,
+ pattern.getConstraint().getDescrs().size() );
+
+ fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( 1,
+ fld.getRestrictions().size() );
+
+ RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fld.getRestrictions().get( 0 );
+ assertEquals( RestrictionConnectiveDescr.OR,
+ or.getConnective() );
+ assertEquals( 2,
+ or.getRestrictions().size() );
+
+ lit = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "sedan",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+ assertEquals( "==",
+ lit.getEvaluator() );
+ assertEquals( "wagon",
+ lit.getText() );
+
+ //now the second field
+ fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
+ assertEquals( 1,
+ fld.getRestrictions().size() );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "3",
+ lit.getText() );
+
+ }
+
+ public void testNotInOperator() throws Exception {
+ final RuleDescr rule = (RuleDescr) parseResource("rule","rule", "notin_operator_test.drl" );
+
+ assertNotNull( rule );
+
+ assertEqualsIgnoreWhitespace( "consequence();",
+ (String) rule.getConsequence() );
+ assertEquals( "simple_rule",
+ rule.getName() );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ //The first pattern, with 2 restrictions on a single field (plus a connective)
+ PatternDescr pattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ assertEquals( 1,
+ pattern.getConstraint().getDescrs().size() );
+
+ FieldConstraintDescr fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ assertEquals( 2,
+ fld.getRestrictions().size() );
+ assertEquals( "age",
+ fld.getFieldName() );
+
+ LiteralRestrictionDescr lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( ">",
+ lit.getEvaluator() );
+ assertEquals( "30",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "40",
+ lit.getText() );
+
+ //the second col, with 2 fields, the first with 2 restrictions, the second field with one
+ pattern = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "Vehicle",
+ pattern.getObjectType() );
+ assertEquals( 2,
+ pattern.getConstraint().getDescrs().size() );
+
+ fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ assertEquals( 2,
+ fld.getRestrictions().size() );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( "type",
+ fld.getFieldName() );
+ assertEquals( "!=",
+ lit.getEvaluator() );
+ assertEquals( "sedan",
+ lit.getText() );
+
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 1 );
+ assertEquals( "!=",
+ lit.getEvaluator() );
+ assertEquals( "wagon",
+ lit.getText() );
+
+ //now the second field
+ fld = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 1 );
+ assertEquals( 1,
+ fld.getRestrictions().size() );
+ lit = (LiteralRestrictionDescr) fld.getRestrictions().get( 0 );
+ assertEquals( "<",
+ lit.getEvaluator() );
+ assertEquals( "3",
+ lit.getText() );
+
+ }
+
+ public void testConstraintAndConnective() throws Exception {
+ final String text = "Person( age < 42 && location==\"atlanta\")";
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 2,
+ pattern.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ fcd = (FieldConstraintDescr) pattern.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ }
+
+ public void testConstraintOrConnective() throws Exception {
+ final String text = "Person( age < 42 || location==\"atlanta\")";
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) or.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ fcd = (FieldConstraintDescr) or.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ }
+
+ public void testConstraintConnectivesPrecedence() throws Exception {
+ final String text = "Person( age < 42 && location==\"atlanta\" || age > 20 && location==\"Seatle\" || location == \"Chicago\")";
+
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+ assertEquals( 3,
+ or.getDescrs().size() );
+
+ AndDescr and = (AndDescr) or.getDescrs().get( 0 );
+ assertEquals( 2,
+ and.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( "<",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "42",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "atlanta",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ and = (AndDescr) or.getDescrs().get( 1 );
+ assertEquals( 2,
+ and.getDescrs().size() );
+ fcd = (FieldConstraintDescr) and.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( ">",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "20",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) and.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "Seatle",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ fcd = (FieldConstraintDescr) or.getDescrs().get( 2 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "Chicago",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ }
+
+ public void testConstraintConnectivesPrecedenceWithBracks() throws Exception {
+ final String text = "Person( age < 42 && ( location==\"atlanta\" || age > 20 && location==\"Seatle\") || location == \"Chicago\")";
+
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
+ assertEquals( 2,
+ or1.getDescrs().size() );
+
+ AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
+ assertEquals( 2,
+ and1.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( "<",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "42",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ OrDescr or2 = (OrDescr) and1.getDescrs().get( 1 );
+ fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "atlanta",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ AndDescr and2 = (AndDescr) or2.getDescrs().get( 1 );
+ assertEquals( 2,
+ and2.getDescrs().size() );
+ fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( ">",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "20",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "Seatle",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ fcd = (FieldConstraintDescr) or1.getDescrs().get( 1 );
+ assertEquals( "location",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "Chicago",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ }
+
+ public void testConstraintConnectivesPrecedenceWithBracks2() throws Exception {
+ final String text = "Person( ( age == 70 && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ) )";
+
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ OrDescr or1 = (OrDescr) pattern.getDescrs().get( 0 );
+ assertEquals( 3,
+ or1.getDescrs().size() );
+
+ AndDescr and1 = (AndDescr) or1.getDescrs().get( 0 );
+ AndDescr and2 = (AndDescr) or1.getDescrs().get( 1 );
+ AndDescr and3 = (AndDescr) or1.getDescrs().get( 2 );
+
+ assertEquals( 2,
+ and1.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) and1.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "70",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) and1.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "black",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ assertEquals( 2,
+ and2.getDescrs().size() );
+ fcd = (FieldConstraintDescr) and2.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "40",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) and2.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "pink",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ assertEquals( 2,
+ and3.getDescrs().size() );
+ fcd = (FieldConstraintDescr) and3.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "12",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ OrDescr or2 = (OrDescr) and3.getDescrs().get( 1 );
+ fcd = (FieldConstraintDescr) or2.getDescrs().get( 0 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "yellow",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ fcd = (FieldConstraintDescr) or2.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "blue",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+ }
+
+ public void testRestrictionConnectives() throws Exception {
+
+ // the expression bellow must generate the following tree:
+ //
+ // AND
+ // |
+ // OR
+ // /---------------+-------------------\
+ // AND AND AND
+ // /---+---\ /---+---\ /---+---\
+ // FC FC FC FC FC OR
+ // /---+---\
+ // FC FC
+ //
+ final String text = "Person( ( age ( > 60 && < 70 ) || ( > 50 && < 55 ) && hair == \"black\" ) || ( age == 40 && hair == \"pink\" ) || ( age == 12 && ( hair == \"yellow\" || hair == \"blue\" ) ))";
+
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+
+ OrDescr orConstr = (OrDescr) pattern.getDescrs().get( 0 );
+
+ assertEquals( 3,
+ orConstr.getDescrs().size() );
+
+ AndDescr andConstr1 = (AndDescr) orConstr.getDescrs().get( 0 );
+
+ FieldConstraintDescr fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+ RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestriction().getRestrictions().get( 0 );
+ RestrictionConnectiveDescr and1 = (RestrictionConnectiveDescr) or.getRestrictions().get( 0 );
+ RestrictionConnectiveDescr and2 = (RestrictionConnectiveDescr) or.getRestrictions().get( 1 );
+
+ assertEquals( ">",
+ ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "60",
+ ((LiteralRestrictionDescr) and1.getRestrictions().get( 0 )).getText() );
+
+ assertEquals( "<",
+ ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getEvaluator() );
+ assertEquals( "70",
+ ((LiteralRestrictionDescr) and1.getRestrictions().get( 1 )).getText() );
+
+ assertEquals( ">",
+ ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "50",
+ ((LiteralRestrictionDescr) and2.getRestrictions().get( 0 )).getText() );
+
+ assertEquals( "<",
+ ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getEvaluator() );
+ assertEquals( "55",
+ ((LiteralRestrictionDescr) and2.getRestrictions().get( 1 )).getText() );
+
+ fcd = (FieldConstraintDescr) andConstr1.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "black",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ AndDescr andConstr2 = (AndDescr) orConstr.getDescrs().get( 1 );
+ assertEquals( 2,
+ andConstr2.getDescrs().size() );
+ fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "40",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ fcd = (FieldConstraintDescr) andConstr2.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "pink",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ AndDescr andConstr3 = (AndDescr) orConstr.getDescrs().get( 2 );
+ assertEquals( 2,
+ andConstr3.getDescrs().size() );
+ fcd = (FieldConstraintDescr) andConstr3.getDescrs().get( 0 );
+ assertEquals( "age",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "12",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ OrDescr orConstr2 = (OrDescr) andConstr3.getDescrs().get( 1 );
+
+ fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 0 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "yellow",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ fcd = (FieldConstraintDescr) orConstr2.getDescrs().get( 1 );
+ assertEquals( "hair",
+ fcd.getFieldName() );
+
+ assertEquals( "==",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "blue",
+ ((LiteralRestrictionDescr) fcd.getRestrictions().get( 0 )).getText() );
+
+ }
+
+ public void testConstraintConnectivesMatches() throws Exception {
+ final String text = "Person( name matches \"mark\" || matches \"bob\" )";
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+ assertEquals( "name",
+ fcd.getFieldName() );
+
+ RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fcd.getRestrictions().get( 0 );
+
+ assertEquals( 2,
+ or.getRestrictions().size() );
+
+ assertEquals( "matches",
+ ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getEvaluator() );
+ assertEquals( "mark",
+ ((LiteralRestrictionDescr) or.getRestrictions().get( 0 )).getText() );
+
+ assertEquals( "matches",
+ ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getEvaluator() );
+ assertEquals( "bob",
+ ((LiteralRestrictionDescr) or.getRestrictions().get( 1 )).getText() );
+
+ }
+
+ public void testNotContains() throws Exception {
+ final String text = "City( $city : city )\nCountry( cities not contains $city )\n";
+ AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 2,
+ descrs.getDescrs().size() );
+ PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 1 );
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+ VariableRestrictionDescr restr = (VariableRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+ assertEquals( "contains",
+ restr.getEvaluator() );
+ assertTrue( restr.isNegated() );
+ assertEquals( "$city",
+ restr.getIdentifier() );
+ }
+
+ public void testNotMatches() throws Exception {
+ final String text = "Message( text not matches '[abc]*' )\n";
+ AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 1,
+ descrs.getDescrs().size() );
+ PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+ LiteralRestrictionDescr restr = (LiteralRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+ assertEquals( "matches",
+ restr.getEvaluator() );
+ assertTrue( restr.isNegated() );
+ assertEquals( "[abc]*",
+ restr.getText() );
+ }
+
+ public void testRestrictions() throws Exception {
+ final String text = "Foo( bar > 1 || == 1 )\n";
+
+ AndDescr descrs = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 1,
+ descrs.getDescrs().size() );
+ PatternDescr pat = (PatternDescr) descrs.getDescrs().get( 0 );
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pat.getConstraint().getDescrs().get( 0 );
+ RestrictionConnectiveDescr or = (RestrictionConnectiveDescr) fieldConstr.getRestrictions().get( 0 );
+ LiteralRestrictionDescr gt1 = (LiteralRestrictionDescr) or.getRestrictions().get( 0 );
+ LiteralRestrictionDescr eq1 = (LiteralRestrictionDescr) or.getRestrictions().get( 1 );
+
+ assertEquals( ">",
+ gt1.getEvaluator() );
+ assertEquals( false,
+ gt1.isNegated() );
+ assertEquals( 1,
+ ((Number) eq1.getValue()).intValue() );
+ assertEquals( "==",
+ eq1.getEvaluator() );
+ assertEquals( false,
+ eq1.isNegated() );
+ assertEquals( 1,
+ ((Number) eq1.getValue()).intValue() );
+
+ }
+
+ public void testSemicolon() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "semicolon.drl" );
+
+ final PackageDescr pkg = this.walker.getPackageDescr();
+ assertEquals( "org.drools",
+ pkg.getName() );
+ assertEquals( 1,
+ pkg.getGlobals().size() );
+ assertEquals( 3,
+ pkg.getRules().size() );
+
+ final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 2,
+ rule1.getLhs().getDescrs().size() );
+
+ final RuleDescr query1 = (RuleDescr) pkg.getRules().get( 1 );
+ assertEquals( 3,
+ query1.getLhs().getDescrs().size() );
+
+ final RuleDescr rule2 = (RuleDescr) pkg.getRules().get( 2 );
+ assertEquals( 2,
+ rule2.getLhs().getDescrs().size() );
+ }
+
+ public void testEval() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "eval_parsing.drl" );
+
+ final PackageDescr pkg = this.walker.getPackageDescr();
+ assertEquals( "org.drools",
+ pkg.getName() );
+ assertEquals( 1,
+ pkg.getRules().size() );
+
+ final RuleDescr rule1 = (RuleDescr) pkg.getRules().get( 0 );
+ assertEquals( 1,
+ rule1.getLhs().getDescrs().size() );
+ }
+
+ public void testAccumulateReverse() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "accumulateReverse.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) out.getSource();
+ assertEqualsIgnoreWhitespace( "int x = 0 ;",
+ accum.getInitCode() );
+ assertEqualsIgnoreWhitespace( "x++;",
+ accum.getActionCode() );
+ assertEqualsIgnoreWhitespace( "x--;",
+ accum.getReverseCode() );
+ assertEqualsIgnoreWhitespace( "new Integer(x)",
+ accum.getResultCode() );
+ assertFalse( accum.isExternalFunction() );
+
+ final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ }
+
+ public void testAccumulateExternalFunction() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "accumulateExternalFunction.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) out.getSource();
+ assertEqualsIgnoreWhitespace( "$age",
+ accum.getExpression() );
+ assertEqualsIgnoreWhitespace( "average",
+ accum.getFunctionIdentifier() );
+ assertTrue( accum.isExternalFunction() );
+
+ final PatternDescr pattern = (PatternDescr) accum.getInputPattern();
+ assertEquals( "Person",
+ pattern.getObjectType() );
+ }
+
+ public void testCollectWithNestedFrom() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "collect_with_nested_from.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final CollectDescr collect = (CollectDescr) out.getSource();
+
+ PatternDescr person = (PatternDescr) collect.getInputPattern();
+ assertEquals( "Person",
+ person.getObjectType() );
+
+ final CollectDescr collect2 = (CollectDescr) person.getSource();
+
+ final PatternDescr people = collect2.getInputPattern();
+ assertEquals( "People",
+ people.getObjectType() );
+ }
+
+ public void testAccumulateWithNestedFrom() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "accumulate_with_nested_from.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr out = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accumulate = (AccumulateDescr) out.getSource();
+
+ PatternDescr person = (PatternDescr) accumulate.getInputPattern();
+ assertEquals( "Person",
+ person.getObjectType() );
+
+ final CollectDescr collect2 = (CollectDescr) person.getSource();
+
+ final PatternDescr people = collect2.getInputPattern();
+ assertEquals( "People",
+ people.getObjectType() );
+ }
+
+ public void testAccessorPaths() throws Exception {
+ final String text = "org . drools/*comment*/\t .Message( text not matches $c#comment\n. property )\n";
+
+ PatternDescr pattern = (PatternDescr) parse("lhs_pattern", "lhs_pattern", text);
+
+ assertEquals( "org.drools.Message",
+ pattern.getObjectType() );
+
+ FieldConstraintDescr fieldConstr = (FieldConstraintDescr) pattern.getConstraint().getDescrs().get( 0 );
+ QualifiedIdentifierRestrictionDescr restr = (QualifiedIdentifierRestrictionDescr) fieldConstr.getRestrictions().get( 0 );
+
+ assertEquals( "matches",
+ restr.getEvaluator() );
+ assertTrue( restr.isNegated() );
+ assertEquals( "$c.property",
+ restr.getText() );
+ }
+
+ public void testOrCE() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "or_ce.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 2,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr person = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "Person",
+ person.getObjectType() );
+ assertEquals( "$p",
+ person.getIdentifier() );
+
+ final OrDescr or = (OrDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+
+ final PatternDescr cheese1 = (PatternDescr) or.getDescrs().get( 0 );
+ assertEquals( "Cheese",
+ cheese1.getObjectType() );
+ assertEquals( "$c",
+ cheese1.getIdentifier() );
+ final PatternDescr cheese2 = (PatternDescr) or.getDescrs().get( 1 );
+ assertEquals( "Cheese",
+ cheese2.getObjectType() );
+ assertNull( cheese2.getIdentifier() );
+ }
+
+ public void testRuleSingleLine() throws Exception {
+ final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1); end";
+ RuleDescr rule = (RuleDescr) parse("rule", "rule", text);
+
+ assertEquals( "another test",
+ rule.getName() );
+ assertEquals( "System.out.println(1); ",
+ rule.getConsequence() );
+ }
+
+ public void testRuleTwoLines() throws Exception {
+ final String text = "rule \"another test\" salience 10 when eval( true ) then System.out.println(1);\n end";
+ RuleDescr rule = (RuleDescr) parse("rule", "rule", text);
+
+ assertEquals( "another test",
+ rule.getName() );
+ assertEquals( "System.out.println(1);\n ",
+ rule.getConsequence() );
+ }
+
+ public void testRuleParseLhs3() throws Exception {
+ final String text = "(or\nnot Person()\n(and Cheese()\nMeat()\nWine()))";
+ AndDescr pattern = (AndDescr) parse("normal_lhs_block", "lhs_block", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ OrDescr or = (OrDescr) pattern.getDescrs().get( 0 );
+ assertEquals( 2,
+ or.getDescrs().size() );
+ NotDescr not = (NotDescr) or.getDescrs().get( 0 );
+ AndDescr and = (AndDescr) or.getDescrs().get( 1 );
+ assertEquals( 1,
+ not.getDescrs().size() );
+ PatternDescr person = (PatternDescr) not.getDescrs().get( 0 );
+ assertEquals( "Person",
+ person.getObjectType() );
+ assertEquals( 3,
+ and.getDescrs().size() );
+ PatternDescr cheese = (PatternDescr) and.getDescrs().get( 0 );
+ assertEquals( "Cheese",
+ cheese.getObjectType() );
+ PatternDescr meat = (PatternDescr) and.getDescrs().get( 1 );
+ assertEquals( "Meat",
+ meat.getObjectType() );
+ PatternDescr wine = (PatternDescr) and.getDescrs().get( 2 );
+ assertEquals( "Wine",
+ wine.getObjectType() );
+
+ }
+
+ public void testAccumulateMultiPattern() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "accumulate_multi_pattern.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 1,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr outPattern = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ final AccumulateDescr accum = (AccumulateDescr) outPattern.getSource();
+ assertEqualsIgnoreWhitespace( "$counter",
+ outPattern.getIdentifier() );
+ assertEqualsIgnoreWhitespace( "int x = 0 ;",
+ accum.getInitCode() );
+ assertEqualsIgnoreWhitespace( "x++;",
+ accum.getActionCode() );
+ assertEqualsIgnoreWhitespace( "new Integer(x)",
+ accum.getResultCode() );
+
+ final AndDescr and = (AndDescr) accum.getInput();
+ assertEquals( 2,
+ and.getDescrs().size() );
+ final PatternDescr person = (PatternDescr) and.getDescrs().get( 0 );
+ final PatternDescr cheese = (PatternDescr) and.getDescrs().get( 1 );
+ assertEquals( "Person",
+ person.getObjectType() );
+ assertEquals( "Cheese",
+ cheese.getObjectType() );
+ }
+
+
+ public void testPluggableOperators() throws Exception {
+ parseResource("compilation_unit", "compilation_unit", "pluggable_operators.drl" );
+
+ final PackageDescr pack = walker.getPackageDescr();
+ assertEquals( 1,
+ pack.getRules().size() );
+ final RuleDescr rule = (RuleDescr) pack.getRules().get( 0 );
+ assertEquals( 5,
+ rule.getLhs().getDescrs().size() );
+
+ final PatternDescr eventA = (PatternDescr) rule.getLhs().getDescrs().get( 0 );
+ assertEquals( "$a",
+ eventA.getIdentifier() );
+ assertEquals( "EventA",
+ eventA.getObjectType() );
+
+ final PatternDescr eventB = (PatternDescr) rule.getLhs().getDescrs().get( 1 );
+ assertEquals( "$b",
+ eventB.getIdentifier() );
+ assertEquals( "EventB",
+ eventB.getObjectType() );
+ assertEquals( 1,
+ eventB.getConstraint().getDescrs().size() );
+ final FieldConstraintDescr fcdB = (FieldConstraintDescr) eventB.getConstraint().getDescrs().get( 0 );
+ assertEquals( 1,
+ fcdB.getRestrictions().size() );
+ assertTrue( fcdB.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+ final VariableRestrictionDescr rb = (VariableRestrictionDescr) fcdB.getRestrictions().get( 0 );
+ assertEquals( "after",
+ rb.getEvaluator() );
+ assertEquals( "$a",
+ rb.getText() );
+ assertEquals( "1,10",
+ rb.getParameterText() );
+ assertFalse( rb.isNegated() );
+
+ final PatternDescr eventC = (PatternDescr) rule.getLhs().getDescrs().get( 2 );
+ assertEquals( "$c",
+ eventC.getIdentifier() );
+ assertEquals( "EventC",
+ eventC.getObjectType() );
+ assertEquals( 1,
+ eventC.getConstraint().getDescrs().size() );
+ final FieldConstraintDescr fcdC = (FieldConstraintDescr) eventC.getConstraint().getDescrs().get( 0 );
+ assertEquals( 1,
+ fcdC.getRestrictions().size() );
+ assertTrue( fcdC.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+ final VariableRestrictionDescr rc = (VariableRestrictionDescr) fcdC.getRestrictions().get( 0 );
+ assertEquals( "finishes",
+ rc.getEvaluator() );
+ assertEquals( "$b",
+ rc.getText() );
+ assertNull( rc.getParameterText() );
+ assertFalse( rc.isNegated() );
+
+ final PatternDescr eventD = (PatternDescr) rule.getLhs().getDescrs().get( 3 );
+ assertEquals( "$d",
+ eventD.getIdentifier() );
+ assertEquals( "EventD",
+ eventD.getObjectType() );
+ assertEquals( 1,
+ eventD.getConstraint().getDescrs().size() );
+ final FieldConstraintDescr fcdD = (FieldConstraintDescr) eventD.getConstraint().getDescrs().get( 0 );
+ assertEquals( 1,
+ fcdD.getRestrictions().size() );
+ assertTrue( fcdD.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+ final VariableRestrictionDescr rd = (VariableRestrictionDescr) fcdD.getRestrictions().get( 0 );
+ assertEquals( "starts",
+ rd.getEvaluator() );
+ assertEquals( "$a",
+ rd.getText() );
+ assertNull( rd.getParameterText() );
+ assertTrue( rd.isNegated() );
+
+ final PatternDescr eventE = (PatternDescr) rule.getLhs().getDescrs().get( 4 );
+ assertEquals( "$e",
+ eventE.getIdentifier() );
+ assertEquals( "EventE",
+ eventE.getObjectType() );
+ assertEquals( 1,
+ eventE.getConstraint().getDescrs().size() );
+ final FieldConstraintDescr fcdE = (FieldConstraintDescr) eventE.getConstraint().getDescrs().get( 0 );
+ assertEquals( 1,
+ fcdE.getRestrictions().size() );
+ assertTrue( fcdE.getRestrictions().get( 0 ) instanceof VariableRestrictionDescr );
+ final VariableRestrictionDescr re = (VariableRestrictionDescr) fcdE.getRestrictions().get( 0 );
+ assertEquals( "before",
+ re.getEvaluator() );
+ assertEquals( "$b",
+ re.getText() );
+ assertEquals( "1, 10",
+ re.getParameterText() );
+ assertTrue( re.isNegated() );
+ }
+
+ public void testEntryPoint() throws Exception {
+ final String text = "StockTick( symbol==\"ACME\") from entry-point StreamA";
+
+ PatternDescr pattern = (PatternDescr) parse("pattern_source", "lhs", text);
+
+ assertEquals( 1,
+ pattern.getDescrs().size() );
+ FieldConstraintDescr fcd = (FieldConstraintDescr) pattern.getDescrs().get( 0 );
+ assertEquals( "symbol",
+ fcd.getFieldName() );
+
+ assertNotNull( pattern.getSource() );
+ EntryPointDescr entry = (EntryPointDescr) pattern.getSource();
+ assertEquals( "StreamA",
+ entry.getEntryId() );
+ }
+
+ private Object parse(String parserRuleName, String treeRuleName,
+ final String text) throws Exception {
+ return newParser(parserRuleName, treeRuleName, newCharStream(text));
+ }
+
+ private Object parse(String parserRuleName, String treeRuleName,
+ final String source, final String text) throws Exception {
+ return newParser(parserRuleName, treeRuleName, newCharStream(text));
+ // this.parser.setSource( source );
+ }
+
+ private Reader getReader(final String name) throws Exception {
+ final InputStream in = getClass().getResourceAsStream(name);
+ return new InputStreamReader(in);
+ }
+
+ private Object parseResource(String parserRuleName, String treeRuleName,
+ final String name) throws Exception {
+
+ // System.err.println( getClass().getResource( name ) );
+ final Reader reader = getReader(name);
+
+ final StringBuffer text = new StringBuffer();
+
+ final char[] buf = new char[1024];
+ int len = 0;
+
+ while ((len = reader.read(buf)) >= 0) {
+ text.append(buf, 0, len);
+ }
+
+ return parse(parserRuleName, treeRuleName, name, text.toString());
+ }
+
+ private CharStream newCharStream(final String text) {
+ return new ANTLRStringStream(text);
+ }
+
+ private Object newParser(String parserRuleName, String treeRuleName,
+ final CharStream charStream) {
+ return execTreeParser(parserRuleName, treeRuleName, charStream);
+ }
+
+ public Object execTreeParser(String testRuleName, String testTreeRuleName,
+ CharStream charStream) {
+ Object treeRuleReturn = null;
+ try {
+ DRLLexer lexer = new DRLLexer(charStream);
+ CommonTokenStream tokens = new CommonTokenStream(lexer);
+ DRLParser parser = new DRLParser(tokens);
+ parser.setTreeAdaptor(new DroolsTreeAdaptor());
+ /** Use Reflection to get rule method from parser */
+ Method ruleName = Class.forName("org.drools.lang.DRLParser")
+ .getMethod(testRuleName);
+
+ /** Invoke grammar rule, and get the return value */
+ Object ruleReturn = ruleName.invoke(parser);
+
+ if (!parser.hasErrors()){
+ Class _return = Class.forName("org.drools.lang.DRLParser" + "$"
+ + testRuleName + "_return");
+ Method returnName = _return.getMethod("getTree");
+ DroolsTree tree = (DroolsTree) returnName.invoke(ruleReturn);
+
+ // Walk resulting tree; create tree nodes stream first
+ CommonTreeNodeStream nodes = new CommonTreeNodeStream(tree);
+ // AST nodes have payload that point into token stream
+ nodes.setTokenStream(tokens);
+ // Create a tree walker attached to the nodes stream
+ this.walker = new DescrBuilderTree(nodes);
+ /** Invoke the tree rule, and store the return value if there is */
+ Method treeRuleName = Class.forName(
+ "org.drools.lang.DescrBuilderTree").getMethod(
+ testTreeRuleName);
+ treeRuleReturn = treeRuleName.invoke(walker);
+ }
+
+ if (treeRuleReturn != null) {
+ /** If return object is instanceof AST, get the toStringTree */
+ if (treeRuleReturn.toString().indexOf(
+ testTreeRuleName + "_return") > 0) {
+ try { // NullPointerException may happen here...
+ Class _treeReturn = Class
+ .forName("org.drools.lang.DescrBuilderTree"
+ + "$" + testTreeRuleName + "_return");
+ Field[] fields = _treeReturn.getDeclaredFields();
+ for (Field field : fields) {
+ if (field.getType().getName().contains(
+ "org.drools.lang.descr.")) {
+ return field.get(treeRuleReturn);
+ }
+ }
+ } catch (Exception e) {
+ System.err.println(e);
+ }
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return treeRuleReturn;
+ }
+
+ private void assertEqualsIgnoreWhitespace(final String expected,
+ final String actual) {
+ final String cleanExpected = expected.replaceAll( "\\s+",
+ "" );
+ final String cleanActual = actual.replaceAll( "\\s+",
+ "" );
+
+ assertEquals( cleanExpected,
+ cleanActual );
+ }
}
\ No newline at end of file
More information about the jboss-svn-commits
mailing list