/*
* Copyright 2013 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* 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.
*/
package org.drools.workbench.models.commons.backend.rule;
import java.io.IOException;
import java.io.StringReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.drools.compiler.lang.Expander;
import org.drools.compiler.lang.dsl.DSLMappingFile;
import org.drools.compiler.lang.dsl.DSLTokenizedMappingFile;
import org.drools.compiler.lang.dsl.DefaultExpander;
import org.drools.workbench.models.datamodel.oracle.DataType;
import org.drools.workbench.models.datamodel.oracle.FieldAccessorsAndMutators;
import org.drools.workbench.models.datamodel.oracle.MethodInfo;
import org.drools.workbench.models.datamodel.oracle.ModelField;
import org.drools.workbench.models.datamodel.oracle.PackageDataModelOracle;
import org.drools.workbench.models.datamodel.rule.ActionCallMethod;
import org.drools.workbench.models.datamodel.rule.ActionFieldValue;
import org.drools.workbench.models.datamodel.rule.ActionGlobalCollectionAdd;
import org.drools.workbench.models.datamodel.rule.ActionInsertFact;
import org.drools.workbench.models.datamodel.rule.ActionInsertLogicalFact;
import org.drools.workbench.models.datamodel.rule.ActionSetField;
import org.drools.workbench.models.datamodel.rule.ActionUpdateField;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.datamodel.rule.CEPWindow;
import org.drools.workbench.models.datamodel.rule.CompositeFactPattern;
import org.drools.workbench.models.datamodel.rule.CompositeFieldConstraint;
import org.drools.workbench.models.datamodel.rule.ConnectiveConstraint;
import org.drools.workbench.models.datamodel.rule.DSLComplexVariableValue;
import org.drools.workbench.models.datamodel.rule.DSLSentence;
import org.drools.workbench.models.datamodel.rule.DSLVariableValue;
import org.drools.workbench.models.datamodel.rule.ExpressionCollection;
import org.drools.workbench.models.datamodel.rule.ExpressionField;
import org.drools.workbench.models.datamodel.rule.ExpressionFormLine;
import org.drools.workbench.models.datamodel.rule.ExpressionMethod;
import org.drools.workbench.models.datamodel.rule.ExpressionMethodParameterDefinition;
import org.drools.workbench.models.datamodel.rule.ExpressionPart;
import org.drools.workbench.models.datamodel.rule.ExpressionText;
import org.drools.workbench.models.datamodel.rule.ExpressionUnboundFact;
import org.drools.workbench.models.datamodel.rule.ExpressionVariable;
import org.drools.workbench.models.datamodel.rule.FactPattern;
import org.drools.workbench.models.datamodel.rule.FieldConstraint;
import org.drools.workbench.models.datamodel.rule.FieldNatureType;
import org.drools.workbench.models.datamodel.rule.FreeFormLine;
import org.drools.workbench.models.datamodel.rule.FromAccumulateCompositeFactPattern;
import org.drools.workbench.models.datamodel.rule.FromCollectCompositeFactPattern;
import org.drools.workbench.models.datamodel.rule.FromCompositeFactPattern;
import org.drools.workbench.models.datamodel.rule.IAction;
import org.drools.workbench.models.datamodel.rule.IPattern;
import org.drools.workbench.models.datamodel.rule.RuleAttribute;
import org.drools.workbench.models.datamodel.rule.RuleModel;
import org.drools.workbench.models.datamodel.rule.SingleFieldConstraint;
import org.drools.workbench.models.datamodel.rule.SingleFieldConstraintEBLeftSide;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class RuleModelDRLPersistenceUnmarshallingTest {
private static final Logger logger = LoggerFactory.getLogger(RuleModelDRLPersistenceUnmarshallingTest.class);
private PackageDataModelOracle dmo;
private Map<String, ModelField[]> packageModelFields = new HashMap<>();
private Map<String, String[]> projectJavaEnumDefinitions = new HashMap<>();
private Map<String, List<MethodInfo>> projectMethodInformation = new HashMap<>();
@Before
public void setUp() throws Exception {
dmo = mock(PackageDataModelOracle.class);
when(dmo.getProjectModelFields()).thenReturn(packageModelFields);
when(dmo.getProjectJavaEnumDefinitions()).thenReturn(projectJavaEnumDefinitions);
when(dmo.getProjectMethodInformation()).thenReturn(projectMethodInformation);
}
@After
public void cleanUp() throws Exception {
packageModelFields.clear();
projectJavaEnumDefinitions.clear();
projectMethodInformation.clear();
}
private void addModelField(final String factName,
final String fieldName,
final String clazz,
final String type) {
ModelField[] modelFields = new ModelField[1];
modelFields[0] = new ModelField(fieldName,
clazz,
ModelField.FIELD_CLASS_TYPE.TYPE_DECLARATION_CLASS,
ModelField.FIELD_ORIGIN.DECLARED,
FieldAccessorsAndMutators.BOTH,
type);
if (packageModelFields.containsKey(factName)) {
final List<ModelField> existingModelFields = new ArrayList<>(Arrays.asList(packageModelFields.get(factName)));
existingModelFields.add(modelFields[0]);
modelFields = existingModelFields.toArray(modelFields);
}
packageModelFields.put(factName,
modelFields);
}
private void addJavaEnumDefinition(final String factName,
final String fieldName,
final String[] values) {
final String key = factName + "#" + fieldName;
projectJavaEnumDefinitions.put(key,
values);
}
private void addMethodInformation(final String factName,
final String name,
final List<String> params,
final String returnType,
final String parametricReturnType,
final String genericType) {
MethodInfo mi = new MethodInfo(name,
params,
returnType,
parametricReturnType,
genericType);
List<MethodInfo> existingMethodInfo = projectMethodInformation.get(factName);
if (existingMethodInfo == null) {
existingMethodInfo = new ArrayList<>();
projectMethodInformation.put(factName,
existingMethodInfo);
}
existingMethodInfo.add(mi);
}
@Test
public void testFactPattern() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant()\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
}
@Test
public void testFactPatternWithBinding() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "$a : Applicant()\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals("$a",
fp.getBoundName());
assertEquals(0,
fp.getNumberOfConstraints());
}
@Test
public void testSingleFieldConstraint() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age < 55 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("<",
sfp.getOperator());
assertEquals("55",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testSingleFieldConstraintWithBinding() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( $a : age < 55 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("<",
sfp.getOperator());
assertEquals("55",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals("$a",
sfp.getFieldBinding());
}
@Test
public void testSingleFieldConstraintWithTwoFieldsBinding() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( $a : age, $n : name )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(2,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp0 = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp0.getFactType());
assertEquals("age",
sfp0.getFieldName());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp0.getConstraintValueType());
assertEquals("$a",
sfp0.getFieldBinding());
assertTrue(fp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp1 = (SingleFieldConstraint) fp.getConstraint(1);
assertEquals("Applicant",
sfp1.getFactType());
assertEquals("name",
sfp1.getFieldName());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp1.getConstraintValueType());
assertEquals("$n",
sfp1.getFieldBinding());
}
@Test
public void testCompositeFieldConstraint() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age < 55 || age > 70 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof CompositeFieldConstraint);
CompositeFieldConstraint cfp = (CompositeFieldConstraint) fp.getConstraint(0);
assertEquals("||",
cfp.getCompositeJunctionType());
assertEquals(2,
cfp.getNumberOfConstraints());
assertTrue(cfp.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp1 = (SingleFieldConstraint) cfp.getConstraint(0);
assertEquals("Applicant",
sfp1.getFactType());
assertEquals("age",
sfp1.getFieldName());
assertEquals("<",
sfp1.getOperator());
assertEquals("55",
sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp1.getConstraintValueType());
SingleFieldConstraint sfp2 = (SingleFieldConstraint) cfp.getConstraint(1);
assertEquals("Applicant",
sfp2.getFactType());
assertEquals("age",
sfp2.getFieldName());
assertEquals(">",
sfp2.getOperator());
assertEquals("70",
sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp2.getConstraintValueType());
}
@Test
public void testSingleFieldConstraintIsNullOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age == null )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("== null",
sfp.getOperator());
assertNull(sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp.getConstraintValueType());
}
@Test
public void testSingleFieldConstraintIsNotNullOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age != null )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("!= null",
sfp.getOperator());
assertNull(sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp.getConstraintValueType());
}
@Test
public void testCompositeFieldConstraintWithNotNullOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age != null && age > 70 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof CompositeFieldConstraint);
CompositeFieldConstraint cfp = (CompositeFieldConstraint) fp.getConstraint(0);
assertEquals("&&",
cfp.getCompositeJunctionType());
assertEquals(2,
cfp.getNumberOfConstraints());
assertTrue(cfp.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp1 = (SingleFieldConstraint) cfp.getConstraint(0);
assertEquals("Applicant",
sfp1.getFactType());
assertEquals("age",
sfp1.getFieldName());
assertEquals("!= null",
sfp1.getOperator());
assertNull(sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp1.getConstraintValueType());
SingleFieldConstraint sfp2 = (SingleFieldConstraint) cfp.getConstraint(1);
assertEquals("Applicant",
sfp2.getFactType());
assertEquals("age",
sfp2.getFieldName());
assertEquals(">",
sfp2.getOperator());
assertEquals("70",
sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp2.getConstraintValueType());
}
@Test
public void testSingleFieldConstraintCEPOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( dob after \"26-Jun-2013\" )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("dob",
sfp.getFieldName());
assertEquals("after",
sfp.getOperator());
assertEquals("26-Jun-2013",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testSingleFieldConstraintCEPOperator1Parameter() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "$e : Event()\n"
+ "Event( this after[1d] $e )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(2,
m.lhs.length);
IPattern p1 = m.lhs[0];
assertTrue(p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) p1;
assertEquals("Event",
fp1.getFactType());
assertEquals("$e",
fp1.getBoundName());
assertEquals(0,
fp1.getNumberOfConstraints());
IPattern p2 = m.lhs[1];
assertTrue(p2 instanceof FactPattern);
FactPattern fp2 = (FactPattern) p2;
assertEquals("Event",
fp2.getFactType());
assertNull(fp2.getBoundName());
assertEquals(1,
fp2.getNumberOfConstraints());
SingleFieldConstraint sfp = (SingleFieldConstraint) fp2.getConstraint(0);
assertEquals("Event",
sfp.getFactType());
assertEquals("this",
sfp.getFieldName());
assertEquals("after",
sfp.getOperator());
assertEquals("$e",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_VARIABLE,
sfp.getConstraintValueType());
assertEquals(3,
sfp.getParameters().size());
assertEquals("1d",
sfp.getParameter("0"));
assertEquals("1",
sfp.getParameter("org.drools.workbench.models.commons.backend.rule.visibleParameterSet"));
assertEquals("org.drools.workbench.models.commons.backend.rule.CEPOperatorParameterDRLBuilder",
sfp.getParameter("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator"));
}
@Test
public void testReciprocal_SingleFieldConstraintCEPOperator1Parameter() {
//This is the inverse of "SingleFieldConstraintCEPOperator1Parameter"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$e : Event()\n"
+ "Event( this after[1d] $e )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
FactPattern fp1 = new FactPattern();
fp1.setFactType("Event");
fp1.setBoundName("$e");
FactPattern fp2 = new FactPattern();
fp2.setFactType("Event");
SingleFieldConstraint sfp = new SingleFieldConstraint();
sfp.setFactType("Event");
sfp.setFieldName("this");
sfp.setOperator("after");
sfp.setValue("$e");
sfp.setConstraintValueType(BaseSingleFieldConstraint.TYPE_VARIABLE);
sfp.getParameters().put("0",
"1d");
sfp.getParameters().put("org.drools.workbench.models.commons.backend.rule.visibleParameterSet",
"1");
sfp.getParameters().put("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator",
"org.drools.workbench.models.commons.backend.rule.CEPOperatorParameterDRLBuilder");
fp2.addConstraint(sfp);
m.addLhsItem(fp1);
m.addLhsItem(fp2);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testSingleFieldConstraintCEPOperator2Parameters() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "$e : Event()\n"
+ "Event( this after[1d, 2d] $e )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(2,
m.lhs.length);
IPattern p1 = m.lhs[0];
assertTrue(p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) p1;
assertEquals("Event",
fp1.getFactType());
assertEquals("$e",
fp1.getBoundName());
assertEquals(0,
fp1.getNumberOfConstraints());
IPattern p2 = m.lhs[1];
assertTrue(p2 instanceof FactPattern);
FactPattern fp2 = (FactPattern) p2;
assertEquals("Event",
fp2.getFactType());
assertNull(fp2.getBoundName());
assertEquals(1,
fp2.getNumberOfConstraints());
SingleFieldConstraint sfp = (SingleFieldConstraint) fp2.getConstraint(0);
assertEquals("Event",
sfp.getFactType());
assertEquals("this",
sfp.getFieldName());
assertEquals("after",
sfp.getOperator());
assertEquals("$e",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_VARIABLE,
sfp.getConstraintValueType());
assertEquals(4,
sfp.getParameters().size());
assertEquals("1d",
sfp.getParameter("0"));
assertEquals("2d",
sfp.getParameter("1"));
assertEquals("2",
sfp.getParameter("org.drools.workbench.models.commons.backend.rule.visibleParameterSet"));
assertEquals("org.drools.workbench.models.commons.backend.rule.CEPOperatorParameterDRLBuilder",
sfp.getParameter("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator"));
}
@Test
public void testReciprocal_SingleFieldConstraintCEPOperator2Parameters() {
//This is the inverse of "SingleFieldConstraintCEPOperator2Parameters"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$e : Event()\n"
+ "Event( this after[1d, 2d] $e )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
FactPattern fp1 = new FactPattern();
fp1.setFactType("Event");
fp1.setBoundName("$e");
FactPattern fp2 = new FactPattern();
fp2.setFactType("Event");
SingleFieldConstraint sfp = new SingleFieldConstraint();
sfp.setFactType("Event");
sfp.setFieldName("this");
sfp.setOperator("after");
sfp.setValue("$e");
sfp.setConstraintValueType(BaseSingleFieldConstraint.TYPE_VARIABLE);
sfp.getParameters().put("0",
"1d");
sfp.getParameters().put("1",
"2d");
sfp.getParameters().put("org.drools.workbench.models.commons.backend.rule.visibleParameterSet",
"2");
sfp.getParameters().put("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator",
"org.drools.workbench.models.commons.backend.rule.CEPOperatorParameterDRLBuilder");
fp2.addConstraint(sfp);
m.addLhsItem(fp1);
m.addLhsItem(fp2);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testSingleFieldConstraintCEPOperatorTimeWindow() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Event() over window:time (1d)\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p1 = m.lhs[0];
assertTrue(p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) p1;
assertEquals("Event",
fp1.getFactType());
assertNull(fp1.getBoundName());
assertEquals(0,
fp1.getNumberOfConstraints());
assertNotNull(fp1.getWindow());
CEPWindow window = fp1.getWindow();
assertEquals("over window:time",
window.getOperator());
assertEquals(2,
window.getParameters().size());
assertEquals("1d",
window.getParameter("1"));
assertEquals("org.drools.workbench.models.commons.backend.rule.CEPWindowOperatorParameterDRLBuilder",
window.getParameter("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator"));
}
@Test
public void testReciprocal_SingleFieldConstraintCEPOperatorTimeWindow() {
//This is the inverse of "SingleFieldConstraintCEPOperatorTimeWindow"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Event() over window:time (1d)\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
FactPattern fp1 = new FactPattern();
fp1.setFactType("Event");
CEPWindow window = new CEPWindow();
window.setOperator("over window:time");
window.getParameters().put("1",
"1d");
window.getParameters().put("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator",
"org.drools.workbench.models.commons.backend.rule.CEPWindowOperatorParameterDRLBuilder");
fp1.setWindow(window);
m.addLhsItem(fp1);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testSingleFieldConstraintCEPOperatorTimeLength() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Event() over window:length (10)\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p1 = m.lhs[0];
assertTrue(p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) p1;
assertEquals("Event",
fp1.getFactType());
assertNull(fp1.getBoundName());
assertEquals(0,
fp1.getNumberOfConstraints());
assertNotNull(fp1.getWindow());
CEPWindow window = fp1.getWindow();
assertEquals("over window:length",
window.getOperator());
assertEquals(2,
window.getParameters().size());
assertEquals("10",
window.getParameter("1"));
assertEquals("org.drools.workbench.models.commons.backend.rule.CEPWindowOperatorParameterDRLBuilder",
window.getParameter("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator"));
}
@Test
public void testReciprocal_SingleFieldConstraintCEPOperatorTimeLength() {
//This is the inverse of "SingleFieldConstraintCEPOperatorTimeLength"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Event() over window:length (10)\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
FactPattern fp1 = new FactPattern();
fp1.setFactType("Event");
CEPWindow window = new CEPWindow();
window.setOperator("over window:length");
window.getParameters().put("1",
"10");
window.getParameters().put("org.drools.workbench.models.commons.backend.rule.operatorParameterGenerator",
"org.drools.workbench.models.commons.backend.rule.CEPWindowOperatorParameterDRLBuilder");
fp1.setWindow(window);
m.addLhsItem(fp1);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testExtends() {
String drl = "rule \"rule1\" extends \"rule2\" \n"
+ "when\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals("rule2",
m.parentName);
}
@Test
public void testRuleNameWithoutTheQuotes() {
String drl = "rule rule1\n"
+ "when\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
}
@Test
public void testMetaData() {
String drl = "rule rule1\n"
+ "@author( Bob )\n"
+ "when\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.metadataList.length);
assertEquals("author",
m.metadataList[0].getAttributeName());
assertEquals("Bob",
m.metadataList[0].getValue());
}
@Test
public void testAttributes() {
String drl = "rule rule1\n"
+ "salience 42\n"
+ "when\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.attributes.length);
assertEquals("salience",
m.attributes[0].getAttributeName());
assertEquals("42",
m.attributes[0].getValue());
}
@Test
public void testEval() {
String drl = "rule rule1\n"
+ "when\n"
+ "eval( true )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FreeFormLine);
assertEquals("eval( true )",
((FreeFormLine) m.lhs[0]).getText());
}
@Test
public void testEval2() {
String drl = "rule rule1\n"
+ "when\n"
+ "Double( eval( functionTrue() && functionFalse() ) )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
SingleFieldConstraint constraint = (SingleFieldConstraint) ((FactPattern) m.lhs[0]).getConstraint(0);
assertEquals("functionTrue() && functionFalse()",
constraint.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
constraint.getConstraintValueType());
}
@Test
public void testLHSFreeFormLine() {
String drl = "rule rule1\n"
+ "when\n"
+ "//A comment\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FreeFormLine);
assertEquals("//A comment",
((FreeFormLine) m.lhs[0]).getText());
}
@Test
public void testRHSFreeFormLine() {
String drl = "rule rule1\n"
+ "when\n"
+ "then\n"
+ "int test = (int)(1-0.8);\n"
+ "System.out.println( \"Hello Mario!\" );\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
assertEquals("int test = (int)(1-0.8);",
((FreeFormLine) m.rhs[0]).getText());
assertTrue(m.rhs[1] instanceof FreeFormLine);
assertEquals("System.out.println( \"Hello Mario!\" );",
((FreeFormLine) m.rhs[1]).getText());
}
@Test
public void testLHSFreeFormLineWithDsl() {
String drl = "rule rule1\n"
+ "when\n"
+ ">//A comment\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FreeFormLine);
assertEquals("//A comment",
((FreeFormLine) m.lhs[0]).getText());
}
@Test
public void testRHSFreeFormLineWithDsl() {
String drl = "rule rule1\n"
+ "when\n"
+ "then\n"
+ ">int test = (int)(1-0.8);\n"
+ ">System.out.println( \"Hello Mario!\" );\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
assertEquals("int test = (int)(1-0.8);",
((FreeFormLine) m.rhs[0]).getText());
assertTrue(m.rhs[1] instanceof FreeFormLine);
assertEquals("System.out.println( \"Hello Mario!\" );",
((FreeFormLine) m.rhs[1]).getText());
}
@Test
public void testVarAssignment() {
String drl = "rule rule1\n"
+ "when\n"
+ " d : Double()\n"
+ "then\n"
+ "double test = d.doubleValue();\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
assertEquals("double test = d.doubleValue();",
((FreeFormLine) m.rhs[0]).getText());
}
@Test
public void testRHSOrder() {
String drl =
"rule \"Low Down Payment based on Appraisal\"\n" +
" dialect \"mvel\"\n" +
" ruleflow-group \"apr-calculation\"\n" +
" salience -3\n" +
" no-loop true\n" +
" when\n" +
" appraised : Appraisal( )\n" +
" application : Application( mortgageAmount > ( appraised.value * 8 / 10 ) )\n" +
" then\n" +
" double ratio = application.getMortgageAmount().doubleValue() / appraised.getValue().doubleValue();\n" +
" int brackets = (int)((ratio - 0.8) / 0.05);\n" +
" brackets++;\n" +
" double aprSurcharge = 0.75 * brackets;\n" +
" System.out.println( \"aprSurcharge added is \" + aprSurcharge );\n" +
" application.setApr( application.getApr() + aprSurcharge );\n" +
" System.out.println(\"Executed Rule: \" + drools.getRule().getName() );\n" +
"end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(7,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
assertTrue(m.rhs[1] instanceof FreeFormLine);
assertTrue(m.rhs[2] instanceof FreeFormLine);
assertTrue(m.rhs[3] instanceof FreeFormLine);
assertTrue(m.rhs[4] instanceof FreeFormLine);
assertTrue(m.rhs[5] instanceof ActionSetField);
assertTrue(m.rhs[6] instanceof FreeFormLine);
}
@Test
public void testNestedFieldExpressions() {
String drl =
"rule rule1\n"
+ "when\n"
+ "Person( address.postalCode == 12345 )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"address",
"org.test.Address",
"Address");
addModelField("org.test.Address",
"postalCode",
"java.lang.Integer",
"Integer");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
assertTrue(((FactPattern) m.lhs[0]).getFieldConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide ebLeftSide = (SingleFieldConstraintEBLeftSide) ((FactPattern) m.lhs[0]).getFieldConstraints()[0];
assertEquals("postalCode",
ebLeftSide.getFieldName());
assertEquals("java.lang.Integer",
ebLeftSide.getFieldType());
assertEquals("==",
ebLeftSide.getOperator());
assertEquals("12345",
ebLeftSide.getValue());
assertEquals(3,
ebLeftSide.getExpressionLeftSide().getParts().size());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
ExpressionUnboundFact expressionUnboundFact = ((ExpressionUnboundFact) ebLeftSide.getExpressionLeftSide().getParts().get(0));
assertEquals("Person",
expressionUnboundFact.getName());
assertEquals("Person",
expressionUnboundFact.getClassType());
assertEquals("Person",
expressionUnboundFact.getGenericType());
assertEquals(((FactPattern) m.lhs[0]).getFactType(),
expressionUnboundFact.getFactType());
assertNull(expressionUnboundFact.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionUnboundFact.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField1 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(1);
assertEquals("address",
expressionField1.getName());
assertEquals("org.test.Address",
expressionField1.getClassType());
assertEquals("Address",
expressionField1.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(0),
expressionField1.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(2),
expressionField1.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
ExpressionField expressionField2 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(2);
assertEquals("postalCode",
expressionField2.getName());
assertEquals("java.lang.Integer",
expressionField2.getClassType());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
expressionField2.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionField2.getPrevious());
assertNull(expressionField2.getNext());
}
@Test
public void testNestedFieldExpressionsWithAFunction() {
String drl =
"rule rule1\n"
+ "when\n"
+ "Person( address.postalCode == myFunction() )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"address",
"org.test.Address",
"Address");
addModelField("org.test.Address",
"postalCode",
"java.lang.Integer",
"Integer");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
assertTrue(((FactPattern) m.lhs[0]).getFieldConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide ebLeftSide = (SingleFieldConstraintEBLeftSide) ((FactPattern) m.lhs[0]).getFieldConstraints()[0];
assertEquals("postalCode",
ebLeftSide.getFieldName());
assertEquals("java.lang.Integer",
ebLeftSide.getFieldType());
assertEquals("==",
ebLeftSide.getOperator());
assertEquals("myFunction()",
ebLeftSide.getValue());
assertEquals(3,
ebLeftSide.getExpressionLeftSide().getParts().size());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
ExpressionUnboundFact expressionUnboundFact = ((ExpressionUnboundFact) ebLeftSide.getExpressionLeftSide().getParts().get(0));
assertEquals("Person",
expressionUnboundFact.getName());
assertEquals("Person",
expressionUnboundFact.getClassType());
assertEquals("Person",
expressionUnboundFact.getGenericType());
assertEquals(((FactPattern) m.lhs[0]).getFactType(),
expressionUnboundFact.getFactType());
assertNull(expressionUnboundFact.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionUnboundFact.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField1 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(1);
assertEquals("address",
expressionField1.getName());
assertEquals("org.test.Address",
expressionField1.getClassType());
assertEquals("Address",
expressionField1.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(0),
expressionField1.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(2),
expressionField1.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
ExpressionField expressionField2 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(2);
assertEquals("postalCode",
expressionField2.getName());
assertEquals("java.lang.Integer",
expressionField2.getClassType());
assertEquals("Integer",
expressionField2.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionField2.getPrevious());
assertNull(expressionField2.getNext());
}
@Test
public void testNestedFieldExpressionsWithAnotherExpression() {
String drl =
"rule rule1\n"
+ "when\n"
+ "p : Person( address.postalCode == p.address.postalCode )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"address",
"org.test.Address",
"Address");
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Address",
"postalCode",
"java.lang.Integer",
"Integer");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
assertTrue(((FactPattern) m.lhs[0]).getFieldConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide ebLeftSide = (SingleFieldConstraintEBLeftSide) ((FactPattern) m.lhs[0]).getFieldConstraints()[0];
assertEquals("postalCode",
ebLeftSide.getFieldName());
assertEquals("java.lang.Integer",
ebLeftSide.getFieldType());
assertEquals("==",
ebLeftSide.getOperator());
assertEquals("",
ebLeftSide.getValue());
assertEquals(3,
ebLeftSide.getExpressionValue().getParts().size());
assertTrue(ebLeftSide.getExpressionValue().getParts().get(0) instanceof ExpressionVariable);
ExpressionVariable expressionVariable = (ExpressionVariable) ebLeftSide.getExpressionValue().getParts().get(0);
assertEquals("p",
expressionVariable.getName());
assertEquals("org.test.Person",
expressionVariable.getClassType());
assertEquals(DataType.TYPE_THIS,
expressionVariable.getGenericType());
assertTrue(ebLeftSide.getExpressionValue().getParts().get(1) instanceof ExpressionField);
ExpressionField ef1 = (ExpressionField) ebLeftSide.getExpressionValue().getParts().get(1);
assertEquals("address",
ef1.getName());
assertEquals("org.test.Address",
ef1.getClassType());
assertEquals("Address",
ef1.getGenericType());
assertTrue(ebLeftSide.getExpressionValue().getParts().get(2) instanceof ExpressionField);
ExpressionField ef2 = (ExpressionField) ebLeftSide.getExpressionValue().getParts().get(2);
assertEquals("postalCode",
ef2.getName());
assertEquals("java.lang.Integer",
ef2.getClassType());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
ef2.getGenericType());
assertEquals(3,
ebLeftSide.getExpressionLeftSide().getParts().size());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
ExpressionUnboundFact expressionUnboundFact = ((ExpressionUnboundFact) ebLeftSide.getExpressionLeftSide().getParts().get(0));
assertEquals("Person",
expressionUnboundFact.getName());
assertEquals("Person",
expressionUnboundFact.getClassType());
assertEquals("Person",
expressionUnboundFact.getGenericType());
assertEquals(((FactPattern) m.lhs[0]).getFactType(),
expressionUnboundFact.getFactType());
assertNull(expressionUnboundFact.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionUnboundFact.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField1 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(1);
assertEquals("address",
expressionField1.getName());
assertEquals("org.test.Address",
expressionField1.getClassType());
assertEquals("Address",
expressionField1.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(0),
expressionField1.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(2),
expressionField1.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
ExpressionField expressionField2 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(2);
assertEquals("postalCode",
expressionField2.getName());
assertEquals("java.lang.Integer",
expressionField2.getClassType());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
expressionField2.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionField2.getPrevious());
assertNull(expressionField2.getNext());
}
@Test
public void testSingleFieldConstraintContainsOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "$is : IncomeSource( )\n"
+ "Applicant( incomes contains $is )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(2,
m.lhs.length);
IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
FactPattern fp0 = (FactPattern) p0;
assertEquals("IncomeSource",
fp0.getFactType());
assertEquals("$is",
fp0.getBoundName());
IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) p1;
assertEquals("Applicant",
fp1.getFactType());
assertEquals(0,
fp0.getNumberOfConstraints());
assertEquals(1,
fp1.getNumberOfConstraints());
assertTrue(fp1.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp1.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("incomes",
sfp.getFieldName());
assertEquals("contains",
sfp.getOperator());
assertEquals("$is",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_VARIABLE,
sfp.getConstraintValueType());
}
@Test
public void testCompositeFactPatternWithOr() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "( Person( age == 42 ) or Person( age == 43 ) )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof CompositeFactPattern);
CompositeFactPattern cfp = (CompositeFactPattern) p;
assertEquals(CompositeFactPattern.COMPOSITE_TYPE_OR,
cfp.getType());
//LHS sub-patterns
assertEquals(2,
cfp.getPatterns().length);
IPattern cfp_p1 = cfp.getPatterns()[0];
assertTrue(cfp_p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) cfp_p1;
assertEquals("Person",
fp1.getFactType());
assertEquals(1,
fp1.getConstraintList().getConstraints().length);
assertTrue(fp1.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint cfp_sfp1 = (SingleFieldConstraint) fp1.getConstraint(0);
assertEquals("Person",
cfp_sfp1.getFactType());
assertEquals("age",
cfp_sfp1.getFieldName());
assertEquals("==",
cfp_sfp1.getOperator());
assertEquals("42",
cfp_sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cfp_sfp1.getConstraintValueType());
IPattern cfp_p2 = cfp.getPatterns()[1];
assertTrue(cfp_p2 instanceof FactPattern);
FactPattern fp2 = (FactPattern) cfp_p2;
assertEquals("Person",
fp2.getFactType());
assertTrue(fp2.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint cfp_sfp2 = (SingleFieldConstraint) fp2.getConstraint(0);
assertEquals("Person",
cfp_sfp2.getFactType());
assertEquals("age",
cfp_sfp2.getFieldName());
assertEquals("==",
cfp_sfp2.getOperator());
assertEquals("43",
cfp_sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cfp_sfp2.getConstraintValueType());
}
@Test
public void testReciprocal_CompositeFactPatternWithOr() {
//This is the inverse of "CompositeFactPatternWithOr"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "( Person( age == 42 ) or Person( age == 43 ) )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
//LHS Patterns
CompositeFactPattern cfp = new CompositeFactPattern();
cfp.setType(CompositeFactPattern.COMPOSITE_TYPE_OR);
//LHS sub-patterns
FactPattern fp1 = new FactPattern();
fp1.setFactType("Person");
SingleFieldConstraint cfp_sfp1 = new SingleFieldConstraint();
cfp_sfp1.setFactType("Person");
cfp_sfp1.setFieldName("age");
cfp_sfp1.setOperator("==");
cfp_sfp1.setValue("42");
cfp_sfp1.setFieldType(DataType.TYPE_NUMERIC_INTEGER);
cfp_sfp1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp1.addConstraint(cfp_sfp1);
cfp.addFactPattern(fp1);
FactPattern fp2 = new FactPattern();
fp2.setFactType("Person");
SingleFieldConstraint cfp_sfp2 = new SingleFieldConstraint();
cfp_sfp2.setFactType("Person");
cfp_sfp2.setFieldName("age");
cfp_sfp2.setOperator("==");
cfp_sfp2.setValue("43");
cfp_sfp2.setFieldType(DataType.TYPE_NUMERIC_INTEGER);
cfp_sfp2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp2.addConstraint(cfp_sfp2);
cfp.addFactPattern(fp2);
m.addLhsItem(cfp);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testCompositeFactPatternWithOrAndCompositeFieldConstraint() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "( Person( age == 42 ) or Person( age == 43 || age == 44) )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof CompositeFactPattern);
CompositeFactPattern cfp = (CompositeFactPattern) p;
assertEquals(CompositeFactPattern.COMPOSITE_TYPE_OR,
cfp.getType());
//LHS sub-patterns
assertEquals(2,
cfp.getPatterns().length);
IPattern cfp_p1 = cfp.getPatterns()[0];
assertTrue(cfp_p1 instanceof FactPattern);
FactPattern fp1 = (FactPattern) cfp_p1;
assertEquals("Person",
fp1.getFactType());
assertEquals(1,
fp1.getConstraintList().getConstraints().length);
assertTrue(fp1.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint cfp_sfp1 = (SingleFieldConstraint) fp1.getConstraint(0);
assertEquals("Person",
cfp_sfp1.getFactType());
assertEquals("age",
cfp_sfp1.getFieldName());
assertEquals("==",
cfp_sfp1.getOperator());
assertEquals("42",
cfp_sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cfp_sfp1.getConstraintValueType());
IPattern cfp_p2 = cfp.getPatterns()[1];
assertTrue(cfp_p2 instanceof FactPattern);
FactPattern fp2 = (FactPattern) cfp_p2;
assertEquals(1,
fp2.getConstraintList().getConstraints().length);
assertTrue(fp2.getConstraint(0) instanceof CompositeFieldConstraint);
CompositeFieldConstraint cfp_p2_cfp = (CompositeFieldConstraint) fp2.getConstraint(0);
assertEquals("||",
cfp_p2_cfp.getCompositeJunctionType());
assertEquals(2,
cfp_p2_cfp.getNumberOfConstraints());
assertTrue(cfp_p2_cfp.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfp_p2_cfp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint cfp_p2_sfp1 = (SingleFieldConstraint) cfp_p2_cfp.getConstraint(0);
assertEquals("Person",
cfp_p2_sfp1.getFactType());
assertEquals("age",
cfp_p2_sfp1.getFieldName());
assertEquals("==",
cfp_p2_sfp1.getOperator());
assertEquals("43",
cfp_p2_sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cfp_p2_sfp1.getConstraintValueType());
SingleFieldConstraint cfp_p2_sfp2 = (SingleFieldConstraint) cfp_p2_cfp.getConstraint(1);
assertEquals("Person",
cfp_p2_sfp2.getFactType());
assertEquals("age",
cfp_p2_sfp2.getFieldName());
assertEquals("==",
cfp_p2_sfp2.getOperator());
assertEquals("44",
cfp_p2_sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cfp_p2_sfp2.getConstraintValueType());
}
@Test
public void testReciprocal_CompositeFactPatternWithOrAndCompositeFieldConstraint() {
//This is the inverse of "CompositeFactPatternWithOrAndCompositeFieldConstraint"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "( Person( age == 42 ) or Person( age == 43 || age == 44) )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
//LHS Pattern
CompositeFactPattern cfp = new CompositeFactPattern();
cfp.setType(CompositeFactPattern.COMPOSITE_TYPE_OR);
//LHS sub-patterns
FactPattern fp1 = new FactPattern();
fp1.setFactType("Person");
SingleFieldConstraint fp1_sfp1 = new SingleFieldConstraint();
fp1_sfp1.setFactType("Person");
fp1_sfp1.setFieldName("age");
fp1_sfp1.setOperator("==");
fp1_sfp1.setValue("42");
fp1_sfp1.setFieldType(DataType.TYPE_NUMERIC_INTEGER);
fp1_sfp1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp1.addConstraint(fp1_sfp1);
FactPattern fp2 = new FactPattern();
fp2.setFactType("Person");
CompositeFieldConstraint fp2_cfp = new CompositeFieldConstraint();
fp2_cfp.setCompositeJunctionType(CompositeFieldConstraint.COMPOSITE_TYPE_OR);
fp2.addConstraint(fp2_cfp);
SingleFieldConstraint fp2_sfp1 = new SingleFieldConstraint();
fp2_sfp1.setFactType("Person");
fp2_sfp1.setFieldName("age");
fp2_sfp1.setOperator("==");
fp2_sfp1.setValue("43");
fp2_sfp1.setFieldType(DataType.TYPE_NUMERIC_INTEGER);
fp2_sfp1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp2_cfp.addConstraint(fp2_sfp1);
SingleFieldConstraint fp2_sfp2 = new SingleFieldConstraint();
fp2_sfp2.setFactType("Person");
fp2_sfp2.setFieldName("age");
fp2_sfp2.setOperator("==");
fp2_sfp2.setValue("44");
fp2_sfp2.setFieldType(DataType.TYPE_NUMERIC_INTEGER);
fp2_sfp2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp2_cfp.addConstraint(fp2_sfp2);
cfp.addFactPattern(fp1);
cfp.addFactPattern(fp2);
m.addLhsItem(cfp);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testNestedFieldConstraints() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "ParentType( this != null, this.parentChildField != null, this.parentChildField.childField == \"hello\" )\n"
+ "then\n"
+ "end";
addModelField("org.test.ParentType",
"parentChildField",
"org.test.ChildType",
"ChildType");
addModelField("org.test.ChildType",
"childField",
"java.lang.String",
"String");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("ParentType",
fp.getFactType());
assertEquals(3,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp0 = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("ParentType",
sfp0.getFactType());
assertEquals("this",
sfp0.getFieldName());
assertEquals(DataType.TYPE_THIS,
sfp0.getFieldType());
assertEquals("!= null",
sfp0.getOperator());
assertNull(sfp0.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp0.getConstraintValueType());
assertNull(sfp0.getParent());
assertTrue(fp.getConstraint(1) instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide sfp1 = (SingleFieldConstraintEBLeftSide) fp.getConstraint(1);
assertEquals("ParentType",
sfp1.getFactType());
assertEquals("parentChildField",
sfp1.getFieldName());
assertEquals("org.test.ChildType",
sfp1.getFieldType());
assertEquals("!= null",
sfp1.getOperator());
assertNull(sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp1.getConstraintValueType());
assertNull(sfp1.getParent());
assertTrue(fp.getConstraint(2) instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide sfp2 = (SingleFieldConstraintEBLeftSide) fp.getConstraint(2);
assertEquals("childField",
sfp2.getFieldName());
assertEquals("java.lang.String",
sfp2.getFieldType());
assertEquals("==",
sfp2.getOperator());
assertEquals("hello",
sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp2.getConstraintValueType());
assertNull(sfp2.getParent());
}
@Test
public void testReciprocal_NestedFieldConstraints() {
//This is the inverse of "NestedFieldConstraints"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "ParentType( this != null, this.parentChildField != null, this.parentChildField.childField == \"hello\" )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
//LHS Pattern
FactPattern fp1 = new FactPattern();
fp1.setFactType("ParentType");
SingleFieldConstraint fp1_sfp1 = new SingleFieldConstraint();
fp1_sfp1.setFactType("ParentType");
fp1_sfp1.setFieldName("this");
fp1_sfp1.setFieldType(DataType.TYPE_THIS);
fp1_sfp1.setOperator("!= null");
fp1_sfp1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_UNDEFINED);
fp1.addConstraint(fp1_sfp1);
SingleFieldConstraint fp1_sfp2 = new SingleFieldConstraint();
fp1_sfp2.setFactType("ParentType");
fp1_sfp2.setFieldName("parentChildField");
fp1_sfp2.setFieldType("ChildType");
fp1_sfp2.setOperator("!= null");
fp1_sfp2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_UNDEFINED);
fp1.addConstraint(fp1_sfp2);
fp1_sfp2.setParent(fp1_sfp1);
SingleFieldConstraint fp1_sfp3 = new SingleFieldConstraint();
fp1_sfp3.setFactType("ChildType");
fp1_sfp3.setFieldName("childField");
fp1_sfp3.setFieldType(DataType.TYPE_STRING);
fp1_sfp3.setOperator("==");
fp1_sfp3.setValue("hello");
fp1_sfp3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp1.addConstraint(fp1_sfp3);
fp1_sfp3.setParent(fp1_sfp2);
m.addLhsItem(fp1);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testNestedFieldConstraintsAsExpression() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Person( contact.telephone > 12345 )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"contact",
"org.test.Contact",
"Contact");
addModelField("org.test.Contact",
"telephone",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(((FactPattern) m.lhs[0]).getFieldConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide ebLeftSide = (SingleFieldConstraintEBLeftSide) ((FactPattern) m.lhs[0]).getFieldConstraints()[0];
assertEquals("telephone",
ebLeftSide.getFieldName());
assertEquals("java.lang.Integer",
ebLeftSide.getFieldType());
assertEquals(">",
ebLeftSide.getOperator());
assertEquals("12345",
ebLeftSide.getValue());
assertEquals(3,
ebLeftSide.getExpressionLeftSide().getParts().size());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
ExpressionUnboundFact expressionUnboundFact = ((ExpressionUnboundFact) ebLeftSide.getExpressionLeftSide().getParts().get(0));
assertEquals("Person",
expressionUnboundFact.getName());
assertEquals("Person",
expressionUnboundFact.getClassType());
assertEquals("Person",
expressionUnboundFact.getGenericType());
assertEquals(((FactPattern) m.lhs[0]).getFactType(),
expressionUnboundFact.getFactType());
assertEquals(null,
expressionUnboundFact.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionUnboundFact.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField1 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(1);
assertEquals("contact",
expressionField1.getName());
assertEquals("org.test.Contact",
expressionField1.getClassType());
assertEquals("Contact",
expressionField1.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(0),
expressionField1.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(2),
expressionField1.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
ExpressionField expressionField2 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(2);
assertEquals("telephone",
expressionField2.getName());
assertEquals("java.lang.Integer",
expressionField2.getClassType());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
expressionField2.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionField2.getPrevious());
assertNull(expressionField2.getNext());
}
@Test
public void testNestedFieldConstraintsOnlyLeafOperator() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "ParentType( parentChildField.childField == \"hello\" )\n"
+ "then\n"
+ "end";
addModelField("org.test.ParentType",
"parentChildField",
"org.test.ChildType",
"ChildType");
addModelField("org.test.ChildType",
"childField",
"java.lang.String",
"String");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
assertTrue(((FactPattern) m.lhs[0]).getFieldConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide ebLeftSide = (SingleFieldConstraintEBLeftSide) ((FactPattern) m.lhs[0]).getFieldConstraints()[0];
assertEquals("childField",
ebLeftSide.getFieldName());
assertEquals("java.lang.String",
ebLeftSide.getFieldType());
assertEquals("==",
ebLeftSide.getOperator());
assertEquals("hello",
ebLeftSide.getValue());
assertEquals(3,
ebLeftSide.getExpressionLeftSide().getParts().size());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
ExpressionUnboundFact expressionUnboundFact = ((ExpressionUnboundFact) ebLeftSide.getExpressionLeftSide().getParts().get(0));
assertEquals("ParentType",
expressionUnboundFact.getName());
assertEquals("ParentType",
expressionUnboundFact.getClassType());
assertEquals("ParentType",
expressionUnboundFact.getGenericType());
assertEquals(((FactPattern) m.lhs[0]).getFactType(),
expressionUnboundFact.getFactType());
assertNull(expressionUnboundFact.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionUnboundFact.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField1 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(1);
assertEquals("parentChildField",
expressionField1.getName());
assertEquals("org.test.ChildType",
expressionField1.getClassType());
assertEquals("ChildType",
expressionField1.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(0),
expressionField1.getPrevious());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(2),
expressionField1.getNext());
assertTrue(ebLeftSide.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
ExpressionField expressionField2 = (ExpressionField) ebLeftSide.getExpressionLeftSide().getParts().get(2);
assertEquals("childField",
expressionField2.getName());
assertEquals("java.lang.String",
expressionField2.getClassType());
assertEquals("String",
expressionField2.getGenericType());
assertEquals(ebLeftSide.getExpressionLeftSide().getParts().get(1),
expressionField2.getPrevious());
assertNull(expressionField2.getNext());
}
@Test
public void testReciprocal_NestedFieldConstraintsOnlyLeafOperator() {
//This is the inverse of "NestedFieldConstraintsOnlyLeafOperator"
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "ParentType( this.parentChildField.childField == \"hello\" )\n"
+ "then\n"
+ "end";
RuleModel m = new RuleModel();
m.name = "rule1";
//LHS Pattern
FactPattern fp1 = new FactPattern();
fp1.setFactType("ParentType");
SingleFieldConstraint fp1_sfp1 = new SingleFieldConstraint();
fp1_sfp1.setFactType("ParentType");
fp1_sfp1.setFieldName("this");
fp1_sfp1.setFieldType(DataType.TYPE_THIS);
fp1_sfp1.setConstraintValueType(BaseSingleFieldConstraint.TYPE_UNDEFINED);
fp1.addConstraint(fp1_sfp1);
SingleFieldConstraint fp1_sfp2 = new SingleFieldConstraint();
fp1_sfp2.setFactType("ParentType");
fp1_sfp2.setFieldName("parentChildField");
fp1_sfp2.setFieldType("ChildType");
fp1_sfp2.setConstraintValueType(BaseSingleFieldConstraint.TYPE_UNDEFINED);
fp1.addConstraint(fp1_sfp2);
fp1_sfp2.setParent(fp1_sfp1);
SingleFieldConstraint fp1_sfp3 = new SingleFieldConstraint();
fp1_sfp3.setFactType("ChildType");
fp1_sfp3.setFieldName("childField");
fp1_sfp3.setFieldType(DataType.TYPE_STRING);
fp1_sfp3.setOperator("==");
fp1_sfp3.setValue("hello");
fp1_sfp3.setConstraintValueType(BaseSingleFieldConstraint.TYPE_LITERAL);
fp1.addConstraint(fp1_sfp3);
fp1_sfp3.setParent(fp1_sfp2);
m.addLhsItem(fp1);
String actualDrl = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
actualDrl);
}
@Test
public void testCalendarsAttribute() {
String drl = "rule \"rule1\"\n"
+ "calendars \"myCalendar\", \"Yet Another Calendar\"\n"
+ "when\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.attributes.length);
assertEquals("calendars",
m.attributes[0].getAttributeName());
assertEquals("myCalendar, Yet Another Calendar",
m.attributes[0].getValue());
}
@Test
public void testFunctionCall() {
// BZ-1013682
String drl = "" +
"package org.mortgages;\n" +
"import org.mortgages.LoanApplication;\n" +
"\n" +
"rule \"my rule\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" a : LoanApplication( )\n" +
" then\n" +
" keke.clear( );\n" +
"end\n";
HashMap<String, String> globals = new HashMap<>();
globals.put("keke",
"java.util.ArrayList");
when(
dmo.getPackageGlobals()
).thenReturn(
globals
);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod actionGlobalCollectionAdd = (ActionCallMethod) m.rhs[0];
assertEquals("clear",
actionGlobalCollectionAdd.getMethodName());
assertEquals("keke",
actionGlobalCollectionAdd.getVariable());
assertEquals(1,
actionGlobalCollectionAdd.getState());
assertEquals(0,
actionGlobalCollectionAdd.getFieldValues().length);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testMethodCall() {
// BZ-1042511
String drl = "" +
"package org.mortgages;\n" +
"import org.mortgages.LoanApplication;\n" +
"import java.util.Map;\n" +
"rule \"my rule\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" a : LoanApplication( )\n" +
" m : Map()\n" +
" then\n" +
" m.put(\"key\", a );\n" +
"end\n";
HashMap<String, String> globals = new HashMap<>();
when(dmo.getPackageGlobals()).thenReturn(globals);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(2,
m.getImports().getImports().size());
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod mc = (ActionCallMethod) m.rhs[0];
assertEquals("put",
mc.getMethodName());
assertEquals("m",
mc.getVariable());
assertEquals(1,
mc.getState());
assertEquals(2,
mc.getFieldValues().length);
ActionFieldValue f1 = mc.getFieldValue(0);
assertEquals("key",
f1.getValue());
ActionFieldValue f2 = mc.getFieldValue(1);
assertEquals("a",
f2.getValue());
String marshalled = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
logger.debug(marshalled);
assertEqualsIgnoreWhitespace(drl,
marshalled);
}
@Test
public void testMethodCallCheckParameterDataTypes1() {
// BZ-1045423
String drl = "" +
"package org.mortgages;\n" +
"import org.mortgages.LoanApplication;\n" +
"import java.util.Map;\n" +
"rule \"my rule\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" a : LoanApplication( )\n" +
" m : Map()\n" +
" then\n" +
" m.put(\"key\", a );\n" +
"end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("put",
Arrays.asList("java.lang.Object",
"java.lang.Object"),
"void",
"void",
"java.util.Map"));
methodInformation.put("java.util.Map",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod mc = (ActionCallMethod) m.rhs[0];
assertEquals("put",
mc.getMethodName());
assertEquals("m",
mc.getVariable());
assertEquals(1,
mc.getState());
assertEquals(2,
mc.getFieldValues().length);
ActionFieldValue f1 = mc.getFieldValue(0);
assertEquals("\"key\"",
f1.getValue());
assertEquals("java.lang.Object",
f1.getType());
assertEquals(FieldNatureType.TYPE_LITERAL,
f1.getNature());
ActionFieldValue f2 = mc.getFieldValue(1);
assertEquals("a",
f2.getValue());
assertEquals("java.lang.Object",
f2.getType());
assertEquals(FieldNatureType.TYPE_VARIABLE,
f2.getNature());
String marshalled = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
logger.debug(marshalled);
assertEqualsIgnoreWhitespace(drl,
marshalled);
}
@Test
public void testMethodCallCheckParameterDataTypes2() {
// BZ-1045423
String drl = "" +
"package org.mortgages;\n" +
"import org.mortgages.MyType;\n" +
"rule \"my rule\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" t : MyType( )\n" +
" then\n" +
" t.doSomething( 1 * 2 );\n" +
"end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("doSomething",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"void",
"void",
"org.mortgages.MyType"));
methodInformation.put("org.mortgages.MyType",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod mc = (ActionCallMethod) m.rhs[0];
assertEquals("doSomething",
mc.getMethodName());
assertEquals("t",
mc.getVariable());
assertEquals(1,
mc.getState());
assertEquals(1,
mc.getFieldValues().length);
ActionFieldValue f1 = mc.getFieldValue(0);
assertEquals("1 * 2",
f1.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
f1.getType());
assertEquals(FieldNatureType.TYPE_FORMULA,
f1.getNature());
String marshalled = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
logger.debug(marshalled);
assertEqualsIgnoreWhitespace(drl,
marshalled);
}
@Test
public void testMethodCallCheckParameterDataTypes3() {
// BZ-1045423
String drl = "" +
"package org.mortgages;\n" +
"import org.mortgages.MyType;\n" +
"rule \"my rule\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" i : Integer( )\n" +
" t : MyType( )\n" +
" then\n" +
" t.doSomething( i );\n" +
"end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("doSomething",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"void",
"void",
"org.mortgages.MyType"));
methodInformation.put("org.mortgages.MyType",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod mc = (ActionCallMethod) m.rhs[0];
assertEquals("doSomething",
mc.getMethodName());
assertEquals("t",
mc.getVariable());
assertEquals(1,
mc.getState());
assertEquals(1,
mc.getFieldValues().length);
ActionFieldValue f1 = mc.getFieldValue(0);
assertEquals("i",
f1.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
f1.getType());
assertEquals(FieldNatureType.TYPE_VARIABLE,
f1.getNature());
String marshalled = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
logger.debug(marshalled);
assertEqualsIgnoreWhitespace(drl,
marshalled);
}
@Test
public void testGlobalCollectionAdd() {
// BZ-1013682
String drl = "package org.mortgages;\n" +
"\n" +
"import org.mortgages.LoanApplication;\n" +
"\n" +
"rule \"Bankruptcy history\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" a : LoanApplication( )\n" +
" then\n" +
" keke.add( a );\n" +
"end";
HashMap<String, String> globals = new HashMap<>();
globals.put("keke",
"java.util.ArrayList");
when(
dmo.getPackageGlobals()
).thenReturn(
globals
);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionGlobalCollectionAdd);
ActionGlobalCollectionAdd actionGlobalCollectionAdd = (ActionGlobalCollectionAdd) m.rhs[0];
assertEquals("keke",
actionGlobalCollectionAdd.getGlobalName());
assertEquals("a",
actionGlobalCollectionAdd.getFactName());
}
@Test
public void testFieldConstraintLessThanOrEqualTo() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Applicant( age <= 22 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
FieldConstraint fc = fp.getConstraint(0);
assertNotNull(fc);
assertTrue(fc instanceof SingleFieldConstraint);
SingleFieldConstraint sfc = (SingleFieldConstraint) fc;
assertEquals("<=",
sfc.getOperator());
assertEquals("22",
sfc.getValue());
}
@Test
public void testExpressionWithListSize() throws Exception {
String drl = "" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Company( emps.size() == 0 )\n" +
" then\n" +
"end";
addModelField("Company",
"emps",
"java.util.List",
"List");
addMethodInformation("java.util.List",
"size",
Collections.emptyList(),
"int",
null,
DataType.TYPE_NUMERIC_INTEGER);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
FactPattern factPattern = (FactPattern) m.lhs[0];
assertEquals(1,
factPattern.getConstraintList().getConstraints().length);
assertTrue(factPattern.getConstraintList().getConstraints()[0] instanceof SingleFieldConstraintEBLeftSide);
SingleFieldConstraintEBLeftSide constraint = (SingleFieldConstraintEBLeftSide) factPattern.getConstraintList().getConstraints()[0];
assertEquals("size",
constraint.getFieldName());
assertEquals("int",
constraint.getFieldType());
assertEquals("0",
constraint.getValue());
assertEquals("==",
constraint.getOperator());
assertEquals(1,
constraint.getConstraintValueType());
}
@Test
public void testMVELInlineList() throws Exception {
String drl = "" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" c : Company( )\n" +
" then\n" +
" c.setEmps( [\"item1\", \"item2\"] );\n" +
"end";
addModelField("Company",
"emps",
"java.util.List",
DataType.TYPE_COLLECTION);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionSetField);
ActionSetField actionSetField = (ActionSetField) m.rhs[0];
assertEquals("c",
actionSetField.getVariable());
assertEquals(1,
actionSetField.getFieldValues().length);
ActionFieldValue actionFieldValue = actionSetField.getFieldValues()[0];
assertEquals("[\"item1\", \"item2\"]",
actionFieldValue.getValue());
assertEquals("emps",
actionFieldValue.getField());
assertEquals(FieldNatureType.TYPE_FORMULA,
actionFieldValue.getNature());
assertEquals(DataType.TYPE_COLLECTION,
actionFieldValue.getType());
}
@Test
public void testFunctionInRHS() throws Exception {
String drl = "" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" application : Application( )\n" +
" then\n" +
" application.setApr( application.getApr() + 5 );\n" +
" update( application )" +
"end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField field = (ActionUpdateField) m.rhs[0];
assertNotNull(field.getFieldValues()[0]);
ActionFieldValue value = field.getFieldValues()[0];
assertEquals("apr",
value.getField());
assertEquals("application.getApr() + 5",
value.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
value.getNature());
assertEquals(DataType.TYPE_NUMERIC,
value.getType());
}
@Test
public void testFieldVars() throws Exception {
String drl = "" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Customer( var:contact )\n" +
" then\n" +
"end";
addModelField("Customer",
"contact",
"Contact",
"Contact");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getFieldConstraints()[0];
assertEquals("var",
constraint.getFieldBinding());
assertEquals("Customer",
constraint.getFactType());
assertEquals("contact",
constraint.getFieldName());
assertEquals("Contact",
constraint.getFieldType());
}
@Test
public void testFieldVarsWithImports() throws Exception {
String drl = "" +
"import org.test.Customer\n" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Customer( var:contact )\n" +
" then\n" +
"end";
addModelField("org.test.Customer",
"contact",
"org.test.Contact",
"org.test.Contact");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getFieldConstraints()[0];
assertEquals("var",
constraint.getFieldBinding());
assertEquals("Customer",
constraint.getFactType());
assertEquals("contact",
constraint.getFieldName());
assertEquals("org.test.Contact",
constraint.getFieldType());
}
@Test
public void testFieldVarsFactTypeInTheSamePackage() throws Exception {
String drl = "" +
"package org.test\n" +
"rule \"Borked\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Customer( var:contact )\n" +
" then\n" +
"end";
addModelField("org.test.Customer",
"contact",
"org.test.Contact",
"org.test.Contact");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getFieldConstraints()[0];
assertEquals("var",
constraint.getFieldBinding());
assertEquals("Customer",
constraint.getFactType());
assertEquals("contact",
constraint.getFieldName());
assertEquals("org.test.Contact",
constraint.getFieldType());
}
@Test
public void testSingleFieldConstraintEBLeftSide() throws Exception {
String drl = "" +
"rule \" broken \"\n"
+ "dialect \"mvel\"\n"
+ " when\n"
+ " Customer( contact != null , contact.tel1 > \"15\" )\n"
+ " then\n"
+ "end";
addModelField("Customer",
"contact",
"Contact",
"Contact");
addModelField("Contact",
"tel1",
"String",
"String");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getFieldConstraints()[0];
assertEquals("Customer",
constraint.getFactType());
assertEquals("contact",
constraint.getFieldName());
assertEquals("Contact",
constraint.getFieldType());
SingleFieldConstraintEBLeftSide constraint2 = (SingleFieldConstraintEBLeftSide) pattern.getFieldConstraints()[1];
assertEquals("tel1",
constraint2.getFieldName());
assertEquals("String",
constraint2.getFieldType());
assertEquals("15",
constraint2.getValue());
assertEquals(">",
constraint2.getOperator());
assertEquals(3,
constraint2.getExpressionLeftSide().getParts().size());
ExpressionPart part1 = constraint2.getExpressionLeftSide().getParts().get(0);
assertEquals("Customer",
part1.getName());
assertEquals("Customer",
part1.getClassType());
assertEquals("Customer",
part1.getGenericType());
ExpressionPart part2 = constraint2.getExpressionLeftSide().getParts().get(1);
assertEquals("contact",
part2.getName());
assertEquals("Contact",
part2.getClassType());
assertEquals("Contact",
part2.getGenericType());
ExpressionPart part3 = constraint2.getExpressionLeftSide().getParts().get(2);
assertEquals("tel1",
part3.getName());
assertEquals("String",
part3.getClassType());
assertEquals("String",
part3.getGenericType());
}
@Test
public void testExpressionEditorLeftToOperator() throws Exception {
String drl = ""
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " a: Applicant()\n"
+ " Applicant( age == a.age )\n"
+ "then\n"
+ "end";
addModelField("Applicant",
"this",
"Applicant",
DataType.TYPE_THIS);
addModelField("Applicant",
"age",
"java.lang.Integer",
"Integer");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern1 = (FactPattern) m.lhs[0];
assertEquals("a",
pattern1.getBoundName());
FactPattern pattern2 = (FactPattern) m.lhs[1];
assertEquals(1,
pattern2.getConstraintList().getNumberOfConstraints());
assertTrue(pattern2.getConstraintList().getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern2.getConstraintList().getConstraint(0);
assertEquals("age",
constraint.getFieldName());
assertEquals("==",
constraint.getOperator());
assertEquals(BaseSingleFieldConstraint.TYPE_EXPR_BUILDER_VALUE,
constraint.getConstraintValueType());
assertEquals("",
constraint.getValue());
assertEquals(2,
constraint.getExpressionValue().getParts().size());
assertTrue(constraint.getExpressionValue().getParts().get(0) instanceof ExpressionVariable);
ExpressionVariable expressionVariable = (ExpressionVariable) constraint.getExpressionValue().getParts().get(0);
assertEquals("a",
expressionVariable.getName());
assertEquals("Applicant",
expressionVariable.getClassType());
assertEquals("this",
expressionVariable.getGenericType());
assertEquals(constraint.getExpressionValue().getParts().get(1),
expressionVariable.getNext());
assertTrue(constraint.getExpressionValue().getParts().get(1) instanceof ExpressionField);
ExpressionField expressionField = (ExpressionField) constraint.getExpressionValue().getParts().get(1);
assertEquals("age",
expressionField.getName());
assertEquals("java.lang.Integer",
expressionField.getClassType());
assertEquals("Integer",
expressionField.getGenericType());
}
@Test
public void testEnumeration() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1047879
String drl = "import org.drools.workbench.models.commons.backend.rule.TestEnum;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "OuterClassWithEnums( outerField == TestEnum.VALUE1 )\n"
+ "then\n"
+ "end";
addModelField("OuterClassWithEnums",
"outerField",
TestEnum.class.getSimpleName(),
DataType.TYPE_COMPARABLE);
addJavaEnumDefinition("OuterClassWithEnums",
"outerField",
new String[]{"TestEnum.VALUE1=TestEnum.VALUE1", "TestEnum.VALUE2=TestEnum.VALUE2"});
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals(1,
pattern.getNumberOfConstraints());
assertTrue(pattern.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getConstraint(0);
assertEquals("OuterClassWithEnums",
constraint.getFactType());
assertEquals("outerField",
constraint.getFieldName());
assertEquals(DataType.TYPE_COMPARABLE,
constraint.getFieldType());
assertEquals("==",
constraint.getOperator());
assertEquals("TestEnum.VALUE1",
constraint.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_ENUM,
constraint.getConstraintValueType());
final String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
drl2);
}
@Test
public void testFullyQualifiedClassNameEnumeration() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1047879
String drl = "import org.drools.workbench.models.commons.backend.rule.TestEnum;\n"
+ "import org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "OuterClassWithEnums( outerField == TestEnum.VALUE1 )\n"
+ "then\n"
+ "end";
addModelField("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums",
"outerField",
TestEnum.class.getSimpleName(),
DataType.TYPE_COMPARABLE);
addJavaEnumDefinition("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums",
"outerField",
new String[]{"TestEnum.VALUE1=TestEnum.VALUE1", "TestEnum.VALUE2=TestEnum.VALUE2"});
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals(1,
pattern.getNumberOfConstraints());
assertTrue(pattern.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint constraint = (SingleFieldConstraint) pattern.getConstraint(0);
assertEquals("OuterClassWithEnums",
constraint.getFactType());
assertEquals("outerField",
constraint.getFieldName());
assertEquals(DataType.TYPE_COMPARABLE,
constraint.getFieldType());
assertEquals("==",
constraint.getOperator());
assertEquals("TestEnum.VALUE1",
constraint.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_ENUM,
constraint.getConstraintValueType());
final String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
drl2);
}
@Test
public void testEnumerationNestedClasses() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1047879
String drl = "import org.drools.workbench.models.commons.backend.rule.TestEnum;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "OuterClassWithEnums( innerClass.innerField == TestEnum.VALUE1 )\n"
+ "then\n"
+ "end";
addModelField("OuterClassWithEnums",
"innerClass",
"InnerClassWithEnums",
"InnerClassWithEnums");
addModelField("InnerClassWithEnums",
"innerField",
TestEnum.class.getSimpleName(),
DataType.TYPE_COMPARABLE);
addJavaEnumDefinition("InnerClassWithEnums",
"innerField",
new String[]{"TestEnum.VALUE1=TestEnum.VALUE1", "TestEnum.VALUE2=TestEnum.VALUE2"});
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals(1,
pattern.getNumberOfConstraints());
assertTrue(pattern.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide constraint = (SingleFieldConstraintEBLeftSide) pattern.getConstraint(0);
assertEquals(3,
constraint.getExpressionLeftSide().getParts().size());
assertTrue(constraint.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact eubf = ((ExpressionUnboundFact) constraint.getExpressionLeftSide().getParts().get(0));
assertEquals("OuterClassWithEnums",
eubf.getName());
assertEquals("OuterClassWithEnums",
eubf.getClassType());
assertEquals("OuterClassWithEnums",
eubf.getGenericType());
assertTrue(constraint.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
final ExpressionField ef1 = ((ExpressionField) constraint.getExpressionLeftSide().getParts().get(1));
assertEquals("innerClass",
ef1.getName());
assertEquals("InnerClassWithEnums",
ef1.getClassType());
assertEquals("InnerClassWithEnums",
ef1.getGenericType());
assertTrue(constraint.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
final ExpressionField ef2 = ((ExpressionField) constraint.getExpressionLeftSide().getParts().get(2));
assertEquals("innerField",
ef2.getName());
assertEquals("TestEnum",
ef2.getClassType());
assertEquals(DataType.TYPE_COMPARABLE,
ef2.getGenericType());
assertEquals("OuterClassWithEnums",
constraint.getFactType());
assertEquals("innerField",
constraint.getFieldName());
assertEquals("TestEnum",
constraint.getFieldType());
assertEquals("==",
constraint.getOperator());
assertEquals("TestEnum.VALUE1",
constraint.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_ENUM,
constraint.getConstraintValueType());
final String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
drl2);
}
@Test
public void testFullyQualifiedClassNameEnumerationNestedClasses() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1047879
String drl = "import org.drools.workbench.models.commons.backend.rule.TestEnum;\n"
+ "import org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums;\n"
+ "import org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums.InnerClassWithEnums;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "OuterClassWithEnums( innerClass.innerField == TestEnum.VALUE1 )\n"
+ "then\n"
+ "end";
addModelField("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums",
"innerClass",
"org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums$InnerClassWithEnums",
"OuterClassWithEnums$InnerClassWithEnums");
addModelField("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums$InnerClassWithEnums",
"innerField",
TestEnum.class.getSimpleName(),
DataType.TYPE_COMPARABLE);
addJavaEnumDefinition("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums$InnerClassWithEnums",
"innerField",
new String[]{"TestEnum.VALUE1=TestEnum.VALUE1", "TestEnum.VALUE2=TestEnum.VALUE2"});
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals(1,
pattern.getNumberOfConstraints());
assertTrue(pattern.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide constraint = (SingleFieldConstraintEBLeftSide) pattern.getConstraint(0);
assertEquals(3,
constraint.getExpressionLeftSide().getParts().size());
assertTrue(constraint.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact eubf = ((ExpressionUnboundFact) constraint.getExpressionLeftSide().getParts().get(0));
assertEquals("OuterClassWithEnums",
eubf.getName());
assertEquals("OuterClassWithEnums",
eubf.getClassType());
assertEquals("OuterClassWithEnums",
eubf.getGenericType());
assertTrue(constraint.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
final ExpressionField ef1 = ((ExpressionField) constraint.getExpressionLeftSide().getParts().get(1));
assertEquals("innerClass",
ef1.getName());
assertEquals("org.drools.workbench.models.commons.backend.rule.OuterClassWithEnums$InnerClassWithEnums",
ef1.getClassType());
assertEquals("OuterClassWithEnums$InnerClassWithEnums",
ef1.getGenericType());
assertTrue(constraint.getExpressionLeftSide().getParts().get(2) instanceof ExpressionField);
final ExpressionField ef2 = ((ExpressionField) constraint.getExpressionLeftSide().getParts().get(2));
assertEquals("innerField",
ef2.getName());
assertEquals("TestEnum",
ef2.getClassType());
assertEquals(DataType.TYPE_COMPARABLE,
ef2.getGenericType());
assertEquals("OuterClassWithEnums",
constraint.getFactType());
assertEquals("innerField",
constraint.getFieldName());
assertEquals("TestEnum",
constraint.getFieldType());
assertEquals("==",
constraint.getOperator());
assertEquals("TestEnum.VALUE1",
constraint.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_ENUM,
constraint.getConstraintValueType());
final String drl2 = RuleModelDRLPersistenceImpl.getInstance().marshal(m);
assertEqualsIgnoreWhitespace(drl,
drl2);
}
@Test
public void testCalendars() {
//BZ1059232 - Guided rule editor: calendars attribute is broken when a list of calendars is used
String drl = "package org.mortgages;\n" +
"\n" +
"import java.lang.Number;\n" +
"rule \"Test\"\n" +
" calendars \"a\" ,\"b\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" then\n" +
"end\n";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m.attributes[0]);
RuleAttribute attribute = m.attributes[0];
assertEquals("calendars",
attribute.getAttributeName());
assertEquals("a, b",
attribute.getValue());
}
@Test
public void testFromRestrictions() {
String drl = "package org.mortgages;\n" +
"\n" +
"import java.lang.Number;\n" +
"rule \"Test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" reserva : Reserva( )\n" +
" itinerario : Itinerario( destino == \"USA\" ) from reserva.itinerarios\n" +
" then\n" +
"end\n";
addModelField("org.mortgages.Reserva",
"itinerarios",
"java.lang.List",
DataType.TYPE_COLLECTION);
addModelField("org.mortgages.Itinerario",
"destino",
"String",
DataType.TYPE_STRING);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertTrue(m.lhs[1] instanceof FromCompositeFactPattern);
FromCompositeFactPattern factPattern = (FromCompositeFactPattern) m.lhs[1];
assertNotNull(factPattern.getFactPattern().getConstraintList());
assertEquals(1,
factPattern.getFactPattern().getConstraintList().getNumberOfConstraints());
SingleFieldConstraint constraint = (SingleFieldConstraint) factPattern.getFactPattern().getFieldConstraints()[0];
assertEquals("Itinerario",
constraint.getFactType());
assertEquals("destino",
constraint.getFieldName());
assertEquals(DataType.TYPE_STRING,
constraint.getFieldType());
assertEquals("USA",
constraint.getValue());
assertEquals("==",
constraint.getOperator());
}
@Test
public void testFactsWithSameName() {
String drl = "package org.pkg1;\n" +
"\n" +
"import java.lang.Number;\n" +
"rule \"Test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Fact( field.field )\n" +
" then\n" +
"end\n";
addModelField("org.pkg1.Fact",
"field",
"org.pkg1.SubFact",
"SubFact");
addModelField("org.pkg1.SubFact",
"field",
"String",
DataType.TYPE_STRING);
addModelField("org.pkg2.Fact",
"someOtherField",
"org.pkg2.SubFact",
"SubFact");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.lhs.length);
}
@Test
public void testFactsWithSameNameImports() {
String drl = "package org.test;\n" +
"\n" +
"import org.pkg1.Fact;\n" +
"rule \"Test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Fact( field.field )\n" +
" then\n" +
"end\n";
addModelField("org.pkg1.Fact",
"field",
"org.pkg1.SubFact",
"SubFact");
addModelField("org.pkg1.SubFact",
"field",
"String",
DataType.TYPE_STRING);
addModelField("org.pkg2.Fact",
"someOtherField",
"org.pkg2.SubFact",
"SubFact");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.lhs.length);
}
@Test
public void testFromBoundVariable() {
String drl = "import java.lang.Number;\n"
+ "import org.drools.workbench.models.commons.backend.rule.Counter;\n"
+ "rule \"rule1\"\n"
+ "when\n"
+ "cc : Counter()\n"
+ "Number() from cc.number\n"
+ "then\n"
+ "end";
addModelField("org.drools.workbench.models.commons.backend.rule.Counter",
"number",
"java.lang.Number",
DataType.TYPE_NUMERIC);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(2,
m.lhs.length);
IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
FactPattern fp0 = (FactPattern) p0;
assertEquals("Counter",
fp0.getFactType());
assertEquals("cc",
fp0.getBoundName());
assertEquals(0,
fp0.getNumberOfConstraints());
IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FromCompositeFactPattern);
FromCompositeFactPattern fcfp1 = (FromCompositeFactPattern) p1;
FactPattern fp1 = fcfp1.getFactPattern();
ExpressionFormLine efl1 = fcfp1.getExpression();
assertNotNull(fp1);
assertNotNull(efl1);
assertEquals("Number",
fp1.getFactType());
assertEquals(0,
fp1.getNumberOfConstraints());
assertEquals(2,
efl1.getParts().size());
assertTrue(efl1.getParts().get(0) instanceof ExpressionVariable);
assertTrue(efl1.getParts().get(1) instanceof ExpressionField);
ExpressionVariable eflv1 = (ExpressionVariable) efl1.getParts().get(0);
assertEquals("cc",
eflv1.getName());
assertEquals("Counter",
eflv1.getClassType());
assertEquals(DataType.TYPE_NUMERIC,
eflv1.getGenericType());
ExpressionField eflf1 = (ExpressionField) efl1.getParts().get(1);
assertEquals("number",
eflf1.getName());
assertEquals("java.lang.Number",
eflf1.getClassType());
assertEquals(DataType.TYPE_NUMERIC,
eflf1.getGenericType());
}
@Test
public void testFromAccumulate() {
String drl = "import java.lang.Number;\n"
+ "import org.mortgages.Applicant;\n"
+ "rule \"rule1\"\n"
+ "when\n"
+ " total : Number( intValue > 0 ) from accumulate ( Applicant( age < 30 ), count() )\n"
+ "then\n"
+ "end";
addModelField("java.lang.Number",
"intValue",
"java.lang.Integer",
DataType.TYPE_NUMERIC);
addModelField("org.mortgages.Applicant",
"age",
"java.lang.Integer",
DataType.TYPE_NUMERIC);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertTrue(m.lhs[0] instanceof FromAccumulateCompositeFactPattern);
FromAccumulateCompositeFactPattern pattern = (FromAccumulateCompositeFactPattern) m.lhs[0];
assertNotNull(pattern.getFactPattern());
FactPattern factPattern = pattern.getFactPattern();
assertEquals("total",
factPattern.getBoundName());
assertNotNull(factPattern.getConstraintList());
assertEquals(1,
factPattern.getConstraintList().getNumberOfConstraints());
FieldConstraint constraint = factPattern.getConstraintList().getConstraint(0);
assertTrue(constraint instanceof SingleFieldConstraint);
SingleFieldConstraint fieldConstraint = (SingleFieldConstraint) constraint;
assertEquals("Number",
fieldConstraint.getFactType());
assertEquals("intValue",
fieldConstraint.getFieldName());
assertEquals("Integer",
fieldConstraint.getFieldType());
assertEquals(">",
fieldConstraint.getOperator());
assertEquals("0",
fieldConstraint.getValue());
}
@Test
public void testSimpleDSLExpansionLHS() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Es gibt einen Vertrag\n"
+ "- Rabatt nicht mehr als 123\n"
+ "then\n"
+ "end\n";
final String dslDefinition = "Es gibt einen Vertrag";
final String dslFile = "[condition][vertrag]" + dslDefinition + "=vertrag : Vertrag()";
final String dslDefinition2 = "- Rabatt nicht mehr als {rabatt}";
final String dslFile2 = "[condition][vertrag]" + dslDefinition2 + "=rabatt < {rabatt}";
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile,
dslFile2);
assertNotNull(m);
assertTrue(m.lhs[0] instanceof DSLSentence);
DSLSentence dslSentence = (DSLSentence) m.lhs[0];
assertEquals("vertrag : Vertrag()",
dslSentence.getDrl());
assertEquals(dslDefinition,
dslSentence.getDefinition());
assertEquals(0,
dslSentence.getValues().size());
DSLSentence dslSentence2 = (DSLSentence) m.lhs[1];
assertEquals("rabatt < {rabatt}",
dslSentence2.getDrl());
assertEquals(dslDefinition2,
dslSentence2.getDefinition());
assertEquals(1,
dslSentence2.getValues().size());
assertNotNull(dslSentence2.getValues().get(0));
DSLVariableValue dslComplexVariableValue = dslSentence2.getValues().get(0);
assertEquals("123",
dslComplexVariableValue.getValue());
}
@Test
public void testDSL() {
String drl = "package org.mortgages;\n" +
"rule \"testdsl\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" There is a test rated applicant older than 111 years\n" +
" then\n" +
"end";
String dslDefinition = "There is a {rating} rated applicant older than {age} years";
String dslFile = "[when]" + dslDefinition + "= Applicant( creditRating == \"{rating}\", age > {age} )";
when(dmo.getPackageName()).thenReturn("org.mortgages");
final RuleModel model = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile);
assertEquals(1,
model.lhs.length);
DSLSentence dslSentence = (DSLSentence) model.lhs[0];
assertEquals("Applicant( creditRating == \"{rating}\", age > {age} )",
dslSentence.getDrl());
assertEquals("test",
dslSentence.getValues().get(0).getValue());
assertEquals("111",
dslSentence.getValues().get(1).getValue());
}
@Test
public void testDSLDollar() {
String drl = "package org.mortgages;\n" +
"rule \"testdsl\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Price is $111\n" +
" then\n" +
"end";
String dslDefinition = "Price is ${p}";
String dslFile = "[when]" + dslDefinition + "= Item( price == \"{p}\" )";
when(dmo.getPackageName()).thenReturn("org.mortgages");
final RuleModel model = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile);
assertEquals(1,
model.lhs.length);
DSLSentence dslSentence = (DSLSentence) model.lhs[0];
assertEquals("Price is ${p}",
dslSentence.getDefinition());
assertEquals("111",
dslSentence.getValues().get(0).getValue());
}
@Test
public void testDSLExpansionLHS() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "The credit rating is AA\n"
+ "then\n"
+ "end\n";
final String dslDefinition = "The credit rating is {rating:ENUM:Applicant.creditRating}";
final String dslFile = "[when]" + dslDefinition + "=Applicant( creditRating == {rating} )";
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile);
assertNotNull(m);
assertTrue(m.lhs[0] instanceof DSLSentence);
DSLSentence dslSentence = (DSLSentence) m.lhs[0];
assertEquals(dslDefinition,
dslSentence.getDefinition());
assertEquals(1,
dslSentence.getValues().size());
assertTrue(dslSentence.getValues().get(0) instanceof DSLComplexVariableValue);
DSLComplexVariableValue dslComplexVariableValue = (DSLComplexVariableValue) dslSentence.getValues().get(0);
assertEquals("AA",
dslComplexVariableValue.getValue());
assertEquals("ENUM:Applicant.creditRating",
dslComplexVariableValue.getId());
}
@Test
public void testDSLExpansionLHS2() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "There is an Applicant\n"
+ "- credit rating is AA\n"
+ "then\n"
+ "end\n";
final String dslDefinition1 = "There is an Applicant";
final String dslFile1 = "[when]" + dslDefinition1 + "=Applicant( )";
final String dslDefinition2 = "- credit rating is {rating:ENUM:Applicant.creditRating}";
final String dslFile2 = "[when]" + dslDefinition2 + "=creditRating == {rating}";
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile1,
dslFile2);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
assertTrue(m.lhs[0] instanceof DSLSentence);
assertTrue(m.lhs[1] instanceof DSLSentence);
DSLSentence dslSentence1 = (DSLSentence) m.lhs[0];
assertEquals(dslDefinition1,
dslSentence1.getDefinition());
assertEquals(0,
dslSentence1.getValues().size());
DSLSentence dslSentence2 = (DSLSentence) m.lhs[1];
assertEquals(dslDefinition2,
dslSentence2.getDefinition());
assertEquals(1,
dslSentence2.getValues().size());
assertTrue(dslSentence2.getValues().get(0) instanceof DSLComplexVariableValue);
DSLComplexVariableValue dslComplexVariableValue = (DSLComplexVariableValue) dslSentence2.getValues().get(0);
assertEquals("AA",
dslComplexVariableValue.getValue());
assertEquals("ENUM:Applicant.creditRating",
dslComplexVariableValue.getId());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1173842
public void testDSLExpansionLHS_WithKeyword_then() {
String expected_dslr = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "There is an Applicant\n"
+ "- age more then 55\n"
+ "then\n"
+ "end\n";
String expected_drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Applicant( age > 55 )\n"
+ "then\n"
+ "end\n";
final String dslDefinition1 = "There is an Applicant";
final String dslFile1 = "[when]" + dslDefinition1 + "=Applicant( )";
final String dslDefinition2 = "- age more then {age}";
final String dslFile2 = "[when]" + dslDefinition2 + "=age > {age}";
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(expected_dslr,
Collections.emptyList(),
dmo,
dslFile1,
dslFile2);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
assertTrue(m.lhs[0] instanceof DSLSentence);
assertTrue(m.lhs[1] instanceof DSLSentence);
DSLSentence dslSentence1 = (DSLSentence) m.lhs[0];
assertEquals(dslDefinition1,
dslSentence1.getDefinition());
assertEquals(0,
dslSentence1.getValues().size());
DSLSentence dslSentence2 = (DSLSentence) m.lhs[1];
assertEquals(dslDefinition2,
dslSentence2.getDefinition());
assertEquals(1,
dslSentence2.getValues().size());
DSLVariableValue dslVariableValue = dslSentence2.getValues().get(0);
assertEquals("55",
dslVariableValue.getValue());
//Check round-trip
assertEqualsIgnoreWhitespace(expected_dslr,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
//Check DSL expansion (as BZ stated runtime was flawed as well)
final Expander expander = new DefaultExpander();
final List<DSLMappingFile> dsls = new ArrayList<>();
try {
final DSLTokenizedMappingFile dslTokenizer1 = new DSLTokenizedMappingFile();
if (dslTokenizer1.parseAndLoad(new StringReader(dslFile1))) {
dsls.add(dslTokenizer1);
} else {
fail();
}
final DSLTokenizedMappingFile dslTokenizer2 = new DSLTokenizedMappingFile();
if (dslTokenizer2.parseAndLoad(new StringReader(dslFile2))) {
dsls.add(dslTokenizer2);
} else {
fail();
}
} catch (IOException e) {
fail();
}
for (DSLMappingFile dsl : dsls) {
expander.addDSLMapping(dsl.getMapping());
}
final String actual_drl = expander.expand(expected_dslr);
assertEqualsIgnoreWhitespace(expected_drl,
actual_drl);
}
@Test
public void testDSLExpansionRHS() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "> $a : Applicant()\n"
+ "then\n"
+ "Set applicant name to Bob\n"
+ "end\n";
final String dslDefinition = "Set applicant name to {name:\\w+ \\w+}";
final String dslFile = "[then]" + dslDefinition + "=$a.setName( \"{name}\" )";
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshalUsingDSL(drl,
Collections.emptyList(),
dmo,
dslFile);
assertNotNull(m);
assertTrue(m.lhs[0] instanceof FactPattern);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals("Applicant",
pattern.getFactType());
assertEquals("$a",
pattern.getBoundName());
assertTrue(m.rhs[0] instanceof DSLSentence);
DSLSentence dslSentence = (DSLSentence) m.rhs[0];
assertEquals(dslDefinition,
dslSentence.getDefinition());
assertEquals(1,
dslSentence.getValues().size());
assertTrue(dslSentence.getValues().get(0) instanceof DSLComplexVariableValue);
DSLComplexVariableValue dslComplexVariableValue = (DSLComplexVariableValue) dslSentence.getValues().get(0);
assertEquals("Bob",
dslComplexVariableValue.getValue());
assertEquals("\\w+ \\w+",
dslComplexVariableValue.getId());
}
@Test
public void testFunctionCalls() {
String drl =
"package org.mortgages;\n"
+ "import java.lang.Number;\n"
+ "import java.lang.String;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " s : String()\n"
+ "then\n"
+ " s.indexOf( s );\n"
+ " s.indexOf( 0 );\n"
+ "end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_STRING),
"int",
null,
DataType.TYPE_STRING));
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"int",
null,
DataType.TYPE_STRING));
methodInformation.put("java.lang.String",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
assertTrue(m.rhs[1] instanceof ActionCallMethod);
ActionCallMethod actionCallMethod1 = (ActionCallMethod) m.rhs[0];
assertEquals(1,
actionCallMethod1.getState());
assertEquals("indexOf",
actionCallMethod1.getMethodName());
assertEquals("s",
actionCallMethod1.getVariable());
assertEquals(1,
actionCallMethod1.getFieldValues().length);
assertEquals("indexOf",
actionCallMethod1.getFieldValues()[0].getField());
assertEquals("s",
actionCallMethod1.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_VARIABLE,
actionCallMethod1.getFieldValues()[0].getNature());
assertEquals("String",
actionCallMethod1.getFieldValues()[0].getType());
ActionCallMethod actionCallMethod2 = (ActionCallMethod) m.rhs[1];
assertEquals(1,
actionCallMethod2.getState());
assertEquals("indexOf",
actionCallMethod2.getMethodName());
assertEquals("s",
actionCallMethod2.getVariable());
assertEquals(1,
actionCallMethod2.getFieldValues().length);
assertEquals("indexOf",
actionCallMethod2.getFieldValues()[0].getField());
assertEquals("0",
actionCallMethod2.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod2.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod2.getFieldValues()[0].getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testFunctionCalls2() {
String drl =
"package org.mortgages;\n"
+ "import java.lang.Number;\n"
+ "import java.lang.String;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " s : String()\n"
+ "then\n"
+ " s.indexOf( 0 );\n"
+ "end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_STRING),
"int",
null,
DataType.TYPE_STRING));
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"int",
null,
DataType.TYPE_STRING));
methodInformation.put("java.lang.String",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod actionCallMethod1 = (ActionCallMethod) m.rhs[0];
assertEquals(1,
actionCallMethod1.getState());
assertEquals("indexOf",
actionCallMethod1.getMethodName());
assertEquals("s",
actionCallMethod1.getVariable());
assertEquals(1,
actionCallMethod1.getFieldValues().length);
assertEquals("indexOf",
actionCallMethod1.getFieldValues()[0].getField());
assertEquals("0",
actionCallMethod1.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod1.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod1.getFieldValues()[0].getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testFunctionCalls3() {
String drl =
"package org.mortgages;\n"
+ "import java.lang.Number;\n"
+ "import java.lang.String;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " $var : String()\n"
+ "then\n"
+ " $var.indexOf( $var );\n"
+ " $var.endsWith( \".\" );\n"
+ " $var.substring( 0, 1 );\n"
+ "end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_STRING),
"int",
null,
DataType.TYPE_STRING));
mapMethodInformation.add(new MethodInfo("indexOf",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"int",
null,
DataType.TYPE_STRING));
mapMethodInformation.add(new MethodInfo("endsWith",
Collections.singletonList(DataType.TYPE_STRING),
"boolean",
null,
DataType.TYPE_BOOLEAN));
mapMethodInformation.add(new MethodInfo("substring",
Collections.singletonList(DataType.TYPE_NUMERIC_INTEGER),
"String",
null,
DataType.TYPE_STRING));
mapMethodInformation.add(new MethodInfo("substring",
Arrays.asList(DataType.TYPE_NUMERIC_INTEGER,
DataType.TYPE_NUMERIC_INTEGER),
"String",
null,
DataType.TYPE_STRING));
methodInformation.put("java.lang.String",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(3,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
assertTrue(m.rhs[1] instanceof ActionCallMethod);
assertTrue(m.rhs[2] instanceof ActionCallMethod);
ActionCallMethod actionCallMethod1 = (ActionCallMethod) m.rhs[0];
assertEquals(1,
actionCallMethod1.getState());
assertEquals("indexOf",
actionCallMethod1.getMethodName());
assertEquals("$var",
actionCallMethod1.getVariable());
assertEquals(1,
actionCallMethod1.getFieldValues().length);
assertEquals("indexOf",
actionCallMethod1.getFieldValues()[0].getField());
assertEquals("$var",
actionCallMethod1.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_VARIABLE,
actionCallMethod1.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_STRING,
actionCallMethod1.getFieldValues()[0].getType());
ActionCallMethod actionCallMethod2 = (ActionCallMethod) m.rhs[1];
assertEquals(1,
actionCallMethod2.getState());
assertEquals("endsWith",
actionCallMethod2.getMethodName());
assertEquals("$var",
actionCallMethod2.getVariable());
assertEquals(1,
actionCallMethod2.getFieldValues().length);
assertEquals("endsWith",
actionCallMethod2.getFieldValues()[0].getField());
assertEquals(".",
actionCallMethod2.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod2.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_STRING,
actionCallMethod2.getFieldValues()[0].getType());
ActionCallMethod actionCallMethod3 = (ActionCallMethod) m.rhs[2];
assertEquals(1,
actionCallMethod3.getState());
assertEquals("substring",
actionCallMethod3.getMethodName());
assertEquals("$var",
actionCallMethod3.getVariable());
assertEquals(2,
actionCallMethod3.getFieldValues().length);
assertEquals("substring",
actionCallMethod3.getFieldValues()[0].getField());
assertEquals("0",
actionCallMethod3.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod3.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod3.getFieldValues()[0].getType());
assertEquals("substring",
actionCallMethod3.getFieldValues()[1].getField());
assertEquals("1",
actionCallMethod3.getFieldValues()[1].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod3.getFieldValues()[1].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod3.getFieldValues()[1].getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testFunctionCalls4_MultiParameterSetter() {
String drl =
"package org.mortgages;\n"
+ "import org.mortgages.classes.MyClass;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " $c : MyClass()\n"
+ "then\n"
+ " $c.setSomething(0, 1);\n"
+ "end\n";
Map<String, List<MethodInfo>> methodInformation = new HashMap<>();
List<MethodInfo> mapMethodInformation = new ArrayList<>();
mapMethodInformation.add(new MethodInfo("setSomething",
Arrays.asList(DataType.TYPE_NUMERIC_INTEGER,
DataType.TYPE_NUMERIC_INTEGER),
"void",
null,
DataType.TYPE_STRING));
methodInformation.put("org.mortgages.classes.MyClass",
mapMethodInformation);
when(dmo.getProjectMethodInformation()).thenReturn(methodInformation);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionCallMethod);
ActionCallMethod actionCallMethod1 = (ActionCallMethod) m.rhs[0];
assertEquals(1,
actionCallMethod1.getState());
assertEquals("setSomething",
actionCallMethod1.getMethodName());
assertEquals("$c",
actionCallMethod1.getVariable());
assertEquals(2,
actionCallMethod1.getFieldValues().length);
assertEquals("setSomething",
actionCallMethod1.getFieldValues()[0].getField());
assertEquals("0",
actionCallMethod1.getFieldValues()[0].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod1.getFieldValues()[0].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod1.getFieldValues()[0].getType());
assertEquals("setSomething",
actionCallMethod1.getFieldValues()[1].getField());
assertEquals("1",
actionCallMethod1.getFieldValues()[1].getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod1.getFieldValues()[1].getNature());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
actionCallMethod1.getFieldValues()[1].getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testRHSInsertFactWithFieldAsVariable() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1077212
String drl = "package org.mortgages\n"
+ "import org.test.Person\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( $f : field1 == 44 )\n"
+ "then\n"
+ "Person fact0 = new Person();\n"
+ "fact0.setField1( $f );\n"
+ "insert( fact0 );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals("$f",
sfp.getFieldBinding());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
ActionInsertFact ap = (ActionInsertFact) a;
assertEquals("Person",
ap.getFactType());
assertEquals("fact0",
ap.getBoundName());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv.getNature());
assertEquals("=$f",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSInsertFactWithFieldAsLiteral() {
String drl = "package org.mortgages\n"
+ "import org.test.Person\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( field1 == 44 )\n"
+ "then\n"
+ "Person fact0 = new Person();\n"
+ "fact0.setField1( 55 );\n"
+ "insert( fact0 );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
ActionInsertFact ap = (ActionInsertFact) a;
assertEquals("Person",
ap.getFactType());
assertEquals("fact0",
ap.getBoundName());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv.getNature());
assertEquals("55",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSUpdateFactWithFieldAsVariable() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1077212
String drl = "package org.mortgages\n"
+ "import org.test.Person\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$p : Person( $f : field1 == 44 )\n"
+ "then\n"
+ "$p.setField1( $f );\n"
+ "update( $p );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals("$p",
fp.getBoundName());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals("$f",
sfp.getFieldBinding());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$p",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv.getNature());
assertEquals("=$f",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSUpdateFactWithFieldAsLiteral() {
String drl = "package org.mortgages\n"
+ "import org.test.Person\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$p : Person()\n"
+ "then\n"
+ "$p.setField1( 55 );\n"
+ "update( $p );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$p",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv.getNature());
assertEquals("55",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSInsertFactWithFieldAsVariableSamePackage() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1077212
String drl = "package org.test\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( $f : field1 == 44 )\n"
+ "then\n"
+ "Person fact0 = new Person();\n"
+ "fact0.setField1( $f );\n"
+ "insert( fact0 );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals("$f",
sfp.getFieldBinding());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
ActionInsertFact ap = (ActionInsertFact) a;
assertEquals("Person",
ap.getFactType());
assertEquals("fact0",
ap.getBoundName());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv.getNature());
assertEquals("=$f",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSInsertFactWithFieldAsLiteralSamePackage() {
String drl = "package org.test\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( field1 == 44 )\n"
+ "then\n"
+ "Person fact0 = new Person();\n"
+ "fact0.setField1( 55 );\n"
+ "insert( fact0 );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
ActionInsertFact ap = (ActionInsertFact) a;
assertEquals("Person",
ap.getFactType());
assertEquals("fact0",
ap.getBoundName());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv.getNature());
assertEquals("55",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSUpdateFactWithFieldAsVariableSamePackage() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1077212
String drl = "package org.test\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$p : Person( $f : field1 == 44 )\n"
+ "then\n"
+ "$p.setField1( $f );\n"
+ "update( $p );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals("$p",
fp.getBoundName());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("44",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals("$f",
sfp.getFieldBinding());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$p",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv.getNature());
assertEquals("=$f",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSUpdateFactWithFieldAsLiteralSamePackage() {
String drl = "package org.test\n"
+ "rule \"variable\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$p : Person()\n"
+ "then\n"
+ "$p.setField1( 55 );\n"
+ "update( $p );\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$p",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("field1",
afv.getField());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv.getNature());
assertEquals("55",
afv.getValue());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
afv.getType());
}
@Test
public void testRHSUpdateFactWithFormula() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1079253
String drl = "package org.mortgages;\n"
+ "import org.test.ShoppingCart\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$sc : ShoppingCart( )\n"
+ "then\n"
+ "$sc.setCartItemPromoSavings( ($sc.cartItemPromoSavings == 0.0) ? 0.0 : $sc.cartItemPromoSavings * -1 );\n"
+ "update( $sc );\n"
+ "end\n";
addModelField("org.test.ShoppingCart",
"cartItemPromoSavings",
"java.lang.Double",
DataType.TYPE_NUMERIC_DOUBLE);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("ShoppingCart",
fp.getFactType());
assertEquals("$sc",
fp.getBoundName());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$sc",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("cartItemPromoSavings",
afv.getField());
assertEquals("($sc.cartItemPromoSavings == 0.0) ? 0.0 : $sc.cartItemPromoSavings * -1",
afv.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv.getNature());
}
@Test
public void testRHSUpdateFactWithFormulaSamePackage() {
//https://bugzilla.redhat.com/show_bug.cgi?id=1079253
String drl = "package org.test;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$sc : ShoppingCart( )\n"
+ "then\n"
+ "$sc.setCartItemPromoSavings( ($sc.cartItemPromoSavings == 0.0) ? 0.0 : $sc.cartItemPromoSavings * -1 );\n"
+ "update( $sc );\n"
+ "end\n";
addModelField("org.test.ShoppingCart",
"cartItemPromoSavings",
"java.lang.Double",
DataType.TYPE_NUMERIC_DOUBLE);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("ShoppingCart",
fp.getFactType());
assertEquals("$sc",
fp.getBoundName());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
IAction a = m.rhs[0];
assertTrue(a instanceof ActionUpdateField);
ActionUpdateField ap = (ActionUpdateField) a;
assertEquals("$sc",
ap.getVariable());
assertEquals(1,
ap.getFieldValues().length);
ActionFieldValue afv = ap.getFieldValues()[0];
assertEquals("cartItemPromoSavings",
afv.getField());
assertEquals("($sc.cartItemPromoSavings == 0.0) ? 0.0 : $sc.cartItemPromoSavings * -1",
afv.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv.getNature());
}
@Test
public void testFunctionsWithVariableParameters() throws Exception {
String drl = "package org.mortgages;\n" +
"rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Calculator( s : summer)\n" +
" Applicant( $age : age)\n" +
" then\n" +
" s.sum( $age, $age );\n" +
"end";
addModelField(
"Calculator",
"summer",
"Summer",
"Summer");
addModelField(
"Applicant",
"age",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
HashMap<String, List<MethodInfo>> map = new HashMap<>();
ArrayList<MethodInfo> methodInfos = new ArrayList<>();
ArrayList<String> params = new ArrayList<>();
params.add("Integer");
params.add("Integer");
methodInfos.add(new MethodInfo("sum",
params,
"java.lang.Integer",
null,
"Summer"));
map.put("Calculator",
methodInfos);
when(
dmo.getProjectMethodInformation()
).thenReturn(
map
);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
assertEquals(1,
m.rhs.length);
ActionCallMethod actionCallMethod = (ActionCallMethod) m.rhs[0];
assertEquals("sum",
actionCallMethod.getMethodName());
assertEquals("s",
actionCallMethod.getVariable());
assertEquals(2,
actionCallMethod.getFieldValues().length);
assertEquals("sum",
actionCallMethod.getFieldValue(0).getField());
assertEquals("$age",
actionCallMethod.getFieldValue(0).getValue());
assertEquals(2,
actionCallMethod.getFieldValue(0).getNature());
assertEquals("java.lang.Integer",
actionCallMethod.getFieldValue(0).getType());
assertEquals("sum",
actionCallMethod.getFieldValue(1).getField());
assertEquals("$age",
actionCallMethod.getFieldValue(1).getValue());
assertEquals(2,
actionCallMethod.getFieldValue(1).getNature());
assertEquals("java.lang.Integer",
actionCallMethod.getFieldValue(1).getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testListSize() throws Exception {
String drl = "" +
"package org.mortgages;\n" +
"import java.lang.Number;\n" +
"rule \"Test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Person( addresses.size() == 0 )\n" +
" then\n" +
"end\n";
addModelField("Person",
"addresses",
"java.util.List",
DataType.TYPE_COLLECTION);
addMethodInformation("java.util.List",
"size",
Collections.emptyList(),
"int",
null,
DataType.TYPE_NUMERIC_INTEGER);
HashMap<String, String> map = new HashMap<>();
map.put("Person#addresses",
"Address");
when(dmo.getProjectFieldParametersType()).thenReturn(map);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.lhs.length);
FactPattern pattern = (FactPattern) m.lhs[0];
assertEquals(1,
pattern.getConstraintList().getConstraints().length);
SingleFieldConstraintEBLeftSide constraint = (SingleFieldConstraintEBLeftSide) pattern.getConstraint(0);
assertEquals("size",
constraint.getFieldName());
assertEquals("int",
constraint.getFieldType());
assertEquals("0",
constraint.getValue());
assertEquals("==",
constraint.getOperator());
assertEquals(1,
constraint.getConstraintValueType());
assertTrue(constraint.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
assertTrue(constraint.getExpressionLeftSide().getParts().get(1) instanceof ExpressionCollection);
assertTrue(constraint.getExpressionLeftSide().getParts().get(2) instanceof ExpressionMethod);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testCollectWithFreeFormDRL_MethodsDefined() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1060816
String drl = "package org.sample.resourceassignment;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"$trans : Transactions()\n" +
"$transactions : java.util.List( eval( size > 0 ) ) from collect ( Transaction() from $trans.getRecCategorization().get(\"APES-01\") )\n" +
"then\n" +
"end";
addModelField("Transactions",
"recCategorization",
"java.util.Map",
DataType.TYPE_COLLECTION);
addMethodInformation("Transactions",
"getRecCategorization()",
Collections.emptyList(),
"java.util.Map",
null,
DataType.TYPE_COLLECTION);
addMethodInformation("java.util.Map",
"get",
new ArrayList<String>() {{
add("p0");
}},
"java.lang.String",
null,
DataType.TYPE_STRING);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
FactPattern fp0 = (FactPattern) p0;
assertEquals("Transactions",
fp0.getFactType());
assertEquals("$trans",
fp0.getBoundName());
assertEquals(0,
fp0.getNumberOfConstraints());
IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FromCollectCompositeFactPattern);
FromCollectCompositeFactPattern fp1 = (FromCollectCompositeFactPattern) p1;
assertEquals("java.util.List",
fp1.getFactPattern().getFactType());
assertEquals("$transactions",
fp1.getFactPattern().getBoundName());
assertEquals(1,
fp1.getFactPattern().getNumberOfConstraints());
assertTrue(fp1.getFactPattern().getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint fp1sfc = (SingleFieldConstraint) fp1.getFactPattern().getConstraint(0);
assertEquals("size > 0",
fp1sfc.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
fp1sfc.getConstraintValueType());
assertTrue(fp1.getRightPattern() instanceof FromCompositeFactPattern);
FromCompositeFactPattern fp2 = (FromCompositeFactPattern) fp1.getRightPattern();
assertNotNull(fp2.getFactPattern());
FactPattern fp3 = fp2.getFactPattern();
assertEquals("Transaction",
fp3.getFactType());
assertEquals(0,
fp3.getNumberOfConstraints());
assertNotNull(fp2.getExpression());
ExpressionFormLine efl = fp2.getExpression();
assertEquals(3,
efl.getParts().size());
assertTrue(efl.getParts().get(0) instanceof ExpressionVariable);
ExpressionVariable ev = (ExpressionVariable) efl.getParts().get(0);
assertEquals("$trans",
ev.getName());
assertEquals("Transactions",
ev.getClassType());
assertTrue(efl.getParts().get(1) instanceof ExpressionMethod);
ExpressionMethod em = (ExpressionMethod) efl.getParts().get(1);
assertEquals("getRecCategorization()",
em.getName());
assertEquals("java.util.Map",
em.getClassType());
assertEquals(DataType.TYPE_COLLECTION,
em.getGenericType());
assertTrue(efl.getParts().get(2) instanceof ExpressionText);
ExpressionText et = (ExpressionText) efl.getParts().get(2);
assertEquals("get(\"APES-01\")",
et.getName());
assertEquals("java.lang.String",
et.getClassType());
assertEquals(DataType.TYPE_STRING,
et.getGenericType());
assertEquals(0,
m.rhs.length);
}
@Test
public void testCollectWithFreeFormDRL_MethodsUndefined() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1060816
String drl = "package org.sample.resourceassignment;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"$trans : Transactions()\n" +
"$transactions : java.util.List( eval( size > 0 ) ) from collect ( Transaction() from $trans.getRecCategorization().get(\"APES-01\") )\n" +
"then\n" +
"end";
addModelField("Transactions",
"recCategorization",
"java.util.Map",
DataType.TYPE_COLLECTION);
addMethodInformation("java.util.Map",
"get",
new ArrayList<String>() {{
add("p0");
}},
"java.lang.String",
null,
DataType.TYPE_STRING);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
FactPattern fp0 = (FactPattern) p0;
assertEquals("Transactions",
fp0.getFactType());
assertEquals("$trans",
fp0.getBoundName());
assertEquals(0,
fp0.getNumberOfConstraints());
IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FromCollectCompositeFactPattern);
FromCollectCompositeFactPattern fp1 = (FromCollectCompositeFactPattern) p1;
assertEquals("java.util.List",
fp1.getFactPattern().getFactType());
assertEquals("$transactions",
fp1.getFactPattern().getBoundName());
assertEquals(1,
fp1.getFactPattern().getNumberOfConstraints());
assertTrue(fp1.getFactPattern().getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint fp1sfc = (SingleFieldConstraint) fp1.getFactPattern().getConstraint(0);
assertEquals("size > 0",
fp1sfc.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
fp1sfc.getConstraintValueType());
assertTrue(fp1.getRightPattern() instanceof FromCompositeFactPattern);
FromCompositeFactPattern fp2 = (FromCompositeFactPattern) fp1.getRightPattern();
assertNotNull(fp2.getFactPattern());
FactPattern fp3 = fp2.getFactPattern();
assertEquals("Transaction",
fp3.getFactType());
assertEquals(0,
fp3.getNumberOfConstraints());
assertNotNull(fp2.getExpression());
ExpressionFormLine efl = fp2.getExpression();
assertEquals(3,
efl.getParts().size());
assertTrue(efl.getParts().get(0) instanceof ExpressionVariable);
ExpressionVariable ev = (ExpressionVariable) efl.getParts().get(0);
assertEquals("$trans",
ev.getName());
assertEquals("Transactions",
ev.getClassType());
assertTrue(efl.getParts().get(1) instanceof ExpressionText);
ExpressionText et1 = (ExpressionText) efl.getParts().get(1);
assertEquals("getRecCategorization()",
et1.getName());
assertEquals("java.lang.String",
et1.getClassType());
assertEquals(DataType.TYPE_STRING,
et1.getGenericType());
assertTrue(efl.getParts().get(2) instanceof ExpressionText);
ExpressionText et2 = (ExpressionText) efl.getParts().get(2);
assertEquals("get(\"APES-01\")",
et2.getName());
assertEquals("java.lang.String",
et2.getClassType());
assertEquals(DataType.TYPE_STRING,
et2.getGenericType());
assertEquals(0,
m.rhs.length);
}
@Test
public void testLHSInOperatorFieldNameNotContainingInLiteral() {
String drl = "package org.test\n"
+ "rule \"in\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( field1 in (1, 2) )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("in",
sfp.getOperator());
assertEquals("1, 2",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testLHSInOperatorFieldNameContainingInLiteral() {
String drl = "package org.test\n"
+ "rule \"in\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( rating in (1, 2) )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"rating",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("rating",
sfp.getFieldName());
assertEquals("in",
sfp.getOperator());
assertEquals("1, 2",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testLHSInOperatorFieldNameNotContainingNotInLiteral() {
String drl = "package org.test\n"
+ "rule \"in\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( field1 not in (1, 2) )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"field1",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("field1",
sfp.getFieldName());
assertEquals("not in",
sfp.getOperator());
assertEquals("1, 2",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testLHSInOperatorFieldNameContainingNotInLiteral() {
String drl = "package org.test\n"
+ "rule \"in\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Person( rating not in (1, 2) )\n"
+ "then\n"
+ "end";
addModelField("org.test.Person",
"rating",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Person",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Person",
sfp.getFactType());
assertEquals("rating",
sfp.getFieldName());
assertEquals("not in",
sfp.getOperator());
assertEquals("1, 2",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
}
@Test
public void testRHSModifyBlockSingleFieldSingleLine() throws Exception {
//The value used in the "set" is intentionally yucky to catch extraction of the field's value errors!
String drl = "rule \"modify1\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" $p : Person( )\n" +
" then\n" +
" modify( $p ) { setFirstName( \",)\" ) }\n" +
"end";
addModelField("Person",
"firstName",
"java.lang.String",
DataType.TYPE_STRING);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField field = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
field.getVariable());
assertNotNull(field.getFieldValues()[0]);
assertEquals(1,
field.getFieldValues().length);
ActionFieldValue value = field.getFieldValues()[0];
assertEquals("firstName",
value.getField());
assertEquals(",)",
value.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value.getNature());
assertEquals(DataType.TYPE_STRING,
value.getType());
}
@Test
public void testRHSModifyBlockSingleFieldMultipleLines() throws Exception {
//The value used in the "set" is intentionally yucky to catch extraction of the field's value errors!
String drl = "rule \"modify1\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" $p : Person( )\n" +
" then\n" +
" modify( $p ) {\n" +
" setFirstName( \",)\" )\n" +
" }\n" +
"end";
addModelField("Person",
"firstName",
"java.lang.String",
DataType.TYPE_STRING);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField field = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
field.getVariable());
assertNotNull(field.getFieldValues()[0]);
assertEquals(1,
field.getFieldValues().length);
ActionFieldValue value = field.getFieldValues()[0];
assertEquals("firstName",
value.getField());
assertEquals(",)",
value.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value.getNature());
assertEquals(DataType.TYPE_STRING,
value.getType());
}
@Test
public void testRHSModifyBlockMultipleFieldsSingleLine() throws Exception {
//The value used in the "set" is intentionally yucky to catch extraction of the field's value errors!
String drl = "rule \"modify1\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" $p : Person( )\n" +
" then\n" +
" modify( $p ) { setFirstName( \",)\" ), setLastName( \",)\" ) }\n" +
"end";
addModelField("Person",
"firstName",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("Person",
"lastName",
"java.lang.String",
DataType.TYPE_STRING);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField field = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
field.getVariable());
assertNotNull(field.getFieldValues()[0]);
assertEquals(2,
field.getFieldValues().length);
ActionFieldValue value1 = field.getFieldValues()[0];
assertEquals("firstName",
value1.getField());
assertEquals(",)",
value1.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value1.getNature());
assertEquals(DataType.TYPE_STRING,
value1.getType());
ActionFieldValue value2 = field.getFieldValues()[1];
assertEquals("lastName",
value2.getField());
assertEquals(",)",
value2.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value2.getNature());
assertEquals(DataType.TYPE_STRING,
value2.getType());
}
@Test
public void testRHSModifyBlockMultipleFieldsMultipleLines() throws Exception {
//The value used in the "set" is intentionally yucky to catch extraction of the field's value errors!
String drl = "rule \"modify1\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" $p : Person( )\n" +
" then\n" +
" modify( $p ) { \n" +
" setFirstName( \",)\" ), \n" +
" setLastName( \",)\" )\n" +
" }\n" +
"end";
addModelField("Person",
"firstName",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("Person",
"lastName",
"java.lang.String",
DataType.TYPE_STRING);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField field = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
field.getVariable());
assertNotNull(field.getFieldValues()[0]);
assertEquals(2,
field.getFieldValues().length);
ActionFieldValue value1 = field.getFieldValues()[0];
assertEquals("firstName",
value1.getField());
assertEquals(",)",
value1.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value1.getNature());
assertEquals(DataType.TYPE_STRING,
value1.getType());
ActionFieldValue value2 = field.getFieldValues()[1];
assertEquals("lastName",
value2.getField());
assertEquals(",)",
value2.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
value2.getNature());
assertEquals(DataType.TYPE_STRING,
value2.getType());
}
@Test
public void testLiteralStrFieldNames() throws Exception {
//The issue is fields that contain the "str" operator literal value
String drl = "rule \"rule1\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Room( decoration == \"tapestry\" , strangeField == 11 )\n" +
" then\n" +
"end";
addModelField("Room",
"decoration",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("Room",
"strangeField",
"java.lang.Integer",
DataType.TYPE_NUMERIC_INTEGER);
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Room",
fp.getFactType());
assertEquals(2,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp0 = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Room",
sfp0.getFactType());
assertEquals("decoration",
sfp0.getFieldName());
assertEquals("==",
sfp0.getOperator());
assertEquals("tapestry",
sfp0.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp0.getConstraintValueType());
assertEquals(DataType.TYPE_STRING,
sfp0.getFieldType());
SingleFieldConstraint sfp1 = (SingleFieldConstraint) fp.getConstraint(1);
assertEquals("Room",
sfp1.getFactType());
assertEquals("strangeField",
sfp1.getFieldName());
assertEquals("==",
sfp1.getOperator());
assertEquals("11",
sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp1.getConstraintValueType());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
sfp1.getFieldType());
}
@Test
public void testMethodCallWithTwoParametersIntegerAndString() throws Exception {
String drl = "package org.mortgages;\n" +
"rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" $t : TestClass()\n" +
" then\n" +
" $t.testFunction( 123, \"hello\" );\n" +
"end";
final HashMap<String, List<MethodInfo>> map = new HashMap<>();
final ArrayList<MethodInfo> methodInfos = new ArrayList<>();
final ArrayList<String> params = new ArrayList<>();
params.add("Integer");
params.add("String");
methodInfos.add(new MethodInfo("testFunction",
params,
"java.lang.Void",
null,
"TestClass"));
map.put("TestClass",
methodInfos);
when(dmo.getProjectMethodInformation()).thenReturn(map);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(1,
m.rhs.length);
ActionCallMethod actionCallMethod = (ActionCallMethod) m.rhs[0];
assertEquals("testFunction",
actionCallMethod.getMethodName());
assertEquals("$t",
actionCallMethod.getVariable());
assertEquals(2,
actionCallMethod.getFieldValues().length);
assertEquals("testFunction",
actionCallMethod.getFieldValue(0).getField());
assertEquals("123",
actionCallMethod.getFieldValue(0).getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod.getFieldValue(0).getNature());
assertEquals("Integer",
actionCallMethod.getFieldValue(0).getType());
assertEquals("testFunction",
actionCallMethod.getFieldValue(1).getField());
assertEquals("hello",
actionCallMethod.getFieldValue(1).getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
actionCallMethod.getFieldValue(1).getNature());
assertEquals("String",
actionCallMethod.getFieldValue(1).getType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testLHSNumberExpressionWithoutThisPrefix() throws Exception {
String drl = "package org.mortgages;\n" +
"import java.lang.Number\n" +
"rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Number( intValue() > 5 )\n" +
" then\n" +
"end";
final HashMap<String, List<MethodInfo>> map = new HashMap<>();
final ArrayList<MethodInfo> methodInfos = new ArrayList<>();
methodInfos.add(new MethodInfo("intValue",
Collections.emptyList(),
"int",
null,
DataType.TYPE_NUMERIC_INTEGER));
map.put("java.lang.Number",
methodInfos);
when(dmo.getProjectMethodInformation()).thenReturn(map);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("Number",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide exp = (SingleFieldConstraintEBLeftSide) fp.getConstraint(0);
assertEquals("int",
exp.getFieldType());
assertEquals(">",
exp.getOperator());
assertEquals("5",
exp.getValue());
assertEquals(2,
exp.getExpressionLeftSide().getParts().size());
assertTrue(exp.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact expPart0 = (ExpressionUnboundFact) exp.getExpressionLeftSide().getParts().get(0);
assertEquals("Number",
expPart0.getFactType());
assertTrue(exp.getExpressionLeftSide().getParts().get(1) instanceof ExpressionMethod);
final ExpressionMethod expPart1 = (ExpressionMethod) exp.getExpressionLeftSide().getParts().get(1);
assertEquals("intValue",
expPart1.getName());
}
@Test
public void testLHSNumberExpressionWithThisPrefix() throws Exception {
String drl = "package org.mortgages;\n" +
"import java.lang.Number\n" +
"rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Number( this.intValue() > 5 )\n" +
" then\n" +
"end";
final HashMap<String, List<MethodInfo>> map = new HashMap<>();
final ArrayList<MethodInfo> methodInfos = new ArrayList<>();
methodInfos.add(new MethodInfo("intValue",
Collections.emptyList(),
"int",
null,
DataType.TYPE_NUMERIC_INTEGER));
map.put("java.lang.Number",
methodInfos);
when(dmo.getProjectMethodInformation()).thenReturn(map);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("Number",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide exp = (SingleFieldConstraintEBLeftSide) fp.getConstraint(0);
assertEquals("int",
exp.getFieldType());
assertEquals(">",
exp.getOperator());
assertEquals("5",
exp.getValue());
assertEquals(3,
exp.getExpressionLeftSide().getParts().size());
assertTrue(exp.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact expPart0 = (ExpressionUnboundFact) exp.getExpressionLeftSide().getParts().get(0);
assertEquals("Number",
expPart0.getFactType());
assertTrue(exp.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
final ExpressionField expPart1 = (ExpressionField) exp.getExpressionLeftSide().getParts().get(1);
assertEquals("this",
expPart1.getName());
assertTrue(exp.getExpressionLeftSide().getParts().get(2) instanceof ExpressionMethod);
final ExpressionMethod expPart2 = (ExpressionMethod) exp.getExpressionLeftSide().getParts().get(2);
assertEquals("intValue",
expPart2.getName());
}
@Test
public void testLHSNestedMethodCalls() throws Exception {
String drl = "package org.mortgages;\n" +
"rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" Parent( methodToGetChild1().methodToGetChild2().field1 > 5 )\n" +
" then\n" +
"end";
addMethodInformation("Parent",
"methodToGetChild1",
Collections.emptyList(),
"Child1",
null,
"Child1");
addMethodInformation("Child1",
"methodToGetChild2",
Collections.emptyList(),
"Child2",
null,
"Child2");
addModelField("Child2",
"field1",
"int",
DataType.TYPE_NUMERIC_INTEGER);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("Parent",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide exp = (SingleFieldConstraintEBLeftSide) fp.getConstraint(0);
assertEquals("int",
exp.getFieldType());
assertEquals(">",
exp.getOperator());
assertEquals("5",
exp.getValue());
assertEquals(4,
exp.getExpressionLeftSide().getParts().size());
assertTrue(exp.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact expPart0 = (ExpressionUnboundFact) exp.getExpressionLeftSide().getParts().get(0);
assertEquals("Parent",
expPart0.getFactType());
assertTrue(exp.getExpressionLeftSide().getParts().get(1) instanceof ExpressionMethod);
final ExpressionMethod expPart1 = (ExpressionMethod) exp.getExpressionLeftSide().getParts().get(1);
assertEquals("methodToGetChild1",
expPart1.getName());
assertTrue(exp.getExpressionLeftSide().getParts().get(2) instanceof ExpressionMethod);
final ExpressionMethod expPart2 = (ExpressionMethod) exp.getExpressionLeftSide().getParts().get(2);
assertEquals("methodToGetChild2",
expPart2.getName());
assertTrue(exp.getExpressionLeftSide().getParts().get(3) instanceof ExpressionField);
final ExpressionField expPart3 = (ExpressionField) exp.getExpressionLeftSide().getParts().get(3);
assertEquals("field1",
expPart3.getName());
}
@Test
public void testLHSMissingConstraints() {
String drl = "package org.mortgages;\n" +
"import java.lang.Number;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.SearchContext;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.ProducerMasterForRules;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.RuleFactor;\n" +
"rule \"SecondaryCuisineRepeatUsage\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" $searchContext : SearchContext( lastThreeCuisines != null )\n" +
" ProducerMasterForRules( primaryCuisine != null, primaryCuisine != $searchContext.lastThreeCuisines, secondaryCuisine != null, secondaryCuisine == $searchContext.lastThreeCuisines )\n" +
" $secondaryCuisineRepeatUsageFactor : RuleFactor( )\n" +
"then\n" +
" modify( $secondaryCuisineRepeatUsageFactor ) {\n" +
" setWeightageImpact(-30)\n" +
" }\n" +
"end\n";
addModelField("org.drools.workbench.models.commons.backend.rule.classes.SearchContext",
"this",
"org.drools.workbench.models.commons.backend.rule.classes.SearchContext",
DataType.TYPE_THIS);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.SearchContext",
"lastThreeCuisines",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.ProducerMasterForRules",
"primaryCuisine",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.ProducerMasterForRules",
"secondaryCuisine",
"java.lang.String",
DataType.TYPE_STRING);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testLHSNestedMethodOneParameter() {
String drl = "package org.mortgages;\n" +
"import java.lang.Number;\n" +
"import java.util.List;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" $foo : MyListContainerClass()\n" +
" $bar : MyStringContainerClass( myString == $foo.myList.get(1))\n" +
"then\n" +
"end\n";
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
"this",
"org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
DataType.TYPE_THIS);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
"myList",
"java.util.List",
"java.util.List");
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
"this",
"org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
DataType.TYPE_THIS);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
"myString",
"java.lang.String",
DataType.TYPE_STRING);
addMethodInformation("java.util.List",
"get",
new ArrayList<String>() {{
add("Integer");
}},
"java.lang.Object",
null,
"java.lang.Object");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testLHSNestedMethodTwoParameters() {
String drl = "package org.mortgages;\n" +
"import java.lang.Number;\n" +
"import java.util.List;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass;\n" +
"import org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass;\n" +
"rule \"r1\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" $foo : MyListContainerClass()\n" +
" $bar : MyStringContainerClass( $foo.myList.set(1, \"hello\" ) == true )\n" +
"then\n" +
"end\n";
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
"this",
"org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
DataType.TYPE_THIS);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyListContainerClass",
"myList",
"java.util.List",
"java.util.List");
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
"this",
"org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
DataType.TYPE_THIS);
addModelField("org.drools.workbench.models.commons.backend.rule.classes.MyStringContainerClass",
"myString",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("java.util.List",
"this",
"java.util.List",
DataType.TYPE_THIS);
addMethodInformation("java.util.List",
"set",
new ArrayList<String>() {{
add("Integer");
add("String");
}},
DataType.TYPE_BOOLEAN,
null,
DataType.TYPE_BOOLEAN);
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1160658
public void testRHSFormulaTruncation() throws Exception {
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " $p : Person()\n"
+ "then\n"
+ " $p.setTextOut( $p.getType() + \"\" );\n"
+ "end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"textOut",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("org.test.Person",
"type",
"java.lang.String",
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(1,
m.rhs.length);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1158813
public void testLHSFromCollectWithoutListDeclared() throws Exception {
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " c : Customer( )\n"
+ " items : java.util.List( eval( size == c.items.size )) \n"
+ " from collect ( var : Item( price > 10 )) \n"
+ "then \n"
+ "end";
addModelField("org.test.Customer",
"this",
"org.test.Customer",
DataType.TYPE_THIS);
addModelField("org.test.Item",
"this",
"org.test.Item",
DataType.TYPE_THIS);
addModelField("org.test.Item",
"price",
"java.lang.Double",
DataType.TYPE_NUMERIC_DOUBLE);
addMethodInformation("org.test.Customer",
"items",
new ArrayList<String>() {{
}},
DataType.TYPE_NUMERIC_INTEGER,
null,
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
assertEquals(0,
m.rhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("Customer",
fp.getFactType());
assertEquals("c",
fp.getBoundName());
assertEquals(0,
fp.getNumberOfConstraints());
assertTrue(m.lhs[1] instanceof FromCollectCompositeFactPattern);
final FromCollectCompositeFactPattern fcfp = (FromCollectCompositeFactPattern) m.lhs[1];
assertNotNull(fcfp.getFactPattern());
assertEquals("java.util.List",
fcfp.getFactPattern().getFactType());
assertEquals("items",
fcfp.getFactPattern().getBoundName());
assertEquals(1,
fcfp.getFactPattern().getNumberOfConstraints());
assertTrue(fcfp.getFactPattern().getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc0 = (SingleFieldConstraint) fcfp.getFactPattern().getConstraint(0);
assertNull(sfc0.getFactType());
assertNull(sfc0.getFieldName());
assertEquals("size == c.items.size",
sfc0.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
sfc0.getConstraintValueType());
assertNotNull(fcfp.getRightPattern());
assertTrue(fcfp.getRightPattern() instanceof FactPattern);
final FactPattern rfp = (FactPattern) fcfp.getRightPattern();
assertEquals("Item",
rfp.getFactType());
assertEquals("var",
rfp.getBoundName());
assertEquals(1,
rfp.getNumberOfConstraints());
assertTrue(rfp.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) rfp.getConstraint(0);
assertEquals("Item",
sfc1.getFactType());
assertEquals("price",
sfc1.getFieldName());
assertEquals("10",
sfc1.getValue());
assertEquals(">",
sfc1.getOperator());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfc1.getConstraintValueType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1158813
public void testLHSFromCollectWithListDeclared() throws Exception {
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " c : Customer( )\n"
+ " items : List( eval( size == c.items.size )) \n"
+ " from collect ( var : Item( price > 10 )) \n"
+ "then \n"
+ "end";
addModelField("org.test.Customer",
"this",
"org.test.Customer",
DataType.TYPE_THIS);
addModelField("org.test.Item",
"this",
"org.test.Item",
DataType.TYPE_THIS);
addModelField("org.test.Item",
"price",
"java.lang.Double",
DataType.TYPE_NUMERIC_DOUBLE);
addModelField("java.util.List",
"this",
"java.util.List",
DataType.TYPE_THIS);
addMethodInformation("org.test.Customer",
"items",
new ArrayList<String>() {{
}},
DataType.TYPE_NUMERIC_INTEGER,
null,
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
assertEquals(0,
m.rhs.length);
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("Customer",
fp.getFactType());
assertEquals("c",
fp.getBoundName());
assertEquals(0,
fp.getNumberOfConstraints());
assertTrue(m.lhs[1] instanceof FromCollectCompositeFactPattern);
final FromCollectCompositeFactPattern fcfp = (FromCollectCompositeFactPattern) m.lhs[1];
assertNotNull(fcfp.getFactPattern());
assertEquals("List",
fcfp.getFactPattern().getFactType());
assertEquals("items",
fcfp.getFactPattern().getBoundName());
assertEquals(1,
fcfp.getFactPattern().getNumberOfConstraints());
assertTrue(fcfp.getFactPattern().getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc0 = (SingleFieldConstraint) fcfp.getFactPattern().getConstraint(0);
assertNull(sfc0.getFactType());
assertNull(sfc0.getFieldName());
assertEquals("size == c.items.size",
sfc0.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
sfc0.getConstraintValueType());
assertNotNull(fcfp.getRightPattern());
assertTrue(fcfp.getRightPattern() instanceof FactPattern);
final FactPattern rfp = (FactPattern) fcfp.getRightPattern();
assertEquals("Item",
rfp.getFactType());
assertEquals("var",
rfp.getBoundName());
assertEquals(1,
rfp.getNumberOfConstraints());
assertTrue(rfp.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) rfp.getConstraint(0);
assertEquals("Item",
sfc1.getFactType());
assertEquals("price",
sfc1.getFieldName());
assertEquals("10",
sfc1.getValue());
assertEquals(">",
sfc1.getOperator());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfc1.getConstraintValueType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1134067
public void testRHSFormulaTruncationInsertFact() throws Exception {
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " Person( $t : name )\n"
+ "then \n"
+ " Person fact0 = new Person();\n"
+ " fact0.setName( $t );\n"
+ " insert( fact0 );\n"
+ "end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
"java.lang.String",
DataType.TYPE_STRING);
addModelField("org.test.Person",
"type",
"java.lang.String",
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(1,
m.rhs.length);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2144
public void testRuleModelPersistenceHelperUnwrapParenthesis() throws Exception {
String drl = "package org.test;\n"
+ "rule \"Load all schedules\"\n"
+ "dialect \"mvel\"\n"
+ "agenda-group \"LoadSchedules\"\n"
+ "salience 900\n"
+ " when\n"
+ " $bundle : Bundle( evaluated == false )\n"
+ " then\n"
+ " $bundle.setEvaluated( true );\n"
+ " update( $bundle );\n"
+ "end";
//Expected is different as we convert "update" to "modify" blocks
String expected = "package org.test;\n"
+ "rule \"Load all schedules\"\n"
+ "dialect \"mvel\"\n"
+ "agenda-group \"LoadSchedules\"\n"
+ "salience 900\n"
+ " when\n"
+ " $bundle : Bundle( evaluated == false )\n"
+ " then\n"
+ " modify( $bundle ) {\n"
+ " setEvaluated( true )\n"
+ " }\n"
+ "end";
addModelField("org.test.Bundle",
"this",
"org.test.Bundle",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"evaluated",
Boolean.class.getName(),
DataType.TYPE_BOOLEAN);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(1,
m.rhs.length);
assertEquals(3,
m.attributes.length);
assertEqualsIgnoreWhitespace(expected,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2141
public void testSingleFieldConstraintConnectives1() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ " when\n"
+ " Applicant( age < 55 || > 75 )\n"
+ " then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("<",
sfp.getOperator());
assertEquals("55",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals(1,
sfp.getConnectives().length);
ConnectiveConstraint cc = sfp.getConnectives()[0];
assertEquals("Applicant",
cc.getFactType());
assertEquals("age",
cc.getFieldName());
assertEquals("|| >",
cc.getOperator());
assertEquals("75",
cc.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cc.getConstraintValueType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2141
public void testSingleFieldConstraintConnectives2() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ " when\n"
+ " Applicant( age == 55 || == 75 )\n"
+ " then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Applicant",
sfp.getFactType());
assertEquals("age",
sfp.getFieldName());
assertEquals("==",
sfp.getOperator());
assertEquals("55",
sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
sfp.getConstraintValueType());
assertEquals(1,
sfp.getConnectives().length);
ConnectiveConstraint cc = sfp.getConnectives()[0];
assertEquals("Applicant",
cc.getFactType());
assertEquals("age",
cc.getFieldName());
assertEquals("|| ==",
cc.getOperator());
assertEquals("75",
cc.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
cc.getConstraintValueType());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2143
public void testNewKeywordVariableNamePrefix1() {
String oldValue = System.getProperty("drools.dateformat");
try {
System.setProperty("drools.dateformat",
"dd-MMM-yyyy");
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ " dialect \"java\"\n"
+ " when\n"
+ " $bundle : Bundle( $treatmentEffectiveDt : treatmentEffectiveDt )\n"
+ " then\n"
+ " java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(\"dd-MMM-yyyy\");\n"
+ " DateTime newStartDate = new DateTime();\n"
+ " modify( $bundle ) {\n"
+ " setTreatmentEffectiveDt( newStartDate.toDate() )"
+ " }\n"
+ "end\n";
addModelField("org.test.Bundle",
"this",
"org.test.Bundle",
DataType.TYPE_THIS);
addModelField("org.test.Bundle",
"treatmentEffectiveDt",
Date.class.getName(),
DataType.TYPE_DATE);
when(dmo.getPackageName()).thenReturn("org.test");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Bundle",
fp.getFactType());
assertEquals("$bundle",
fp.getBoundName());
assertEquals(1,
fp.getConstraintList().getConstraints().length);
assertTrue(fp.getConstraint(0) instanceof SingleFieldConstraint);
SingleFieldConstraint sfp = (SingleFieldConstraint) fp.getConstraint(0);
assertEquals("Bundle",
sfp.getFactType());
assertEquals("treatmentEffectiveDt",
sfp.getFieldName());
assertEquals("$treatmentEffectiveDt",
sfp.getFieldBinding());
assertNull(sfp.getOperator());
assertNull(sfp.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_UNDEFINED,
sfp.getConstraintValueType());
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
FreeFormLine ffl = (FreeFormLine) m.rhs[0];
assertEquals("DateTime newStartDate = new DateTime();",
ffl.getText());
assertTrue(m.rhs[1] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[1];
assertEquals("$bundle",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv = auf.getFieldValues()[0];
assertEquals("treatmentEffectiveDt",
afv.getField());
assertEquals("newStartDate.toDate()",
afv.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv.getNature());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
} finally {
if (oldValue == null) {
System.clearProperty("drools.dateformat");
} else {
System.setProperty("drools.dateformat",
oldValue);
}
}
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2143
public void testNewKeywordVariableNamePrefix2() {
String oldValue = System.getProperty("drools.dateformat");
try {
System.setProperty("drools.dateformat",
"dd-MMM-yyyy");
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ " dialect \"java\"\n"
+ " when\n"
+ " $a : Applicant()\n"
+ " then\n"
+ " java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(\"dd-MMM-yyyy\");\n"
+ " java.util.Date newStartDate = new java.util.Date();\n"
+ " modify( $a ) {\n"
+ " setApplicantDate( newStartDate )"
+ " }\n"
+ "end\n";
addModelField("org.test.Applicant",
"this",
"org.test.Applicant",
DataType.TYPE_THIS);
addModelField("org.test.Applicant",
"applicantDate",
Date.class.getName(),
DataType.TYPE_DATE);
when(dmo.getPackageName()).thenReturn("org.test");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals("$a",
fp.getBoundName());
assertNull(fp.getConstraintList());
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
FreeFormLine ffl = (FreeFormLine) m.rhs[0];
assertEquals("java.util.Date newStartDate = new java.util.Date();",
ffl.getText());
assertTrue(m.rhs[1] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[1];
assertEquals("$a",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv = auf.getFieldValues()[0];
assertEquals("applicantDate",
afv.getField());
assertEquals("newStartDate",
afv.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv.getNature());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
} finally {
if (oldValue == null) {
System.clearProperty("drools.dateformat");
} else {
System.setProperty("drools.dateformat",
oldValue);
}
}
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2143
public void testNewKeywordVariableNamePrefix3() {
String oldValue = System.getProperty("drools.dateformat");
try {
System.setProperty("drools.dateformat",
"dd-MMM-yyyy");
String drl = "package org.test;\n"
+ "rule \"rule1\"\n"
+ " dialect \"java\"\n"
+ " when\n"
+ " $a : Applicant()\n"
+ " then\n"
+ " java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(\"dd-MMM-yyyy\");\n"
+ " java.util.Date newStartDate = new java.util.Date();\n"
+ " modify( $a ) \n"
+ " { setApplicantDate( newStartDate ) }\n"
+ "end\n";
addModelField("org.test.Applicant",
"this",
"org.test.Applicant",
DataType.TYPE_THIS);
addModelField("org.test.Applicant",
"applicantDate",
Date.class.getName(),
DataType.TYPE_DATE);
when(dmo.getPackageName()).thenReturn("org.test");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Applicant",
fp.getFactType());
assertEquals("$a",
fp.getBoundName());
assertNull(fp.getConstraintList());
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
FreeFormLine ffl = (FreeFormLine) m.rhs[0];
assertEquals("java.util.Date newStartDate = new java.util.Date();",
ffl.getText());
assertTrue(m.rhs[1] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[1];
assertEquals("$a",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv = auf.getFieldValues()[0];
assertEquals("applicantDate",
afv.getField());
assertEquals("newStartDate",
afv.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv.getNature());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
} finally {
if (oldValue == null) {
System.clearProperty("drools.dateformat");
} else {
System.setProperty("drools.dateformat",
oldValue);
}
}
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1158176
public void testRHSEntryPointInsertion() throws Exception {
String drl = "package org.test;\n" +
"rule \"AgentBooking Rule\"\n" +
"dialect \"mvel\"\n" +
" when\n" +
" agent : Agent( )\n" +
" currentDate : TransactionDate( )\n" +
" Number( eval( intValue >=2 )) from accumulate (\n" +
" resEvent : ReservationEvent( agentId == agent.agentId , resdate == currentDate.eventDate ) from entry-point \"reservationEvent\", \n" +
" count(resEvent))\n" +
" then\n" +
" ReservationThresoldEvent thresoldevent = new ReservationThresoldEvent();\n" +
" thresoldevent.setAgentId( agent.getAgentId() );\n" +
" thresoldevent.setTxEventDate( currentDate.getEventDate() );\n" +
" kcontext.getKnowledgeRuntime().getEntryPoint(\"reservationTraceEvent\").insert( thresoldevent );\n" +
"end";
addModelField("org.test.Agent",
"this",
"org.test.Agent",
DataType.TYPE_THIS);
addModelField("org.test.Agent",
"agentId",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
addModelField("org.test.TransactionDate",
"this",
"org.test.TransactionDate",
DataType.TYPE_THIS);
addModelField("org.test.TransactionDate",
"eventDate",
Date.class.getName(),
DataType.TYPE_DATE);
addModelField("java.lang.Number",
"intValue",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
addModelField("org.test.ReservationEvent",
"this",
"org.test.ReservationEvent",
DataType.TYPE_THIS);
addModelField("org.test.ReservationEvent",
"agentId",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
addModelField("org.test.ReservationEvent",
"resdate",
Date.class.getName(),
DataType.TYPE_DATE);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(3,
m.lhs.length);
assertEquals(3,
m.rhs.length);
assertTrue(m.rhs[0] instanceof FreeFormLine);
assertTrue(m.rhs[1] instanceof FreeFormLine);
assertTrue(m.rhs[2] instanceof FreeFormLine);
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1136100
public void testLHSCustomAccumulateFunctions() throws Exception {
String drl = "package org.test;\n"
+ "rule \"test\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "Double( ) from accumulate ( Applicant( $a : age != null ),\n"
+ "init( double total = 0; ),\n"
+ "action( total += $a; ),\n"
+ "reverse( total -= $a; ),\n"
+ "result( new Double( total ) ) )\n"
+ "then\n"
+ "end";
addModelField(Double.class.getName(),
"this",
Double.class.getName(),
DataType.TYPE_THIS);
addModelField("org.test.Applicant",
"this",
"org.test.Applicant",
DataType.TYPE_THIS);
addModelField("org.test.Applicant",
"age",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(0,
m.rhs.length);
assertTrue(m.lhs[0] instanceof FromAccumulateCompositeFactPattern);
final FromAccumulateCompositeFactPattern facfp = (FromAccumulateCompositeFactPattern) m.lhs[0];
assertEquals("double total = 0;",
facfp.getInitCode());
assertEquals("total += $a;",
facfp.getActionCode());
assertEquals("total -= $a;",
facfp.getReverseCode());
assertEquals("new Double( total )",
facfp.getResultCode());
assertNotNull(facfp.getFactPattern());
final FactPattern fp = facfp.getFactPattern();
assertEquals("Double",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertNotNull(facfp.getSourcePattern());
assertTrue(facfp.getSourcePattern() instanceof FactPattern);
final FactPattern fsp = (FactPattern) facfp.getSourcePattern();
assertEquals("Applicant",
fsp.getFactType());
assertEquals(1,
fsp.getNumberOfConstraints());
assertTrue(fsp.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc = (SingleFieldConstraint) fsp.getConstraint(0);
assertEquals("$a",
sfc.getFieldBinding());
assertEquals("Applicant",
sfc.getFactType());
assertEquals("!= null",
sfc.getOperator());
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1174360
public void testLHSMultipleAllOfTheFollowing() throws Exception {
String drl = "package org.test;\n" +
"rule \"test\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"PhoneNumber(\n" +
"( homePhone != null && homePhone matches \"\\\"+9199\\\"\" ) || \n" +
"( personalPhone != null && personalPhone matches \"\\\"+9188\\\"\" ) || \n" +
"( workPhone != null && workPhone matches \"\\\"+9177\\\"\") \n" +
")\n" +
"then\n" +
"end\n";
addModelField("org.test.PhoneNumber",
"this",
"org.test.PhoneNumber",
DataType.TYPE_THIS);
addModelField("org.test.PhoneNumber",
"homePhone",
String.class.getName(),
DataType.TYPE_STRING);
addModelField("org.test.PhoneNumber",
"personalPhone",
String.class.getName(),
DataType.TYPE_STRING);
addModelField("org.test.PhoneNumber",
"workPhone",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
assertEquals(0,
m.rhs.length);
//Check Pattern
assertTrue(m.lhs[0] instanceof FactPattern);
final FactPattern fp = (FactPattern) m.lhs[0];
assertEquals("PhoneNumber",
fp.getFactType());
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof CompositeFieldConstraint);
final CompositeFieldConstraint cfc = (CompositeFieldConstraint) fp.getConstraint(0);
assertEquals("||",
cfc.getCompositeJunctionType());
assertEquals(3,
cfc.getNumberOfConstraints());
assertTrue(cfc.getConstraint(0) instanceof CompositeFieldConstraint);
assertTrue(cfc.getConstraint(1) instanceof CompositeFieldConstraint);
assertTrue(cfc.getConstraint(2) instanceof CompositeFieldConstraint);
//Check first composite field constraint
final CompositeFieldConstraint cfc_0 = (CompositeFieldConstraint) cfc.getConstraint(0);
assertEquals("&&",
cfc_0.getCompositeJunctionType());
assertEquals(2,
cfc_0.getNumberOfConstraints());
assertTrue(cfc_0.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfc_0.getConstraint(1) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc_0_0 = (SingleFieldConstraint) cfc_0.getConstraint(0);
assertEquals("PhoneNumber",
sfc_0_0.getFactType());
assertEquals("homePhone",
sfc_0_0.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_0_0.getFieldType());
assertEquals("!= null",
sfc_0_0.getOperator());
assertNull(sfc_0_0.getValue());
final SingleFieldConstraint sfc_0_1 = (SingleFieldConstraint) cfc_0.getConstraint(1);
assertEquals("PhoneNumber",
sfc_0_1.getFactType());
assertEquals("homePhone",
sfc_0_1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_0_1.getFieldType());
assertEquals("matches",
sfc_0_1.getOperator());
assertEquals("\\\"+9199\\\"",
sfc_0_1.getValue());
//Check second composite field constraint
final CompositeFieldConstraint cfc_1 = (CompositeFieldConstraint) cfc.getConstraint(1);
assertEquals("&&",
cfc_1.getCompositeJunctionType());
assertEquals(2,
cfc_1.getNumberOfConstraints());
assertTrue(cfc_1.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfc_1.getConstraint(1) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc_1_0 = (SingleFieldConstraint) cfc_1.getConstraint(0);
assertEquals("PhoneNumber",
sfc_1_0.getFactType());
assertEquals("personalPhone",
sfc_1_0.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_1_0.getFieldType());
assertEquals("!= null",
sfc_1_0.getOperator());
assertNull(sfc_1_0.getValue());
final SingleFieldConstraint sfc_1_1 = (SingleFieldConstraint) cfc_1.getConstraint(1);
assertEquals("PhoneNumber",
sfc_1_1.getFactType());
assertEquals("personalPhone",
sfc_1_1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_1_1.getFieldType());
assertEquals("matches",
sfc_1_1.getOperator());
assertEquals("\\\"+9188\\\"",
sfc_1_1.getValue());
//Check third composite field constraint
final CompositeFieldConstraint cfc_2 = (CompositeFieldConstraint) cfc.getConstraint(2);
assertEquals("&&",
cfc_2.getCompositeJunctionType());
assertEquals(2,
cfc_2.getNumberOfConstraints());
assertTrue(cfc_2.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(cfc_2.getConstraint(1) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc_2_0 = (SingleFieldConstraint) cfc_2.getConstraint(0);
assertEquals("PhoneNumber",
sfc_2_0.getFactType());
assertEquals("workPhone",
sfc_2_0.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_2_0.getFieldType());
assertEquals("!= null",
sfc_2_0.getOperator());
assertNull(sfc_2_0.getValue());
final SingleFieldConstraint sfc_2_1 = (SingleFieldConstraint) cfc_2.getConstraint(1);
assertEquals("PhoneNumber",
sfc_2_1.getFactType());
assertEquals("workPhone",
sfc_2_1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc_2_1.getFieldType());
assertEquals("matches",
sfc_2_1.getOperator());
assertEquals("\\\"+9177\\\"",
sfc_2_1.getValue());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1175333
public void testRHSFreeFormDRL() throws Exception {
String drl = "package org.test;\n" +
"rule \"Validate Down Payment\"\n" +
"dialect \"mvel\"\n" +
"ruleflow-group \"validation\"\n" +
"when\n" +
" property : Property( )\n" +
" Application( downPayment < 0 || downPayment > property.price )\n" +
"then\n" +
" ValidationError fact0 = new ValidationError();\n" +
" fact0.setCause( \"Down payment can't be negative or larger than property value\" );\n" +
" insert( fact0 );\n" +
" System.out.println(\"Executed Rule: \" + drools.getRule().getName() );\n" +
"end\n";
addModelField("org.test.Property",
"this",
"org.test.Property",
DataType.TYPE_THIS);
addModelField("org.test.Property",
"price",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
addModelField("org.test.Application",
"this",
"org.test.Application",
DataType.TYPE_THIS);
addModelField("org.test.Application",
"downPayment",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
addModelField("org.test.ValidationError",
"this",
"org.test.ValidationError",
DataType.TYPE_THIS);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1189930
//Formatted as generated from a Guided Rule in the Workbench
public void testBigDecimal1() throws Exception {
String drl = "package org.test;\n" +
"import java.lang.Number;\n" +
"import java.math.BigDecimal;\n" +
"import java.util.Calendar;\n" +
"rule \"BigDecimalRule\"\n" +
" dialect \"java\"\n" +
"when\n" +
" $bd : BigDecimal( )\n" +
"then\n" +
" LastRunInformation lastRun = new LastRunInformation();\n" +
" lastRun.setLastNumber( $bd );\n" +
" insert( lastRun );\n" +
"end";
addModelField("org.test.LastRunInformation",
"this",
"org.test.LastRunInformation",
DataType.TYPE_THIS);
addModelField("org.test.LastRunInformation",
"lastNumber",
BigDecimal.class.getName(),
DataType.TYPE_NUMERIC_BIGDECIMAL);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
final FactPattern fp = (FactPattern) p;
assertEquals("$bd",
fp.getBoundName());
assertEquals("BigDecimal",
fp.getFactType());
assertEquals(1,
m.rhs.length);
final IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
final ActionInsertFact aif = (ActionInsertFact) a;
assertEquals("lastRun",
aif.getBoundName());
assertEquals("LastRunInformation",
aif.getFactType());
assertEquals(1,
aif.getFieldValues().length);
final ActionFieldValue afv0 = aif.getFieldValues()[0];
assertEquals("lastNumber",
afv0.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv0.getNature());
assertEquals("=$bd",
afv0.getValue());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1189930
public void testBigDecimal2() throws Exception {
String drl = "package org.test;\n" +
"import java.lang.Number;\n" +
"import java.math.BigDecimal;\n" +
"import java.util.Calendar;\n" +
"rule \"BigDecimalRule\"\n" +
" dialect \"java\"\n" +
"when\n" +
" $bd : BigDecimal( )\n" +
"then\n" +
" LastRunInformation lastRun = new LastRunInformation();\n" +
" lastRun.setLastNumber($bd);\n" +
" insert(lastRun);\n" +
"end";
addModelField("org.test.LastRunInformation",
"this",
"org.test.LastRunInformation",
DataType.TYPE_THIS);
addModelField("org.test.LastRunInformation",
"lastNumber",
BigDecimal.class.getName(),
DataType.TYPE_NUMERIC_BIGDECIMAL);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
final FactPattern fp = (FactPattern) p;
assertEquals("$bd",
fp.getBoundName());
assertEquals("BigDecimal",
fp.getFactType());
assertEquals(1,
m.rhs.length);
final IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
final ActionInsertFact aif = (ActionInsertFact) a;
assertEquals("lastRun",
aif.getBoundName());
assertEquals("LastRunInformation",
aif.getFactType());
assertEquals(1,
aif.getFieldValues().length);
final ActionFieldValue afv0 = aif.getFieldValues()[0];
assertEquals("lastNumber",
afv0.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv0.getNature());
assertEquals("=$bd",
afv0.getValue());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1189930
public void testBigDecimal3() throws Exception {
String drl = "package org.test;\n" +
"import java.lang.Number;\n" +
"import java.math.BigDecimal;\n" +
"import java.util.Calendar;\n" +
"rule \"BigDecimalRule\"\n" +
" dialect \"java\"\n" +
"when\n" +
" $bd : BigDecimal( )\n" +
"then\n" +
" LastRunInformation lastRun = new LastRunInformation();\n" +
" lastRun.setLastNumber($bd);\n" +
"\n" +
" insert(lastRun);\n" +
"end";
addModelField("org.test.LastRunInformation",
"this",
"org.test.LastRunInformation",
DataType.TYPE_THIS);
addModelField("org.test.LastRunInformation",
"lastNumber",
BigDecimal.class.getName(),
DataType.TYPE_NUMERIC_BIGDECIMAL);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
final FactPattern fp = (FactPattern) p;
assertEquals("$bd",
fp.getBoundName());
assertEquals("BigDecimal",
fp.getFactType());
assertEquals(1,
m.rhs.length);
final IAction a = m.rhs[0];
assertTrue(a instanceof ActionInsertFact);
final ActionInsertFact aif = (ActionInsertFact) a;
assertEquals("lastRun",
aif.getBoundName());
assertEquals("LastRunInformation",
aif.getFactType());
assertEquals(1,
aif.getFieldValues().length);
final ActionFieldValue afv0 = aif.getFieldValues()[0];
assertEquals("lastNumber",
afv0.getField());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv0.getNature());
assertEquals("=$bd",
afv0.getValue());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1191737
public void testMultipleFromKeywords() throws Exception {
String drl = "package org.test;\n" +
"rule \"ToyWithoutName \"\n" +
"dialect \"java\"\n" +
"when\n" +
" $father: Father()\n" +
" ($kid: Kid() from $father.kids)\n" +
" ($toy: Toy(name == null) from $kid.toys)\n" +
"then\n" +
" System.out.println(\"blabla\");\n" +
"end";
addModelField("org.test.Father",
"this",
"org.test.Father",
DataType.TYPE_THIS);
addModelField("org.test.Father",
"kids",
"org.test.Kid",
DataType.TYPE_COLLECTION);
addModelField("org.test.Kid",
"this",
"org.test.Kid",
DataType.TYPE_THIS);
addModelField("org.test.Kid",
"toys",
"org.test.Toy",
DataType.TYPE_COLLECTION);
addModelField("org.test.Toy",
"this",
"org.test.Toy",
DataType.TYPE_THIS);
addModelField("org.test.Toy",
"name",
"java.lang.String",
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(3,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("$father",
fp0.getBoundName());
assertEquals("Father",
fp0.getFactType());
final IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FromCompositeFactPattern);
final FromCompositeFactPattern fp1 = (FromCompositeFactPattern) p1;
assertEquals("$kid",
fp1.getFactPattern().getBoundName());
assertEquals("Kid",
fp1.getFactType());
final IPattern p2 = m.lhs[2];
assertTrue(p2 instanceof FromCompositeFactPattern);
final FromCompositeFactPattern fp2 = (FromCompositeFactPattern) p2;
assertEquals("$toy",
fp2.getFactPattern().getBoundName());
assertEquals("Toy",
fp2.getFactType());
assertEquals(1,
m.rhs.length);
final IAction a = m.rhs[0];
assertTrue(a instanceof FreeFormLine);
final FreeFormLine affl = (FreeFormLine) a;
assertEquals("System.out.println(\"blabla\");",
affl.getText());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/DROOLS-713
public void testLHSFormula() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"java\"\n" +
"agenda-group \"MyGroup\"\n" +
"salience 900\n" +
"when\n" +
" $bundle : MyClass( $protocolSequence : protocolSequence )\n" +
" eval( $protocolSequence != null )\n" +
" $followupBundle : MyClass( protocolSequence == ( $protocolSequence + 1 ) )\n" +
"then\n" +
"end";
addModelField("org.test.MyClass",
"this",
"org.test.MyClass",
DataType.TYPE_THIS);
addModelField("org.test.MyClass",
"protocolSequence",
Integer.class.getName(),
DataType.TYPE_NUMERIC_INTEGER);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(3,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("$bundle",
fp0.getBoundName());
assertEquals("MyClass",
fp0.getFactType());
final IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FreeFormLine);
final FreeFormLine ffl1 = (FreeFormLine) p1;
assertEquals("eval( $protocolSequence != null )",
ffl1.getText());
final IPattern p2 = m.lhs[2];
assertTrue(p2 instanceof FactPattern);
final FactPattern fp2 = (FactPattern) p2;
assertEquals("$followupBundle",
fp2.getBoundName());
assertEquals("MyClass",
fp2.getFactType());
assertEquals(1,
fp2.getNumberOfConstraints());
assertTrue(fp2.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp2.getConstraint(0);
assertEquals("MyClass",
sfc1.getFactType());
assertEquals("protocolSequence",
sfc1.getFieldName());
assertEquals(DataType.TYPE_NUMERIC_INTEGER,
sfc1.getFieldType());
assertEquals("==",
sfc1.getOperator());
assertEquals("$protocolSequence + 1",
sfc1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_RET_VALUE,
sfc1.getConstraintValueType());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1127303
public void testRHSChainedMethodCalls1() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Person( $n : name )\n" +
"then\n" +
" $n.toUpperCase().indexOf(\"S\", 1);\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(1,
m.rhs.length);
final IAction a0 = m.rhs[0];
assertTrue(a0 instanceof FreeFormLine);
final FreeFormLine ffl1 = (FreeFormLine) a0;
assertEquals("$n.toUpperCase().indexOf(\"S\", 1);",
ffl1.getText());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1127303
public void testRHSChainedMethodCalls2() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Person( $n : name )\n" +
"then\n" +
" $n.toUpperCase().indexOf(\".\", 1);\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(1,
m.rhs.length);
final IAction a0 = m.rhs[0];
assertTrue(a0 instanceof FreeFormLine);
final FreeFormLine ffl1 = (FreeFormLine) a0;
assertEquals("$n.toUpperCase().indexOf(\".\", 1);",
ffl1.getText());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1127303
public void testRHSChainedMethodCalls3() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Person( $n : name )\n" +
"then\n" +
" $n.toUpperCase().indexOf(\"(\", 1);\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(1,
m.rhs.length);
final IAction a0 = m.rhs[0];
assertTrue(a0 instanceof FreeFormLine);
final FreeFormLine ffl1 = (FreeFormLine) a0;
assertEquals("$n.toUpperCase().indexOf(\"(\", 1);",
ffl1.getText());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1127303
public void testRHSChainedMethodCalls4() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Person( $n : name )\n" +
"then\n" +
" $n.toUpperCase().indexOf(\"\\\").\", 1);\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(1,
m.rhs.length);
final IAction a0 = m.rhs[0];
assertTrue(a0 instanceof FreeFormLine);
final FreeFormLine ffl1 = (FreeFormLine) a0;
assertEquals("$n.toUpperCase().indexOf(\"\\\").\", 1);",
ffl1.getText());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/DROOLS-715
public void testLHSValidLiteralFieldName() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" MyClass( valid == true )\n" +
"then\n" +
"end";
addModelField("org.test.MyClass",
"this",
"org.test.MyClass",
DataType.TYPE_THIS);
addModelField("org.test.MyClass",
"valid",
Boolean.class.getName(),
DataType.TYPE_BOOLEAN);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("MyClass",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("MyClass",
sfc1.getFactType());
assertEquals("valid",
sfc1.getFieldName());
assertEquals(DataType.TYPE_BOOLEAN,
sfc1.getFieldType());
assertEquals("==",
sfc1.getOperator());
assertEquals("true",
sfc1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_ENUM,
sfc1.getConstraintValueType());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1218308
public void testInvalidFromSyntax() throws Exception {
String drl = "rule \"test\"\n" +
" dialect \"mvel\"\n" +
" when\n" +
" (obj : MyClass( ) from my.package)\n" +
" then\n" +
" System.out.println(\"Test\")\n" +
" end";
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FromCompositeFactPattern);
final FromCompositeFactPattern fp0 = (FromCompositeFactPattern) p0;
assertEquals("MyClass",
fp0.getFactType());
final FactPattern fp1 = fp0.getFactPattern();
assertEquals("MyClass",
fp1.getFactType());
assertEquals(0,
fp1.getNumberOfConstraints());
final ExpressionFormLine efl = fp0.getExpression();
assertNotNull(efl);
assertEquals(2,
efl.getParts().size());
assertTrue(efl.getParts().get(0) instanceof ExpressionVariable);
final ExpressionVariable ev = (ExpressionVariable) efl.getParts().get(0);
assertEquals("my",
ev.getName());
assertTrue(efl.getParts().get(1) instanceof ExpressionText);
final ExpressionText et = (ExpressionText) efl.getParts().get(1);
assertEquals("package",
et.getName());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1218308
public void testValidSyntaxNonImportedType() throws Exception {
String drl = "rule \"x\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" var : NotImported( )\n" +
" OtherType( field != var.field )\n" +
" (MyType( ) from var.collectionField)\n" +
"then\n" +
"end";
addModelField("org.test.OtherType",
"this",
"org.test.OtherType",
DataType.TYPE_THIS);
addModelField("org.test.OtherType",
"field",
String.class.getName(),
DataType.TYPE_STRING);
addModelField("org.test.MyType",
"this",
"org.test.MyType",
DataType.TYPE_THIS);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(3,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("NotImported",
fp0.getFactType());
assertEquals("var",
fp0.getBoundName());
assertEquals(0,
fp0.getNumberOfConstraints());
final IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FactPattern);
final FactPattern fp1 = (FactPattern) p1;
assertEquals("OtherType",
fp1.getFactType());
assertEquals(1,
fp1.getNumberOfConstraints());
assertTrue(fp1.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp1sfc0 = (SingleFieldConstraint) fp1.getConstraint(0);
assertEquals("OtherType",
fp1sfc0.getFactType());
assertEquals("field",
fp1sfc0.getFieldName());
assertEquals("!=",
fp1sfc0.getOperator());
assertEquals(2,
fp1sfc0.getExpressionValue().getParts().size());
assertTrue(fp1sfc0.getExpressionValue().getParts().get(0) instanceof ExpressionText);
final ExpressionText fp1sfc0e0 = (ExpressionText) fp1sfc0.getExpressionValue().getParts().get(0);
assertEquals("var",
fp1sfc0e0.getName());
assertTrue(fp1sfc0.getExpressionValue().getParts().get(1) instanceof ExpressionText);
final ExpressionText fp1sfc0e1 = (ExpressionText) fp1sfc0.getExpressionValue().getParts().get(1);
assertEquals("field",
fp1sfc0e1.getName());
final IPattern p2 = m.lhs[2];
assertTrue(p2 instanceof FromCompositeFactPattern);
final FromCompositeFactPattern fp2 = (FromCompositeFactPattern) p2;
assertEquals("MyType",
fp2.getFactType());
assertEquals(2,
fp2.getExpression().getParts().size());
assertTrue(fp2.getExpression().getParts().get(0) instanceof ExpressionVariable);
final ExpressionVariable fp2e0 = (ExpressionVariable) fp2.getExpression().getParts().get(0);
assertEquals("var",
fp2e0.getName());
assertTrue(fp2.getExpression().getParts().get(1) instanceof ExpressionText);
final ExpressionText fp2e1 = (ExpressionText) fp2.getExpression().getParts().get(1);
assertEquals("collectionField",
fp2e1.getName());
assertEquals(0,
m.rhs.length);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1218308
public void testInvalidSyntax1() throws Exception {
String drl = "rule \"test\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Smurf( flange \n" +
"then\n" +
"end";
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FreeFormLine);
final FreeFormLine ffl = (FreeFormLine) p0;
assertEquals("Smurf( flange",
ffl.getText());
assertEquals(0,
m.rhs.length);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://bugzilla.redhat.com/show_bug.cgi?id=1234640
public void testStringFieldsWithDoubleForwardSlashes() throws Exception {
String drl = "rule \"test\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" MyType( url == \"http://www.redhat.com\" )\n" +
"then\n" +
"end";
addModelField("org.test.MyType",
"this",
"org.test.MyType",
DataType.TYPE_THIS);
addModelField("org.test.MyType",
"url",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("MyType",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp0sfc0 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("MyType",
fp0sfc0.getFactType());
assertEquals("url",
fp0sfc0.getFieldName());
assertEquals("==",
fp0sfc0.getOperator());
assertEquals(DataType.TYPE_STRING,
fp0sfc0.getFieldType());
assertEquals("http://www.redhat.com",
fp0sfc0.getValue());
assertEquals(0,
m.rhs.length);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
private void assertEqualsIgnoreWhitespace(final String expected,
final String actual) {
final String cleanExpected = expected.replaceAll("\\s+",
"");
final String cleanActual = actual.replaceAll("\\s+",
"");
assertEquals(cleanExpected,
cleanActual);
}
@Test
public void testStringReplaceExpression() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1264321
String drl = "rule \"Replace_condition_Issue\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" MyType( myString.replace(\"a\",\"b\"))\n" +
"then\n" +
"end";
addModelField("org.test.MyType",
"this",
"org.test.MyType",
DataType.TYPE_THIS);
addModelField("org.test.MyType",
"myString",
String.class.getName(),
DataType.TYPE_STRING);
addMethodInformation("java.lang.String",
"replace",
new ArrayList<String>() {{
add("String");
add("String");
}},
"java.lang.String",
null,
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("MyType",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraintEBLeftSide);
final SingleFieldConstraintEBLeftSide fp0sfc0 = (SingleFieldConstraintEBLeftSide) fp0.getConstraint(0);
assertEquals(3,
fp0sfc0.getExpressionLeftSide().getParts().size());
assertTrue(fp0sfc0.getExpressionLeftSide().getParts().get(0) instanceof ExpressionUnboundFact);
final ExpressionUnboundFact ep0 = (ExpressionUnboundFact) fp0sfc0.getExpressionLeftSide().getParts().get(0);
assertEquals("MyType",
ep0.getFactType());
assertTrue(fp0sfc0.getExpressionLeftSide().getParts().get(1) instanceof ExpressionField);
final ExpressionField ep1 = (ExpressionField) fp0sfc0.getExpressionLeftSide().getParts().get(1);
assertEquals("myString",
ep1.getName());
assertTrue(fp0sfc0.getExpressionLeftSide().getParts().get(2) instanceof ExpressionMethod);
final ExpressionMethod ep2 = (ExpressionMethod) fp0sfc0.getExpressionLeftSide().getParts().get(2);
assertEquals("replace",
ep2.getName());
assertEquals(2,
ep2.getParams().size());
final ExpressionFormLine param0 = ep2.getParams().get(new ExpressionMethodParameterDefinition(0,
"String"));
assertNotNull(param0);
assertEquals(1,
param0.getParts().size());
assertNotNull(param0.getParts().get(0));
assertEquals("a",
param0.getParts().get(0).getName());
assertEquals("String",
param0.getParts().get(0).getClassType());
final ExpressionFormLine param1 = ep2.getParams().get(new ExpressionMethodParameterDefinition(1,
"String"));
assertNotNull(param1);
assertEquals(1,
param1.getParts().size());
assertNotNull(param1.getParts().get(0));
assertEquals("b",
param1.getParts().get(0).getName());
assertEquals("String",
param1.getParts().get(0).getClassType());
assertEquals(0,
m.rhs.length);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testBoundListConstraint() throws Exception {
//https://bugzilla.redhat.com/show_bug.cgi?id=1264339
String drl = "package org.test;\n" +
"rule \"List_Of_Values_Issue\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" MyTransactionVO( $myData : myData )\n" +
" MyDataList( myDataList contains $myData )\n" +
" then\n" +
"end";
addModelField("org.test.MyTransactionVO",
"this",
"org.test.MyTransactionVO",
DataType.TYPE_THIS);
addModelField("org.test.MyTransactionVO",
"myData",
"org.test.MyDataList",
"org.test.MyDataList");
addModelField("org.test.MyDataList",
"this",
"org.test.MyDataList",
DataType.TYPE_THIS);
addModelField("org.test.MyDataList",
"myDataList",
List.class.getName(),
DataType.TYPE_COLLECTION);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(2,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("MyTransactionVO",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
final IPattern p1 = m.lhs[1];
assertTrue(p1 instanceof FactPattern);
final FactPattern fp1 = (FactPattern) p1;
assertEquals("MyDataList",
fp1.getFactType());
assertEquals(1,
fp1.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp0sfc0 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("MyTransactionVO",
fp0sfc0.getFactType());
assertEquals("myData",
fp0sfc0.getFieldName());
assertEquals("$myData",
fp0sfc0.getFieldBinding());
assertEquals("MyDataList",
fp0sfc0.getFieldType());
assertNull(fp0sfc0.getOperator());
assertNull(fp0sfc0.getValue());
assertTrue(fp1.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp1sfc0 = (SingleFieldConstraint) fp1.getConstraint(0);
assertEquals("MyDataList",
fp1sfc0.getFactType());
assertEquals("myDataList",
fp1sfc0.getFieldName());
assertEquals("contains",
fp1sfc0.getOperator());
assertEquals("$myData",
fp1sfc0.getValue());
assertEquals(SingleFieldConstraint.TYPE_VARIABLE,
fp1sfc0.getConstraintValueType());
assertEquals(0,
m.rhs.length);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
public void testRHSAppendToList() throws Exception {
//https://issues.jboss.org/browse/GUVNOR-2286
String drl = "package org.test;\n" +
"import java.lang.Number;\n" +
"rule \"RuleCheckEmail\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
"incomeData : IncomeData( email == \"myemail\" , $list : list != null )\n" +
"then\n" +
"Element element = new Element();\n" +
"element.setId( 2 );\n" +
"insertLogical( element );\n" +
"$list.add( element );\n" +
"end";
addModelField("org.test.IncomeData",
"this",
"org.test.IncomeData",
DataType.TYPE_THIS);
addModelField("org.test.IncomeData",
"email",
String.class.getName(),
DataType.TYPE_STRING);
addModelField("org.test.IncomeData",
"list",
List.class.getName(),
DataType.TYPE_COLLECTION);
addModelField("java.util.List",
"this",
"java.util.List",
DataType.TYPE_THIS);
addMethodInformation("java.util.List",
"add",
new ArrayList<String>() {{
add("java.lang.Object");
}},
DataType.TYPE_BOOLEAN,
null,
DataType.TYPE_BOOLEAN);
addMethodInformation("java.util.List",
"add",
new ArrayList<String>() {{
add("java.lang.Integer");
add("java.lang.Object");
}},
DataType.TYPE_BOOLEAN,
null,
DataType.TYPE_BOOLEAN);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("IncomeData",
fp0.getFactType());
assertEquals(2,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp0sfc0 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("IncomeData",
fp0sfc0.getFactType());
assertEquals("email",
fp0sfc0.getFieldName());
assertEquals(DataType.TYPE_STRING,
fp0sfc0.getFieldType());
assertEquals("==",
fp0sfc0.getOperator());
assertEquals("myemail",
fp0sfc0.getValue());
assertTrue(fp0.getConstraint(1) instanceof SingleFieldConstraint);
final SingleFieldConstraint fp0sfc1 = (SingleFieldConstraint) fp0.getConstraint(1);
assertEquals("IncomeData",
fp0sfc1.getFactType());
assertEquals("list",
fp0sfc1.getFieldName());
assertEquals(DataType.TYPE_COLLECTION,
fp0sfc1.getFieldType());
assertEquals("!= null",
fp0sfc1.getOperator());
assertNull(fp0sfc1.getValue());
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionInsertLogicalFact);
final ActionInsertLogicalFact a0 = (ActionInsertLogicalFact) m.rhs[0];
assertEquals("Element",
a0.getFactType());
assertEquals("element",
a0.getBoundName());
assertEquals(1,
a0.getFieldValues().length);
final ActionFieldValue a0f0 = a0.getFieldValues()[0];
assertEquals("id",
a0f0.getField());
assertEquals("2",
a0f0.getValue());
assertEquals(DataType.TYPE_NUMERIC,
a0f0.getType());
assertEquals(FieldNatureType.TYPE_LITERAL,
a0f0.getNature());
assertTrue(m.rhs[1] instanceof ActionCallMethod);
final ActionCallMethod a1 = (ActionCallMethod) m.rhs[1];
assertEquals("add",
a1.getMethodName());
assertEquals("$list",
a1.getVariable());
assertEquals(1,
a1.getFieldValues().length);
final ActionFieldValue a1f0 = a1.getFieldValues()[0];
assertEquals("add",
a1f0.getField());
assertEquals("element",
a1f0.getValue());
assertEquals(FieldNatureType.TYPE_VARIABLE,
a1f0.getNature());
assertEquals("java.lang.Object",
a1f0.getType());
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2030
public void testLHSTemplateKeys() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" Person( name == \"@{k1}\" )\n" +
"then\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(SingleFieldConstraint.TYPE_TEMPLATE,
sfc1.getConstraintValueType());
assertEquals("k1",
sfc1.getValue());
assertEquals(0,
m.rhs.length);
}
@Test
//https://issues.jboss.org/browse/GUVNOR-2030
public void testRHSTemplateKeys() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" $p : Person( name == \"Fred\" )\n" +
"then\n" +
" modify( $p ) { setName( \"@{k1}\" ) }\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(1,
fp0.getNumberOfConstraints());
assertTrue(fp0.getConstraint(0) instanceof SingleFieldConstraint);
final SingleFieldConstraint sfc1 = (SingleFieldConstraint) fp0.getConstraint(0);
assertEquals("Person",
sfc1.getFactType());
assertEquals("name",
sfc1.getFieldName());
assertEquals(DataType.TYPE_STRING,
sfc1.getFieldType());
assertEquals(SingleFieldConstraint.TYPE_LITERAL,
sfc1.getConstraintValueType());
assertEquals("Fred",
sfc1.getValue());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv = auf.getFieldValues()[0];
assertEquals("name",
afv.getField());
assertEquals("k1",
afv.getValue());
assertEquals(FieldNatureType.TYPE_TEMPLATE,
afv.getNature());
}
@Test
//See https://issues.jboss.org/browse/GUVNOR-2455
public void testRHS_DataTypeSuffixes() throws Exception {
String drl = "package org.test;\n" +
"rule \"MyRule\"\n" +
"dialect \"mvel\"\n" +
"when\n" +
" $p : Person( )\n" +
"then\n" +
" modify( $p ) { setDouble( 25.0d ), setFloat( 25.0f ), setLong( 25L ) }\n" +
"end";
addModelField("org.test.Person",
"this",
"org.test.Person",
DataType.TYPE_THIS);
addModelField("org.test.Person",
"double",
Double.class.getName(),
DataType.TYPE_NUMERIC_DOUBLE);
addModelField("org.test.Person",
"float",
Float.class.getName(),
DataType.TYPE_NUMERIC_FLOAT);
addModelField("org.test.Person",
"long",
Long.class.getName(),
DataType.TYPE_NUMERIC_LONG);
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals(1,
m.lhs.length);
final IPattern p0 = m.lhs[0];
assertTrue(p0 instanceof FactPattern);
final FactPattern fp0 = (FactPattern) p0;
assertEquals("Person",
fp0.getFactType());
assertEquals(0,
fp0.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[0];
assertEquals("$p",
auf.getVariable());
assertEquals(3,
auf.getFieldValues().length);
ActionFieldValue afv0 = auf.getFieldValues()[0];
assertEquals("double",
afv0.getField());
assertEquals("25.0",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv0.getNature());
ActionFieldValue afv1 = auf.getFieldValues()[1];
assertEquals("float",
afv1.getField());
assertEquals("25.0",
afv1.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv1.getNature());
ActionFieldValue afv2 = auf.getFieldValues()[2];
assertEquals("long",
afv2.getField());
assertEquals("25",
afv2.getValue());
assertEquals(FieldNatureType.TYPE_LITERAL,
afv2.getNature());
}
@Test
public void compositeFieldConstraintWithTwoPredicates() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Person( eval( age > 18 ) && eval(age < 45) )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
//LHS sub-patterns
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof CompositeFieldConstraint);
CompositeFieldConstraint fp_cfp = (CompositeFieldConstraint) fp.getConstraint(0);
assertEquals("&&",
fp_cfp.getCompositeJunctionType());
assertEquals(2,
fp_cfp.getNumberOfConstraints());
assertTrue(fp_cfp.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(fp_cfp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint fp_cfp_sfp1 = (SingleFieldConstraint) fp_cfp.getConstraint(0);
assertEquals("age > 18",
fp_cfp_sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
fp_cfp_sfp1.getConstraintValueType());
SingleFieldConstraint fp_cfp_sfp2 = (SingleFieldConstraint) fp_cfp.getConstraint(1);
assertEquals("age < 45",
fp_cfp_sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
fp_cfp_sfp2.getConstraintValueType());
}
@Test
public void compositeFieldConstraintWithOnePredicateAndOneLiteral() {
String drl = "rule \"rule1\"\n"
+ "when\n"
+ "Person( eval( age > 18 ) && age < 45 )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("rule1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
//LHS sub-patterns
assertEquals(1,
fp.getNumberOfConstraints());
assertTrue(fp.getConstraint(0) instanceof CompositeFieldConstraint);
CompositeFieldConstraint fp_cfp = (CompositeFieldConstraint) fp.getConstraint(0);
assertEquals("&&",
fp_cfp.getCompositeJunctionType());
assertEquals(2,
fp_cfp.getNumberOfConstraints());
assertTrue(fp_cfp.getConstraint(0) instanceof SingleFieldConstraint);
assertTrue(fp_cfp.getConstraint(1) instanceof SingleFieldConstraint);
SingleFieldConstraint fp_cfp_sfp1 = (SingleFieldConstraint) fp_cfp.getConstraint(0);
assertEquals("age > 18",
fp_cfp_sfp1.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_PREDICATE,
fp_cfp_sfp1.getConstraintValueType());
SingleFieldConstraint fp_cfp_sfp2 = (SingleFieldConstraint) fp_cfp.getConstraint(1);
assertEquals("Person",
fp_cfp_sfp2.getFactType());
assertEquals("age",
fp_cfp_sfp2.getFieldName());
assertEquals("<",
fp_cfp_sfp2.getOperator());
assertEquals("45",
fp_cfp_sfp2.getValue());
assertEquals(BaseSingleFieldConstraint.TYPE_LITERAL,
fp_cfp_sfp2.getConstraintValueType());
}
@Test
public void newRHSFactsCanBeUsedInRHSBinding() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$l : LoanApplication()\n"
+ "then\n"
+ "Applicant $a = new Applicant();\n"
+ "insert( $a );\n"
+ "modify( $l ) {\n"
+ " setApplicant( $a )"
+ "}\n"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.LoanApplication",
"this",
"org.mortgages.LoanApplication",
DataType.TYPE_THIS);
addModelField("org.mortgages.LoanApplication",
"applicant",
"org.mortgages.Applicant",
"org.mortgages.Applicant");
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("LoanApplication",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(2,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionInsertFact);
ActionInsertFact aif = (ActionInsertFact) m.rhs[0];
assertEquals("$a",
aif.getBoundName());
assertEquals("Applicant",
aif.getFactType());
assertEquals(0,
aif.getFieldValues().length);
assertTrue(m.rhs[1] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[1];
assertEquals("$l",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv0 = auf.getFieldValues()[0];
assertEquals("applicant",
afv0.getField());
assertEquals("=$a",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_VARIABLE,
afv0.getNature());
assertEquals("Applicant",
afv0.getType());
}
@Test
public void actionUpdateFieldWithFormula() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$a : Application()\n"
+ "then\n"
+ "modify( $a ) {\n"
+ " setName( \"Pupa\" + 20 + \"Smurf\" )"
+ "}\n"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.Applicant",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Application",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[0];
assertEquals("$a",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv0 = auf.getFieldValues()[0];
assertEquals("name",
afv0.getField());
assertEquals("\"Pupa\" + 20 + \"Smurf\"",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv0.getNature());
}
@Test
public void actionUpdateFieldWithFormulaNotEndWithString() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$a : Application()\n"
+ "then\n"
+ "modify( $a ) {\n"
+ " setName( \"Pupa\" + 20 )"
+ "}\n"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.Applicant",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Application",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[0];
assertEquals("$a",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv0 = auf.getFieldValues()[0];
assertEquals("name",
afv0.getField());
assertEquals("\"Pupa\" + 20",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv0.getNature());
}
@Test
public void actionUpdateFieldWithFormulaWithEscapedQuote() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$a : Application()\n"
+ "then\n"
+ "modify( $a ) {\n"
+ " setName( \"Pupa \\\"\" + 20 + \"\\\" Smurf\" )"
+ "}\n"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.Applicant",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Application",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionUpdateField);
ActionUpdateField auf = (ActionUpdateField) m.rhs[0];
assertEquals("$a",
auf.getVariable());
assertEquals(1,
auf.getFieldValues().length);
ActionFieldValue afv0 = auf.getFieldValues()[0];
assertEquals("name",
afv0.getField());
assertEquals("\"Pupa \\\"\" + 20 + \"\\\" Smurf\"",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv0.getNature());
}
@Test
public void actionSetFieldWithFormula() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$a : Application()\n"
+ "then\n"
+ "$a.setName( \"Pupa\" + 20 + \"Smurf\" );"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.Applicant",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Application",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionSetField);
ActionSetField asf = (ActionSetField) m.rhs[0];
assertEquals("$a",
asf.getVariable());
assertEquals(1,
asf.getFieldValues().length);
ActionFieldValue afv0 = asf.getFieldValues()[0];
assertEquals("name",
afv0.getField());
assertEquals("\"Pupa\" + 20 + \"Smurf\"",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv0.getNature());
}
@Test
public void actionInsertFactWithFormula() throws Exception {
String drl = "package org.mortgages;\n"
+ "rule \"r1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "$a : Application()\n"
+ "then\n"
+ "Applicant $a = new Applicant();\n"
+ "$a.setName( \"Pupa\" + 20 + \"Smurf\" );\n"
+ "insert( $a );\n"
+ "end";
addModelField("org.mortgages.Applicant",
"this",
"org.mortgages.Applicant",
DataType.TYPE_THIS);
addModelField("org.mortgages.Applicant",
"name",
String.class.getName(),
DataType.TYPE_STRING);
when(dmo.getPackageName()).thenReturn("org.mortgages");
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
assertNotNull(m);
assertEquals("r1",
m.name);
//LHS Pattern
assertEquals(1,
m.lhs.length);
IPattern p = m.lhs[0];
assertTrue(p instanceof FactPattern);
FactPattern fp = (FactPattern) p;
assertEquals("Application",
fp.getFactType());
assertEquals(0,
fp.getNumberOfConstraints());
assertEquals(1,
m.rhs.length);
assertTrue(m.rhs[0] instanceof ActionInsertFact);
ActionInsertFact aif = (ActionInsertFact) m.rhs[0];
assertEquals("$a",
aif.getBoundName());
assertEquals(1,
aif.getFieldValues().length);
ActionFieldValue afv0 = aif.getFieldValues()[0];
assertEquals("name",
afv0.getField());
assertEquals("\"Pupa\" + 20 + \"Smurf\"",
afv0.getValue());
assertEquals(FieldNatureType.TYPE_FORMULA,
afv0.getNature());
}
@Test
public void testForAll() throws Exception {
// RHBPMS-4666
String drl = "package org.test;\n" +
"import java.util.List;\n" +
"rule \"MyRule\" dialect \"mvel\" when\n" +
" $myList : List( empty == false )\n" +
" forall( String( this.startsWith( \"n\" ) ) from $myList )\n" +
"then\n" +
"end";
when(dmo.getPackageName()).thenReturn("org.test");
final RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/RHBPMS-4695
public void testNestedEvalWithIdenticalCompositeOperator() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "MyTestDateObject(firstName != null && firstName != \"\" && eval($td.getFirstName().toUpperCase().equals(\"NONAME\") || $td.getFirstName().toUpperCase().equals(\"NAMENOTPROVIDED\")))\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/RHBPMS-4695
public void testNestedEvalWithDifferentCompositeOperators() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "MyTestDateObject(firstName != null && firstName != \"\" || eval($td.getFirstName().toUpperCase().equals(\"NONAME\") || $td.getFirstName().toUpperCase().equals(\"NAMENOTPROVIDED\")))\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/RHBPMS-4695
public void testNestedEvalWithIdenticalCompositeOperatorsAndTrailingConstraint() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "MyTestDateObject(firstName != null && eval($td.getFirstName().toUpperCase().equals(\"NONAME\") || $td.getFirstName().toUpperCase().equals(\"NAMENOTPROVIDED\")) && firstName != \"\" )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
@Test
//https://issues.jboss.org/browse/RHBPMS-4695
public void testNestedEvalWithDifferentCompositeOperatorsAndTrailingConstraint() {
String drl = "rule \"rule1\"\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ "MyTestDateObject(firstName != null || eval($td.getFirstName().toUpperCase().equals(\"NONAME\") || $td.getFirstName().toUpperCase().equals(\"NAMENOTPROVIDED\")) && firstName != \"\" )\n"
+ "then\n"
+ "end";
RuleModel m = RuleModelDRLPersistenceImpl.getInstance().unmarshal(drl,
Collections.emptyList(),
dmo);
//Check round-trip
assertEqualsIgnoreWhitespace(drl,
RuleModelDRLPersistenceImpl.getInstance().marshal(m));
}
}