/* * Copyright 2005 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.compiler.integrationtests; import org.acme.insurance.Driver; import org.acme.insurance.Policy; import org.drools.compiler.Address; import org.drools.compiler.Attribute; import org.drools.compiler.Bar; import org.drools.compiler.Cat; import org.drools.compiler.Cell; import org.drools.compiler.Cheese; import org.drools.compiler.CheeseEqual; import org.drools.compiler.Cheesery; import org.drools.compiler.Cheesery.Maturity; import org.drools.compiler.Child; import org.drools.compiler.CommonTestMethodBase; import org.drools.compiler.DomainObjectHolder; import org.drools.compiler.FactA; import org.drools.compiler.FactB; import org.drools.compiler.FactC; import org.drools.compiler.FirstClass; import org.drools.compiler.Foo; import org.drools.compiler.FromTestClass; import org.drools.compiler.Guess; import org.drools.compiler.IndexedNumber; import org.drools.compiler.LongAddress; import org.drools.compiler.Message; import org.drools.compiler.MockPersistentSet; import org.drools.compiler.Move; import org.drools.compiler.ObjectWithSet; import org.drools.compiler.Order; import org.drools.compiler.OrderItem; import org.drools.compiler.OuterClass; import org.drools.compiler.Person; import org.drools.compiler.PersonFinal; import org.drools.compiler.PersonInterface; import org.drools.compiler.PersonWithEquals; import org.drools.compiler.Pet; import org.drools.compiler.PolymorphicFact; import org.drools.compiler.Primitives; import org.drools.compiler.RandomNumber; import org.drools.compiler.SecondClass; import org.drools.compiler.Sensor; import org.drools.compiler.SpecialString; import org.drools.compiler.State; import org.drools.compiler.StockTick; import org.drools.compiler.Target; import org.drools.compiler.TestParam; import org.drools.compiler.Triangle; import org.drools.compiler.Win; import org.drools.compiler.builder.impl.KnowledgeBuilderConfigurationImpl; import org.drools.compiler.builder.impl.KnowledgeBuilderImpl; import org.drools.compiler.compiler.DescrBuildError; import org.drools.compiler.compiler.DrlParser; import org.drools.compiler.compiler.DroolsError; import org.drools.compiler.compiler.ParserError; import org.drools.compiler.lang.DrlDumper; import org.drools.compiler.lang.descr.AttributeDescr; import org.drools.compiler.lang.descr.PackageDescr; import org.drools.compiler.lang.descr.RuleDescr; import org.drools.compiler.rule.builder.dialect.java.JavaDialectConfiguration; import org.drools.compiler.rule.builder.dialect.mvel.MVELDialectConfiguration; import org.drools.core.ClassObjectFilter; import org.drools.core.audit.WorkingMemoryConsoleLogger; import org.drools.core.base.RuleNameEndsWithAgendaFilter; import org.drools.core.base.RuleNameEqualsAgendaFilter; import org.drools.core.base.RuleNameMatchesAgendaFilter; import org.drools.core.base.RuleNameStartsWithAgendaFilter; import org.drools.core.common.DefaultFactHandle; import org.drools.core.common.InternalAgenda; import org.drools.core.common.InternalFactHandle; import org.drools.core.impl.EnvironmentFactory; import org.drools.core.impl.InternalKnowledgeBase; import org.drools.core.io.impl.InputStreamResource; import org.drools.core.marshalling.impl.ClassObjectMarshallingStrategyAcceptor; import org.drools.core.marshalling.impl.IdentityPlaceholderResolverStrategy; import org.drools.core.reteoo.EntryPointNode; import org.drools.core.reteoo.LeftTuple; import org.drools.core.reteoo.ObjectSink; import org.drools.core.reteoo.ObjectTypeNode; import org.drools.core.rule.MapBackedClassLoader; import org.junit.Assert; import org.junit.Test; import org.kie.api.KieBaseConfiguration; import org.kie.api.KieServices; import org.kie.api.builder.KieModule; import org.kie.api.builder.ReleaseId; import org.kie.api.command.Setter; import org.kie.api.conf.EqualityBehaviorOption; import org.kie.api.conf.RemoveIdentitiesOption; import org.kie.api.definition.rule.Rule; import org.kie.api.definition.type.FactType; import org.kie.api.event.rule.AfterMatchFiredEvent; import org.kie.api.event.rule.AgendaEventListener; import org.kie.api.event.rule.ObjectDeletedEvent; import org.kie.api.event.rule.RuleRuntimeEventListener; import org.kie.api.io.Resource; import org.kie.api.io.ResourceType; import org.kie.api.marshalling.ObjectMarshallingStrategy; import org.kie.api.runtime.Environment; import org.kie.api.runtime.EnvironmentName; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.EntryPoint; import org.kie.api.runtime.rule.FactHandle; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderConfiguration; import org.kie.internal.builder.KnowledgeBuilderError; import org.kie.internal.builder.KnowledgeBuilderErrors; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.builder.conf.LanguageLevelOption; import org.kie.internal.command.CommandFactory; import org.kie.internal.conf.SequentialOption; import org.kie.internal.conf.ShareAlphaNodesOption; import org.kie.internal.definition.KnowledgePackage; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import org.kie.internal.runtime.StatelessKnowledgeSession; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mvel2.MVEL; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.Serializable; import java.io.StringReader; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import static org.hamcrest.CoreMatchers.is; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; /** * Run all the tests with the ReteOO engine implementation */ public class MiscTest extends CommonTestMethodBase { private static Logger logger = LoggerFactory.getLogger( MiscTest.class ); @Test public void testImportFunctions() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ImportFunctions.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final Cheese cheese = new Cheese( "stilton", 15 ); session.insert( cheese ); List list = new ArrayList(); session.setGlobal( "list", list ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); int fired = session.fireAllRules(); list = (List) session.getGlobal( "list" ); assertEquals( 4, fired ); assertEquals( 4, list.size() ); assertEquals( "rule1", list.get( 0 ) ); assertEquals( "rule2", list.get( 1 ) ); assertEquals( "rule3", list.get( 2 ) ); assertEquals( "rule4", list.get( 3 ) ); } @Test public void testStaticFieldReference() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_StaticField.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); // will test serialisation of int and typesafe enums tests session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); List list = new ArrayList(); session.setGlobal( "list", list ); final Cheesery cheesery1 = new Cheesery(); cheesery1.setStatus( Cheesery.SELLING_CHEESE ); cheesery1.setMaturity( Maturity.OLD ); session.insert( cheesery1 ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); final Cheesery cheesery2 = new Cheesery(); cheesery2.setStatus( Cheesery.MAKING_CHEESE ); cheesery2.setMaturity( Maturity.YOUNG ); session.insert( cheesery2 ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( cheesery1, list.get( 0 ) ); assertEquals( cheesery2, list.get( 1 ) ); } @Test public void testMetaConsequence() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MetaConsequence.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List results = new ArrayList(); session.setGlobal( "results", results ); session.insert( new Person( "Michael" ) ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); results = (List) session.getGlobal( "results" ); session.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "bar", (results.get( 0 )) ); assertEquals( "bar2", (results.get( 1 )) ); } @Test public void testEnabledExpression() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_enabledExpression.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List results = new ArrayList(); session.setGlobal( "results", results ); session.insert( new Person( "Michael" ) ); results = (List) session.getGlobal( "results" ); session.fireAllRules(); assertEquals( 3, results.size() ); assertTrue( results.contains( "1" ) ); assertTrue( results.contains( "2" ) ); assertTrue( results.contains( "3" ) ); } @Test public void testGetStatefulKnowledgeSessions() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "empty.drl" ) ); StatefulKnowledgeSession ksession_1 = createKnowledgeSession( kbase ); String expected_1 = "expected_1"; String expected_2 = "expected_2"; FactHandle handle_1 = ksession_1.insert( expected_1 ); FactHandle handle_2 = ksession_1.insert( expected_2 ); ksession_1.fireAllRules(); Collection<StatefulKnowledgeSession> coll_1 = kbase.getStatefulKnowledgeSessions(); assertTrue( coll_1.size() == 1 ); StatefulKnowledgeSession ksession_2 = coll_1.iterator().next(); Object actual_1 = ksession_2.getObject( handle_1 ); Object actual_2 = ksession_2.getObject( handle_2 ); assertEquals( expected_1, actual_1 ); assertEquals( expected_2, actual_2 ); ksession_1.dispose(); Collection<StatefulKnowledgeSession> coll_2 = kbase.getStatefulKnowledgeSessions(); assertTrue( coll_2.size() == 0 ); // here to make sure it's safe to call dispose() twice ksession_1.dispose(); Collection<StatefulKnowledgeSession> coll_3 = kbase.getStatefulKnowledgeSessions(); assertTrue( coll_3.size() == 0 ); } @Test public void testGetFactHandle() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "empty.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); for ( int i = 0; i < 20; i++ ) { Object object = new Object(); ksession.insert( object ); FactHandle factHandle = ksession.getFactHandle( object ); assertNotNull( factHandle ); assertEquals( object, ksession.getObject( factHandle ) ); } ksession.dispose(); } @Test public void testPrimitiveArray() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_primitiveArray.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List result = new ArrayList(); session.setGlobal( "result", result ); final Primitives p1 = new Primitives(); p1.setPrimitiveIntArray( new int[]{1, 2, 3} ); p1.setArrayAttribute( new String[]{"a", "b"} ); session.insert( p1 ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); result = (List) session.getGlobal( "result" ); session.fireAllRules(); assertEquals( 3, result.size() ); assertEquals( 3, ((Integer) result.get( 0 )).intValue() ); assertEquals( 2, ((Integer) result.get( 1 )).intValue() ); assertEquals( 3, ((Integer) result.get( 2 )).intValue() ); } @Test public void testMVELSoundex() throws Exception { // read in the source KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "MVEL_soundex.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); Cheese c = new Cheese( "fubar", 2 ); ksession.insert( c ); ksession.fireAllRules(); assertEquals( 42, c.getPrice() ); } @Test public void testMVELSoundexNoCharParam() throws Exception { // read in the source KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "MVEL_soundexNPE2500.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); Cheese foobarCheese = new Cheese( "foobar", 2 ); Cheese nullCheese = new Cheese( null, 2 ); Cheese starCheese = new Cheese( "*", 2 ); ksession.insert( foobarCheese ); ksession.insert( nullCheese ); ksession.insert( starCheese ); ksession.fireAllRules(); assertEquals( 42, foobarCheese.getPrice() ); assertEquals( 2, nullCheese.getPrice() ); assertEquals( 2, starCheese.getPrice() ); } @Test public void testMVELRewrite() throws Exception { // read in the source KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MVELrewrite.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); List results = new ArrayList(); ksession.setGlobal( "results", results ); Cheese brie = new Cheese( "brie", 2 ); Cheese stilton = new Cheese( "stilton", 2 ); Cheesery cheesery = new Cheesery(); cheesery.addCheese( brie ); cheesery.addCheese( stilton ); ksession.insert( cheesery ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( cheesery, results.get( 0 ) ); } @Test public void testVariableDeclaration() throws Exception { String str = "rule KickOff\n" + "dialect \"mvel\"\n" + "when\n" + "then\n" + "int i;\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } } @Test public void testMissingImport() throws Exception { String str = ""; str += "package org.drools.compiler \n"; str += "import " + Person.class.getName() + "\n"; str += "global java.util.List list \n"; str += "rule rule1 \n"; str += "when \n"; str += " $i : Cheese() \n"; str += " MissingClass( fieldName == $i ) \n"; str += "then \n"; str += " list.add( $i ); \n"; str += "end \n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { logger.warn( kbuilder.getErrors().toString() ); } assertTrue( kbuilder.hasErrors() ); } @Test public void testInvalidModify1() throws Exception { String str = ""; str += "package org.drools.compiler \n"; str += "import " + Cheese.class.getName() + "\n"; str += "global java.util.List list \n"; str += "rule rule1 \n"; str += " no-loop \n"; str += "when \n"; str += " $i : Cheese() \n"; str += "then \n"; str += " modify( $i ); "; str += " list.add( $i ); \n"; str += "end \n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { logger.warn( kbuilder.getErrors().toString() ); } assertTrue( kbuilder.hasErrors() ); } @Test public void testInvalidModify2() throws Exception { String str = ""; str += "package org.drools.compiler \n"; str += "import " + Cheese.class.getName() + "\n"; str += "global java.util.List list \n"; str += "rule rule1 \n"; str += " no-loop \n"; str += "when \n"; str += " $i : Cheese() \n"; str += "then \n"; str += " modify( $i ) { setType( \"stilton\" ); setType( \"stilton\" );}; "; str += " list.add( $i ); \n"; str += "end \n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { logger.warn( kbuilder.getErrors().toString() ); } assertTrue( kbuilder.hasErrors() ); } @Test public void testIncrementOperator() throws Exception { String str = ""; str += "package org.drools.compiler \n"; str += "global java.util.List list \n"; str += "rule rule1 \n"; str += " dialect \"java\" \n"; str += "when \n"; str += " $I : Integer() \n"; str += "then \n"; str += " int i = $I.intValue(); \n"; str += " i += 5; \n"; str += " list.add( i ); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( 5 ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( 10, list.get( 0 ) ); } @Test public void testKnowledgeRuntimeAccess() throws Exception { String str = ""; str += "package org.drools.compiler.test\n"; str += "import " + Message.class.getName() + "\n"; str += "rule \"Hello World\"\n"; str += "when\n"; str += " Message( )\n"; str += "then\n"; str += " System.out.println( drools.getKieRuntime() );\n"; str += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Message( "help" ) ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testEvalWithBigDecimal() throws Exception { String str = ""; str += "package org.drools.compiler \n"; str += "import java.math.BigDecimal; \n"; str += "global java.util.List list \n"; str += "rule rule1 \n"; str += " dialect \"java\" \n"; str += "when \n"; str += " $bd : BigDecimal() \n"; str += " eval( $bd.compareTo( BigDecimal.ZERO ) > 0 ) \n"; str += "then \n"; str += " list.add( $bd ); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( new BigDecimal( 1.5 ) ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( new BigDecimal( 1.5 ), list.get( 0 ) ); } @Test public void testFieldBiningsAndEvalSharing() throws Exception { final String drl = "test_FieldBindingsAndEvalSharing.drl"; evalSharingTest( drl ); } @Test public void testFieldBiningsAndPredicateSharing() throws Exception { final String drl = "test_FieldBindingsAndPredicateSharing.drl"; evalSharingTest( drl ); } private void evalSharingTest(final String drl) throws Exception { KnowledgeBase kbase = loadKnowledgeBase( drl ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); final TestParam tp1 = new TestParam(); tp1.setValue2( "boo" ); ksession.insert( tp1 ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( 1, ((List) ksession.getGlobal( "list" )).size() ); } @Test public void testGeneratedBeans1() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_GeneratedBeans.drl"); // Retrieve the generated fact type FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans", "Cheese" ); // Create a new Fact instance Object cheese = cheeseFact.newInstance(); // Set a field value using the more verbose method chain... // should we add short cuts? // cheeseFact.getField( "type" ).set( cheese, // "stilton" ); cheeseFact.set( cheese, "type", "stilton" ); assertEquals( "stilton", cheeseFact.get( cheese, "type" ) ); FactType personType = kbase.getFactType( "org.drools.generatedbeans", "Person" ); Object ps = personType.newInstance(); personType.set( ps, "age", 42 ); Map<String, Object> personMap = personType.getAsMap( ps ); assertEquals( 42, personMap.get( "age" ) ); personMap.put( "age", 43 ); personType.setFromMap( ps, personMap ); assertEquals( 43, personType.get( ps, "age" ) ); // just documenting toString() result: // assertEquals( "Cheese( type=stilton )", // cheese.toString() ); // reading the field attribute, using the method chain assertEquals( "stilton", cheeseFact.getField( "type" ).get( cheese ) ); // creating a stateful session StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Object cg = cheeseFact.newInstance(); ksession.setGlobal( "cg", cg ); List<Object> result = new ArrayList<Object>(); ksession.setGlobal( "list", result ); // inserting fact ksession.insert( cheese ); // firing rules ksession.fireAllRules(); // checking results assertEquals( 1, result.size() ); assertEquals( new Integer( 5 ), result.get( 0 ) ); // creating a person that likes the cheese: // Retrieve the generated fact type FactType personFact = kbase.getFactType( "org.drools.generatedbeans", "Person" ); // Create a new Fact instance Object person = personFact.newInstance(); // Set a field value using the more verbose method chain... // should we add short cuts? personFact.getField( "likes" ).set( person, cheese ); // demonstrating primitive type support personFact.getField( "age" ).set( person, 7 ); // just documenting toString() result: // assertEquals( "Person( age=7, likes=Cheese( type=stilton ) )", // person.toString() ); // inserting fact ksession.insert( person ); // firing rules ksession.fireAllRules(); // checking results assertEquals( 2, result.size() ); assertEquals( person, result.get( 1 ) ); } @Test public void testGeneratedBeansMVEL() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_GeneratedBeansMVEL.drl"); // Retrieve the generated fact type FactType pf = kbase.getFactType( "mortgages", "Applicant" ); FactType af = kbase.getFactType( "mortgages", "LoanApplication" ); Object person = pf.newInstance(); pf.set( person, "creditRating", "OK" ); Object application = af.newInstance(); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( person ); ksession.insert( application ); ksession.fireAllRules(); } @Test public void testGeneratedBeans2() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_GeneratedBeans2.drl"); // Retrieve the generated fact type FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans", "Cheese" ); // Create a new Fact instance Object cheese = cheeseFact.newInstance(); cheeseFact.set( cheese, "type", "stilton" ); assertEquals( "stilton", cheeseFact.get( cheese, "type" ) ); // testing equals method Object cheese2 = cheeseFact.newInstance(); cheeseFact.set( cheese2, "type", "stilton" ); assertEquals( cheese, cheese2 ); FactType personType = kbase.getFactType( "org.drools.generatedbeans", "Person" ); Object ps = personType.newInstance(); personType.set( ps, "name", "mark" ); personType.set( ps, "last", "proctor" ); personType.set( ps, "age", 42 ); Object ps2 = personType.newInstance(); personType.set( ps2, "name", "mark" ); personType.set( ps2, "last", "proctor" ); personType.set( ps2, "age", 30 ); assertEquals( ps, ps2 ); personType.set( ps2, "last", "little" ); assertFalse( ps.equals( ps2 ) ); // creating a stateful session StatefulKnowledgeSession wm = createKnowledgeSession( kbase ); Object cg = cheeseFact.newInstance(); wm.setGlobal( "cg", cg ); List result = new ArrayList(); wm.setGlobal( "list", result ); // inserting fact wm.insert( cheese ); // firing rules wm.fireAllRules(); // checking results assertEquals( 1, result.size() ); assertEquals( new Integer( 5 ), result.get( 0 ) ); // creating a person that likes the cheese: // Retrieve the generated fact type FactType personFact = kbase.getFactType( "org.drools.generatedbeans", "Person" ); // Create a new Fact instance Object person = personFact.newInstance(); // Set a field value using the more verbose method chain... // should we add short cuts? personFact.getField( "likes" ).set( person, cheese ); // demonstrating primitive type support personFact.getField( "age" ).set( person, 7 ); // just documenting toString() result: // assertEquals( "Person( age=7, likes=Cheese( type=stilton ) )", // person.toString() ); // inserting fact wm.insert( person ); // firing rules wm.fireAllRules(); // checking results assertEquals( 2, result.size() ); assertEquals( person, result.get( 1 ) ); } @Test public void testDeclaredFactAndFunction() throws Exception { String rule = "package com.jboss.qa;\n"; rule += "global java.util.List list\n"; rule += "declare Address\n"; rule += " street: String\n"; rule += "end\n"; rule += "function void myFunction() {\n"; rule += "}\n"; rule += "rule \"r1\"\n"; rule += " dialect \"mvel\"\n"; rule += "when\n"; rule += " Address()\n"; rule += "then\n"; rule += " list.add(\"r1\");\n"; rule += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); FactType addressFact = kbase.getFactType( "com.jboss.qa", "Address" ); Object address = addressFact.newInstance(); session.insert( address ); session.fireAllRules(); list = (List) session.getGlobal( "list" ); assertEquals( 1, list.size() ); assertEquals( "r1", list.get( 0 ) ); } @Test public void testTypeDeclarationOnSeparateResource() throws Exception { String file1 = "package a.b.c\n" + "declare SomePerson\n" + " weight : double\n" + " height : double\n" + "end\n"; String file2 = "package a.b.c\n" + "import org.drools.compiler.*\n" + "declare Holder\n" + " person : Person\n" + "end\n" + "rule \"create holder\"\n" + " when\n" + " person : Person( )\n" + " not (\n" + " Holder( person; )\n" + " )\n" + " then\n" + " insert(new Holder(person));\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( file1, file2 ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); assertEquals( 0, ksession.fireAllRules() ); ksession.insert( new Person( "Bob" ) ); assertEquals( 1, ksession.fireAllRules() ); assertEquals( 0, ksession.fireAllRules() ); } @Test public void testUppercaseField() throws Exception { String rule = "package org.drools.compiler.test;\n"; rule += "global java.util.List list\n"; rule += "declare Address\n"; rule += " Street: String\n"; rule += "end\n"; rule += "rule \"r1\"\n"; rule += "when\n"; rule += " Address($street: Street)\n"; rule += "then\n"; rule += " list.add($street);\n"; rule += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.setGlobal( "list", new ArrayList<String>() ); FactType addressType = kbase.getFactType( "org.drools.compiler.test", "Address" ); Object address = addressType.newInstance(); addressType.set( address, "Street", "5th Avenue" ); ksession.insert( address ); ksession.fireAllRules(); List list = (List) ksession.getGlobal( "list" ); assertEquals( 1, list.size() ); assertEquals( "5th Avenue", list.get( 0 ) ); ksession.dispose(); } @Test public void testUppercaseField2() throws Exception { String rule = "package org.drools.compiler\n" + "declare SomeFact\n" + " Field : String\n" + " aField : String\n" + "end\n" + "rule X\n" + "when\n" + " SomeFact( Field == \"foo\", aField == \"bar\" )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); FactType factType = kbase.getFactType( "org.drools.compiler", "SomeFact" ); Object fact = factType.newInstance(); factType.set( fact, "Field", "foo" ); factType.set( fact, "aField", "bar" ); ksession.insert( fact ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); ksession.dispose(); } @Test public void testNullHandling() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_NullHandling.drl" ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final Cheese nullCheese = new Cheese( null, 2 ); session.insert( nullCheese ); final Person notNullPerson = new Person( "shoes butt back" ); notNullPerson.setBigDecimal( new BigDecimal( "42.42" ) ); session.insert( notNullPerson ); Person nullPerson = new Person( "whee" ); nullPerson.setBigDecimal( null ); session.insert( nullPerson ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); //System.out.println(((List) session.getGlobal("list")).get(0)); assertEquals( 3, ((List) session.getGlobal( "list" )).size() ); nullPerson = new Person( null ); session.insert( nullPerson ); session.fireAllRules(); assertEquals( 4, ((List) session.getGlobal( "list" )).size() ); } @Test public void testNullFieldOnCompositeSink() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_NullFieldOnCompositeSink.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( new Attribute() ); ksession.insert( new Message() ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( 1, ((List) ksession.getGlobal( "list" )).size() ); assertEquals( "X", ((List) ksession.getGlobal( "list" )).get( 0 ) ); } @Test public void testEmptyPattern() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_EmptyPattern.drl" ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 5 ); session.insert( stilton ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 5, ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testExplicitAnd() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_ExplicitAnd.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( new Message( "hola" ) ); ksession.fireAllRules(); assertEquals( 0, list.size() ); ksession.insert( new Cheese( "brie", 33 ) ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( 1, ((List) ksession.getGlobal( "list" )).size() ); } @Test public void testHelloWorld() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("HelloWorld.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); // go ! final Message message = new Message( "hola" ); message.addToList( "hello" ); message.setNumber( 42 ); ksession.insert( message ); ksession.insert( "boo" ); // ksession = SerializationHelper.serializeObject(ksession); ksession.fireAllRules(); assertTrue( message.isFired() ); assertEquals( message, ((List) ksession.getGlobal( "list" )).get( 0 ) ); } @Test public void testExtends() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "extend_rule_test.drl" ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); //Test 2 levels of inheritance, and basic rule List list = new ArrayList(); session.setGlobal( "list", list ); final Cheese mycheese = new Cheese( "cheddar", 4 ); FactHandle handle = session.insert( mycheese ); session.fireAllRules(); assertEquals( 2, list.size() ); assertTrue( list.contains( "rule 4" ) ); assertTrue( list.contains( "rule 2b" ) ); //Test 2nd level (parent) to make sure rule honors the extend rule list = new ArrayList(); session.setGlobal( "list", list ); session.delete( handle ); final Cheese mycheese2 = new Cheese( "notcheddar", 4 ); FactHandle handle2 = session.insert( mycheese2 ); session.fireAllRules(); assertEquals( "rule 4", list.get( 0 ) ); assertEquals( 1, list.size() ); //Test 3 levels of inheritance, all levels list = new ArrayList(); session.setGlobal( "list", list ); session.delete( handle2 ); final Cheese mycheese3 = new Cheese( "stilton", 6 ); FactHandle handle3 = session.insert( mycheese3 ); session.fireAllRules(); //System.out.println(list.toString()); assertEquals( "rule 3", list.get( 0 ) ); assertEquals( 1, list.size() ); //Test 3 levels of inheritance, third only list = new ArrayList(); session.setGlobal( "list", list ); session.delete( handle3 ); final Cheese mycheese4 = new Cheese( "notstilton", 6 ); FactHandle handle4 = session.insert( mycheese4 ); session.fireAllRules(); //System.out.println(((List) session.getGlobal( "list" )).toString()); assertTrue( ((List) session.getGlobal( "list" )).size() == 0 ); //Test 3 levels of inheritance, 2nd only list = new ArrayList(); session.setGlobal( "list", list ); session.delete( handle4 ); final Cheese mycheese5 = new Cheese( "stilton", 7 ); FactHandle handle5 = session.insert( mycheese5 ); session.fireAllRules(); //System.out.println(((List) session.getGlobal( "list" )).toString()); assertEquals( 0, list.size() ); } @Test public void testExtends2() { KnowledgeBase kbase = loadKnowledgeBase( "test_RuleExtend.drl" ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final Cheese stilton = new Cheese( "stilton", 5 ); final Cheese cheddar = new Cheese( "cheddar", 7 ); final Cheese brie = new Cheese( "brie", 5 ); ksession.insert( stilton ); ksession.insert( cheddar ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "stilton", results.get( 0 ) ); assertEquals( "brie", results.get( 1 ) ); } @Test public void testLatinLocale() throws Exception { Locale defaultLoc = Locale.getDefault(); try { // setting a locale that uses COMMA as decimal separator Locale.setDefault( new Locale( "pt", "BR" ) ); KnowledgeBase kbase = loadKnowledgeBase("test_LatinLocale.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List<String> results = new ArrayList<String>(); ksession.setGlobal( "results", results ); final Cheese mycheese = new Cheese( "cheddar", 4 ); FactHandle handle = ksession.insert( mycheese ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( "1", results.get( 0 ) ); mycheese.setPrice( 8 ); mycheese.setDoublePrice( 8.50 ); ksession.update( handle, mycheese ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "3", results.get( 1 ) ); } finally { Locale.setDefault( defaultLoc ); } } @Test public void testLiteral() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "literal_rule_test.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 5 ); session.insert( stilton ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( "stilton", ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testLiteralWithEscapes() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_literal_with_escapes.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); String expected = "s\tti\"lto\nn"; final Cheese stilton = new Cheese( expected, 5 ); session.insert( stilton ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); int fired = session.fireAllRules(); assertEquals( 1, fired ); assertEquals( expected, ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testLiteralWithBoolean() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "literal_with_boolean.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final PersonInterface bill = new Person( "bill", null, 12 ); bill.setAlive( true ); session.insert( bill ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( bill, ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testFactBindings() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_FactBindings.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); RuleRuntimeEventListener wmel = mock( RuleRuntimeEventListener.class ); ksession.addEventListener( wmel ); final Person bigCheese = new Person( "big cheese" ); final Cheese cheddar = new Cheese( "cheddar", 15 ); bigCheese.setCheese( cheddar ); final FactHandle bigCheeseHandle = ksession.insert( bigCheese ); final FactHandle cheddarHandle = ksession.insert( cheddar ); ksession.fireAllRules(); ArgumentCaptor<org.kie.api.event.rule.ObjectUpdatedEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.ObjectUpdatedEvent.class ); verify( wmel, times( 2 ) ).objectUpdated( arg.capture() ); org.kie.api.event.rule.ObjectUpdatedEvent event = arg.getAllValues().get( 0 ); assertSame( cheddarHandle, event.getFactHandle() ); assertSame( cheddar, event.getOldObject() ); assertSame( cheddar, event.getObject() ); event = arg.getAllValues().get( 1 ); assertSame( bigCheeseHandle, event.getFactHandle() ); assertSame( bigCheese, event.getOldObject() ); assertSame( bigCheese, event.getObject() ); } @Test public void testPropertyChangeSupportNewAPI() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_PropertyChangeTypeDecl.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final State state = new State( "initial" ); session.insert( state ); session.fireAllRules(); assertEquals( 1, ((List) session.getGlobal( "list" )).size() ); state.setFlag( true ); assertEquals( 1, ((List) session.getGlobal( "list" )).size() ); session.fireAllRules(); assertEquals( 2, ((List) session.getGlobal( "list" )).size() ); state.setState( "finished" ); session.dispose(); // checks that the session removed itself from the bean listeners list assertEquals( 0, state.getPropertyChangeListeners().length ); } @Test public void testDisconnectedFactHandle() { KnowledgeBase kbase = getKnowledgeBase(); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); DefaultFactHandle helloHandle = (DefaultFactHandle) ksession.insert( "hello" ); DefaultFactHandle goodbyeHandle = (DefaultFactHandle) ksession.insert( "goodbye" ); FactHandle key = DefaultFactHandle.createFromExternalFormat( helloHandle.toExternalForm() ); assertEquals( "hello", ksession.getObject( key ) ); key = DefaultFactHandle.createFromExternalFormat( goodbyeHandle.toExternalForm() ); assertEquals( "goodbye", ksession.getObject( key ) ); } @Test public void testBigDecimal() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "big_decimal_and_comparable.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final PersonInterface bill = new Person( "bill", null, 42 ); bill.setBigDecimal( new BigDecimal( "42" ) ); final PersonInterface ben = new Person( "ben", null, 43 ); ben.setBigDecimal( new BigDecimal( "43" ) ); session.insert( bill ); session.insert( new Cheese( "gorgonzola", 43 ) ); session.insert( ben ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 1, ((List) session.getGlobal( "list" )).size() ); } @Test public void testBigDecimalIntegerLiteral() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "big_decimal_and_literal.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final PersonInterface bill = new Person( "bill", null, 12 ); bill.setBigDecimal( new BigDecimal( "42" ) ); bill.setBigInteger( new BigInteger( "42" ) ); session.insert( bill ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 6, ((List) session.getGlobal( "list" )).size() ); } @Test public void testBigDecimalWithFromAndEval() throws Exception { String rule = "package org.drools.compiler.test;\n"; rule += "rule \"Test Rule\"\n"; rule += "when\n"; rule += " $dec : java.math.BigDecimal() from java.math.BigDecimal.TEN;\n"; rule += " eval( $dec.compareTo(java.math.BigDecimal.ONE) > 0 )\n"; rule += "then\n"; rule += " System.out.println(\"OK!\");\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); session.fireAllRules(); } @Test() public void testImport() throws Exception { // Same package as this test String rule = ""; rule += "package org.drools.compiler.integrationtests;\n"; rule += "import java.lang.Math;\n"; rule += "rule \"Test Rule\"\n"; rule += " dialect \"mvel\"\n"; rule += " when\n"; rule += " then\n"; // Can't handle the TestFact.TEST rule += " new TestFact(TestFact.TEST);\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.fireAllRules(); } @Test public void testMVELConsequenceWithMapsAndArrays() throws Exception { String rule = "package org.drools.compiler.test;\n"; rule += "import java.util.ArrayList\n"; rule += "import java.util.HashMap\n"; rule += "global java.util.List list\n"; rule += "rule \"Test Rule\"\n"; rule += " dialect \"mvel\""; rule += "when\n"; rule += "then\n"; rule += " m = new HashMap();\n"; rule += " l = new ArrayList();\n"; rule += " l.add(\"first\");\n"; rule += " m.put(\"content\", l);\n"; rule += " System.out.println(((ArrayList)m[\"content\"])[0]);\n"; rule += " list.add(((ArrayList)m[\"content\"])[0]);\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 1, ((List) session.getGlobal( "list" )).size() ); assertEquals( "first", ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testCell() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "evalmodify.drl" ) ); Environment env = EnvironmentFactory.newEnvironment(); env.set( EnvironmentName.OBJECT_MARSHALLING_STRATEGIES, new ObjectMarshallingStrategy[]{ new IdentityPlaceholderResolverStrategy( ClassObjectMarshallingStrategyAcceptor.DEFAULT )} ); StatefulKnowledgeSession session = createKnowledgeSession( kbase, null, env ); final Cell cell1 = new Cell( 9 ); final Cell cell = new Cell( 0 ); session.insert( cell1 ); FactHandle cellHandle = session.insert( cell ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 9, cell.getValue() ); } @Test public void testNesting() throws Exception { Person p = new Person(); p.setName( "Michael" ); Address add1 = new Address(); add1.setStreet( "High" ); Address add2 = new Address(); add2.setStreet( "Low" ); List l = new ArrayList(); l.add( add1 ); l.add( add2 ); p.setAddresses( l ); DrlParser parser = new DrlParser( LanguageLevelOption.DRL5 ); PackageDescr desc = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "nested_fields.drl" ) ) ); List packageAttrs = desc.getAttributes(); assertEquals( 1, desc.getRules().size() ); assertEquals( 1, packageAttrs.size() ); RuleDescr rule = (RuleDescr) desc.getRules().get( 0 ); Map<String, AttributeDescr> ruleAttrs = rule.getAttributes(); assertEquals( 1, ruleAttrs.size() ); assertEquals( "mvel", ((AttributeDescr) ruleAttrs.get( "dialect" )).getValue() ); assertEquals( "dialect", ((AttributeDescr) ruleAttrs.get( "dialect" )).getName() ); KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( desc ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); session.insert( p ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); } @Test public void testOr() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "or_test.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "list", list ); final Cheese cheddar = new Cheese( "cheddar", 5 ); final FactHandle h = session.insert( cheddar ); session.fireAllRules(); // just one added assertEquals( "got cheese", list.get( 0 ) ); assertEquals( 1, list.size() ); session.delete( h ); session.fireAllRules(); // still just one assertEquals( 1, list.size() ); session.insert( new Cheese( "stilton", 5 ) ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); // now have one more assertEquals( 2, ((List) session.getGlobal( "list" )).size() ); } @Test public void testEval() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "eval_rule_test.drl" ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.setGlobal( "five", new Integer( 5 ) ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 5 ); ksession.insert( stilton ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( stilton, ((List) ksession.getGlobal( "list" )).get( 0 ) ); } @Test public void testJaninoEval() throws Exception { KnowledgeBuilderConfiguration kbconf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(); kbconf.setProperty( JavaDialectConfiguration.JAVA_COMPILER_PROPERTY, "JANINO" ); KnowledgeBase kbase = loadKnowledgeBase( kbconf, "eval_rule_test.drl" ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.setGlobal( "five", new Integer( 5 ) ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 5 ); ksession.insert( stilton ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( stilton, ((List) ksession.getGlobal( "list" )).get( 0 ) ); } @Test public void testEvalMore() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "eval_rule_test_more.drl" ); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); session.setGlobal( "list", list ); final Person foo = new Person( "foo" ); session.insert( foo ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( foo, ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testReturnValue() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "returnvalue_rule_test.drl" ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.setGlobal( "two", new Integer( 2 ) ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final PersonInterface peter = new Person( "peter", null, 12 ); ksession.insert( peter ); final PersonInterface jane = new Person( "jane", null, 10 ); ksession.insert( jane ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( jane, ((List) ksession.getGlobal( "list" )).get( 0 ) ); assertEquals( peter, ((List) ksession.getGlobal( "list" )).get( 1 ) ); } @Test public void testPredicate() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "predicate_rule_test.drl" ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.setGlobal( "two", new Integer( 2 ) ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final PersonInterface peter = new Person( "peter", null, 12 ); ksession.insert( peter ); final PersonInterface jane = new Person( "jane", null, 10 ); ksession.insert( jane ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); assertEquals( jane, ((List) ksession.getGlobal( "list" )).get( 0 ) ); assertEquals( peter, ((List) ksession.getGlobal( "list" )).get( 1 ) ); } @Test public void testNullBehaviour() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "null_behaviour.drl" ); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); final PersonInterface p1 = new Person( "michael", "food", 40 ); final PersonInterface p2 = new Person( null, "drink", 30 ); session.insert( p1 ); session.insert( p2 ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); } @Test public void testNullConstraint() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "null_constraint.drl" ); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); final List foo = new ArrayList(); session.setGlobal( "messages", foo ); final PersonInterface p1 = new Person( null, "food", 40 ); final Primitives p2 = new Primitives(); p2.setArrayAttribute( null ); session.insert( p1 ); session.insert( p2 ); session = SerializationHelper.getSerialisedStatefulKnowledgeSession( session, true ); session.fireAllRules(); assertEquals( 2, ((List) session.getGlobal( "messages" )).size() ); } @Test public void testBasicFrom() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_From.drl" ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list1 = new ArrayList(); ksession.setGlobal( "list1", list1 ); final List list2 = new ArrayList(); ksession.setGlobal( "list2", list2 ); final List list3 = new ArrayList(); ksession.setGlobal( "list3", list3 ); final Cheesery cheesery = new Cheesery(); final Cheese stilton = new Cheese( "stilton", 12 ); final Cheese cheddar = new Cheese( "cheddar", 15 ); cheesery.addCheese( stilton ); cheesery.addCheese( cheddar ); ksession.setGlobal( "cheesery", cheesery ); ksession.insert( cheesery ); Person p = new Person( "stilton" ); ksession.insert( p ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); // from using a global assertEquals( 2, ((List) ksession.getGlobal( "list1" )).size() ); assertEquals( cheddar, ((List) ksession.getGlobal( "list1" )).get( 0 ) ); assertEquals( stilton, ((List) ksession.getGlobal( "list1" )).get( 1 ) ); // from using a declaration assertEquals( 2, ((List) ksession.getGlobal( "list2" )).size() ); assertEquals( cheddar, ((List) ksession.getGlobal( "list2" )).get( 0 ) ); assertEquals( stilton, ((List) ksession.getGlobal( "list2" )).get( 1 ) ); // from using a declaration assertEquals( 1, ((List) ksession.getGlobal( "list3" )).size() ); assertEquals( stilton, ((List) ksession.getGlobal( "list3" )).get( 0 ) ); } @Test public void testFromWithParams() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_FromWithParams.drl" ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); final Object globalObject = new Object(); ksession.setGlobal( "list", list ); ksession.setGlobal( "testObject", new FromTestClass() ); ksession.setGlobal( "globalObject", globalObject ); final Person bob = new Person( "bob" ); ksession.insert( bob ); // TODO java.io.NotSerializableException: org.mvel.util.FastList // ksession = SerializationHelper.serializeObject(ksession); ksession.fireAllRules(); assertEquals( 6, ((List) ksession.getGlobal( "list" )).size() ); final List array = (List) ((List) ksession.getGlobal( "list" )).get( 0 ); assertEquals( 3, array.size() ); final Person p = (Person) array.get( 0 ); assertEquals( p, bob ); assertEquals( new Integer( 42 ), array.get( 1 ) ); final List nested = (List) array.get( 2 ); assertEquals( "x", nested.get( 0 ) ); assertEquals( "y", nested.get( 1 ) ); final Map map = (Map) ((List) ksession.getGlobal( "list" )).get( 1 ); assertEquals( 2, map.keySet().size() ); assertTrue( map.keySet().contains( bob ) ); assertEquals( globalObject, map.get( bob ) ); assertTrue( map.keySet().contains( "key1" ) ); final Map nestedMap = (Map) map.get( "key1" ); assertEquals( 1, nestedMap.keySet().size() ); assertTrue( nestedMap.keySet().contains( "key2" ) ); assertEquals( "value2", nestedMap.get( "key2" ) ); assertEquals( new Integer( 42 ), ((List) ksession.getGlobal( "list" )).get( 2 ) ); assertEquals( "literal", ((List) ksession.getGlobal( "list" )).get( 3 ) ); assertEquals( bob, ((List) ksession.getGlobal( "list" )).get( 4 ) ); assertEquals( globalObject, ((List) ksession.getGlobal( "list" )).get( 5 ) ); } @Test public void testFromWithNewConstructor() throws Exception { DrlParser parser = new DrlParser( LanguageLevelOption.DRL5 ); PackageDescr descr = parser.parse( new InputStreamReader( getClass().getResourceAsStream( "test_FromWithNewConstructor.drl" ) ) ); Collection<KnowledgePackage> pkgs = loadKnowledgePackages( descr ); pkgs = SerializationHelper.serializeObject( pkgs ); } /** * JBRULES-1415 Certain uses of from causes NullPointerException in WorkingMemoryLogger */ @Test public void testFromDeclarationWithWorkingMemoryLogger() throws Exception { String rule = "package org.drools.compiler.test;\n"; rule += "import org.drools.compiler.Cheesery\n"; rule += "import org.drools.compiler.Cheese\n"; rule += "global java.util.List list\n"; rule += "rule \"Test Rule\"\n"; rule += "when\n"; rule += " $cheesery : Cheesery()\n"; rule += " Cheese( $type : type) from $cheesery.cheeses\n"; rule += "then\n"; rule += " list.add( $type );\n"; rule += "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession session = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); session.setGlobal( "list", list ); Cheesery cheesery = new Cheesery(); cheesery.addCheese( new Cheese( "stilton", 22 ) ); session.insert( cheesery ); // TODO java.io.EOFException // session = SerializationHelper.serializeObject(session); session.fireAllRules(); assertEquals( 1, ((List) session.getGlobal( "list" )).size() ); assertEquals( "stilton", ((List) session.getGlobal( "list" )).get( 0 ) ); } @Test public void testWithInvalidRule() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "invalid_rule.drl", getClass() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); final String pretty = kbuilder.getErrors().toString(); assertFalse( pretty.equals( "" ) ); } @Test public void testWithInvalidRule2() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "invalid_rule2.drl", getClass() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testErrorLineNumbers() throws Exception { // this test aims to test semantic errors // parser errors are another test case KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "errors_in_rule.drl", getClass() ), ResourceType.DRL ); KnowledgeBuilderError[] errors = kbuilder.getErrors().toArray( new KnowledgeBuilderError[0] ); assertEquals( 3, errors.length ); final DescrBuildError stiltonError = (DescrBuildError) errors[0]; assertTrue( stiltonError.getMessage().contains( "Stilton" ) ); assertNotNull( stiltonError.getDescr() ); assertTrue( stiltonError.getLine() != -1 ); // check that its getting it from the ruleDescr assertEquals( stiltonError.getLine(), stiltonError.getDescr().getLine() ); // check the absolute error line number (there are more). assertEquals( 26, stiltonError.getLine() ); final DescrBuildError poisonError = (DescrBuildError) errors[1]; assertTrue( poisonError.getMessage().contains( "Poison" ) ); assertEquals( 28, poisonError.getLine() ); KnowledgeBuilderConfigurationImpl cfg = new KnowledgeBuilderConfigurationImpl(); JavaDialectConfiguration javaConf = (JavaDialectConfiguration) cfg.getDialectConfiguration( "java" ); switch ( javaConf.getCompiler() ) { case JavaDialectConfiguration.NATIVE : assertTrue( errors[2].getMessage().contains( "illegal" ) ); break; case JavaDialectConfiguration.ECLIPSE: assertTrue( errors[2].getMessage().contains( "add" ) ); break; case JavaDialectConfiguration.JANINO: assertTrue( errors[2].getMessage().contains( "Unexpected" ) ); break; default: fail( "Unknown compiler used" ); } // now check the RHS, not being too specific yet, as long as it has the // rules line number, not zero final DescrBuildError rhsError = (DescrBuildError) errors[2]; assertTrue(rhsError.getLine() >= 23 && rhsError.getLine() <= 32); // TODO this should be 16 } @Test public void testErrorsParser() throws Exception { final DrlParser parser = new DrlParser( LanguageLevelOption.DRL5 ); assertEquals( 0, parser.getErrors().size() ); parser.parse( new InputStreamReader( getClass().getResourceAsStream( "errors_parser_multiple.drl" ) ) ); assertTrue( parser.hasErrors() ); assertTrue( parser.getErrors().size() > 0 ); assertTrue( parser.getErrors().get( 0 ) instanceof ParserError); final ParserError first = ((ParserError) parser.getErrors().get( 0 )); assertTrue( first.getMessage() != null ); assertFalse( first.getMessage().equals( "" ) ); } @Test public void testAssertRetract() throws Exception { // postponed while I sort out KnowledgeHelperFixer KnowledgeBase kbase = loadKnowledgeBase( "assert_retract.drl" ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final PersonInterface person = new Person( "michael", "cheese" ); person.setStatus( "start" ); ksession.insert( person ); ksession.fireAllRules(); List<String> results = (List<String>) ksession.getGlobal( "list" ); for ( String result : results ) { logger.info( result ); } assertEquals( 5, results.size() ); assertTrue( results.contains( "first" ) ); assertTrue( results.contains( "second" ) ); assertTrue( results.contains( "third" ) ); assertTrue( results.contains( "fourth" ) ); assertTrue( results.contains( "fifth" ) ); } @Test public void testPredicateAsFirstPattern() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "predicate_as_first_pattern.drl" ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final Cheese mussarela = new Cheese( "Mussarela", 35 ); ksession.insert( mussarela ); final Cheese provolone = new Cheese( "Provolone", 20 ); ksession.insert( provolone ); ksession.fireAllRules(); assertEquals( "The rule is being incorrectly fired", 35, mussarela.getPrice() ); assertEquals( "Rule is incorrectly being fired", 20, provolone.getPrice() ); } @Test public void testConsequenceException() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_ConsequenceException.drl" ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final Cheese brie = new Cheese( "brie", 12 ); ksession.insert( brie ); try { ksession.fireAllRules(); fail( "Should throw an Exception from the Consequence" ); } catch ( final org.kie.api.runtime.rule.ConsequenceException e ) { assertEquals( "Throw Consequence Exception", e.getMatch().getRule().getName() ); assertEquals( "this should throw an exception", e.getCause().getMessage() ); } } @Test public void testEvalException() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EvalException.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final Cheese brie = new Cheese( "brie", 12 ); try { ksession.insert( brie ); ksession.fireAllRules(); fail( "Should throw an Exception from the Eval" ); } catch ( final Exception e ) { assertEquals( "this should throw an exception", e.getCause().getMessage() ); } } @Test public void testPredicateException() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_PredicateException.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final Cheese brie = new Cheese( "brie", 12 ); try { ksession.insert( brie ); ksession.fireAllRules(); fail( "Should throw an Exception from the Predicate" ); } catch ( final Exception e ) { Throwable cause = e.getCause(); if ( cause instanceof InvocationTargetException ) { cause = ((InvocationTargetException) cause).getTargetException(); } assertTrue( cause.getMessage().contains( "this should throw an exception" ) ); } } @Test public void testReturnValueException() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ReturnValueException.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final Cheese brie = new Cheese( "brie", 12 ); try { ksession.insert( brie ); ksession.fireAllRules(); fail( "Should throw an Exception from the ReturnValue" ); } catch ( final Exception e ) { Throwable root = e; while ( root.getCause() != null ) root = root.getCause(); root.getMessage().contains( "this should throw an exception" ); } } @Test public void testMultiRestrictionFieldConstraint() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MultiRestrictionFieldConstraint.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list1 = new ArrayList(); ksession.setGlobal( "list1", list1 ); final List list2 = new ArrayList(); ksession.setGlobal( "list2", list2 ); final List list3 = new ArrayList(); ksession.setGlobal( "list3", list3 ); final List list4 = new ArrayList(); ksession.setGlobal( "list4", list4 ); final Person youngChili1 = new Person( "young chili1" ); youngChili1.setAge( 12 ); youngChili1.setHair( "blue" ); final Person youngChili2 = new Person( "young chili2" ); youngChili2.setAge( 25 ); youngChili2.setHair( "purple" ); final Person chili1 = new Person( "chili1" ); chili1.setAge( 35 ); chili1.setHair( "red" ); final Person chili2 = new Person( "chili2" ); chili2.setAge( 38 ); chili2.setHair( "indigigo" ); final Person oldChili1 = new Person( "old chili1" ); oldChili1.setAge( 45 ); oldChili1.setHair( "green" ); final Person oldChili2 = new Person( "old chili2" ); oldChili2.setAge( 48 ); oldChili2.setHair( "blue" ); ksession.insert( youngChili1 ); ksession.insert( youngChili2 ); ksession.insert( chili1 ); ksession.insert( chili2 ); ksession.insert( oldChili1 ); ksession.insert( oldChili2 ); ksession.fireAllRules(); assertEquals( 1, list1.size() ); assertTrue( list1.contains( chili1 ) ); assertEquals( 2, list2.size() ); assertTrue( list2.contains( chili1 ) ); assertTrue( list2.contains( chili2 ) ); assertEquals( 2, list3.size() ); assertTrue( list3.contains( youngChili1 ) ); assertTrue( list3.contains( youngChili2 ) ); assertEquals( 2, list4.size() ); assertTrue( list4.contains( youngChili1 ) ); assertTrue( list4.contains( chili1 ) ); } @Test public void testDumpers() throws Exception { final DrlParser parser = new DrlParser( LanguageLevelOption.DRL5 ); Resource resource = new InputStreamResource( getClass().getResourceAsStream( "test_Dumpers.drl" ) ); final PackageDescr pkg = parser.parse( resource ); if ( parser.hasErrors() ) { for ( DroolsError error : parser.getErrors() ) { logger.warn( error.toString() ); } fail( parser.getErrors().toString() ); } KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( pkg ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese brie = new Cheese( "brie", 12 ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 3, list.size() ); assertEquals( "3 1", list.get( 0 ) ); assertEquals( "MAIN", list.get( 1 ) ); assertEquals( "1 1", list.get( 2 ) ); final DrlDumper drlDumper = new DrlDumper(); final String drlResult = drlDumper.dump( pkg ); System.out.println( drlResult ); kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( drlResult ) ); ksession = kbase.newStatefulKnowledgeSession(); list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 3, list.size() ); assertEquals( "3 1", list.get( 0 ) ); assertEquals( "MAIN", list.get( 1 ) ); assertEquals( "1 1", list.get( 2 ) ); } @Test public void testContainsCheese() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ContainsCheese.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 12 ); ksession.insert( stilton ); final Cheese brie = new Cheese( "brie", 10 ); ksession.insert( brie ); final Cheesery cheesery = new Cheesery(); cheesery.getCheeses().add( stilton ); ksession.insert( cheesery ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( stilton, list.get( 0 ) ); assertEquals( brie, list.get( 1 ) ); } @Test public void testDuplicateRuleNames() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_DuplicateRuleName1.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Collection<KnowledgePackage> kpkgs = loadKnowledgePackages( "test_DuplicateRuleName2.drl" ); kbase.addKnowledgePackages( kpkgs ); // @todo: this is from JBRULES-394 - maybe we should test more stuff // here? } @Test public void testNullValuesIndexing() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NullValuesIndexing.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); // Adding person with null name and likes attributes final PersonInterface bob = new Person( null, null ); bob.setStatus( "P1" ); final PersonInterface pete = new Person( null, null ); bob.setStatus( "P2" ); ksession.insert( bob ); ksession.insert( pete ); ksession.fireAllRules(); assertEquals( "Indexing with null values is not working correctly.", "OK", bob.getStatus() ); assertEquals( "Indexing with null values is not working correctly.", "OK", pete.getStatus() ); } @Test public void testEmptyRule() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EmptyRule.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "fired1" ) ); assertTrue( list.contains( "fired2" ) ); } @Test public void testjustEval() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NoPatterns.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "fired1" ) ); assertTrue( list.contains( "fired3" ) ); } @Test public void testOrWithBinding() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_OrWithBindings.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Person hola = new Person( "hola" ); ksession.insert( hola ); ksession.fireAllRules(); assertEquals( 0, list.size() ); Cheese brie = new Cheese( "brie" ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertTrue( list.contains( hola ) ); assertTrue( list.contains( brie ) ); } @Test public void testJoinNodeModifyObject() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_JoinNodeModifyObject.drl" ) ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); try { final List orderedFacts = new ArrayList(); final List errors = new ArrayList(); ksession.setGlobal( "orderedNumbers", orderedFacts ); ksession.setGlobal( "errors", errors ); final int MAX = 2; for ( int i = 1; i <= MAX; i++ ) { final IndexedNumber n = new IndexedNumber( i, MAX - i + 1 ); ksession.insert( n ); } ksession.fireAllRules(); assertTrue( "Processing generated errors: " + errors.toString(), errors.isEmpty() ); for ( int i = 1; i <= MAX; i++ ) { final IndexedNumber n = (IndexedNumber) orderedFacts.get( i - 1 ); assertEquals( "Fact is out of order", i, n.getIndex() ); } } finally { } } @Test public void testInsurancePricingExample() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "insurance_pricing_example.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); // now create some test data final Driver driver = new Driver(); final Policy policy = new Policy(); ksession.insert( driver ); ksession.insert( policy ); ksession.fireAllRules(); assertEquals( 120, policy.getBasePrice() ); } @Test public void testLLR() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_JoinNodeModifyTuple.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); // 1st time Target tgt = new Target(); tgt.setLabel( "Santa-Anna" ); tgt.setLat( new Float( 60.26544f ) ); tgt.setLon( new Float( 28.952137f ) ); tgt.setCourse( new Float( 145.0f ) ); tgt.setSpeed( new Float( 12.0f ) ); tgt.setTime( new Float( 1.8666667f ) ); ksession.insert( tgt ); tgt = new Target(); tgt.setLabel( "Santa-Maria" ); tgt.setLat( new Float( 60.236874f ) ); tgt.setLon( new Float( 28.992579f ) ); tgt.setCourse( new Float( 325.0f ) ); tgt.setSpeed( new Float( 8.0f ) ); tgt.setTime( new Float( 1.8666667f ) ); ksession.insert( tgt ); ksession.fireAllRules(); // 2nd time tgt = new Target(); tgt.setLabel( "Santa-Anna" ); tgt.setLat( new Float( 60.265343f ) ); tgt.setLon( new Float( 28.952267f ) ); tgt.setCourse( new Float( 145.0f ) ); tgt.setSpeed( new Float( 12.0f ) ); tgt.setTime( new Float( 1.9f ) ); ksession.insert( tgt ); tgt = new Target(); tgt.setLabel( "Santa-Maria" ); tgt.setLat( new Float( 60.236935f ) ); tgt.setLon( new Float( 28.992493f ) ); tgt.setCourse( new Float( 325.0f ) ); tgt.setSpeed( new Float( 8.0f ) ); tgt.setTime( new Float( 1.9f ) ); ksession.insert( tgt ); ksession.fireAllRules(); // 3d time tgt = new Target(); tgt.setLabel( "Santa-Anna" ); tgt.setLat( new Float( 60.26525f ) ); tgt.setLon( new Float( 28.952396f ) ); tgt.setCourse( new Float( 145.0f ) ); tgt.setSpeed( new Float( 12.0f ) ); tgt.setTime( new Float( 1.9333333f ) ); ksession.insert( tgt ); tgt = new Target(); tgt.setLabel( "Santa-Maria" ); tgt.setLat( new Float( 60.236996f ) ); tgt.setLon( new Float( 28.992405f ) ); tgt.setCourse( new Float( 325.0f ) ); tgt.setSpeed( new Float( 8.0f ) ); tgt.setTime( new Float( 1.9333333f ) ); ksession.insert( tgt ); ksession.fireAllRules(); // 4th time tgt = new Target(); tgt.setLabel( "Santa-Anna" ); tgt.setLat( new Float( 60.265163f ) ); tgt.setLon( new Float( 28.952526f ) ); tgt.setCourse( new Float( 145.0f ) ); tgt.setSpeed( new Float( 12.0f ) ); tgt.setTime( new Float( 1.9666667f ) ); ksession.insert( tgt ); tgt = new Target(); tgt.setLabel( "Santa-Maria" ); tgt.setLat( new Float( 60.237057f ) ); tgt.setLon( new Float( 28.99232f ) ); tgt.setCourse( new Float( 325.0f ) ); tgt.setSpeed( new Float( 8.0f ) ); tgt.setTime( new Float( 1.9666667f ) ); ksession.insert( tgt ); ksession.fireAllRules(); } @Test public void testReturnValueAndGlobal() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ReturnValueAndGlobal.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List matchlist = new ArrayList(); ksession.setGlobal( "matchingList", matchlist ); final List nonmatchlist = new ArrayList(); ksession.setGlobal( "nonMatchingList", nonmatchlist ); ksession.setGlobal( "cheeseType", "stilton" ); final Cheese stilton1 = new Cheese( "stilton", 5 ); final Cheese stilton2 = new Cheese( "stilton", 7 ); final Cheese brie = new Cheese( "brie", 4 ); ksession.insert( stilton1 ); ksession.insert( stilton2 ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 2, matchlist.size() ); assertEquals( 1, nonmatchlist.size() ); } @Test public void testDeclaringAndUsingBindsInSamePattern() throws Exception { KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbc.setOption( RemoveIdentitiesOption.YES ); KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( kbc, "test_DeclaringAndUsingBindsInSamePattern.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List sensors = new ArrayList(); ksession.setGlobal( "sensors", sensors ); final Sensor sensor1 = new Sensor( 100, 150 ); ksession.insert( sensor1 ); ksession.fireAllRules(); assertEquals( 0, sensors.size() ); final Sensor sensor2 = new Sensor( 200, 150 ); ksession.insert( sensor2 ); ksession.fireAllRules(); assertEquals( 3, sensors.size() ); } @Test public void testMissingImports() { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "test_missing_import.drl", getClass() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testNestedConditionalElements() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NestedConditionalElements.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final State state = new State( "SP" ); ksession.insert( state ); final Person bob = new Person( "Bob" ); bob.setStatus( state.getState() ); bob.setLikes( "stilton" ); ksession.insert( bob ); ksession.fireAllRules(); assertEquals( 0, list.size() ); ksession.insert( new Cheese( bob.getLikes(), 10 ) ); ksession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testDeclarationUsage() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "test_DeclarationUsage.drl", getClass() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testDeclareAndFrom() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_DeclareWithFrom.drl" ); FactType profileType = kbase.getFactType( "org.drools.compiler", "Profile" ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Object profile = profileType.newInstance(); Map<String, Integer> map = new HashMap<String, Integer>(); map.put( "internet", Integer.valueOf( 2 ) ); profileType.set( profile, "pageFreq", map ); ksession.insert( profile ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testDeclarationNonExistingField() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource( "test_DeclarationOfNonExistingField.drl", getClass() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testUnbalancedTrees() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_UnbalancedTrees.drl" ) ); StatefulKnowledgeSession wm = createKnowledgeSession( kbase ); wm.insert( new Cheese( "a", 10 ) ); wm.insert( new Cheese( "b", 10 ) ); wm.insert( new Cheese( "c", 10 ) ); wm.insert( new Cheese( "d", 10 ) ); final Cheese e = new Cheese( "e", 10 ); wm.insert( e ); wm.fireAllRules(); assertEquals( "Rule should have fired twice, seting the price to 30", 30, e.getPrice() ); // success } @Test public void testImportConflict() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ImportConflict.drl" ) ); StatefulKnowledgeSession wm = createKnowledgeSession( kbase ); } @Test public void testEmptyIdentifier() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_emptyIdentifier.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List result = new ArrayList(); ksession.setGlobal( "results", result ); final Person person = new Person( "bob" ); final Cheese cheese = new Cheese( "brie", 10 ); ksession.insert( person ); ksession.insert( cheese ); ksession.fireAllRules(); assertEquals( 4, result.size() ); } @Test public void testDuplicateVariableBinding() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_duplicateVariableBinding.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final Map result = new HashMap(); ksession.setGlobal( "results", result ); final Cheese stilton = new Cheese( "stilton", 20 ); final Cheese brie = new Cheese( "brie", 10 ); ksession.insert( stilton ); ksession.insert( brie ); ksession.fireAllRules(); assertEquals( 5, result.size() ); assertEquals( stilton.getPrice(), ((Integer) result.get( stilton.getType() )).intValue() ); assertEquals( brie.getPrice(), ((Integer) result.get( brie.getType() )).intValue() ); assertEquals( stilton.getPrice(), ((Integer) result.get( stilton )).intValue() ); assertEquals( brie.getPrice(), ((Integer) result.get( brie )).intValue() ); assertEquals( stilton.getPrice(), ((Integer) result.get( "test3" + stilton.getType() )).intValue() ); ksession.insert( new Person( "bob", brie.getType() ) ); ksession.fireAllRules(); assertEquals( 6, result.size() ); assertEquals( brie.getPrice(), ((Integer) result.get( "test3" + brie.getType() )).intValue() ); } @Test public void testShadowProxyInHirarchies() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ShadowProxyInHirarchies.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Child( "gp" ) ); ksession.fireAllRules(); } @Test public void testSelfReference() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_SelfReference.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final Order order = new Order( 10, "Bob" ); final OrderItem item1 = new OrderItem( order, 1 ); final OrderItem item2 = new OrderItem( order, 2 ); final OrderItem anotherItem1 = new OrderItem( null, 3 ); final OrderItem anotherItem2 = new OrderItem( null, 4 ); ksession.insert( order ); ksession.insert( item1 ); ksession.insert( item2 ); ksession.insert( anotherItem1 ); ksession.insert( anotherItem2 ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertTrue( results.contains( item1 ) ); assertTrue( results.contains( item2 ) ); } @Test public void testNumberComparisons() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NumberComparisons.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); // asserting the sensor object final RandomNumber rn = new RandomNumber(); rn.setValue( 10 ); ksession.insert( rn ); final Guess guess = new Guess(); guess.setValue( new Integer( 5 ) ); final FactHandle handle = ksession.insert( guess ); ksession.fireAllRules(); // HIGHER assertEquals( 1, list.size() ); assertEquals( "HIGHER", list.get( 0 ) ); guess.setValue( new Integer( 15 ) ); ksession.update( handle, guess ); ksession.fireAllRules(); // LOWER assertEquals( 2, list.size() ); assertEquals( "LOWER", list.get( 1 ) ); guess.setValue( new Integer( 10 ) ); ksession.update( handle, guess ); ksession.fireAllRules(); // CORRECT assertEquals( 3, list.size() ); assertEquals( "CORRECT", list.get( 2 ) ); } @Test public void testEventModel() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EventModel.drl" ) ); StatefulKnowledgeSession wm = createKnowledgeSession( kbase ); RuleRuntimeEventListener wmel = mock( RuleRuntimeEventListener.class ); wm.addEventListener( wmel ); final Cheese stilton = new Cheese( "stilton", 15 ); final FactHandle stiltonHandle = wm.insert( stilton ); ArgumentCaptor<org.kie.api.event.rule.ObjectInsertedEvent> oic = ArgumentCaptor.forClass( org.kie.api.event.rule.ObjectInsertedEvent.class ); verify( wmel ).objectInserted( oic.capture() ); assertSame( stiltonHandle, oic.getValue().getFactHandle() ); wm.update( stiltonHandle, stilton ); ArgumentCaptor<org.kie.api.event.rule.ObjectUpdatedEvent> ouc = ArgumentCaptor.forClass( org.kie.api.event.rule.ObjectUpdatedEvent.class ); verify( wmel ).objectUpdated( ouc.capture() ); assertSame( stiltonHandle, ouc.getValue().getFactHandle() ); wm.delete( stiltonHandle ); ArgumentCaptor<ObjectDeletedEvent> orc = ArgumentCaptor.forClass( ObjectDeletedEvent.class ); verify( wmel ).objectDeleted(orc.capture()); assertSame( stiltonHandle, orc.getValue().getFactHandle() ); } @Test public void testImplicitDeclarations() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_implicitDeclarations.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.setGlobal( "factor", new Double( 1.2 ) ); final Cheese cheese = new Cheese( "stilton", 10 ); ksession.insert( cheese ); ksession.fireAllRules(); assertEquals( 1, results.size() ); } @Test public void testMVELImplicitWithFrom() throws IOException, ClassNotFoundException { String str = "" + "package org.drools.compiler.test \n" + "import java.util.List \n" + "global java.util.List list \n" + "global java.util.List list2 \n" + "rule \"show\" dialect \"mvel\" \n" + "when \n" + " $m : List( eval( size == 0 ) ) from [list] \n" + "then \n" + " list2.add('r1'); \n" + "end \n"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( str ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.setGlobal( "list2", list ); ksession.fireAllRules(); assertEquals( "r1", list.get( 0 ) ); } @Test public void testJavaImplicitWithFrom() throws IOException, ClassNotFoundException { String str = "" + "package org.drools.compiler.test \n" + "import java.util.List \n" + "global java.util.List list \n" + "global java.util.List list2 \n" + "rule \"show\" dialect \"java\" \n" + "when \n" + " $m : List( eval( size == 0 ) ) from [list] \n" + "then \n" + " list2.add('r1'); \n" + "end \n"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( str ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.setGlobal( "list2", list ); ksession.fireAllRules(); assertEquals( "r1", list.get( 0 ) ); } @Test public void testCastingInsideEvals() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_castsInsideEval.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.setGlobal( "value", new Integer( 20 ) ); ksession.fireAllRules(); } @Test public void testMemberOfAndNotMemberOf() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_memberOf.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 12 ); final Cheese muzzarela = new Cheese( "muzzarela", 10 ); final Cheese brie = new Cheese( "brie", 15 ); ksession.insert( stilton ); ksession.insert( muzzarela ); final Cheesery cheesery = new Cheesery(); cheesery.getCheeses().add( stilton.getType() ); cheesery.getCheeses().add( brie.getType() ); ksession.insert( cheesery ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( stilton, list.get( 0 ) ); assertEquals( muzzarela, list.get( 1 ) ); } @Test public void testContainsInArray() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_contains_in_array.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Primitives p = new Primitives(); p.setStringArray( new String[]{"test1", "test3"} ); ksession.insert( p ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( "ok1", list.get( 0 ) ); assertEquals( "ok2", list.get( 1 ) ); } @Test public void testNodeSharingNotExists() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_nodeSharingNotExists.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( "rule1", list.get( 0 ) ); ksession.insert( new Cheese( "stilton", 10 ) ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( "rule2", list.get( 1 ) ); } @Test public void testNullBinding() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_nullBindings.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); ksession.insert( new Person( "bob" ) ); ksession.insert( new Person( null ) ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( "OK", list.get( 0 ) ); } @Test public void testModifyRetractWithFunction() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_RetractModifyWithFunction.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final Cheese stilton = new Cheese( "stilton", 7 ); final Cheese muzzarella = new Cheese( "muzzarella", 9 ); final int sum = stilton.getPrice() + muzzarella.getPrice(); final FactHandle stiltonHandle = ksession.insert( stilton ); final FactHandle muzzarellaHandle = ksession.insert( muzzarella ); ksession.fireAllRules(); assertEquals( sum, stilton.getPrice() ); assertEquals( 1, ksession.getFactCount() ); assertNotNull( ksession.getObject( stiltonHandle ) ); assertNotNull( ksession.getFactHandle( stilton ) ); assertNull( ksession.getObject( muzzarellaHandle ) ); assertNull( ksession.getFactHandle( muzzarella ) ); } @Test public void testConstraintConnectors() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ConstraintConnectors.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final Person youngChili1 = new Person( "young chili1" ); youngChili1.setAge( 12 ); youngChili1.setHair( "blue" ); final Person youngChili2 = new Person( "young chili2" ); youngChili2.setAge( 25 ); youngChili2.setHair( "purple" ); final Person chili1 = new Person( "chili1" ); chili1.setAge( 35 ); chili1.setHair( "red" ); final Person chili2 = new Person( "chili2" ); chili2.setAge( 38 ); chili2.setHair( "indigigo" ); final Person oldChili1 = new Person( "old chili1" ); oldChili1.setAge( 45 ); oldChili1.setHair( "green" ); final Person oldChili2 = new Person( "old chili2" ); oldChili2.setAge( 48 ); oldChili2.setHair( "blue" ); final Person veryold = new Person( "very old" ); veryold.setAge( 99 ); veryold.setHair( "gray" ); ksession.insert( youngChili1 ); ksession.insert( youngChili2 ); ksession.insert( chili1 ); ksession.insert( chili2 ); ksession.insert( oldChili1 ); ksession.insert( oldChili2 ); ksession.insert( veryold ); ksession.fireAllRules(); assertEquals( 4, results.size() ); assertEquals( chili1, results.get( 0 ) ); assertEquals( oldChili1, results.get( 1 ) ); assertEquals( youngChili1, results.get( 2 ) ); assertEquals( veryold, results.get( 3 ) ); } @Test public void testConnectorsAndOperators() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ConstraintConnectorsAndOperators.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new StockTick( 1, "RHT", 10, 1000 ) ); ksession.insert( new StockTick( 2, "IBM", 10, 1100 ) ); final int fired = ksession.fireAllRules(); assertEquals( 1, fired ); } @Test public void testConstraintConnectorOr() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ConstraintConnectorOr.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<Person> results = new ArrayList<Person>(); ksession.setGlobal( "results", results ); final Person mark = new Person( "Mark" ); mark.setAlive( true ); mark.setHappy( true ); final Person bush = new Person( "Bush" ); bush.setAlive( true ); bush.setHappy( false ); final Person conan = new Person( "Conan" ); conan.setAlive( false ); conan.setHappy( true ); final Person nero = new Person( "Nero" ); nero.setAlive( false ); nero.setHappy( false ); ksession.insert( mark ); ksession.insert( bush ); ksession.insert( conan ); ksession.insert( nero ); ksession.fireAllRules(); assertEquals( 3, results.size() ); assertTrue( results.contains( mark ) ); assertTrue( results.contains( bush ) ); assertTrue( results.contains( conan ) ); } @Test public void testMatchesNotMatchesCheese() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MatchesNotMatches.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "list", list ); final Cheese stilton = new Cheese( "stilton", 12 ); final Cheese stilton2 = new Cheese( "stilton2", 12 ); final Cheese agedStilton = new Cheese( "aged stilton", 12 ); final Cheese brie = new Cheese( "brie", 10 ); final Cheese brie2 = new Cheese( "brie2", 10 ); final Cheese muzzarella = new Cheese( "muzzarella", 10 ); final Cheese muzzarella2 = new Cheese( "muzzarella2", 10 ); final Cheese provolone = new Cheese( "provolone", 10 ); final Cheese provolone2 = new Cheese( "another cheese (provolone)", 10 ); ksession.insert( stilton ); ksession.insert( stilton2 ); ksession.insert( agedStilton ); ksession.insert( brie ); ksession.insert( brie2 ); ksession.insert( muzzarella ); ksession.insert( muzzarella2 ); ksession.insert( provolone ); ksession.insert( provolone2 ); ksession.fireAllRules(); logger.info( list.toString() ); assertEquals( 4, list.size() ); assertEquals( stilton, list.get( 0 ) ); assertEquals( brie, list.get( 1 ) ); assertEquals( agedStilton, list.get( 2 ) ); assertEquals( provolone, list.get( 3 ) ); } @Test public void testAutomaticBindings() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_AutoBindings.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Person bob = new Person( "bob", "stilton" ); final Cheese stilton = new Cheese( "stilton", 12 ); ksession.insert( bob ); ksession.insert( stilton ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( bob, list.get( 0 ) ); } @Test public void testMatchesMVEL() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MatchesMVEL.drl" ) ); final StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List results = new ArrayList(); session.setGlobal( "results", results ); Map map = new HashMap(); map.put( "content", "hello ;=" ); session.insert( map ); session.fireAllRules(); assertEquals( 1, results.size() ); } @Test public void testMatchesMVEL2() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_MatchesMVEL2.drl" ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Map map = new HashMap(); map.put( "content", "String with . and (routine)" ); ksession.insert( map ); int fired = ksession.fireAllRules(); assertEquals( 2, fired ); } @Test public void testMatchesMVEL3() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_MatchesMVEL2.drl" ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Map map = new HashMap(); map.put( "content", "String with . and ()" ); ksession.insert( map ); int fired = ksession.fireAllRules(); assertEquals( 1, fired ); } @Test public void testQualifiedFieldReference() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_QualifiedFieldReference.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Person bob = new Person( "bob", "stilton" ); final Cheese stilton = new Cheese( "stilton", 12 ); ksession.insert( bob ); ksession.insert( stilton ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( bob, list.get( 0 ) ); } @Test public void testEvalInline() throws Exception { final String text = "package org.drools.compiler\n" + "rule \"inline eval\"\n" + "when\n" + " $str : String()\n" + " Person( eval( name.startsWith($str) && age == 18) )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( text ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( "b" ); ksession.insert( new Person( "mark", 50 ) ); int rules = ksession.fireAllRules(); assertEquals( 0, rules ); ksession.insert( new Person( "bob", 18 ) ); rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testMethodCalls() throws Exception { final String text = "package org.drools.compiler\n" + "rule \"method calls\"\n" + "when\n" + " Person( getName().substring(2) == 'b' )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( text ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Person( "mark", 50 ) ); int rules = ksession.fireAllRules(); assertEquals( 0, rules ); ksession.insert( new Person( "bob", 18 ) ); rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testAlphaExpression() throws Exception { final String text = "package org.drools.compiler\n" + "rule \"alpha\"\n" + "when\n" + " Person( 5 < 6 )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( text ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Person( "mark", 50 ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testEvalCE() throws Exception { final String text = "package org.drools.compiler\n" + "rule \"inline eval\"\n" + "when\n" + " $str : String()\n" + " $p : Person()\n" + " eval( $p.getName().startsWith($str) && $p.getName().endsWith($str) )" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( text ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( "b" ); ksession.insert( new Person( "mark", 50 ) ); int rules = ksession.fireAllRules(); assertEquals( 0, rules ); ksession.insert( new Person( "bob", 18 ) ); rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testEvalRewrite() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EvalRewrite.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Order order1 = new Order( 10, "Bob" ); final OrderItem item11 = new OrderItem( order1, 1 ); final OrderItem item12 = new OrderItem( order1, 2 ); order1.addItem( item11 ); order1.addItem( item12 ); final Order order2 = new Order( 11, "Bob" ); final OrderItem item21 = new OrderItem( order2, 1 ); final OrderItem item22 = new OrderItem( order2, 2 ); order2.addItem( item21 ); order2.addItem( item22 ); final Order order3 = new Order( 12, "Bob" ); final OrderItem item31 = new OrderItem( order3, 1 ); final OrderItem item32 = new OrderItem( order3, 2 ); order3.addItem( item31 ); order3.addItem( item32 ); final Order order4 = new Order( 13, "Bob" ); final OrderItem item41 = new OrderItem( order4, 1 ); final OrderItem item42 = new OrderItem( order4, 2 ); order4.addItem( item41 ); order4.addItem( item42 ); ksession.insert( order1 ); ksession.insert( item11 ); ksession.insert( item12 ); ksession.insert( order2 ); ksession.insert( item21 ); ksession.insert( item22 ); ksession.insert( order3 ); ksession.insert( item31 ); ksession.insert( item32 ); ksession.insert( order4 ); ksession.insert( item41 ); ksession.insert( item42 ); ksession.fireAllRules(); assertEquals( 5, list.size() ); assertTrue( list.contains( item11 ) ); assertTrue( list.contains( item12 ) ); assertTrue( list.contains( item22 ) ); assertTrue( list.contains( order3 ) ); assertTrue( list.contains( order4 ) ); } @Test public void testMapAccess() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MapAccess.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Map map = new HashMap(); map.put( "name", "Edson" ); map.put( "surname", "Tirelli" ); map.put( "age", "28" ); ksession.insert( map ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertTrue( list.contains( map ) ); } @Test public void testMapNullConstraint() throws Exception { KnowledgeBase kbase = loadKnowledgeBase( "test_mapNullConstraints.drl" ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); new WorkingMemoryConsoleLogger( ksession ); Map addresses = new HashMap(); addresses.put( "home", new Address( "home street" ) ); Person bob = new Person( "Bob" ); bob.setNamedAddresses( addresses ); ksession.insert( bob ); ksession.fireAllRules(); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael, times( 4 ) ).afterMatchFired(arg.capture()); org.kie.api.event.rule.AfterMatchFiredEvent aaf = arg.getAllValues().get( 0 ); assertThat( aaf.getMatch().getRule().getName(), is( "1. home != null" ) ); aaf = arg.getAllValues().get( 1 ); assertThat( aaf.getMatch().getRule().getName(), is( "2. not home == null" ) ); aaf = arg.getAllValues().get( 2 ); assertThat( aaf.getMatch().getRule().getName(), is( "7. work == null" ) ); aaf = arg.getAllValues().get( 3 ); assertThat( aaf.getMatch().getRule().getName(), is( "8. not work != null" ) ); } @Test public void testNoneTypeSafeDeclarations() { // same namespace String str = "package org.drools.compiler\n" + "global java.util.List list\n" + "declare Person\n" + " @typesafe(false)\n" + "end\n" + "rule testTypeSafe\n dialect \"mvel\" when\n" + " $p : Person( object.street == 's1' )\n" + "then\n" + " list.add( $p );\n" + "end\n"; executeTypeSafeDeclarations( str, true ); // different namespace with import str = "package org.drools.compiler.test\n" + "import org.drools.compiler.Person\n" + "global java.util.List list\n" + "declare Person\n" + " @typesafe(false)\n" + "end\n" + "rule testTypeSafe\n dialect \"mvel\" when\n" + " $p : Person( object.street == 's1' )\n" + "then\n" + " list.add( $p );\n" + "end\n"; executeTypeSafeDeclarations( str, true ); // different namespace without import using qualified name str = "package org.drools.compiler.test\n" + "global java.util.List list\n" + "declare org.drools.compiler.Person\n" + " @typesafe(false)\n" + "end\n" + "rule testTypeSafe\n dialect \"mvel\" when\n" + " $p : org.drools.compiler.Person( object.street == 's1' )\n" + "then\n" + " list.add( $p );\n" + "end\n"; executeTypeSafeDeclarations( str, true ); // this should fail as it's not declared non typesafe str = "package org.drools.compiler.test\n" + "global java.util.List list\n" + "declare org.drools.compiler.Person\n" + " @typesafe(true)\n" + "end\n" + "rule testTypeSafe\n dialect \"mvel\" when\n" + " $p : org.drools.compiler.Person( object.street == 's1' )\n" + "then\n" + " list.add( $p );\n" + "end\n"; executeTypeSafeDeclarations( str, false ); } private void executeTypeSafeDeclarations(String str, boolean mustSucceed) { KnowledgeBase kbase = null; try { kbase = loadKnowledgeBaseFromString(str); if ( !mustSucceed ) { fail("Compilation Should fail" ); } } catch ( Throwable e ) { if ( mustSucceed ) { fail("Compilation Should succeed" ); } return; } StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Address a = new Address( "s1" ); Person p = new Person( "yoda" ); p.setObject( a ); ksession.insert( p ); ksession.fireAllRules(); assertEquals( p, list.get( 0 ) ); } @Test public void testMapAccessWithVariable() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MapAccessWithVariable.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Map map = new HashMap(); map.put( "name", "Edson" ); map.put( "surname", "Tirelli" ); map.put( "age", "28" ); ksession.insert( map ); ksession.insert( "name" ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertTrue( list.contains( map ) ); } // Drools does not support variables inside bindings yet... but we should... @Test public void testMapAccessWithVariable2() { String str = "package org.drools.compiler;\n" + "import java.util.Map;\n" + "rule \"map access with variable\"\n" + " when\n" + " $key : String( )\n" + " $p1 : Person( name == 'Bob', namedAddresses[$key] != null, $na : namedAddresses[$key] )\n" + " $p2 : Person( name == 'Mark', namedAddresses[$key] == $na )\n" + " then\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); Assert.assertTrue( kbuilder.hasErrors() ); } @Test public void testHalt() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_halt.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Integer( 0 ) ); ksession.fireAllRules(); assertEquals( 10, results.size() ); for ( int i = 0; i < 10; i++ ) { assertEquals( new Integer( i ), results.get( i ) ); } } @Test public void testFireLimit() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_fireLimit.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Integer( 0 ) ); int count = ksession.fireAllRules(); assertEquals( 21, count ); assertEquals( 20, results.size() ); for ( int i = 0; i < 20; i++ ) { assertEquals( new Integer( i ), results.get( i ) ); } results.clear(); ksession.insert( new Integer( 0 ) ); count = ksession.fireAllRules( 10 ); assertEquals( 10, count ); assertEquals( 10, results.size() ); for ( int i = 0; i < 10; i++ ) { assertEquals( new Integer( i ), results.get( i ) ); } count = ksession.fireAllRules(); //should finish the rest assertEquals( 11, count ); assertEquals( 20, results.size() ); for ( int i = 0; i < 20; i++ ) { assertEquals( new Integer( i ), results.get( i ) ); } results.clear(); ksession.insert( new Integer( 0 ) ); count = ksession.fireAllRules(); assertEquals( 21, count ); assertEquals( 20, results.size() ); for ( int i = 0; i < 20; i++ ) { assertEquals( new Integer( i ), results.get( i ) ); } results.clear(); } @Test public void testEqualitySupport() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_equalitySupport.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); PersonWithEquals person = new PersonWithEquals( "bob", 30 ); ksession.insert( person ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( "mark", results.get( 0 ) ); } @Test public void testCharComparisons() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_charComparisons.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); Primitives p1 = new Primitives(); p1.setCharPrimitive( 'a' ); p1.setStringAttribute( "b" ); Primitives p2 = new Primitives(); p2.setCharPrimitive( 'b' ); p2.setStringAttribute( "a" ); ksession.insert( p1 ); ksession.insert( p2 ); ksession.fireAllRules(); assertEquals( 3, results.size() ); assertEquals( "1", results.get( 0 ) ); assertEquals( "2", results.get( 1 ) ); assertEquals( "3", results.get( 2 ) ); } @Test public void testAlphaNodeSharing() throws Exception { KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbc.setOption( ShareAlphaNodesOption.YES ); final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( kbc, "test_alphaNodeSharing.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); Person p1 = new Person( "bob", 5 ); ksession.insert( p1 ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "1", results.get( 0 ) ); assertEquals( "2", results.get( 1 ) ); } @Test public void testSelfReference2() throws Exception { final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_SelfReference2.drl" ) ); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese() ); ksession.fireAllRules(); assertEquals( 0, results.size() ); } @Test public void testSelfJoinWithIndex() throws IOException, ClassNotFoundException { String drl = ""; drl += "package org.drools.compiler.test\n"; drl += "import org.drools.compiler.Person\n"; drl += "global java.util.List list\n"; drl += "rule test1\n"; drl += "when\n"; drl += " $p1 : Person( $name : name, $age : age )\n"; drl += " $p2 : Person( name == $name, age < $age)\n"; drl += "then\n"; drl += " list.add( $p1 );\n"; drl += "end\n"; final KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( drl ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Person p1 = new Person( "darth", 30 ); FactHandle fh1 = ksession.insert( p1 ); Person p2 = new Person( "darth", 25 ); FactHandle fh2 = ksession.insert( p2 ); // creates activation. p1.setName( "yoda" ); ksession.update( fh1, p1 ); // creates activation ksession.fireAllRules(); assertEquals( 0, list.size() ); } @Test public void testMergingDifferentPackages() throws Exception { // using the same builder try { Collection<KnowledgePackage> kpkgs = loadKnowledgePackages( "test_RuleNameClashes1.drl", "test_RuleNameClashes2.drl" ); assertEquals( 3, kpkgs.size() ); for ( KnowledgePackage kpkg : kpkgs ) { if (kpkg.getName().equals("org.drools.package1")) { assertEquals( "rule 1", kpkg.getRules().iterator().next().getName() ); } } } catch ( KnowledgeBuilderImpl.PackageMergeException e ) { fail( "unexpected exception: " + e.getMessage() ); } catch ( RuntimeException e ) { e.printStackTrace(); fail( "unexpected exception: " + e.getMessage() ); } } @Test public void testSelfJoinAndNotWithIndex() throws IOException, ClassNotFoundException { String drl = ""; drl += "package org.drools.compiler.test\n"; drl += "import org.drools.compiler.Person\n"; drl += "global java.util.List list\n"; drl += "rule test1\n"; drl += "when\n"; // selects the youngest person, for drl += " $p1 : Person( )\n"; drl += " not Person( name == $p1.name, age < $p1.age )\n"; // select the youngest person with the same name as $p1, but different likes and must be older drl += " $p2 : Person( name == $p1.name, likes != $p1.likes, age > $p1.age)\n"; drl += " not Person( name == $p1.name, likes == $p2.likes, age < $p2.age )\n"; drl += "then\n"; drl += " System.out.println( $p1 + \":\" + $p2 );\n"; drl += " list.add( $p1 );\n"; drl += " list.add( $p2 );\n"; drl += "end\n"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( drl ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Person p0 = new Person( "yoda", 0 ); p0.setLikes( "cheddar" ); FactHandle fh0 = ksession.insert( p0 ); Person p1 = new Person( "darth", 15 ); p1.setLikes( "cheddar" ); FactHandle fh1 = ksession.insert( p1 ); Person p2 = new Person( "darth", 25 ); p2.setLikes( "cheddar" ); FactHandle fh2 = ksession.insert( p2 ); // creates activation. Person p3 = new Person( "darth", 30 ); p3.setLikes( "brie" ); FactHandle fh3 = ksession.insert( p3 ); ksession.fireAllRules(); // selects p1 and p3 assertEquals( 2, list.size() ); assertSame( p1, list.get( 0 ) ); assertSame( p3, list.get( 1 ) ); p1.setName( "yoda" ); ksession.update( fh1, p1 ); // creates activation ksession.fireAllRules(); // now selects p2 and p3 assertEquals( 4, list.size() ); assertSame( p2, list.get( 2 ) ); assertSame( p3, list.get( 3 ) ); } @Test public void testMergingDifferentPackages2() throws Exception { // using different builders try { Collection<KnowledgePackage> kpkgs1 = loadKnowledgePackages( "test_RuleNameClashes1.drl" ); assertEquals( 1, kpkgs1.iterator().next().getRules().size() ); Collection<KnowledgePackage> kpkgs2 = loadKnowledgePackages( "test_RuleNameClashes2.drl" ); assertEquals( 1, kpkgs2.iterator().next().getRules().size() ); KnowledgeBase kbase = loadKnowledgeBase(); kbase.addKnowledgePackages( kpkgs1 ); kbase.addKnowledgePackages( kpkgs2 ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 10 ) ); ksession.insert( new Cheese( "brie", 5 ) ); ksession.fireAllRules(); assertEquals( results.toString(), 2, results.size() ); assertTrue( results.contains( "p1.r1" ) ); assertTrue( results.contains( "p2.r1" ) ); } catch ( KnowledgeBuilderImpl.PackageMergeException e ) { fail( "Should not raise exception when merging different packages into the same rulebase: " + e.getMessage() ); } catch ( Exception e ) { e.printStackTrace(); fail( "unexpected exception: " + e.getMessage() ); } } @Test public void testMergePackageWithSameRuleNames() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_MergePackageWithSameRuleNames1.drl" ) ); Collection<KnowledgePackage> kpkgs = loadKnowledgePackages( "test_MergePackageWithSameRuleNames2.drl" ); kbase.addKnowledgePackages( kpkgs ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( "rule1 for the package2", results.get( 0 ) ); } @Test public void testRuleRemovalWithJoinedRootPattern() { String str = ""; str += "package org.drools.compiler \n"; str += "rule rule1 \n"; str += "when \n"; str += " String() \n"; str += " Person() \n"; str += "then \n"; str += "end \n"; str += "rule rule2 \n"; str += "when \n"; str += " String() \n"; str += " Cheese() \n"; str += "then \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); DefaultFactHandle handle = (DefaultFactHandle) ksession.insert( "hello" ); ksession.fireAllRules(); LeftTuple leftTuple = handle.getFirstLeftTuple(); assertNotNull( leftTuple ); assertNotNull( leftTuple.getPeer() ); kbase.removeRule( "org.drools.compiler", "rule2" ); leftTuple = handle.getFirstLeftTuple(); assertNotNull( leftTuple ); assertNull( leftTuple.getHandleNext() ); } // JBRULES-1808 @Test public void testKnowledgeHelperFixerInStrings() { String str = ""; str += "package org.simple \n"; str += "global java.util.List list \n"; str += "rule xxx \n"; str += " no-loop true "; str += "when \n"; str += " $fact : String() \n"; str += "then \n"; str += " list.add(\"This is an update()\"); \n"; str += " list.add(\"This is an update($fact)\"); \n"; str += " update($fact); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( "hello" ); ksession.fireAllRules(); ksession.dispose(); assertEquals( 2, list.size() ); assertEquals( "This is an update()", list.get( 0 ) ); assertEquals( "This is an update($fact)", list.get( 1 ) ); } @Test public void testEmptyAfterRetractInIndexedMemory() { String str = ""; str += "package org.simple \n"; str += "import org.drools.compiler.Person\n"; str += "global java.util.List list \n"; str += "rule xxx dialect 'mvel' \n"; str += "when \n"; str += " Person( $name : name ) \n"; str += " $s : String( this == $name) \n"; str += "then \n"; str += " list.add($s); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Person p = new Person( "ackbar" ); FactHandle ph = ksession.insert( p ); FactHandle sh = ksession.insert( "ackbar" ); ksession.fireAllRules(); ksession.dispose(); assertEquals( 1, list.size() ); assertEquals( "ackbar", list.get( 0 ) ); } @Test public void testRuleReplacement() throws Exception { // test rule replacement Collection<KnowledgePackage> kpkgs = loadKnowledgePackages( "test_RuleNameClashes3.drl", "test_RuleNameClashes3.drl" ); for (KnowledgePackage kpkg : kpkgs) { if (kpkg.getName().equals("org.drools.package1")) { assertEquals( 1, kpkg.getRules().size() ); break; } } KnowledgeBase kbase = loadKnowledgeBase(); kbase.addKnowledgePackages( kpkgs ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 10 ) ); ksession.insert( new Cheese( "brie", 5 ) ); ksession.fireAllRules(); assertEquals( results.toString(), 0, results.size() ); ksession.insert( new Cheese( "muzzarella", 7 ) ); ksession.fireAllRules(); assertEquals( results.toString(), 1, results.size() ); assertTrue( results.contains( "p1.r3" ) ); } @Test public void testBindingsOnConnectiveExpressions() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_bindings.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 15 ) ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "stilton", results.get( 0 ) ); assertEquals( new Integer( 15 ), results.get( 1 ) ); } @Test public void testMultipleFroms() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_multipleFroms.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final Cheesery cheesery = new Cheesery(); cheesery.addCheese( new Cheese( "stilton", 15 ) ); cheesery.addCheese( new Cheese( "brie", 10 ) ); ksession.setGlobal( "cheesery", cheesery ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( 2, ((List) results.get( 0 )).size() ); assertEquals( 2, ((List) results.get( 1 )).size() ); } @Test public void testNullHashing() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NullHashing.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 15 ) ); ksession.insert( new Cheese( "", 10 ) ); ksession.insert( new Cheese( null, 8 ) ); ksession.fireAllRules(); assertEquals( 3, results.size() ); } @Test public void testDefaultBetaConstrains() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_DefaultBetaConstraint.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final FirstClass first = new FirstClass( "1", "2", "3", "4", "5" ); final FactHandle handle = ksession.insert( first ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( "NOT", results.get( 0 ) ); ksession.insert( new SecondClass() ); ksession.update( handle, first ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "NOT", results.get( 1 ) ); ksession.update( handle, first ); ksession.insert( new SecondClass( null, "2", "3", "4", "5" ) ); ksession.fireAllRules(); assertEquals( 3, results.size() ); assertEquals( "NOT", results.get( 2 ) ); ksession.update( handle, first ); ksession.insert( new SecondClass( "1", null, "3", "4", "5" ) ); ksession.fireAllRules(); assertEquals( 4, results.size() ); assertEquals( "NOT", results.get( 3 ) ); ksession.update( handle, first ); ksession.insert( new SecondClass( "1", "2", null, "4", "5" ) ); ksession.fireAllRules(); assertEquals( 5, results.size() ); assertEquals( "NOT", results.get( 4 ) ); ksession.update( handle, first ); ksession.insert( new SecondClass( "1", "2", "3", null, "5" ) ); ksession.fireAllRules(); assertEquals( 6, results.size() ); assertEquals( "NOT", results.get( 5 ) ); ksession.update( handle, first ); ksession.insert( new SecondClass( "1", "2", "3", "4", null ) ); ksession.fireAllRules(); assertEquals( 7, results.size() ); assertEquals( "NOT", results.get( 6 ) ); ksession.insert( new SecondClass( "1", "2", "3", "4", "5" ) ); ksession.update( handle, first ); ksession.fireAllRules(); assertEquals( 8, results.size() ); assertEquals( "EQUALS", results.get( 7 ) ); } @Test public void testBooleanWrapper() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_BooleanWrapper.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); Primitives p1 = new Primitives(); ksession.insert( p1 ); ksession.fireAllRules(); assertEquals( 0, results.size() ); Primitives p2 = new Primitives(); p2.setBooleanWrapper( Boolean.FALSE ); ksession.insert( p2 ); ksession.fireAllRules(); assertEquals( 0, results.size() ); Primitives p3 = new Primitives(); p3.setBooleanWrapper( Boolean.TRUE ); ksession.insert( p3 ); ksession.fireAllRules(); assertEquals( 1, results.size() ); } @Test public void testCrossProductRemovingIdentityEquals() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_CrossProductRemovingIdentityEquals.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list1 = new ArrayList(); List list2 = new ArrayList(); session.setGlobal( "list1", list1 ); SpecialString first42 = new SpecialString( "42" ); SpecialString second43 = new SpecialString( "43" ); SpecialString world = new SpecialString( "World" ); session.insert( world ); session.insert( first42 ); session.insert( second43 ); session.fireAllRules(); assertEquals( 6, list1.size() ); list2 = Arrays.asList( new String[]{"42:43", "43:42", "World:42", "42:World", "World:43", "43:World"} ); Collections.sort( list1 ); Collections.sort( list2 ); assertEquals( list2, list1 ); } @Test public void testIterateObjects() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_IterateObjects.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 10 ) ); ksession.fireAllRules(); Iterator events = ksession.getObjects( new ClassObjectFilter( PersonInterface.class ) ).iterator(); assertTrue( events.hasNext() ); assertEquals( 1, results.size() ); assertEquals( results.get( 0 ), events.next() ); } @Test public void testNotInStatelessSession() throws Exception { KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbc.setOption( SequentialOption.YES ); KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( kbc, "test_NotInStatelessSession.drl" ) ); StatelessKnowledgeSession session = createStatelessKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); session.execute( "not integer" ); assertEquals( "not integer", list.get( 0 ) ); } @Test public void testDynamicallyAddInitialFactRule() throws Exception { String rule = "package org.drools.compiler.test\n" + "global java.util.List list\n" + "rule xxx when\n" + " i:Integer()\n" + "then\n" + " list.add(i);\n" + "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); session.insert( new Integer( 5 ) ); session.fireAllRules(); assertEquals( new Integer( 5 ), list.get( 0 ) ); rule = "package org.drools.compiler.test\n" + "global java.util.List list\n" + "rule xxx when\n" + "then\n" + " list.add(\"x\");\n" + "end"; Collection<KnowledgePackage> kpkgs = loadKnowledgePackagesFromString( rule ); kbase.addKnowledgePackages( kpkgs ); session.fireAllRules(); assertEquals( "x", list.get( 1 ) ); } @Test public void testEvalRewriteWithSpecialOperators() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EvalRewriteWithSpecialOperators.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Order order1 = new Order( 10, "Bob" ); final OrderItem item11 = new OrderItem( order1, 1 ); final OrderItem item12 = new OrderItem( order1, 2 ); order1.addItem( item11 ); order1.addItem( item12 ); final Order order2 = new Order( 11, "Bob" ); final OrderItem item21 = new OrderItem( order2, 1 ); final OrderItem item22 = new OrderItem( order2, 2 ); order2.addItem( item21 ); order2.addItem( item22 ); final Order order3 = new Order( 12, "Bob" ); final OrderItem item31 = new OrderItem( order3, 1 ); final OrderItem item32 = new OrderItem( order3, 2 ); final OrderItem item33 = new OrderItem( order3, 3 ); order3.addItem( item31 ); order3.addItem( item32 ); order3.addItem( item33 ); final Order order4 = new Order( 13, "Bob" ); final OrderItem item41 = new OrderItem( order4, 1 ); final OrderItem item42 = new OrderItem( order4, 2 ); order4.addItem( item41 ); order4.addItem( item42 ); final Order order5 = new Order( 14, "Mark" ); final OrderItem item51 = new OrderItem( order5, 1 ); final OrderItem item52 = new OrderItem( order5, 2 ); order5.addItem( item51 ); order5.addItem( item52 ); ksession.insert( order1 ); ksession.insert( item11 ); ksession.insert( item12 ); ksession.insert( order2 ); ksession.insert( item21 ); ksession.insert( item22 ); ksession.insert( order3 ); ksession.insert( item31 ); ksession.insert( item32 ); ksession.insert( item33 ); ksession.insert( order4 ); ksession.insert( item41 ); ksession.insert( item42 ); ksession.insert( order5 ); ksession.insert( item51 ); ksession.insert( item52 ); ksession.fireAllRules(); assertEquals( 9, list.size() ); int index = 0; assertEquals( item11, list.get( index++ ) ); assertEquals( item12, list.get( index++ ) ); assertEquals( item21, list.get( index++ ) ); assertEquals( item22, list.get( index++ ) ); assertEquals( item31, list.get( index++ ) ); assertEquals( item33, list.get( index++ ) ); assertEquals( item41, list.get( index++ ) ); assertEquals( order5, list.get( index++ ) ); assertEquals( order5, list.get( index++ ) ); } @Test public void testImportColision() throws Exception { Collection<KnowledgePackage> kpkgs1 = loadKnowledgePackages( "nested1.drl" ); Collection<KnowledgePackage> kpkgs2 = loadKnowledgePackages( "nested2.drl" ); KnowledgeBase kbase = loadKnowledgeBase(); kbase.addKnowledgePackages( kpkgs1 ); kbase.addKnowledgePackages( kpkgs2 ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); kbase = SerializationHelper.serializeObject( kbase ); ksession.insert( new FirstClass() ); ksession.insert( new SecondClass() ); ksession.insert( new FirstClass.AlternativeKey() ); ksession.insert( new SecondClass.AlternativeKey() ); ksession.fireAllRules(); } @Test public void testAutovivificationOfVariableRestrictions() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_AutoVivificationVR.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton", 10, 8 ) ); ksession.fireAllRules(); assertEquals( 1, results.size() ); } @Test public void testShadowProxyOnCollections() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ShadowProxyOnCollections.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); final Cheesery cheesery = new Cheesery(); ksession.insert( cheesery ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( 1, cheesery.getCheeses().size() ); assertEquals( results.get( 0 ), cheesery.getCheeses().get( 0 ) ); } @Test public void testShadowProxyOnCollections2() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ShadowProxyOnCollections2.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); List list = new ArrayList(); list.add( "example1" ); list.add( "example2" ); MockPersistentSet mockPersistentSet = new MockPersistentSet( false ); mockPersistentSet.addAll( list ); ObjectWithSet objectWithSet = new ObjectWithSet(); objectWithSet.setSet( mockPersistentSet ); ksession.insert( objectWithSet ); ksession.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( "show", objectWithSet.getMessage() ); } @Test public void testNestedAccessors() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NestedAccessors.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Order order1 = new Order( 11, "Bob" ); final OrderItem item11 = new OrderItem( order1, 1 ); final OrderItem item12 = new OrderItem( order1, 2 ); order1.addItem( item11 ); order1.addItem( item12 ); ksession.insert( order1 ); ksession.insert( item11 ); ksession.insert( item12 ); ksession.fireAllRules(); assertEquals( 0, list.size() ); final Order order2 = new Order( 12, "Mark" ); Order.OrderStatus status = new Order.OrderStatus(); status.setActive( true ); order2.setStatus( status ); final OrderItem item21 = new OrderItem( order2, 1 ); final OrderItem item22 = new OrderItem( order2, 2 ); order1.addItem( item21 ); order1.addItem( item22 ); ksession.insert( order2 ); ksession.insert( item21 ); ksession.insert( item22 ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertSame( item21, list.get( 0 ) ); assertSame( item22, list.get( 1 ) ); } @Test public void testWorkingMemoryLoggerWithUnbalancedBranches() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_Logger.drl" ) ); StatefulKnowledgeSession wm = createKnowledgeSession( kbase ); try { wm.fireAllRules(); wm.insert( new Cheese( "a", 10 ) ); wm.insert( new Cheese( "b", 11 ) ); wm.fireAllRules(); } catch ( Exception e ) { e.printStackTrace(); fail( "No exception should be raised " ); } } @Test public void testFromNestedAccessors() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_FromNestedAccessors.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Order order1 = new Order( 11, "Bob" ); final OrderItem item11 = new OrderItem( order1, 1 ); final OrderItem item12 = new OrderItem( order1, 2 ); order1.addItem( item11 ); order1.addItem( item12 ); ksession.insert( order1 ); ksession.insert( item11 ); ksession.insert( item12 ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertSame( order1.getStatus(), list.get( 0 ) ); } @Test public void testFromArrayIteration() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_FromArrayIteration.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); List list = new ArrayList(); session.setGlobal( "list", list ); session.insert( new DomainObjectHolder() ); session.fireAllRules(); assertEquals( 3, list.size() ); assertEquals( "Message3", list.get( 0 ) ); assertEquals( "Message2", list.get( 1 ) ); assertEquals( "Message1", list.get( 2 ) ); } @Test public void testSubNetworks() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_SubNetworks.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); } @Test public void testFinalClass() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_FinalClass.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final PersonFinal bob = new PersonFinal(); bob.setName( "bob" ); bob.setStatus( null ); ksession.insert( bob ); ksession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testEvalRewriteMatches() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_EvalRewriteMatches.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Order order1 = new Order( 14, "Mark" ); final OrderItem item11 = new OrderItem( order1, 1 ); final OrderItem item12 = new OrderItem( order1, 2 ); order1.addItem( item11 ); order1.addItem( item12 ); ksession.insert( order1 ); ksession.insert( item11 ); ksession.insert( item12 ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertTrue( list.contains( item11 ) ); assertTrue( list.contains( item12 ) ); } @Test public void testConsequenceBuilderException() throws Exception { final KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); builder.add( ResourceFactory.newClassPathResource( "test_ConsequenceBuilderException.drl", getClass() ), ResourceType.DRL ); assertTrue( builder.hasErrors() ); } @Test public void testRuntimeTypeCoercion() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_RuntimeTypeCoercion.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final PolymorphicFact fact = new PolymorphicFact( new Integer( 10 ) ); final FactHandle handle = ksession.insert( fact ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( fact.getData(), list.get( 0 ) ); fact.setData( "10" ); ksession.update( handle, fact ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( fact.getData(), list.get( 1 ) ); try { fact.setData( new Boolean( true ) ); ksession.update( handle, fact ); assertEquals( 2, list.size() ); } catch ( ClassCastException cce ) { } } @Test public void testRuntimeTypeCoercion2() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_RuntimeTypeCoercion2.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); final Primitives fact = new Primitives(); fact.setBooleanPrimitive( true ); fact.setBooleanWrapper( new Boolean( true ) ); fact.setObject( new Boolean( true ) ); fact.setCharPrimitive( 'X' ); final FactHandle handle = ksession.insert( fact ); ksession.fireAllRules(); int index = 0; assertEquals( list.toString(), 4, list.size() ); assertEquals( "boolean", list.get( index++ ) ); assertEquals( "boolean wrapper", list.get( index++ ) ); assertEquals( "boolean object", list.get( index++ ) ); assertEquals( "char", list.get( index++ ) ); fact.setBooleanPrimitive( false ); fact.setBooleanWrapper( null ); fact.setCharPrimitive( '\0' ); fact.setObject( new Character( 'X' ) ); ksession.update( handle, fact ); ksession.fireAllRules(); assertEquals( 5, list.size() ); assertEquals( "char object", list.get( index++ ) ); fact.setObject( null ); ksession.update( handle, fact ); ksession.fireAllRules(); assertEquals( 6, list.size() ); assertEquals( "null object", list.get( index++ ) ); } @Test public void testAlphaEvalWithOrCE() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_AlphaEvalWithOrCE.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); FactA a = new FactA(); a.setField1( "a value" ); ksession.insert( a ); ksession.insert( new FactB() ); ksession.insert( new FactC() ); ksession.fireAllRules(); assertEquals( "should not have fired", 0, list.size() ); } @Test public void testModifyRetractAndModifyInsert() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ModifyRetractInsert.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Person bob = new Person( "Bob" ); bob.setStatus( "hungry" ); ksession.insert( bob ); ksession.insert( new Cheese() ); ksession.insert( new Cheese() ); ksession.fireAllRules( 2 ); assertEquals( "should have fired only once", 1, list.size() ); } @Test public void testAlphaCompositeConstraints() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_AlphaCompositeConstraints.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Person bob = new Person( "bob", 30 ); ksession.insert( bob ); ksession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testModifyBlock() throws Exception { doModifyTest( "test_ModifyBlock.drl" ); } @Test public void testModifyBlockWithPolymorphism() throws Exception { doModifyTest( "test_ModifyBlockWithPolymorphism.drl" ); } private void doModifyTest(String drlResource) throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( drlResource ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Person bob = new Person( "Bob" ); bob.setStatus( "hungry" ); Cheese c = new Cheese(); ksession.insert( bob ); ksession.insert( c ); ksession.fireAllRules(); assertEquals( 10, c.getPrice() ); assertEquals( "fine", bob.getStatus() ); } @Test public void testModifyBlockWithFrom() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ModifyBlockWithFrom.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List results = new ArrayList(); ksession.setGlobal( "results", results ); Person bob = new Person( "Bob" ); Address addr = new Address( "abc" ); bob.addAddress( addr ); ksession.insert( bob ); ksession.insert( addr ); ksession.fireAllRules(); // modify worked assertEquals( "12345", addr.getZipCode() ); // chaining worked assertEquals( 1, results.size() ); assertEquals( addr, results.get( 0 ) ); } // this test requires mvel 1.2.19. Leaving it commented until mvel is released. @Test public void testJavaModifyBlock() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_JavaModifyBlock.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); Person bob = new Person( "Bob", 30 ); bob.setStatus( "hungry" ); ksession.insert( bob ); ksession.insert( new Cheese() ); ksession.insert( new Cheese() ); ksession.insert( new OuterClass.InnerClass( 1 ) ); ksession.fireAllRules(); assertEquals( 2, list.size() ); assertEquals( "full", bob.getStatus() ); assertEquals( 31, bob.getAge() ); assertEquals( 2, ((OuterClass.InnerClass) list.get( 1 )).getIntAttr() ); } @Test public void testOrCE() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_OrCE.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); ksession.insert( new Cheese( "brie", 10 ) ); ksession.insert( new Person( "bob" ) ); ksession.fireAllRules(); assertEquals( "should have fired once", 1, list.size() ); } @Test public void testOrWithAndUsingNestedBindings() throws IOException, ClassNotFoundException { String str = ""; str += "package org.drools.compiler\n"; str += "import org.drools.compiler.Person\n"; str += "global java.util.List mlist\n"; str += "global java.util.List jlist\n"; str += "rule rule1 dialect \"mvel\" \n"; str += "when\n"; str += "$a : Person( name == \"a\" )\n"; str += " (or $b : Person( name == \"b1\" )\n"; str += " (and $p : Person( name == \"p2\" )\n"; str += " $b : Person( name == \"b2\" ) )\n"; str += " (and $p : Person( name == \"p3\" )\n"; str += " $b : Person( name == \"b3\" ) )\n"; str += " )\n "; str += "then\n"; str += " mlist.add( $b );\n"; str += "end\n"; str += "rule rule2 dialect \"java\" \n"; str += "when\n"; str += "$a : Person( name == \"a\" )\n"; str += " (or $b : Person( name == \"b1\" )\n"; str += " (and $p : Person( name == \"p2\" )\n"; str += " $b : Person( name == \"b2\" ) )\n"; str += " (and $p : Person( name == \"p3\" )\n"; str += " $b : Person( name == \"b3\" ) )\n"; str += " )\n "; str += "then\n"; str += " jlist.add( $b );\n"; str += "end\n"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( str ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person a = new Person( "a" ); Person b1 = new Person( "b1" ); Person p2 = new Person( "p2" ); Person b2 = new Person( "b2" ); Person p3 = new Person( "p3" ); Person b3 = new Person( "b3" ); List mlist = new ArrayList(); List jlist = new ArrayList(); ksession.setGlobal( "mlist", mlist ); ksession.setGlobal( "jlist", jlist ); ksession.insert( a ); ksession.insert( b1 ); ksession.fireAllRules(); assertEquals( b1, mlist.get( 0 ) ); assertEquals( b1, jlist.get( 0 ) ); ksession.dispose(); ksession = createKnowledgeSession( kbase ); ksession.setGlobal( "mlist", mlist ); ksession.setGlobal( "jlist", jlist ); ksession.insert( a ); ksession.insert( b2 ); ksession.insert( p2 ); ksession.fireAllRules(); assertEquals( b2, mlist.get( 1 ) ); assertEquals( b2, jlist.get( 1 ) ); ksession.dispose(); ksession = createKnowledgeSession( kbase ); ksession.setGlobal( "mlist", mlist ); ksession.setGlobal( "jlist", jlist ); ksession.insert( a ); ksession.insert( b3 ); ksession.insert( p3 ); ksession.fireAllRules(); assertEquals( b3, mlist.get( 2 ) ); assertEquals( b3, jlist.get( 2 ) ); } @Test public void testFieldBindingOnWrongFieldName() { //JBRULES-2527 String str = ""; str += "package org.drools.compiler\n"; str += "import org.drools.compiler.Person\n"; str += "global java.util.List mlist\n"; str += "rule rule1 \n"; str += "when\n"; str += " Person( $f : invalidFieldName, eval( $f != null ) )\n"; str += "then\n"; str += "end\n"; try { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( !kbuilder.hasErrors() ) { fail( "KnowledgeBuilder should have errors" ); } } catch ( Exception e ) { fail( "Exception should not be thrown " ); } str = ""; str += "package org.drools.compiler\n"; str += "import org.drools.compiler.Person\n"; str += "global java.util.List mlist\n"; str += "rule rule1 \n"; str += "when\n"; str += " Person( $f : invalidFieldName, name == ( $f ) )\n"; str += "then\n"; str += "end\n"; try { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( !kbuilder.hasErrors() ) { fail( "KnowledgeBuilder should have errors" ); } } catch ( Exception e ) { e.printStackTrace(); fail( "Exception should not be thrown " ); } } @Test public void testDeepNestedConstraints() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_DeepNestedConstraints.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); ksession.insert( new Person( "bob", "muzzarela" ) ); ksession.insert( new Cheese( "brie", 10 ) ); ksession.insert( new Cheese( "muzzarela", 80 ) ); ksession.fireAllRules(); assertEquals( "should have fired twice", 2, list.size() ); } @Test public void testGetFactHandleEqualityBehavior() throws Exception { KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbc.setOption( EqualityBehaviorOption.EQUALITY ); KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( kbc ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); CheeseEqual cheese = new CheeseEqual( "stilton", 10 ); ksession.insert( cheese ); FactHandle fh = ksession.getFactHandle( new CheeseEqual( "stilton", 10 ) ); assertNotNull( fh ); } @Test public void testGetFactHandleIdentityBehavior() throws Exception { KieBaseConfiguration kbc = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbc.setOption(EqualityBehaviorOption.IDENTITY); KnowledgeBase kbase = SerializationHelper.serializeObject(loadKnowledgeBase(kbc)); StatefulKnowledgeSession ksession = createKnowledgeSession(kbase); CheeseEqual cheese = new CheeseEqual( "stilton", 10 ); ksession.insert( cheese ); FactHandle fh1 = ksession.getFactHandle( new Cheese( "stilton", 10 ) ); assertNull( fh1 ); FactHandle fh2 = ksession.getFactHandle( cheese ); assertNotNull( fh2 ); } @Test public void testOrCEFollowedByEval() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_OrCEFollowedByEval.drl" ) ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final List list = new ArrayList(); ksession.setGlobal( "results", list ); ksession.insert( new FactA( "X" ) ); InternalFactHandle b = (InternalFactHandle) ksession.insert( new FactB( "X" ) ); ksession.fireAllRules(); assertEquals( "should have fired", 2, list.size() ); assertTrue( list.contains( b.getObject() ) ); } @Test public void testNPEOnMVELAlphaPredicates() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_NPEOnMVELPredicate.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List list = new ArrayList(); session.setGlobal( "results", list ); Cheese cheese = new Cheese( "stilton", 10 ); Cheesery cheesery = new Cheesery(); cheesery.addCheese( cheese ); Person bob = new Person( "bob", "stilton" ); Cheese cheese2 = new Cheese(); bob.setCheese( cheese2 ); FactHandle p = session.insert( bob ); FactHandle c = session.insert( cheesery ); session.fireAllRules(); assertEquals( "should not have fired", 0, list.size() ); cheese2.setType( "stilton" ); session.update( p, bob ); session.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testModifyWithLockOnActive() throws Exception { KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBase( "test_ModifyWithLockOnActive.drl" ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List results = new ArrayList(); session.setGlobal( "results", results ); final Person bob = new Person( "Bob", 15 ); final Person mark = new Person( "Mark", 16 ); final Person michael = new Person( "Michael", 14 ); session.insert( bob ); session.insert( mark ); session.insert( michael ); session.getAgenda().getAgendaGroup( "feeding" ).setFocus(); session.fireAllRules( 5 ); assertEquals( 2, ((List) session.getGlobal( "results" )).size() ); } @Test public void testNPEOnParenthesis() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_ParenthesisUsage.drl"); final List<Person> results = new ArrayList<Person>(); final StatefulKnowledgeSession session = createKnowledgeSession( kbase ); session.setGlobal( "results", results ); Person bob = new Person( "Bob", 20 ); bob.setAlive( true ); Person foo = new Person( "Foo", 0 ); foo.setAlive( false ); session.insert( bob ); session.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( bob, results.get( 0 ) ); session.insert( foo ); session.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( foo, results.get( 1 ) ); } @Test public void testEvalWithLineBreaks() throws Exception { final KnowledgeBase kbase = loadKnowledgeBase("test_EvalWithLineBreaks.drl"); final List<Person> results = new ArrayList<Person>(); final StatefulKnowledgeSession session = createKnowledgeSession( kbase ); session.setGlobal( "results", results ); session.insert( Integer.valueOf( 10 ) ); session.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( Integer.valueOf( 10 ), results.get( 0 ) ); } @Test public void testDRLWithoutPackageDeclaration() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_NoPackageDeclaration.drl"); // no package defined, so it is set to the default final FactType factType = kbase.getFactType( "defaultpkg", "Person" ); assertNotNull( factType ); final Object bob = factType.newInstance(); factType.set( bob, "name", "Bob" ); factType.set( bob, "age", Integer.valueOf( 30 ) ); final StatefulKnowledgeSession session = createKnowledgeSession( kbase ); final List results = new ArrayList(); session.setGlobal( "results", results ); session.insert( bob ); session.fireAllRules(); assertEquals( 1, results.size() ); assertEquals( bob, results.get( 0 ) ); } @Test public void testKnowledgeContextJava() { KnowledgeBase kbase = loadKnowledgeBase("test_KnowledgeContextJava.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> list = new ArrayList<String>(); ksession.setGlobal( "list", list ); ksession.insert( new Message() ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( "Hello World", list.get( 0 ) ); } @Test public void testListOfMaps() { KnowledgeBase kbase = loadKnowledgeBase("test_TestMapVariableRef.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Map mapOne = new HashMap<String, Object>(); Map mapTwo = new HashMap<String, Object>(); mapOne.put( "MSG", "testMessage" ); mapTwo.put( "MSGTWO", "testMessage" ); list.add( mapOne ); list.add( mapTwo ); ksession.insert( list ); ksession.fireAllRules(); assertEquals( 3, list.size() ); } @Test public void testKnowledgeContextMVEL() { KnowledgeBase kbase = loadKnowledgeBase("test_KnowledgeContextMVEL.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> list = new ArrayList<String>(); ksession.setGlobal( "list", list ); ksession.insert( new Message() ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( "Hello World", list.get( 0 ) ); } @Test public void testJBRules2055() { KnowledgeBase kbase = loadKnowledgeBase("test_JBRules2055.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> results = new ArrayList<String>(); ksession.setGlobal( "results", results ); ksession.insert( new Cheese( "stilton" ) ); ksession.insert( new Cheese( "brie" ) ); ksession.insert( new Cheese( "muzzarella" ) ); ksession.insert( new Person( "bob", "stilton" ) ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertEquals( "stilton", results.get( 0 ) ); assertEquals( "brie", results.get( 1 ) ); } @Test public void testJBRules2369() { KnowledgeBase kbase = loadKnowledgeBase("test_JBRules2369.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> results = new ArrayList<String>(); ksession.setGlobal( "results", results ); FactA a = new FactA(); FactB b = new FactB( Integer.valueOf( 0 ) ); FactHandle aHandle = ksession.insert( a ); FactHandle bHandle = ksession.insert( b ); ksession.fireAllRules(); assertEquals( 1, results.size() ); ksession.update( aHandle, a ); ksession.fireAllRules(); assertEquals( 2, results.size() ); } @Test public void testInsertionOrder() { KnowledgeBase kbase = loadKnowledgeBase("test_InsertionOrder.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> results = new ArrayList<String>(); ksession.setGlobal( "results", results ); ksession.insert( new Move( 1, 2 ) ); ksession.insert( new Move( 2, 3 ) ); Win win2 = new Win( 2 ); Win win3 = new Win( 3 ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertTrue( results.contains( win2 ) ); assertTrue( results.contains( win3 ) ); ksession.dispose(); ksession = createKnowledgeSession( kbase ); results = new ArrayList<String>(); ksession.setGlobal( "results", results ); // reverse the order of the inserts ksession.insert( new Move( 2, 3 ) ); ksession.insert( new Move( 1, 2 ) ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertTrue( results.contains( win2 ) ); assertTrue( results.contains( win3 ) ); } @Test public void testFireAllWhenFiringUntilHalt() { KnowledgeBase kbase = getKnowledgeBase(); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Runnable fireUntilHalt = new Runnable() { public void run() { ksession.fireUntilHalt(); } }; Runnable fireAllRules = new Runnable() { public void run() { ksession.fireAllRules(); } }; Thread t1 = new Thread( fireUntilHalt ); Thread t2 = new Thread( fireAllRules ); t1.start(); try { Thread.currentThread().sleep( 500 ); } catch ( InterruptedException e ) { } t2.start(); // give the chance for t2 to finish try { Thread.currentThread().sleep( 1000 ); } catch ( InterruptedException e ) { } boolean aliveT2 = t2.isAlive(); ksession.halt(); try { Thread.currentThread().sleep( 1000 ); } catch ( InterruptedException e ) { } boolean aliveT1 = t1.isAlive(); if ( t2.isAlive() ) { t2.interrupt(); } if ( t1.isAlive() ) { t1.interrupt(); } assertFalse( "T2 should have finished", aliveT2 ); assertFalse( "T1 should have finished", aliveT1 ); } @Test public void testFireUntilHaltFailingAcrossEntryPoints() throws Exception { String rule1 = "package org.drools.compiler\n"; rule1 += "global java.util.List list\n"; rule1 += "rule testFireUntilHalt\n"; rule1 += "when\n"; rule1 += " Cheese()\n"; rule1 += " $p : Person() from entry-point \"testep2\"\n"; rule1 += "then \n"; rule1 += " list.add( $p ) ;\n"; rule1 += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(rule1); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final EntryPoint ep = ksession.getEntryPoint( "testep2" ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( new Cheese( "cheddar" ) ); ksession.fireAllRules(); Runnable fireUntilHalt = new Runnable() { public void run() { ksession.fireUntilHalt(); } }; Thread t1 = new Thread( fireUntilHalt ); t1.start(); Thread.currentThread().sleep( 500 ); ep.insert( new Person( "darth" ) ); Thread.currentThread().sleep( 500 ); ksession.halt(); t1.join( 5000 ); boolean alive = t1.isAlive(); if ( alive ) { t1.interrupt(); } assertFalse( "Thread should have died!", alive ); assertEquals( 1, list.size() ); } @Test public void testNetworkBuildErrorAcrossEntryPointsAndFroms() throws Exception { String rule1 = "package org.drools.compiler\n"; rule1 += "global java.util.List list\n"; rule1 += "rule rule1\n"; rule1 += "when\n"; rule1 += " Cheese() from entry-point \"testep\"\n"; rule1 += " $p : Person() from list\n"; rule1 += "then \n"; rule1 += " list.add( \"rule1\" ) ;\n"; rule1 += " insert( $p );\n"; rule1 += "end\n"; rule1 += "rule rule2\n"; rule1 += "when\n"; rule1 += " $p : Person() \n"; rule1 += "then \n"; rule1 += " list.add( \"rule2\" ) ;\n"; rule1 += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(rule1); final StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); final EntryPoint ep = ksession.getEntryPoint( "testep" ); List list = new ArrayList(); ksession.setGlobal( "list", list ); list.add( new Person( "darth" ) ); ep.insert( new Cheese( "cheddar" ) ); ksession.fireAllRules(); assertEquals( 3, list.size() ); } @Test public void testBindingToMissingField() throws Exception { // JBRULES-3047 String rule1 = "package org.drools.compiler\n"; rule1 += "rule rule1\n"; rule1 += "when\n"; rule1 += " Integer( $i : noSuchField ) \n"; rule1 += " eval( $i > 0 )\n"; rule1 += "then \n"; rule1 += "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( rule1.getBytes() ), ResourceType.DRL ); if ( !kbuilder.hasErrors() ) { fail( "this should have errors" ); } } @Test public void testJBRules2140() { KnowledgeBase kbase = loadKnowledgeBase("test_JBRules2140.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<String> results = new ArrayList<String>(); ksession.setGlobal( "results", results ); ksession.fireAllRules(); assertEquals( 2, results.size() ); assertTrue( results.contains( "java" ) ); assertTrue( results.contains( "mvel" ) ); } @Test public void testGeneratedBeansSerializable() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_GeneratedBeansSerializable.drl"); // Retrieve the generated fact type FactType cheeseFact = kbase.getFactType( "org.drools.generatedbeans", "Cheese" ); assertTrue( "Generated beans must be serializable", Serializable.class.isAssignableFrom( cheeseFact.getFactClass() ) ); // Create a new Fact instance Object cheese = cheeseFact.newInstance(); cheeseFact.set( cheese, "type", "stilton" ); // another instance Object cheese2 = cheeseFact.newInstance(); cheeseFact.set( cheese2, "type", "brie" ); // creating a stateful session StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List<Number> results = new ArrayList<Number>(); ksession.setGlobal( "results", results ); // inserting fact ksession.insert( cheese ); ksession.insert( cheese2 ); // firing rules ksession.fireAllRules(); // checking results assertEquals( 1, results.size() ); assertEquals( 2, results.get( 0 ).intValue() ); } @Test public void testAddRemoveListeners() throws Exception { final KnowledgeBase kbase = loadKnowledgeBase("test_AddRemoveListeners.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); // creating listener as a jmock proxy final RuleRuntimeEventListener wmeListener = mock( RuleRuntimeEventListener.class ); ksession.addEventListener( wmeListener ); // listener will be notified of both facts insertion ksession.insert( new Cheese( "stilton" ) ); ksession.insert( wmeListener ); // firing rules will remove listener ksession.fireAllRules(); // inserting another object into the working memory, listener should NOT be notified, // since it is no longer listening. ksession.insert( new Cheese( "brie" ) ); verify( wmeListener, times( 2 ) ).objectInserted( any( org.kie.api.event.rule.ObjectInsertedEvent.class ) ); } @Test public void testInsert() throws Exception { String drl = ""; drl += "package test\n"; drl += "import org.drools.compiler.Person\n"; drl += "import org.drools.compiler.Pet\n"; drl += "import java.util.ArrayList\n"; drl += "global java.util.List list\n"; drl += "rule test\n"; drl += "when\n"; drl += "$person:Person()\n"; drl += "$pets : ArrayList()\n"; drl += " from collect( \n"; drl += " Pet(\n"; drl += " ownerName == $person.name\n"; drl += " )\n"; drl += " )\n"; drl += "then\n"; drl += " list.add( $person );\n"; drl += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( drl ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal("list", list); Person p = new Person( "Toni" ); ksession.insert( p); ksession.insert( new Pet( "Toni" ) ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertSame( p, list.get( 0 ) ); } @Test public void testMemberOfNotWorkingWithOr() throws Exception { String rule = ""; rule += "package org.drools.compiler;\n"; rule += "import java.util.ArrayList;\n"; rule += "import org.drools.compiler.Person;\n"; rule += "rule \"Test Rule\"\n"; rule += "when\n"; rule += " $list: ArrayList() \n"; rule += " ArrayList() \n"; rule += " from collect( \n"; rule += " Person( \n"; rule += " ( \n"; rule += " pet memberOf $list \n"; rule += " ) || ( \n"; rule += " pet == null \n"; rule += " ) \n"; rule += " ) \n"; rule += " )\n"; rule += "then\n"; rule += " System.out.println(\"hello person\");\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); Person toni = new Person( "Toni", 12 ); toni.setPet( new Pet( "Mittens" ) ); session.insert( new ArrayList() ); session.insert( toni ); session.fireAllRules(); } @Test public void testUnNamed() throws Exception { String rule = ""; rule += "package org.drools.compiler;\n"; rule += "import java.util.ArrayList;\n"; rule += "import org.drools.compiler.Person;\n"; rule += "rule \"Test Rule\"\n"; rule += "when\n"; rule += " $list: ArrayList() \n"; rule += " ArrayList() \n"; rule += " from collect( \n"; rule += " Person( \n"; rule += " ( \n"; rule += " pet memberOf $list \n"; rule += " ) || ( \n"; rule += " pet == null \n"; rule += " ) \n"; rule += " ) \n"; rule += " )\n"; rule += "then\n"; rule += " System.out.println(\"hello person\");\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); Person toni = new Person( "Toni", 12 ); toni.setPet( new Pet( "Mittens" ) ); session.insert( new ArrayList() ); session.insert( toni ); session.fireAllRules(); } @Test // this isn't possible, we can only narrow with type safety, not widen. // unless typesafe=false is used public void testAccessFieldsFromSubClass() throws Exception { // Exception in ClassFieldAccessorStore line: 116 String rule = ""; rule += "package org.drools.compiler;\n"; rule += "import org.drools.compiler.Person;\n"; rule += "import org.drools.compiler.Pet;\n"; rule += "import org.drools.compiler.Cat;\n"; rule += "declare Person @typesafe(false) end\n"; rule += "rule \"Test Rule\"\n"; rule += "when\n"; rule += " Person(\n"; rule += " pet.breed == \"Siamise\"\n"; rule += " )\n"; rule += "then\n"; rule += "System.out.println(\"hello person\");\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); Person person = new Person(); person.setPet( new Cat( "Mittens" ) ); session.insert( person ); session.fireAllRules(); } @Test public void testGenericsInRHS() throws Exception { String rule = ""; rule += "package org.drools.compiler;\n"; rule += "import java.util.Map;\n"; rule += "import java.util.HashMap;\n"; rule += "rule \"Test Rule\"\n"; rule += " when\n"; rule += " then\n"; rule += " Map<String,String> map = new HashMap<String,String>();\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); assertNotNull( session ); } @Test public void testAccessingMapValues() throws Exception { String rule = ""; rule += "package org.drools.compiler;\n"; rule += "import org.drools.compiler.Pet;\n"; rule += "rule \"Test Rule\"\n"; rule += " when\n"; rule += " $pet: Pet()\n"; rule += " Pet( \n"; rule += " ownerName == $pet.attributes[\"key\"] \n"; rule += " )\n"; rule += " then\n"; rule += " System.out.println(\"hi pet\");\n"; rule += "end"; KnowledgeBase kbase = SerializationHelper.serializeObject( loadKnowledgeBaseFromString( rule ) ); StatefulKnowledgeSession session = createKnowledgeSession( kbase ); assertNotNull( session ); Pet pet1 = new Pet( "Toni" ); pet1.getAttributes().put( "key", "value" ); Pet pet2 = new Pet( "Toni" ); session.insert( pet1 ); session.insert( pet2 ); session.fireAllRules(); } @Test public void testClassLoaderHits() throws Exception { final KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(); //conf.setOption( ClassLoaderCacheOption.DISABLED ); final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( conf ); kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_GeneratedBeansMVEL.drl" ) ), ResourceType.DRL ); kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_GeneratedBeans.drl" ) ), ResourceType.DRL ); kbuilder.add( ResourceFactory.newInputStreamResource( getClass().getResourceAsStream( "test_NullFieldOnCompositeSink.drl" ) ), ResourceType.DRL ); assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() ); //((CompositeClassLoader)((PackageBuilderConfiguration)conf).getClassLoader()).dumpStats(); } @Test public void testMVELConsequenceWithoutSemiColon1() throws Exception { String drl = ""; drl += "package test\n"; drl += "import org.drools.compiler.Person\n"; drl += "import org.drools.compiler.Pet\n"; drl += "rule test dialect 'mvel'\n"; drl += "when\n"; drl += "$person:Person()\n"; drl += "$pet:Pet()\n"; drl += "then\n"; drl += " delete($person) // some comment\n"; drl += " delete($pet) // another comment\n"; drl += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); // create working memory mock listener RuleRuntimeEventListener wml = Mockito.mock( RuleRuntimeEventListener.class ); ksession.addEventListener( wml ); FactHandle personFH = ksession.insert( new Person( "Toni" ) ); FactHandle petFH = ksession.insert( new Pet( "Toni" ) ); int fired = ksession.fireAllRules(); assertEquals( 1, fired ); // capture the arguments and check that the retracts happened ArgumentCaptor<ObjectDeletedEvent> retracts = ArgumentCaptor.forClass( ObjectDeletedEvent.class ); verify( wml, times( 2 ) ).objectDeleted(retracts.capture()); List<ObjectDeletedEvent> values = retracts.getAllValues(); assertThat( values.get( 0 ).getFactHandle(), is( personFH ) ); assertThat( values.get( 1 ).getFactHandle(), is( petFH ) ); } @Test public void testRuleMetaAttributes() throws Exception { String drl = ""; drl += "package test\n"; drl += "rule \"test meta attributes\"\n"; drl += " @id(1234 ) @author( john_doe ) @text(\"It's an escaped\\\" string\" )\n"; drl += "when\n"; drl += "then\n"; drl += " // some comment\n"; drl += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); Rule rule = kbase.getRule( "test", "test meta attributes" ); assertNotNull( rule ); assertThat( (Integer) rule.getMetaData().get( "id" ), is( 1234 ) ); assertThat( (String) rule.getMetaData().get( "author" ), is( "john_doe" ) ); assertThat( (String) rule.getMetaData().get( "text" ), is( "It's an escaped\" string" ) ); } // following test depends on MVEL: http://jira.codehaus.org/browse/MVEL-212 @Test public void testMVELConsequenceUsingFactConstructors() throws Exception { String drl = ""; drl += "package test\n"; drl += "import org.drools.compiler.Person\n"; drl += "global org.drools.core.runtime.StatefulKnowledgeSession ksession\n"; drl += "rule test dialect 'mvel'\n"; drl += "when\n"; drl += " $person:Person( name == 'mark' )\n"; drl += "then\n"; drl += " // below constructor for Person does not exist\n"; drl += " Person p = new Person( 'bob', 30, 555 )\n"; drl += " ksession.update(ksession.getFactHandle($person), new Person('bob', 30, 999, 453, 534, 534, 32))\n"; drl += "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newReaderResource( new StringReader( drl ) ), ResourceType.DRL ); KnowledgeBuilderErrors errors = kbuilder.getErrors(); assertTrue( kbuilder.hasErrors() ); } @Test public void testRuleChainingWithLogicalInserts() throws Exception { KnowledgeBase kbase = loadKnowledgeBase("test_RuleChaining.drl"); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); // create working memory mock listener RuleRuntimeEventListener wml = Mockito.mock( RuleRuntimeEventListener.class ); org.kie.api.event.rule.AgendaEventListener ael = Mockito.mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( wml ); ksession.addEventListener( ael ); int fired = ksession.fireAllRules(); assertEquals( 3, fired ); // capture the arguments and check that the rules fired in the proper sequence ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> actvs = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael, times( 3 ) ).afterMatchFired(actvs.capture()); List<org.kie.api.event.rule.AfterMatchFiredEvent> values = actvs.getAllValues(); assertThat( values.get( 0 ).getMatch().getRule().getName(), is( "init" ) ); assertThat( values.get( 1 ).getMatch().getRule().getName(), is( "r1" ) ); assertThat( values.get( 2 ).getMatch().getRule().getName(), is( "r2" ) ); verify( ael, never() ).matchCancelled(any(org.kie.api.event.rule.MatchCancelledEvent.class)); verify( wml, times( 2 ) ).objectInserted( any( org.kie.api.event.rule.ObjectInsertedEvent.class ) ); verify( wml, never() ).objectDeleted(any(ObjectDeletedEvent.class)); } @Test public void testOrWithReturnValueRestriction() throws Exception { String fileName = "test_OrWithReturnValue.drl"; KnowledgeBase kbase = loadKnowledgeBase( fileName ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Cheese( "brie", 18 ) ); ksession.insert( new Cheese( "stilton", 8 ) ); ksession.insert( new Cheese( "brie", 28 ) ); int fired = ksession.fireAllRules(); assertEquals( 2, fired ); } @Test public void testFromExprFollowedByNot() { String rule = ""; rule += "package org.drools.compiler;\n"; rule += "global java.util.List list;\n"; rule += "rule \"Rule 1\"\n"; rule += " when\n"; rule += " p : Person ($var: pet )\n"; rule += " Pet () from $var\n"; rule += " not Pet ()\n"; rule += " then\n"; rule += " list.add( p );\n"; rule += "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(rule); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Person p = new Person(); p.setPet( new Pet() ); ksession.insert( p ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertSame(p, list.get(0)); } @Test public void testLastMemoryEntryNotBug() { // JBRULES-2809 // This occurs when a blocker is the last in the node's memory, or if there is only one fact in the node // And it gets no opportunity to rematch with itself String str = ""; str += "package org.simple \n"; str += "import " + A.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule x1 \n"; str += "when \n"; str += " $s : String( this == 'x1' ) \n"; str += " not A( this != null ) \n"; str += "then \n"; str += " list.add(\"fired x1\"); \n"; str += "end \n"; str += "rule x2 \n"; str += "when \n"; str += " $s : String( this == 'x2' ) \n"; str += " not A( field1 == $s, this != null ) \n"; // this ensures an index bucket str += "then \n"; str += " list.add(\"fired x2\"); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( "x1" ); ksession.insert( "x2" ); A a1 = new A( "x1", null ); A a2 = new A( "x2", null ); FactHandle fa1 = ksession.insert( a1 ); FactHandle fa2 = ksession.insert( a2 ); // make sure the 'exists' is obeyed when fact is cycled causing add/remove node memory ksession.update( fa1, a1 ); ksession.update( fa2, a2 ); ksession.fireAllRules(); assertEquals( 0, list.size() ); ksession.dispose(); } @Test public void testLastMemoryEntryExistsBug() { // JBRULES-2809 // This occurs when a blocker is the last in the node's memory, or if there is only one fact in the node // And it gets no opportunity to rematch with itself String str = ""; str += "package org.simple \n"; str += "import " + A.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule x1 \n"; str += "when \n"; str += " $s : String( this == 'x1' ) \n"; str += " exists A( this != null ) \n"; str += "then \n"; str += " list.add(\"fired x1\"); \n"; str += "end \n"; str += "rule x2 \n"; str += "when \n"; str += " $s : String( this == 'x2' ) \n"; str += " exists A( field1 == $s, this != null ) \n"; // this ensures an index bucket str += "then \n"; str += " list.add(\"fired x2\"); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( "x1" ); ksession.insert( "x2" ); A a1 = new A( "x1", null ); A a2 = new A( "x2", null ); FactHandle fa1 = ksession.insert( a1 ); FactHandle fa2 = ksession.insert( a2 ); // make sure the 'exists' is obeyed when fact is cycled causing add/remove node memory ksession.update( fa1, a1 ); ksession.update( fa2, a2 ); ksession.fireAllRules(); assertEquals( 2, list.size() ); ksession.dispose(); } @Test public void testNotIterativeModifyBug() { // JBRULES-2809 // This bug occurs when a tuple is modified, the remove/add puts it onto the memory end // However before this was done it would attempt to find the next tuple, starting from itself // This meant it would just re-add itself as the blocker, but then be moved to end of the memory // If this tuple was then removed or changed, the blocked was unable to check previous tuples. String str = ""; str += "package org.simple \n"; str += "import " + A.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule xxx \n"; str += "when \n"; str += " $f1 : A() \n"; str += " not A(this != $f1, eval(field2 == $f1.getField2())) \n"; str += " eval( !$f1.getField1().equals(\"1\") ) \n"; str += "then \n"; str += " list.add($f1); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); A a1 = new A( "2", "2" ); A a2 = new A( "1", "2" ); A a3 = new A( "1", "2" ); FactHandle fa1 = ksession.insert( a1 ); FactHandle fa2 = ksession.insert( a2 ); FactHandle fa3 = ksession.insert( a3 ); ksession.fireAllRules(); // a1 is blocked by a2 assertEquals( 0, list.size() ); // modify a2, so that a1 is now blocked by a3 a2.setField2( "1" ); // Do ksession.update( fa2, a2 ); a2.setField2( "2" ); // Undo ksession.update( fa2, a2 ); // modify a3 to cycle, so that it goes on the memory end, but in a previous bug still blocked a1 ksession.update( fa3, a3 ); a3.setField2( "1" ); // Do ksession.update( fa3, a3 ); ksession.fireAllRules(); assertEquals( 0, list.size() ); // this should still now blocked by a2, but bug from previous update hanging onto blocked ksession.dispose(); } @Test public void testModifyWithLiaToEval() { String str = ""; str += "package org.simple \n"; str += "import " + Person.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule xxx \n"; str += "when \n"; str += " $p : Person() \n"; str += " eval( $p.getAge() > 30 ) \n"; str += "then \n"; str += " list.add($p); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); Person p1 = new Person( "darth", 25 ); FactHandle fh = ksession.insert( p1 ); ksession.fireAllRules(); assertEquals( 0, list.size() ); p1.setAge( 35 ); ksession.update( fh, p1 ); ksession.fireAllRules(); assertEquals( 1, list.size() ); ksession.dispose(); } @Test public void testExistsIterativeModifyBug() { // JBRULES-2809 // This bug occurs when a tuple is modified, the remove/add puts it onto the memory end // However before this was done it would attempt to find the next tuple, starting from itself // This meant it would just re-add itself as the blocker, but then be moved to end of the memory // If this tuple was then removed or changed, the blocked was unable to check previous tuples. String str = ""; str += "package org.simple \n"; str += "import " + A.class.getCanonicalName() + "\n"; str += "global java.util.List list \n"; str += "rule xxx \n"; str += "when \n"; str += " $f1 : A() \n"; str += " exists A(this != $f1, eval(field2 == $f1.getField2())) \n"; str += " eval( !$f1.getField1().equals(\"1\") ) \n"; str += "then \n"; str += " list.add($f1); \n"; str += "end \n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); List list = new ArrayList(); ksession.setGlobal( "list", list ); A a1 = new A( "2", "2" ); A a2 = new A( "1", "2" ); A a3 = new A( "1", "2" ); FactHandle fa1 = ksession.insert( a1 ); FactHandle fa2 = ksession.insert( a2 ); FactHandle fa3 = ksession.insert( a3 ); // a2, a3 are blocked by a1 // modify a1, so that a1,a3 are now blocked by a2 a1.setField2( "1" ); // Do ksession.update( fa1, a1 ); a1.setField2( "2" ); // Undo ksession.update( fa1, a1 ); // modify a2, so that a1,a2 are now blocked by a3 a2.setField2( "1" ); // Do ksession.update( fa2, a2 ); a2.setField2( "2" ); // Undo ksession.update( fa2, a2 ); // modify a3 to cycle, so that it goes on the memory end, but in a previous bug still blocked a1 ksession.update( fa3, a3 ); a3.setField2( "1" ); // Do ksession.update( fa3, a3 ); ksession.fireAllRules(); assertEquals( 1, list.size() ); // a2 should still be blocked by a1, but bug from previous update hanging onto blocked ksession.dispose(); } @Test public void testBindingsWithOr() throws InstantiationException, IllegalAccessException { // JBRULES-2917: matching of field==v1 || field==v2 breaks when variable binding is added String str = "package org.drools.compiler\n" + "declare Assignment\n" + " source : int\n" + " target : int\n" + "end\n" + "rule ValueIsTheSame1\n" + "when\n" + " Assignment( $t: target == 10 || target == source )\n" + "then\n" + "end\n" + "rule ValueIsTheSame2\n" + "when\n" + " Assignment( $t: target == source || target == 10 )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); FactType asgType = kbase.getFactType( "org.drools.compiler", "Assignment" ); Object asg = asgType.newInstance(); asgType.set( asg, "source", 10 ); asgType.set( asg, "target", 10 ); ksession.insert( asg ); int rules = ksession.fireAllRules(); ksession.dispose(); assertEquals( 2, rules ); } @Test public void testMVELClassReferences() throws InstantiationException, IllegalAccessException { String str = "package org.drools.compiler\n" + "declare Assignment\n" + " source : Class\n" + " target : Class\n" + "end\n" + "rule ObjectIsAssignable1\n" + "when\n" + " Assignment( $t: target == java.lang.Object.class || target == source )\n" + "then\n" + "end\n" + "rule ObjectIsAssignable2\n" + "when\n" + " Assignment( $t: target == source || target == java.lang.Object.class )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); FactType asgType = kbase.getFactType( "org.drools.compiler", "Assignment" ); Object asg = asgType.newInstance(); asgType.set( asg, "source", Object.class ); asgType.set( asg, "target", Object.class ); ksession.insert( asg ); int rules = ksession.fireAllRules(); ksession.dispose(); assertEquals( 2, rules ); } @Test public void testNotMatchesSucceeds() throws InstantiationException, IllegalAccessException { // JBRULES-2914: Rule misfires due to "not matches" not working String str = "package org.drools.compiler\n" + "rule NotMatches\n" + "when\n" + " Person( name == null || (name != null && name not matches \"-.{2}x.*\" ) )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person p = new Person( "-..x..xrwx" ); ksession.insert( p ); int rules = ksession.fireAllRules(); ksession.dispose(); assertEquals( 0, rules ); } @Test public void testNotMatchesFails() throws InstantiationException, IllegalAccessException { // JBRULES-2914: Rule misfires due to "not matches" not working String str = "package org.drools.compiler\n" + "rule NotMatches\n" + "when\n" + " Person( name == null || (name != null && name not matches \"-.{2}x.*\" ) )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person p = new Person( "d..x..xrwx" ); ksession.insert( p ); int rules = ksession.fireAllRules(); ksession.dispose(); assertEquals( 1, rules ); } @Test public void testNotEqualsOperator() { // JBRULES-3003: restriction evaluation returns 'false' for "trueField != falseField" String str = "package org.drools.compiler\n" + "rule NotEquals\n" + "when\n" + " Primitives( booleanPrimitive != booleanWrapper )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Primitives p = new Primitives(); p.setBooleanPrimitive( true ); p.setBooleanWrapper( Boolean.FALSE ); ksession.insert( p ); int rules = ksession.fireAllRules(); ksession.dispose(); assertEquals( 1, rules ); } @Test public void testNotContainsOperator() { // JBRULES-2404: "not contains" operator doesn't work on nested fields String str = "package org.drools.compiler\n" + "rule NotContains\n" + "when\n" + " $oi : OrderItem( )\n" + " $o : Order( items.values() not contains $oi )" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Order order1 = new Order( 1, "XYZ" ); Order order2 = new Order( 2, "ABC" ); OrderItem item11 = new OrderItem( order1, 1 ); order1.addItem( item11 ); OrderItem item21 = new OrderItem( order2, 1 ); order2.addItem( item21 ); ksession.insert( order1 ); ksession.insert( item11 ); // should not fire, as item11 is contained in order1.items int rules = ksession.fireAllRules(); assertEquals( 0, rules ); // should fire as item21 is not contained in order1.items ksession.insert( item21 ); rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testOrWithFrom() { // JBRULES-2274: Rule does not fire as expected using deep object model and nested 'or' clause String str = "package org.drools.compiler\n" + "rule NotContains\n" + "when\n" + " $oi1 : OrderItem( )\n" + " $o1 : Order(number == 1) from $oi1.order; \n" + " ( eval(true) or eval(true) )\n" + " $oi2 : OrderItem( )\n" + " $o2 : Order(number == 2) from $oi2.order; \n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Order order1 = new Order( 1, "XYZ" ); Order order2 = new Order( 2, "ABC" ); OrderItem item11 = new OrderItem( order1, 1 ); order1.addItem( item11 ); OrderItem item21 = new OrderItem( order2, 1 ); order2.addItem( item21 ); ksession.insert( order1 ); ksession.insert( order2 ); ksession.insert( item11 ); ksession.insert( item21 ); int rules = ksession.fireAllRules(); assertEquals( 2, rules ); } @Test public void testSoundsLike() { // JBRULES-2991: Operator soundslike is broken String str = "package org.drools.compiler\n" + "rule SoundsLike\n" + "when\n" + " Person( name soundslike \"Bob\" )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Person( "Bob" ) ); ksession.insert( new Person( "Mark" ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testAgendaFilter1() { String str = "package org.drools.compiler\n" + "rule Aaa when then end\n" + "rule Bbb when then end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); RuleNameStartsWithAgendaFilter af = new RuleNameStartsWithAgendaFilter( "B" ); int rules = ksession.fireAllRules( af ); assertEquals( 1, rules ); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael ).afterMatchFired(arg.capture()); assertThat( arg.getValue().getMatch().getRule().getName(), is( "Bbb" ) ); } @Test public void testAgendaFilter2() { String str = "package org.drools.compiler\n" + "rule Aaa when then end\n" + "rule Bbb when then end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); RuleNameEndsWithAgendaFilter af = new RuleNameEndsWithAgendaFilter( "a" ); int rules = ksession.fireAllRules( af ); assertEquals( 1, rules ); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael ).afterMatchFired(arg.capture()); assertThat( arg.getValue().getMatch().getRule().getName(), is( "Aaa" ) ); } @Test public void testAgendaFilter3() { String str = "package org.drools.compiler\n" + "rule Aaa when then end\n" + "rule Bbb when then end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); RuleNameMatchesAgendaFilter af = new RuleNameMatchesAgendaFilter( ".*b." ); int rules = ksession.fireAllRules( af ); assertEquals( 1, rules ); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael ).afterMatchFired(arg.capture()); assertThat( arg.getValue().getMatch().getRule().getName(), is( "Bbb" ) ); } @Test public void testAgendaFilter4() { String str = "package org.drools.compiler\n" + "rule Aaa when then end\n" + "rule Bbb when then end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); RuleNameEqualsAgendaFilter af = new RuleNameEqualsAgendaFilter( "Aaa" ); int rules = ksession.fireAllRules( af ); assertEquals( 1, rules ); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> arg = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael ).afterMatchFired(arg.capture()); assertThat( arg.getValue().getMatch().getRule().getName(), is( "Aaa" ) ); } @Test public void testRestrictionsWithOr() { // JBRULES-2203: NullPointerException When Using Conditional Element "or" in LHS Together with a Return Value Restriction String str = "package org.drools.compiler\n" + "rule \"test\"\n" + "when\n" + " Cheese( price == (1 + 1) );\n" + " (or eval(true);\n" + " eval(true);\n" + " )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Cheese( "Stilton", 2 ) ); int rules = ksession.fireAllRules(); assertEquals( 2, rules ); } @Test public void testMapModel() { String str = "package org.drools.compiler\n" + "import java.util.Map\n" + "rule \"test\"\n" + "when\n" + " Map( type == \"Person\", name == \"Bob\" );\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Map<String, String> mark = new HashMap<String, String>(); mark.put( "type", "Person" ); mark.put( "name", "Mark" ); ksession.insert( mark ); int rules = ksession.fireAllRules(); assertEquals( 0, rules ); Map<String, String> bob = new HashMap<String, String>(); bob.put( "type", "Person" ); bob.put( "name", "Bob" ); ksession.insert( bob ); rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testConstraintExpression() { String str = "package org.drools.compiler\n" + "rule \"test\"\n" + "when\n" + " Person( 5*2 > 3 );\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Person( "Bob" ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testMethodConstraint() { String str = "package org.drools.compiler\n" + "rule \"test\"\n" + "when\n" + " Person( isAlive() );\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person person = new Person( "Bob" ); person.setAlive( true ); ksession.insert( person ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testComplexOperator() { String str = "package org.drools.compiler\n" + "rule \"test in\"\n" + "when\n" + " Person( $name : name in (\"bob\", \"mark\") )\n" + "then\n" + " boolean test = $name != null;" + "end\n" + "rule \"test not in\"\n" + "when\n" + " Person( $name : name not in (\"joe\", \"doe\") )\n" + "then\n" + " boolean test = $name != null;" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person person = new Person( "bob" ); ksession.insert( person ); int rules = ksession.fireAllRules(); assertEquals( 2, rules ); } @Test public void testEventsInDifferentPackages() { String str = "package org.drools.compiler.test\n" + "import org.drools.compiler.*\n" + "declare StockTick\n" + " @role( event )\n" + "end\n" + "rule r1\n" + "when\n" + "then\n" + " StockTick st = new StockTick();\n" + " st.setCompany(\"RHT\");\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testClassTypeAttributes() { String str = "package org.drools.compiler\n" + "rule r1\n" + "when\n" + " Primitives( classAttr == null )" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Primitives() ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } public void testFreeFormExpressions() { String str = "package org.drools.compiler\n" + "rule r1\n" + "when\n" + " $p1 : Person( age > 2*10, 10 < age )\n" + " $p2 : Person( age > 2*$p1.age )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Person bob = new Person( "bob", 30 ); Person mark = new Person( "mark", 61 ); ksession.insert( bob ); ksession.insert( mark ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testFreeFormExpressions2() { String str = "package org.drools.compiler\n" + "rule r1\n" + "when\n" + " $p1 : Cell( row == 2 )\n" + " $p2 : Cell( row == $p1.row + 1, row == ($p1.row + 1), row == 1 + $p1.row, row == (1 + $p1.row) )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Cell c1 = new Cell( 1, 2, 0 ); Cell c2 = new Cell( 1, 3, 0 ); ksession.insert( c1 ); ksession.insert( c2 ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testAddMissingResourceToPackageBuilder() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); try { kbuilder.add( ResourceFactory.newClassPathResource("some.rf"), ResourceType.DRL ); fail( "adding a missing resource should fail" ); } catch ( RuntimeException e ) { } try { kbuilder.add( ResourceFactory.newClassPathResource( "some.rf" ), ResourceType.DRF ); fail( "adding a missing resource should fail" ); } catch ( RuntimeException e ) { } } @Test public void testJBRULES_2995() { String str = "package org.drools.compiler\n" + "rule r1\n" + "when\n" + " Primitives( classAttr == java.lang.String.class, \n" + " eval(classAttr.equals( java.lang.String.class ) ),\n" + " classAttr == String.class )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Primitives primitives = new Primitives(); primitives.setClassAttr( String.class ); ksession.insert( primitives ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testJBRULES2872() { String str = "package org.drools.compiler.test\n" + "import org.drools.compiler.FactA\n" + "rule X\n" + "when\n" + " FactA( enumVal == TestEnum.ONE || == TestEnum.TWO )\n" + "then\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); KnowledgeBuilderErrors errors = kbuilder.getErrors(); logger.info( errors.toString() ); assertEquals( 1, errors.size() ); KnowledgeBuilderError error = errors.iterator().next(); assertEquals( 5, error.getLines()[0] ); } @Test public void testJBRULES3030() { String str = "package org.drools.compiler\n" + "rule X\n" + "when\n" + " $gp : GrandParent()" + " $ch : ChildHolder( child == $gp )\n" + "then\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertFalse( kbuilder.hasErrors() ); } @Test public void testJBRULES3111() { String str = "package org.drools.compiler\n" + "declare Bool123\n" + " bool1 : boolean\n" + " bool2 : boolean\n" + " bool3 : boolean\n" + "end\n" + "declare Thing\n" + " name : String\n" + " bool123 : Bool123\n" + "end\n" + "rule kickOff\n" + "when\n" + "then\n" + " insert( new Thing( \"one\", new Bool123( true, false, false ) ) );\n" + " insert( new Thing( \"two\", new Bool123( false, false, false ) ) );\n" + " insert( new Thing( \"three\", new Bool123( false, false, false ) ) );\n" + "end\n" + "rule r1\n" + "when\n" + " $t: Thing( bool123.bool1 == true )\n" + "then\n" + "end\n" + "rule r2\n" + "when\n" + " $t: Thing( bool123.bool2 == true )\n" + "then\n" + "end\n" + "rule r3\n" + "when\n" + " $t: Thing( bool123.bool3 == true )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); int rulesFired = ksession.fireAllRules(); assertEquals( 2, rulesFired ); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> captor = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael, times( 2 ) ).afterMatchFired(captor.capture()); List<org.kie.api.event.rule.AfterMatchFiredEvent> aafe = captor.getAllValues(); Assert.assertThat( aafe.get( 0 ).getMatch().getRule().getName(), is( "kickOff" ) ); Assert.assertThat( aafe.get( 1 ).getMatch().getRule().getName(), is( "r1" ) ); Object value = aafe.get( 1 ).getMatch().getDeclarationValue( "$t" ); String name = (String) MVEL.eval( "$t.name", Collections.singletonMap( "$t", value ) ); Assert.assertThat( name, is( "one" ) ); } @Test public void testBigLiterals() { String str = "package org.drools.compiler\n" + "rule X\n" + "when\n" + " Primitives( bigInteger == 10I, bigInteger < (50I), bigDecimal == 10B, bigDecimal < (50B) )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); Primitives p = new Primitives(); p.setBigDecimal( BigDecimal.valueOf( 10 ) ); p.setBigInteger( BigInteger.valueOf( 10 ) ); ksession.insert( p ); int rulesFired = ksession.fireAllRules(); assertEquals( 1, rulesFired ); } @Test public void testNonBooleanConstraint() { String str = "package org.drools.compiler\n" + "import java.util.List\n" + "rule \"test\"\n" + "when\n" + " $p1: Person( name + name )\n" + "then\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); logger.info( kbuilder.getErrors().toString() ); } @Test public void testModifyJava() { String str = "package org.drools.compiler\n" + "import java.util.List\n" + "rule \"test\"\n" + "when\n" + " $l : List() from collect ( Person( alive == false ) );\n" + "then\n" + " for(Object p : $l ) {\n" + " Person p2 = (Person) p;\n" + " modify(p2) { setAlive(true) }\n" + " }\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); Assert.assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() ); } @Test public void testModifyMVEL() { String str = "package org.drools.compiler\n" + "import java.util.List\n" + "rule \"test\"\n" + " dialect \"mvel\"\n" + "when\n" + " $l : List() from collect ( Person( alive == false ) );\n" + "then\n" + " for(Object p : $l ) {\n" + " Person p2 = (Person) p;\n" + " modify(p2) { setAlive(true) }\n" + " }\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); Assert.assertFalse( kbuilder.getErrors().toString(), kbuilder.hasErrors() ); } @Test public void testPackageNameOfTheBeast() throws Exception { // JBRULES-2749 Various rules stop firing when they are in unlucky packagename and there is a function declared String ruleFileContent1 = "package org.drools.integrationtests;\n" + "function void myFunction() {\n" + "}\n" + "declare MyDeclaredType\n" + " someProperty: boolean\n" + "end"; String ruleFileContent2 = "package de.something;\n" + // FAILS // String ruleFileContent2 = "package de.somethinga;\n" + // PASSES // String ruleFileContent2 = "package de.somethingb;\n" + // PASSES // String ruleFileContent2 = "package de.somethingc;\n" + // PASSES // String ruleFileContent2 = "package de.somethingd;\n" + // PASSES // String ruleFileContent2 = "package de.somethinge;\n" + // FAILS // String ruleFileContent2 = "package de.somethingf;\n" + // FAILS // String ruleFileContent2 = "package de.somethingg;\n" + // FAILS "import org.drools.integrationtests.*;\n" + "rule \"CheckMyDeclaredType\"\n" + " when\n" + " MyDeclaredType()\n" + " then\n" + " insertLogical(\"THIS-IS-MY-MARKER-STRING\");\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( ruleFileContent1, ruleFileContent2 ); StatefulKnowledgeSession knowledgeSession = createKnowledgeSession( kbase ); final FactType myDeclaredFactType = kbase.getFactType( "org.drools.integrationtests", "MyDeclaredType" ); Object myDeclaredFactInstance = myDeclaredFactType.newInstance(); knowledgeSession.insert( myDeclaredFactInstance ); int rulesFired = knowledgeSession.fireAllRules(); assertEquals( 1, rulesFired ); knowledgeSession.dispose(); } @Test public void testGUVNOR578_2() throws Exception { MapBackedClassLoader loader = new MapBackedClassLoader( this.getClass().getClassLoader() ); JarInputStream jis = new JarInputStream( this.getClass().getResourceAsStream( "/primespoc.jar" ) ); JarEntry entry = null; byte[] buf = new byte[1024]; int len = 0; while ( (entry = jis.getNextJarEntry()) != null ) { if ( !entry.isDirectory() ) { ByteArrayOutputStream out = new ByteArrayOutputStream(); while ( (len = jis.read( buf )) >= 0 ) { out.write( buf, 0, len ); } loader.addResource( entry.getName(), out.toByteArray() ); } } List<JarInputStream> jarInputStreams = new ArrayList<JarInputStream>(); jarInputStreams.add( jis ); KnowledgeBuilderConfiguration conf = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, loader); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(conf); String header = "import fr.gouv.agriculture.dag.agorha.business.primes.SousPeriodePrimeAgent\n"; kbuilder.add(ResourceFactory.newByteArrayResource(header.getBytes()), ResourceType.DRL); assertFalse( kbuilder.hasErrors() ); String passingRule = "rule \"rule1\"\n" + "dialect \"mvel\"\n" + "when\n" + "SousPeriodePrimeAgent( echelle == \"abc\" )" + "then\n" + "end\n"; String failingRule = "rule \"rule2\"\n" + "dialect \"mvel\"\n" + "when\n" + "SousPeriodePrimeAgent( quotiteRemuneration == 123 , echelle == \"abc\" )" + "then\n" + "end\n"; kbuilder.add(ResourceFactory.newByteArrayResource(passingRule.getBytes()), ResourceType.DRL); assertFalse( kbuilder.hasErrors() ); kbuilder.add(ResourceFactory.newByteArrayResource(failingRule.getBytes()), ResourceType.DRL); assertFalse( kbuilder.hasErrors() ); } @Test public void testJBRULES3323() throws Exception { //adding rules. it is important to add both since they reciprocate StringBuilder rule = new StringBuilder(); rule.append( "package de.orbitx.accumulatetesettest;\n" ); rule.append( "import java.util.Set;\n" ); rule.append( "import java.util.HashSet;\n" ); rule.append( "import org.drools.compiler.Foo;\n" ); rule.append( "import org.drools.compiler.Bar;\n" ); rule.append( "rule \"Sub optimal foo parallelism - this rule is causing NPE upon reverse\"\n" ); rule.append( "when\n" ); rule.append( "$foo : Foo($leftId : id, $leftBar : bar != null)\n" ); rule.append( "$fooSet : Set()\n" ); rule.append( "from accumulate ( Foo(id > $leftId, bar != null && != $leftBar, $bar : bar),\n" ); rule.append( "collectSet( $bar ) )\n" ); rule.append( "then\n" ); rule.append( "//System.out.println(\"ok\");\n" ); rule.append( "end\n" ); //building stuff KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); //adding test data Bar[] barList = new Bar[3]; for ( int i = 0; i < barList.length; i++ ) { barList[i] = new Bar( String.valueOf( i ) ); } Foo[] fooList = new Foo[4]; for ( int i = 0; i < fooList.length; i++ ) { fooList[i] = new Foo( String.valueOf( i ), i == 3 ? barList[2] : barList[i] ); } for ( Foo foo : fooList ) { ksession.insert( foo ); } //the NPE is caused by exactly this sequence. of course there are more sequences but this //appears to be the most short one int[] magicFoos = new int[]{3, 3, 1, 1, 0, 0, 2, 2, 1, 1, 0, 0, 3, 3, 2, 2, 3, 1, 1}; int[] magicBars = new int[]{1, 2, 0, 1, 1, 0, 1, 2, 2, 1, 2, 0, 0, 2, 0, 2, 0, 0, 1}; //upon final rule firing an NPE will be thrown in org.drools.core.rule.Accumulate for ( int i = 0; i < magicFoos.length; i++ ) { Foo tehFoo = fooList[magicFoos[i]]; FactHandle fooFactHandle = ksession.getFactHandle( tehFoo ); tehFoo.setBar( barList[magicBars[i]] ); ksession.update( fooFactHandle, tehFoo ); ksession.fireAllRules(); } ksession.dispose(); } @Test public void testJBRULES3326() throws Exception { StringBuilder rule = new StringBuilder(); rule.append( "package org.drools.compiler\n" ); rule.append( "rule X\n" ); rule.append( "when\n" ); rule.append( " Message(!!!false)\n" ); rule.append( "then\n" ); rule.append( "end\n" ); //building stuff KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Message( "test" ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); ksession.dispose(); } @Test public void testDispose() throws Exception { StringBuilder rule = new StringBuilder(); rule.append( "package org.drools.compiler\n" ); rule.append( "rule X\n" ); rule.append( "when\n" ); rule.append( " Message()\n" ); rule.append( "then\n" ); rule.append( "end\n" ); //building stuff KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Message( "test" ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); ksession.dispose(); try { // the following should raise an IllegalStateException as the session was already disposed ksession.fireAllRules(); fail( "An IllegallStateException should have been raised as the session was disposed before the method call." ); } catch ( IllegalStateException ise ) { // success } } @Test public void testInnerEnum() throws Exception { StringBuilder rule = new StringBuilder(); rule.append( "package org.drools.compiler\n" ); rule.append( "rule X\n" ); rule.append( "when\n" ); rule.append( " Triangle( type == Triangle.Type.UNCLASSIFIED )\n" ); rule.append( "then\n" ); rule.append( "end\n" ); //building stuff KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); ksession.insert( new Triangle() ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); ksession.dispose(); } @Test public void testNestedAccessors2() throws Exception { String rule = "package org.drools.compiler\n" + "rule 'rule1'" + " salience 10\n" + "when\n" + " Cheesery( typedCheeses[0].type == 'stilton' );\n" + "then\n" + "end\n" + "rule 'rule2'\n" + "when\n" + " Cheesery( typedCheeses[0].price == 10 );\n" + "then\n" + "end"; //building stuff KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); Cheesery c1 = new Cheesery(); c1.addCheese( new Cheese( "stilton", 20 ) ); Cheesery c2 = new Cheesery(); c2.addCheese( new Cheese( "brie", 10 ) ); Cheesery c3 = new Cheesery(); c3.addCheese( new Cheese( "muzzarella", 30 ) ); ksession.insert( c1 ); ksession.insert( c2 ); ksession.insert( c3 ); ksession.fireAllRules(); ArgumentCaptor<org.kie.api.event.rule.AfterMatchFiredEvent> captor = ArgumentCaptor.forClass( org.kie.api.event.rule.AfterMatchFiredEvent.class ); verify( ael, times( 2 ) ).afterMatchFired(captor.capture()); List<org.kie.api.event.rule.AfterMatchFiredEvent> values = captor.getAllValues(); assertThat( (Cheesery) values.get( 0 ).getMatch().getObjects().get( 0 ), is( c1 ) ); assertThat( (Cheesery) values.get( 1 ).getMatch().getObjects().get( 0 ), is( c2 ) ); ksession.dispose(); } @Test public void testMVELConstraintsWithFloatingPointNumbersInScientificNotation() { String rule = "package test; \n" + "dialect \"mvel\"\n" + "global java.util.List list;" + "\n" + "declare Bean \n" + " field : double \n" + "end \n" + "\n" + "rule \"Init\" \n" + "when \n" + "then \n" + "\t insert( new Bean( 1.0E-2 ) ); \n" + "end \n" + "\n" + "rule \"Check\" \n" + "when \n" + "\t Bean( field < 1.0E-1 ) \n" + "then \n" + "\t list.add( \"OK\" ); \n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession(); List<String> list = new ArrayList<String>(); kSession.setGlobal( "list", list ); kSession.fireAllRules(); assertEquals( 1, list.size() ); } public static class A { private String field1; private String field2; public A(String field1, String field2) { this.field1 = field1; this.field2 = field2; } public String getField1() { return field1; } public void setField1(String field1) { this.field1 = field1; } public String getField2() { return field2; } public void setField2(String field2) { this.field2 = field2; } public String toString() { return "A) " + field1 + ":" + field2; } } @Test public void testMvelDoubleInvocation() throws Exception { String rule = "package org.drools.compiler\n" + "import " + MiscTest.class.getName() + ".TestUtility;\n" + "import " + MiscTest.class.getName() + ".TestFact;\n" + "rule \"First Rule\"\n" + " when\n" + " $tf : TestFact(TestUtility.utilMethod(s, \"Value1\") == true\n" + " && i > 0\n" + " )\n" + " then\n" + " System.out.println(\"First Rule Fires\");\n" + "end\n" + "\n" + "rule \"Second Rule\"\n" + " when\n" + " $tf : TestFact(TestUtility.utilMethod(s, \"Value2\") == true\n" + " && i > 0\n" + " )\n" + " then\n" + " System.out.println(\"Second Rule Fires\");\n" + "end\n" + "\n" + "rule \"Third Rule\"\n" + " when\n" + " $tf : TestFact(TestUtility.utilMethod(s, \"Value3\") == true\n" + " && i > 0\n" + " )\n" + " then\n" + " System.out.println(\"Third Rule Fires\");\n" + "end "; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule.toString() ); StatefulKnowledgeSession ksession = createKnowledgeSession( kbase ); TestFact fact = new TestFact(); fact.setS( "asdf" ); fact.setI( 10 ); ksession.insert( fact ); ksession.fireAllRules(); ksession.dispose(); } public static class TestUtility { public static Boolean utilMethod(String s1, String s2) { Boolean result = null; if ( s1 != null ) { result = s1.equals( s2 ); } logger.info( "in utilMethod >" + s1 + "< >" + s2 + "< returns " + result ); return result; } } public static class TestFact { private int i; private String s; public int getI() { return i; } public void setI(int i) { this.i = i; } public String getS() { return s; } public void setS(String s) { this.s = s; } } @Test public void testUnwantedCoersion() throws Exception { String rule = "package org.drools.compiler\n" + "import " + MiscTest.class.getName() + ".InnerBean;\n" + "import " + MiscTest.class.getName() + ".OuterBean;\n" + "rule \"Test.Code One\"\n" + "when\n" + " OuterBean($code : inner.code in (\"1.50\", \"2.50\"))\n" + "then\n" + " System.out.println(\"Code compared values: 1.50, 2.50 - actual code value: \" + $code);\n" + "end\n" + "rule \"Test.Code Two\"\n" + "when\n" + " OuterBean($code : inner.code in (\"1.5\", \"2.5\"))\n" + "then\n" + " System.out.println(\"Code compared values: 1.5, 2.5 - actual code value: \" + $code);\n" + "end\n" + "rule \"Big Test ID One\"\n" + "when\n" + " OuterBean($id : id in (\"3.5\", \"4.5\"))\n" + "then\n" + " System.out.println(\"ID compared values: 3.5, 4.5 - actual ID value: \" + $id);\n" + "end\n" + "rule \"Big Test ID Two\"\n" + "when\n" + " OuterBean($id : id in ( \"3.0\", \"4.0\"))\n" + "then\n" + " System.out.println(\"ID compared values: 3.0, 4.0 - actual ID value: \" + $id);\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); InnerBean innerTest = new InnerBean(); innerTest.setCode( "1.500" ); ksession.insert( innerTest ); OuterBean outerTest = new OuterBean(); outerTest.setId( "3" ); outerTest.setInner( innerTest ); ksession.insert( outerTest ); OuterBean outerTest2 = new OuterBean(); outerTest2.setId( "3.0" ); outerTest2.setInner( innerTest ); ksession.insert( outerTest2 ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } public static class InnerBean { private String code; public String getCode() { return code; } public void setCode(String code) { this.code = code; } } public static class OuterBean { private InnerBean inner; private String id; public InnerBean getInner() { return inner; } public void setInner(InnerBean inner) { this.inner = inner; } public String getId() { return id; } public void setId(String id) { this.id = id; } } @Test public void testShiftOperator() throws Exception { String rule = "dialect \"mvel\"\n" + "rule kickOff\n" + "when\n" + "then\n" + " insert( Integer.valueOf( 1 ) );\n" + " insert( Long.valueOf( 1 ) );\n" + " insert( Integer.valueOf( 65552 ) ); // 0x10010\n" + " insert( Long.valueOf( 65552 ) );\n" + " insert( Integer.valueOf( 65568 ) ); // 0x10020\n" + " insert( Long.valueOf( 65568 ) );\n" + " insert( Integer.valueOf( 65536 ) ); // 0x10000\n" + " insert( Long.valueOf( 65536L ) );\n" + " insert( Long.valueOf( 4294967296L ) ); // 0x100000000L\n" + "end\n" + "rule test1\n" + " salience -1\n" + "when\n" + " $a: Integer( $one: intValue == 1 )\n" + " $b: Integer( $shift: intValue )\n" + " $c: Integer( $i: intValue, intValue == ($one << $shift ) )\n" + "then\n" + " System.out.println( \"test1 \" + $a + \" << \" + $b + \" = \" + Integer.toHexString( $c ) );\n" + "end\n" + "rule test2\n" + " salience -2\n" + "when\n" + " $a: Integer( $one: intValue == 1 )\n" + " $b: Long ( $shift: longValue )\n" + " $c: Integer( $i: intValue, intValue == ($one << $shift ) )\n" + "then\n" + " System.out.println( \"test2 \" + $a + \" << \" + $b + \" = \" + Integer.toHexString( $c ) );\n" + "end\n" + "rule test3\n" + " salience -3\n" + "when\n" + " $a: Long ( $one: longValue == 1 )\n" + " $b: Long ( $shift: longValue )\n" + " $c: Integer( $i: intValue, intValue == ($one << $shift ) )\n" + "then\n" + " System.out.println( \"test3 \" + $a + \" << \" + $b + \" = \" + Integer.toHexString( $c ) );\n" + "end\n" + "rule test4\n" + " salience -4\n" + "when\n" + " $a: Long ( $one: longValue == 1 )\n" + " $b: Integer( $shift: intValue )\n" + " $c: Integer( $i: intValue, intValue == ($one << $shift ) )\n" + "then\n" + " System.out.println( \"test4 \" + $a + \" << \" + $b + \" = \" + Integer.toHexString( $c ) );\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); int rules = ksession.fireAllRules(); assertEquals( 13, rules ); } @Test public void testPatternMatchingOnThis() throws Exception { String rule = "package org.drools.compiler\n" + "rule R1 when\n" + " $i1: Integer()\n" + " $i2: Integer( this > $i1 )\n" + "then\n" + " System.out.println( $i2 + \" > \" + $i1 );\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Integer( 1 ) ); ksession.insert( new Integer( 2 ) ); int rules = ksession.fireAllRules(); assertEquals( 1, rules ); } @Test public void testArrayUsage() { String str = "import org.drools.compiler.TestParam;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Intercept\"\n" + "when\n" + " TestParam( value1 == \"extract\", $args : elements )\n" + " $s : String( this == $args[$s.length() - $s.length()] )\n" + " $s1 : String( this == $args[0] )\n" + " $s2 : String( this == $args[1] )\n" + " Integer( this == 2 ) from $args.length\n" + " $s3 : String( this == $args[$args.length - $args.length + 1] )\n" + "then\n" + " delete( $s1 ); \n" + " delete( $s2 ); \n" + " list.add( $s1 ); \n" + " list.add( $s2 ); \n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); java.util.List list = new java.util.ArrayList(); ksession.setGlobal( "list", list ); int N = 2; for ( int j = 0; j < N; j++ ) { TestParam o = new TestParam(); o.setValue1("extract" ); o.setElements(new Object[]{"x1_" + j, "x2_" + j}); ksession.insert( "x1_" + j ); ksession.insert( "x2_" + j ); ksession.insert( o ); ksession.fireAllRules(); } assertEquals( 4, list.size() ); assertTrue( list.contains( "x1_0")); assertTrue( list.contains( "x1_1")); assertTrue( list.contains( "x2_0")); assertTrue( list.contains( "x2_1")); ksession.dispose(); } @Test(timeout = 5000) public void testEfficientBetaNodeNetworkUpdate() { // [JBRULES-3372] String str = "declare SimpleMembership\n" + " listId : String\n" + " patientId : String\n" + "end\n" + "declare SimplePatientFact\n" + " value : int\n" + " patientId : String\n" + "end\n" + "rule \"A\"\n" + "when\n" + "$slm : SimpleMembership($pid : patientId, listId == \"5072\" )\n" + "and not (\n" + " (\n" + " (\n" + " SimplePatientFact(value == 1, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 2, patientId == $pid)\n" + " )\n" + " ) and (\n" + " (\n" + " SimplePatientFact(value == 6, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 7, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 8, patientId == $pid)\n" + " )\n" + " ) and (\n" + " (\n" + " SimplePatientFact(value == 9, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 10, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 11, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 12, patientId == $pid)\n" + " ) or (\n" + " SimplePatientFact(value == 13, patientId == $pid)\n" + " )\n" + " )\n" + ")\n" + "then\n" + " System.out.println(\"activated\");\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); } @Test public void testModifyCommand() { String str = "rule \"sample rule\"\n" + " when\n" + " then\n" + " System.out.println(\"\\\"Hello world!\\\"\");\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p1 = new Person( "John", "nobody", 25 ); ksession.execute( CommandFactory.newInsert( p1 ) ); FactHandle fh = ksession.getFactHandle( p1 ); Person p = new Person( "Frank", "nobody", 30 ); List<Setter> setterList = new ArrayList<Setter>(); setterList.add( CommandFactory.newSetter( "age", String.valueOf( p.getAge() ) ) ); setterList.add( CommandFactory.newSetter( "name", p.getName() ) ); setterList.add( CommandFactory.newSetter( "likes", p.getLikes() ) ); ksession.execute( CommandFactory.newModify( fh, setterList ) ); } @Test public void testMVELTypeCoercion() { String str = "package org.drools.compiler.test; \n" + "\n" + "global java.util.List list;" + "\n" + "declare Bean\n" + // NOTICE: THIS WORKS WHEN THE FIELD IS "LIST", BUT USED TO WORK WITH ARRAYLIST TOO " field : java.util.ArrayList\n" + "end\n" + "\n" + "\n" + "rule \"Init\"\n" + "when \n" + "then\n" + " insert( new Bean( new java.util.ArrayList( java.util.Arrays.asList( \"x\" ) ) ) );\n" + "end\n" + "\n" + "rule \"Check\"\n" + "when\n" + " $b : Bean( $fld : field == [\"x\"] )\n" + "then\n" + " System.out.println( $fld );\n" + " list.add( \"OK\" ); \n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } KieBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbConf.setOption( EqualityBehaviorOption.EQUALITY ); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kbConf ); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); java.util.List list = new java.util.ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "OK" ) ); ksession.dispose(); } @Test public void testPatternOnClass() throws Exception { String rule = "import org.drools.core.reteoo.InitialFactImpl\n" + "import org.drools.compiler.FactB\n" + "rule \"Clear\" when\n" + " $f: Object(class != FactB.class)\n" + "then\n" + " if( ! ($f instanceof InitialFactImpl) ){\n" + " delete( $f );\n" + " }\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new FactA() ); ksession.insert( new FactA() ); ksession.insert( new FactB() ); ksession.insert( new FactB() ); ksession.insert( new FactC() ); ksession.insert( new FactC() ); ksession.fireAllRules(); for ( FactHandle fact : ksession.getFactHandles() ) { InternalFactHandle internalFact = (InternalFactHandle) fact; assertTrue( internalFact.getObject() instanceof FactB ); } } @Test public void testPatternOffset() throws Exception { // JBRULES-3427 String str = "package org.drools.compiler.test; \n" + "declare A\n" + "end\n" + "declare B\n" + " field : int\n" + "end\n" + "declare C\n" + " field : int\n" + "end\n" + "rule R when\n" + "( " + " A( ) or ( A( ) and B( ) ) " + ") and (\n" + " A( ) or ( B( $bField : field ) and C( field != $bField ) )\n" + ")\n" + "then\n" + " System.out.println(\"rule fired\");\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); FactType typeA = kbase.getFactType( "org.drools.compiler.test", "A" ); FactType typeB = kbase.getFactType( "org.drools.compiler.test", "B" ); FactType typeC = kbase.getFactType( "org.drools.compiler.test", "C" ); Object a = typeA.newInstance(); ksession.insert( a ); Object b = typeB.newInstance(); typeB.set( b, "field", 1 ); ksession.insert( b ); Object c = typeC.newInstance(); typeC.set( c, "field", 1 ); ksession.insert( c ); ksession.fireAllRules(); } @Test public void testCommentDelimiterInString() throws Exception { // JBRULES-3401 String str = "rule x\n" + "dialect \"mvel\"\n" + "when\n" + "then\n" + "System.out.println( \"/*\" );\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); } public interface InterfaceA { InterfaceB getB(); } public interface InterfaceB { } public static class ClassA implements InterfaceA { private ClassB b = null; public ClassB getB() { return b; } public void setB(InterfaceB b) { this.b = (ClassB) b; } } public static class ClassB implements InterfaceB { private String id = "123"; public String getId() { return id; } public void setId(String id) { this.id = id; } @Override public boolean equals(Object o) { if ( this == o ) return true; if ( o == null || getClass() != o.getClass() ) return false; ClassB classB = (ClassB) o; if ( id != null ? !id.equals( classB.id ) : classB.id != null ) return false; return true; } @Override public int hashCode() { return Integer.valueOf( id ); } } @Test public void testCovariance() throws Exception { // JBRULES-3392 String str = "import " + MiscTest.class.getName() + ".*\n" + "rule x\n" + "when\n" + " $b : ClassB( )\n" + " $a : ClassA( b.id == $b.id )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ClassA a = new ClassA(); ClassB b = new ClassB(); a.setB( b ); ksession.insert( a ); ksession.insert( b ); assertEquals( 1, ksession.fireAllRules() ); } @Test public void testRetractLeftTuple() throws Exception { // JBRULES-3420 String str = "import " + MiscTest.class.getName() + ".*\n" + "rule R1 salience 3\n" + "when\n" + " $b : InterfaceB( )\n" + " $a : ClassA( b == null )\n" + "then\n" + " $a.setB( $b );\n" + " update( $a );\n" + "end\n" + "rule R2 salience 2\n" + "when\n" + " $b : ClassB( id == \"123\" )\n" + " $a : ClassA( b != null && b.id == $b.id )\n" + "then\n" + " $b.setId( \"456\" );\n" + " update( $b );\n" + "end\n" + "rule R3 salience 1\n" + "when\n" + " InterfaceA( $b : b )\n" + "then\n" + " delete( $b );\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new ClassA() ); ksession.insert( new ClassB() ); assertEquals( 3, ksession.fireAllRules() ); } @Test public void testVariableBindingWithOR() throws Exception { // JBRULES-3390 String str1 = "package org.drools.compiler.test; \n" + "declare A\n" + "end\n" + "declare B\n" + " field : int\n" + "end\n" + "declare C\n" + " field : int\n" + "end\n" + "rule R when\n" + "( " + " A( ) and ( B( $bField : field ) or C( $cField : field ) ) " + ")\n" + "then\n" + " System.out.println($bField);\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str1.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); String str2 = "package org.drools.compiler.test; \n" + "declare A\n" + "end\n" + "declare B\n" + " field : int\n" + "end\n" + "declare C\n" + " field : int\n" + "end\n" + "rule R when\n" + "( " + " A( ) and ( B( $field : field ) or C( $field : field ) ) " + ")\n" + "then\n" + " System.out.println($field);\n" + "end\n"; KnowledgeBuilder kbuilder2 = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder2.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ); assertFalse( kbuilder2.hasErrors() ); } @Test public void testModifySimple() { String str = "package org.drools.compiler;\n" + "\n" + "rule \"test modify block\"\n" + "when\n" + " $p: Person( name == \"hungry\" )\n" + "then\n" + " modify( $p ) { setName(\"fine\") }\n" + "end\n" + "\n" + "rule \"Log\"\n" + "when\n" + " $o: Object()\n" + "then\n" + " System.out.println( $o );\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person(); p.setName( "hungry" ); ksession.insert( p ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testDeclaresWithArrayFields() throws Exception { String rule = "package org.drools.compiler.test; \n" + "import " + org.drools.compiler.test.Person.class.getName() + ";\n" + "import " + org.drools.compiler.test.Man.class.getName() + ";\n" + "\n" + "global java.util.List list;" + "\n" + "declare Cheese\n" + " name : String = \"ched\" \n" + "end \n" + "" + "declare X\n" + " fld \t: String = \"xx\" @key \n" + " achz\t: Cheese[] \n" + " astr\t: String[] " + " = new String[] {\"x\", \"y11\" } \n" + " aint\t: int[] \n" + " sint\t: short[] \n" + " bint\t: byte[] \n" + " lint\t: long[] \n" + " dint\t: double[] \n" + " fint\t: float[] \n" + " zint\t: Integer[] " + " = new Integer[] {2,3} @key \n" + " aaaa\t: String[][] \n" + " bbbb\t: int[][] \n" + " aprs\t: Person[] " + " = new Person[] { new Man() } \n" + "end\n" + "\n" + "rule \"Init\"\n" + "when\n" + "\n" + "then\n" + " X x = new X( \"xx\", \n" + " new Cheese[0], \n" + " new String[] { \"x\", \"y22\" }, \n" + " new int[] { 7, 9 }, \n" + " new short[] { 3, 4 }, \n" + " new byte[] { 1, 2 }, \n" + " new long[] { 100L, 200L }, \n" + " new double[] { 3.2, 4.4 }, \n" + " new float[] { 3.2f, 4.4f }, \n" + " new Integer[] { 2, 3 }, \n" + " new String[2][3], \n" + " new int[5][3], \n" + " null \n" + " ); \n" + " insert( x );\n" + " " + " X x2 = new X(); \n" + " x2.setAint( new int[2] ); \n " + " x2.getAint()[0] = 7; \n" + " insert( x2 );\n" + " " + " if ( x.hashCode() == x2.hashCode() ) list.add( \"hash\" ); \n" + " " + " if( x.equals( x2 ) ) list.add( \"equals\" ); \n" + " " + " list.add( x.getAint( )[0] ); \n" + "end \n" + "\n" + "rule \"Check\"\n" + "when\n" + " X( astr.length > 0, \n" + " astr[0] == \"x\", \n" + " $x : astr[1], \n" + " aint[0] == 7 ) \n" + "then\n" + " list.add( $x );\n" + "end \n" + ""; System.out.println( rule ); KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "hash" ) ); assertTrue( list.contains( "equals" ) ); assertTrue( list.contains( 7 ) ); assertTrue( list.contains( "y11" ) ); assertTrue( list.contains( "y22" ) ); } public static class Parent { } public static class ChildA extends Parent { private final int x; public ChildA(int x) { this.x = x; } public int getX() { return x; } } public static class ChildB extends Parent { private final int x; public ChildB(int x) { this.x = x; } public int getX() { return x; } } @Test public void testTypeUnsafe() throws Exception { String str = "import " + MiscTest.class.getName() + ".*\n" + "declare\n" + " Parent @typesafe(false)\n" + "end\n" + "rule R1\n" + "when\n" + " $a : Parent( x == 1 )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); for ( int i = 0; i < 20; i++ ) { ksession.insert( new ChildA( i % 10 ) ); ksession.insert( new ChildB( i % 10 ) ); } assertEquals( 4, ksession.fireAllRules() ); // give time to async jitting to complete Thread.sleep( 100 ); ksession.insert( new ChildA( 1 ) ); ksession.insert( new ChildB( 1 ) ); assertEquals( 2, ksession.fireAllRules() ); } @Test public void testConstructorWithOtherDefaults() { String str = "" + "\n" + "global java.util.List list;\n" + "\n" + "declare Bean\n" + " kField : String @key\n" + " sField : String = \"a\"\n" + " iField : int = 10\n" + " dField : double = 4.32\n" + " aField : Long[] = new Long[] { 100L, 1000L }\n" + "end" + "\n" + "rule \"Trig\"\n" + "when\n" + " Bean( kField == \"key\", sField == \"a\", iField == 10, dField == 4.32, aField[1] == 1000L ) \n" + "then\n" + " list.add( \"OK\" );\n" + "end\n" + "\n" + "rule \"Exec\"\n" + "when\n" + "then\n" + " insert( new Bean( \"key\") ); \n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); java.util.List list = new java.util.ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "OK" ) ); ksession.dispose(); } @Test public void testBindingToNullFieldWithEquality() { // JBRULES-3396 String str = "package org.drools.compiler.test; \n" + "\n" + "global java.util.List list;" + "\n" + "declare Bean\n" + " id : String @key\n" + " field : String\n" + "end\n" + "\n" + "\n" + "rule \"Init\"\n" + "when \n" + "then\n" + " insert( new Bean( \"x\" ) );\n" + "end\n" + "\n" + "rule \"Check\"\n" + "when\n" + " $b : Bean( $fld : field )\n" + "then\n" + " System.out.println( $fld );\n" + " list.add( \"OK\" ); \n" + "end"; KieBaseConfiguration kbConf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(); kbConf.setOption( EqualityBehaviorOption.EQUALITY ); KnowledgeBase kbase = loadKnowledgeBaseFromString( kbConf, str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); java.util.List list = new java.util.ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( "OK" ) ); ksession.dispose(); } @Test public void testCoercionOfStringValueWithoutQuotes() throws Exception { // JBRULES-3080 String str = "package org.drools.compiler.test; \n" + "declare A\n" + " field : String\n" + "end\n" + "rule R when\n" + " A( field == 12 )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); FactType typeA = kbase.getFactType( "org.drools.compiler.test", "A" ); Object a = typeA.newInstance(); typeA.set( a, "field", "12" ); ksession.insert( a ); assertEquals( 1, ksession.fireAllRules() ); } @Test public void testVarargConstraint() throws Exception { // JBRULES-3268 String str = "package org.drools.compiler.test;\n" + "import " + MiscTest.class.getName() + ".VarargBean;\n" + " global java.util.List list;\n" + "\n" + "rule R1 when\n" + " VarargBean( isOddArgsNr(1, 2, 3) )\n" + "then\n" + " list.add(\"odd\");\n" + "end\n" + "rule R2 when\n" + " VarargBean( isOddArgsNr(1, 2, 3, 4) )\n" + "then\n" + " list.add(\"even\");\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert( new VarargBean() ); ksession.fireAllRules(); assertEquals( 1, list.size() ); assertTrue( list.contains( "odd" ) ); } public static class VarargBean { public boolean isOddArgsNr(int... args) { return args.length % 2 == 1; } } @Test public void testPackageImportWithMvelDialect() throws Exception { // JBRULES-2244 String str = "package org.drools.compiler.test;\n" + "import org.drools.compiler.*\n" + "dialect \"mvel\"\n" + "rule R1 no-loop when\n" + " $p : Person( )" + " $c : Cheese( )" + "then\n" + " modify($p) { setCheese($c) };\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person( "Mario", 38 ); ksession.insert( p ); Cheese c = new Cheese( "Gorgonzola" ); ksession.insert( c ); assertEquals( 1, ksession.fireAllRules() ); assertSame( c, p.getCheese() ); } @Test public void testNoMvelSyntaxInFunctions() throws Exception { // JBRULES-3433 String str = "import java.util.*;\n" + "dialect \"mvel\"\n" + "function Integer englishToInt(String englishNumber) { \n" + " Map m = [\"one\":1, \"two\":2, \"three\":3, \"four\":4, \"five\":5]; \n" + " Object obj = m.get(englishNumber.toLowerCase()); \n" + " return Integer.parseInt(obj.toString()); \n" + "}\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testMissingClosingBraceOnModify() throws Exception { // JBRULES-3436 String str = "package org.drools.compiler.test;\n" + "import org.drools.compiler.*\n" + "rule R1 when\n" + " $p : Person( )" + " $c : Cheese( )" + "then\n" + " modify($p) { setCheese($c) ;\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testPrimitiveToBoxedCoercionInMethodArgument() throws Exception { String str = "package org.drools.compiler.test;\n" + "import " + MiscTest.class.getName() + "\n" + "import org.drools.compiler.*\n" + "rule R1 when\n" + " Person( $ag1 : age )" + " $p2 : Person( name == MiscTest.integer2String($ag1) )" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person( "42", 42 ); ksession.insert( p ); assertEquals( 1, ksession.fireAllRules() ); } public static String integer2String(Integer value) { return "" + value; } @Test public void testKeyedInterfaceField() { //JBRULES-3441 String str = "package org.drools.compiler.integrationtest; \n" + "\n" + "import " + MiscTest.class.getName() + ".*; \n" + "" + "global java.util.List list;" + "" + "declare Bean\n" + " id : InterfaceB @key\n" + "end\n" + "\n" + "\n" + "rule \"Init\"\n" + "when \n" + "then\n" + " insert( new Bean( new ClassB() ) );\n" + "end\n" + "\n" + "rule \"Check\"\n" + "when\n" + " $b : Bean( )\n" + "then\n" + " list.add( $b.hashCode() ); \n" + " list.add( $b.equals( new Bean( new ClassB() ) ) ); \n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); java.util.List list = new java.util.ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); assertTrue( list.contains( 31 + 123 ) ); assertTrue( list.contains( true ) ); ksession.dispose(); } @Test public void testDeclaredTypeAsFieldForAnotherDeclaredType() { // JBRULES-3468 String str = "package com.sample\n" + "\n" + "import com.sample.*;\n" + "\n" + "declare Item\n" + " id : int;\n" + "end\n" + "\n" + "declare Priority\n" + " name : String;\n" + " priority : int;\n" + "end\n" + "\n" + "declare Cap\n" + " item : Item;\n" + " name : String\n" + "end\n" + "\n" + "rule \"split cart into items\"\n" + "when\n" + "then\n" + " insert(new Item(1));\n" + " insert(new Item(2));\n" + " insert(new Item(3));\n" + "end\n" + "\n" + "rule \"Priorities\"\n" + "when\n" + "then\n" + " insert(new Priority(\"A\", 3));\n" + " insert(new Priority(\"B\", 2));\n" + " insert(new Priority(\"C\", 5));\n" + "end\n" + "\n" + "rule \"Caps\"\n" + "when\n" + " $i : Item()\n" + " $p : Priority($name : name)\n" + "then\n" + " insert(new Cap($i, $name));\n" + "end\n" + "\n" + "rule \"test\"\n" + "when\n" + " $i : Item()\n" + " Cap(item.id == $i.id)\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); assertEquals( 20, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testCheckDuplicateVariables() throws Exception { // JBRULES-3035 String str = "package com.sample\n" + "import org.drools.compiler.*\n" + "rule R1 when\n" + " Person( $a: age, $a: name ) // this should cause a compile-time error\n" + "then\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); str = "package com.sample\n" + "rule R1 when\n" + " accumulate( Object(), $c: count(1), $c: max(1) ) // this should cause a compile-time error\n" + "then\n" + "end"; kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); str = "package com.sample\n" + "rule R1 when\n" + " Number($i: intValue) from accumulate( Object(), $i: count(1) ) // this should cause a compile-time error\n" + "then\n" + "end"; kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testDeclaredTypesDefaultHashCode() { // JBRULES-3481 String str = "package com.sample\n" + "\n" + "global java.util.List list; \n" + "" + "declare Bean\n" + " id : int \n" + "end\n" + "\n" + "declare KeyedBean\n" + " id : int @key \n" + "end\n" + "\n" + "\n" + "rule Create\n" + "when\n" + "then\n" + " list.add( new Bean(1) ); \n" + " list.add( new Bean(2) ); \n" + " list.add( new KeyedBean(1) ); \n" + " list.add( new KeyedBean(1) ); \n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.fireAllRules(); ksession.dispose(); assertFalse( list.get( 0 ).hashCode() == 34 ); assertFalse( list.get( 1 ).hashCode() == 34 ); assertFalse( list.get( 0 ).hashCode() == list.get( 1 ).hashCode() ); assertNotSame( list.get( 0 ), list.get( 1 ) ); assertFalse( list.get( 0 ).equals( list.get( 1 ) ) ); assertTrue( list.get( 2 ).hashCode() == 32 ); assertTrue( list.get( 3 ).hashCode() == 32 ); assertNotSame( list.get( 2 ), list.get( 3 ) ); assertTrue( list.get( 2 ).equals( list.get( 3 ) ) ); } @Test public void testJittingConstraintWithInvocationOnLiteral() { String str = "package com.sample\n" + "import org.drools.compiler.Person\n" + "rule XXX when\n" + " Person( name.toString().toLowerCase().contains( \"mark\".toString().toLowerCase() ) )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( "mark", 37 ) ); ksession.insert( new Person( "mario", 38 ) ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testJittingMethodWithCharSequenceArg() { String str = "package com.sample\n" + "import org.drools.compiler.Person\n" + "rule XXX when\n" + " Person( $n : name, $n.contains( \"mark\" ) )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( "mark", 37 ) ); ksession.insert( new Person( "mario", 38 ) ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testMapAccessorWithPrimitiveKey() { String str = "package com.sample\n" + "import " + MiscTest.class.getName() + ".MapContainerBean\n" + "rule R1 when\n" + " MapContainerBean( map[1] == \"one\" )\n" + "then\n" + "end\n" + "rule R2 when\n" + " MapContainerBean( map[1+1] == \"two\" )\n" + "then\n" + "end\n" + "rule R3 when\n" + " MapContainerBean( map[this.get3()] == \"three\" )\n" + "then\n" + "end\n" + "rule R4 when\n" + " MapContainerBean( map[4] == null )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new MapContainerBean() ); assertEquals( 4, ksession.fireAllRules() ); ksession.dispose(); } public static class MapContainerBean { private final Map<Integer, String> map = new HashMap<Integer, String>(); MapContainerBean() { map.put( 1, "one" ); map.put( 2, "two" ); map.put( 3, "three" ); } public Map<Integer, String> getMap() { return map; } public int get3() { return 3; } } @Test public void testFromWithStrictModeOff() { // JBRULES-3533 String str = "import java.util.Map;\n" + "dialect \"mvel\"\n" + "rule \"LowerCaseFrom\"\n" + "when\n" + " Map($valOne : this['keyOne'] !=null)\n" + " $lowerValue : String() from $valOne.toLowerCase()\n" + "then\n" + " System.out.println( $valOne.toLowerCase() );\n" + "end\n"; KnowledgeBuilderConfigurationImpl pkgBuilderCfg = new KnowledgeBuilderConfigurationImpl(); MVELDialectConfiguration mvelConf = (MVELDialectConfiguration) pkgBuilderCfg.getDialectConfiguration( "mvel" ); mvelConf.setStrict( false ); mvelConf.setLangLevel( 5 ); KnowledgeBase kbase = loadKnowledgeBaseFromString( pkgBuilderCfg, str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Map<String, String> testMap = new HashMap<String, String>(); testMap.put( "keyOne", "valone" ); testMap.put( "valTwo", "valTwo" ); ksession.insert( testMap ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testFromWithStrictModeOn() { // JBRULES-3533 String str = "import java.util.Map;\n" + "dialect \"mvel\"\n" + "rule \"LowerCaseFrom\"\n" + "when\n" + " Map($valOne : this['keyOne'] !=null)\n" + " $lowerValue : String() from $valOne.toLowerCase()\n" + "then\n" + " System.out.println( $valOne.toLowerCase() );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testEntryPointWithVarIN() { String str = "package org.drools.compiler.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"In\"\n" + "when\n" + " $x : Integer()\n " + "then\n" + " drools.getEntryPoint(\"inX\").insert( $x );\n" + "end\n" + "\n" + "rule \"Out\"\n" + "when\n" + " $i : Integer() from entry-point \"inX\"\n" + "then\n" + " list.add( $i );\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( 10 ); List res = new ArrayList(); ksession.setGlobal( "list", res ); ksession.fireAllRules(); ksession.dispose(); assertTrue( res.contains( 10 ) ); } @Test public void testArithmeticExpressionWithNull() { // JBRULES-3568 String str = "import " + MiscTest.class.getName() + ".PrimitiveBean;\n" + "rule R when\n" + " PrimitiveBean(primitive/typed > 0.7)\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new PrimitiveBean( 0.9, 1.1 ) ); ksession.insert( new PrimitiveBean( 0.9, null ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } public static class PrimitiveBean { public final double primitive; public final Double typed; public PrimitiveBean(double primitive, Double typed) { this.primitive = primitive; this.typed = typed; } public double getPrimitive() { return primitive; } public Double getTyped() { return typed; } } public void testMvelMatches() { String str = "package com.sample\n" + "import org.drools.compiler.Person\n" + "global java.util.List results;" + "rule XXX when\n" + " Person( $n : name ~= \"\\\\D.*\" )\n" + "then\n" + " results.add( $n ); \n " + "end \n" + "rule YY when\n" + " Person( $a : age, $n : name ~= \"\\\\d\\\\D.*\" )\n" + "then\n" + " results.add( $a ); \n " + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List res = new ArrayList(); ksession.setGlobal( "results", res ); ksession.insert( new Person( "mark", 37 ) ); ksession.insert( new Person( "mario", 38 ) ); ksession.insert( new Person( "1mike", 44 ) ); ksession.insert( new Person( "52matt", 44 ) ); ksession.fireAllRules(); ksession.dispose(); assertEquals( 3, res.size() ); assertTrue( res.contains( "mark" ) ); assertTrue( res.contains( "mario" ) ); assertTrue( res.contains( 44 ) ); } @Test public void testRuleFlowGroupWithLockOnActivate() { // JBRULES-3590 String str = "import org.drools.compiler.Person;\n" + "import org.drools.compiler.Cheese;\n" + "rule R1\n" + "ruleflow-group \"group1\"\n" + "lock-on-active true\n" + "when\n" + " $p : Person()\n" + "then\n" + " $p.setName(\"John\");\n" + " update ($p);\n" + "end\n" + "rule R2\n" + "ruleflow-group \"group1\"\n" + "lock-on-active true\n" + "when\n" + " $p : Person( name == null )\n" + " forall ( Cheese ( type == \"cheddar\" ))\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person() ); ksession.insert( new Cheese( "gorgonzola" ) ); ((InternalAgenda) ksession.getAgenda()).activateRuleFlowGroup( "group1" ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testInstanceof() throws Exception { // JBRULES-3591 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( address instanceof LongAddress )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark = new Person( "mark" ); mark.setAddress( new LongAddress( "uk" ) ); ksession.insert( mark ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testFromNodeWithMultipleBetas() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $p : Person( $name : name, $addresses : addresses )\n" + " $c : Cheese( $type: type == $name )\n" + " $a : Address( street == $type, suburb == $name ) from $addresses\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person( "x" ); p.addAddress( new Address( "x", "x", "x" ) ); p.addAddress( new Address( "y", "y", "y" ) ); ksession.insert( p ); ksession.insert( new Cheese( "x" ) ); ksession.fireAllRules(); ksession.dispose(); } @Test public void testMvelFunctionWithDeclaredTypeArg() { // JBRULES-3562 String rule = "package test; \n" + "dialect \"mvel\"\n" + "global java.lang.StringBuilder value;\n" + "function String getFieldValue(Bean bean) {" + " return bean.getField();" + "}" + "declare Bean \n" + " field : String \n" + "end \n" + "\n" + "rule R1 \n" + "when \n" + "then \n" + " insert( new Bean( \"mario\" ) ); \n" + "end \n" + "\n" + "rule R2 \n" + "when \n" + " $bean : Bean( ) \n" + "then \n" + " value.append( getFieldValue($bean) ); \n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( rule ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); StringBuilder sb = new StringBuilder(); ksession.setGlobal( "value", sb ); ksession.fireAllRules(); assertEquals( "mario", sb.toString() ); ksession.dispose(); } @Test public void testMvelFunctionWithDeclaredTypeArgForGuvnor() throws Exception { // JBRULES-3562 String function = "function String getFieldValue(Bean bean) {" + " return bean.getField();" + "}\n"; String declaredFactType = "declare Bean \n" + " field : String \n" + "end \n"; String rule = "rule R2 \n" + "dialect 'mvel'\n" + "when \n" + " $bean : Bean( ) \n" + "then \n" + " System.out.println( getFieldValue($bean) ); \n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( declaredFactType.getBytes() ), ResourceType.DRL ); kbuilder.add( ResourceFactory.newByteArrayResource( function.getBytes() ), ResourceType.DRL ); kbuilder.add( ResourceFactory.newByteArrayResource( rule.getBytes() ), ResourceType.DRL ); for ( KnowledgeBuilderError error : kbuilder.getErrors() ) { System.out.println( "ERROR:" ); System.out.println( error.getMessage() ); } assertFalse( kbuilder.hasErrors() ); } public void testGenericsList() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $c : Cheese( $type: type )\n" + " $p : Person( $name : name, addresses.get(0).street == $type )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person( "x" ); p.addAddress( new Address( "x", "x", "x" ) ); p.addAddress( new Address( "y", "y", "y" ) ); ksession.insert( p ); ksession.insert( new Cheese( "x" ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testGenericsOption() throws Exception { // JBRULES-3579 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $c : Cheese( $type: type )\n" + " $p : Person( $name : name, addressOption.get.street == $type )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person p = new Person( "x" ); p.setAddress( new Address( "x", "x", "x" ) ); ksession.insert( p ); ksession.insert( new Cheese( "x" ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testRHSClone() { // JBRULES-3539 String str = "import java.util.Map;\n" + "dialect \"mvel\"\n" + "rule \"RHSClone\"\n" + "when\n" + " Map($valOne : this['keyOne'] !=null)\n" + "then\n" + " System.out.println( $valOne.clone() );\n" + "end\n"; KnowledgeBuilderConfigurationImpl pkgBuilderCfg = new KnowledgeBuilderConfigurationImpl(); MVELDialectConfiguration mvelConf = (MVELDialectConfiguration) pkgBuilderCfg.getDialectConfiguration( "mvel" ); mvelConf.setStrict( false ); mvelConf.setLangLevel( 5 ); KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( pkgBuilderCfg ); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if ( errors.size() > 0 ) { for ( KnowledgeBuilderError error : errors ) { System.err.println( error ); } fail( "Could not parse knowledge" ); } } @Test public void testDeclaredTypeWithHundredsProps() { // JBRULES-3621 StringBuilder sb = new StringBuilder( "declare MyType\n" ); for ( int i = 0; i < 300; i++ ) { sb.append( "i" + i + " : int\n" ); } sb.append( "end" ); KnowledgeBase kbase = loadKnowledgeBaseFromString( sb.toString() ); } @Test public void testAddRuleWithFrom() { // JBRULES-3499 String str1 = "global java.util.List names;\n" + "global java.util.List list;\n"; String str2 = "import org.drools.compiler.*;\n" + "global java.util.List names;\n" + "global java.util.List list;\n" + "rule R1 when\n" + " $p : Person( )\n" + " String( this == $p.name ) from names\n" + "then\n" + " list.add( $p );\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str1); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List<String> names = new ArrayList<String>(); names.add("Mark"); ksession.setGlobal( "names", names ); List<String> list = new ArrayList<String>(); ksession.setGlobal("list", list); Person p = new Person( "Mark" ); ksession.insert( p ); ksession.fireAllRules(); kbase.addKnowledgePackages( loadKnowledgePackagesFromString(str2) ); ksession.fireAllRules(); assertEquals(1, list.size()); assertSame(p, list.get(0)); ksession.dispose(); } @Test public void testConstantLeft() { // JBRULES-3627 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $p : Person( \"Mark\" == name )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( null ) ); ksession.insert( new Person( "Mark" ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void noDormantCheckOnModifies() throws Exception { // Test case for BZ 862325 String str = "package org.drools.compiler;\n" + " rule R1\n" + " salience 10\n" + " when\n" + " $c : Cheese( price == 10 ) \n" + " $p : Person( ) \n" + " then \n" + " modify($c) { setPrice( 5 ) }\n" + " modify($p) { setAge( 20 ) }\n" + "end\n" + "rule R2\n" + " when\n" + " $p : Person( )" + " then \n" + " // noop\n" + "end\n"; // load up the knowledge base KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); org.kie.api.event.rule.AgendaEventListener ael = mock( org.kie.api.event.rule.AgendaEventListener.class ); ksession.addEventListener( ael ); ksession.insert( new Person( "Bob", 19 ) ); ksession.insert( new Cheese( "brie", 10 ) ); ksession.fireAllRules(); // both rules should fire exactly once verify( ael, times( 2 ) ).afterMatchFired(any(org.kie.api.event.rule.AfterMatchFiredEvent.class)); // no cancellations should have happened verify( ael, never() ).matchCancelled( any( org.kie.api.event.rule.MatchCancelledEvent.class ) ); } @Test public void testNullConstantLeft() { // JBRULES-3627 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $p : Person( null == name )\n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( null ) ); ksession.insert( new Person( "Mark" ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testJitConstraintInvokingConstructor() { // JBRULES-3628 String str = "import org.drools.compiler.Person;\n" + "rule R1 when\n" + " Person( new Integer( ageAsInteger ) < 40 ) \n" + "then\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( "Mario", 38 ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testRemoveRuleWithFromNode() throws Exception { // JBRULES-3631 String str = "package org.drools.compiler;\n" + "import org.drools.compiler.*;\n" + "rule R1 when\n" + " not( Person( name == \"Mark\" ));\n" + "then\n" + "end\n" + "rule R2 when\n" + " $p: Person( name == \"Mark\" );\n" + " not( Address() from $p.getAddresses() );\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); assertEquals(2, kbase.getKnowledgePackage("org.drools.compiler").getRules().size()); kbase.removeRule( "org.drools.compiler", "R2" ); assertEquals( 1, kbase.getKnowledgePackage( "org.drools.compiler" ).getRules().size() ); } @Test public void testDeterministicOTNOrdering() throws Exception { // JBRULES-3632 String str = "package indexingproblem.remove.me.anditworks;\n" + "declare Criteria\n" + " processed : boolean\n" + "end\n" + "\n" + "declare CheeseCriteria extends Criteria end\n" + "\n" + "rule setUp salience 10000 when\n" + "then\n" + " insert(new CheeseCriteria());\n" + "end\n" + "\n" + "rule aaa when\n" + " CheeseCriteria( )\n" + "then\n" + "end\n" + "\n" + "rule bbb when\n" + " CheeseCriteria( )\n" + "then\n" + "end\n" + "\n" + "rule ccc when\n" + " CheeseCriteria( )\n" + "then\n" + "end\n" + "\n" + "rule eeeFalse when\n" + " Criteria( processed == false )\n" + "then\n" + "end\n" + "\n" + "declare Filter end\n" + "\n" + "rule fffTrue when\n" + " Criteria( processed == true )\n" + " Filter( )\n" + "then\n" + "end\n" + "\n" + "rule ruleThatFails when\n" + " $criteria : Criteria( processed == false )\n" + "then\n" + " modify($criteria) { setProcessed(true) }\n" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); kbase = SerializationHelper.serializeObject( kbase ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.fireAllRules(); // check that OTNs ordering is not breaking serialization ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession, true ); ksession.fireAllRules(); } @Test public void testRemoveBigRule() throws Exception { // JBRULES-3496 String str = "package org.drools.compiler.test\n" + "\n" + "declare SimpleFact\n" + " patientSpaceId : String\n" + " block : int\n" + "end\n" + "\n" + "declare SimpleMembership\n" + " patientSpaceId : String\n" + " listId : String\n" + "end\n" + "\n" + "declare SimplePatient\n" + " spaceId : String\n" + "end\n" + "\n" + "rule \"RTR - 47146 retract\"\n" + "agenda-group \"list membership\"\n" + "when\n" + " $listMembership0 : SimpleMembership( $listMembershipPatientSpaceIdRoot : patientSpaceId, ( listId != null && listId == \"47146\" ) )\n" + " not ( $patient0 : SimplePatient( $patientSpaceIdRoot : spaceId, spaceId != null && spaceId == $listMembershipPatientSpaceIdRoot ) \n" + " and ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 1 )\n" + " ) or ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 2 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 3 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 4 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 5 )\n" + " ) ) and ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 6 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 7 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 8 )\n" + " ) ) and ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 9 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 10 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 11 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 12 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 13 )\n" + " ) or ( (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 14 )\n" + " ) and (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 15 )\n" + " ) ) or ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 16 )\n" + " ) and ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 17 )\n" + " ) ) or ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 18 )\n" + " ) and (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 19 )\n" + " ) ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 20 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 21 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 22 )\n" + " ) or ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 23 )\n" + " ) and (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 24 )\n" + " ) ) ) and ( ( " + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 25 )\n" + " ) or (" + " SimpleFact( patientSpaceId == $patientSpaceIdRoot, block == 26 )\n" + " ) ) )\n" + "then\n" + "end\n"; Collection<KnowledgePackage> kpgs = loadKnowledgePackagesFromString( str ); Assert.assertEquals(1, kpgs.size()); KnowledgeBase kbase = getKnowledgeBase(); kbase.addKnowledgePackages( kpgs ); kbase.removeKnowledgePackage( kpgs.iterator().next().getName() ); EntryPointNode epn = ( (InternalKnowledgeBase) kbase ).getRete().getEntryPointNodes().values().iterator().next(); for (ObjectTypeNode otn : epn.getObjectTypeNodes().values()) { ObjectSink[] sinks = otn.getObjectSinkPropagator().getSinks(); if (sinks.length > 0) { fail( otn + " has sinks " + Arrays.toString( sinks ) ); } } } @Test public void testCompilationFailureOnTernaryComparison() { // JBRULES-3642 String str = "declare Cont\n" + " val:Integer\n" + "end\n" + "rule makeFacts\n" + "salience 10\n" + "when\n" + "then\n" + " insert( new Cont(2) );\n" + "end\n" + "rule R1\n" + "when\n" + " $c: Cont( 3 < val < 10 )\n" + "then\n" + "end"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); } @Test public void testCommentWithCommaInRHS() { // JBRULES-3648 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $p : Person( age < name.length ) \n" + "then\n" + " insertLogical(new Person(\"Mario\",\n" + " // this is the age,\n" + " 38));" + "end"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); } @Test public void testAlphaHashingWithConstants() { // JBRULES-3658 String str = "import " + Person.class.getName() + ";\n" + "import " + MiscTest.class.getName() + ";\n" + "rule R1 when\n" + " $p : Person( age == 38 )\n" + "then end\n" + "rule R2 when\n" + " $p : Person( age == 37+1 )\n" + "then end\n" + "rule R3 when\n" + " $p : Person( age == 36+2 )\n" + "then end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString( str ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.insert( new Person( "Mario", 38 ) ); assertEquals( 3, ksession.fireAllRules() ); } @Test public void testEnabledExpression2() { String drl = "import " + Foo.class.getName() + ";\n" + "rule R1\n" + " enabled( rule.name == $f.id )" + "when\n" + " $f : Foo()\n" + "then end\n" + "rule R2\n" + "when\n" + " Foo( id == \"R2\" )\n" + "then end\n"; KieServices ks = KieServices.Factory.get(); // Create an in-memory jar for version 1.0.0 ReleaseId releaseId1 = ks.newReleaseId( "org.kie", "test-enabled", "1.0.0" ); KieModule km = createAndDeployJar( ks, releaseId1, drl ); // Create a session and fire rules KieContainer kc = ks.newKieContainer( km.getReleaseId() ); AgendaEventListener ael = mock( AgendaEventListener.class ); KieSession ksession = kc.newKieSession(); ksession.addEventListener( ael ); ksession.insert( new Foo( "R1", null ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); ArgumentCaptor<AfterMatchFiredEvent> event = ArgumentCaptor.forClass(AfterMatchFiredEvent.class); verify( ael ).afterMatchFired( event.capture() ); assertEquals( "R1", event.getValue().getMatch().getRule().getName() ); ael = mock( AgendaEventListener.class ); ksession = kc.newKieSession(); ksession.addEventListener( ael ); ksession.insert( new Foo( "R2", null ) ); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); event = ArgumentCaptor.forClass(AfterMatchFiredEvent.class); verify( ael ).afterMatchFired( event.capture() ); assertEquals( "R2", event.getValue().getMatch().getRule().getName() ); } @Test public void testMemoriesCCEWhenAddRemoveAddRule() { // JBRULES-3656 String rule1 = "import " + MiscTest.class.getCanonicalName() + ".*\n" + "import java.util.Date\n" + "rule \"RTR - 28717 retract\"\n" + "when\n" + " $listMembership0 : SimpleMembership( $listMembershipPatientSpaceIdRoot : patientSpaceId,\n" + " ( listId != null && listId == \"28717\" ) ) and not ($patient0 : SimplePatient( $patientSpaceIdRoot : spaceId, spaceId != null &&\n" + " spaceId == $listMembershipPatientSpaceIdRoot ) and\n" + " (($ruleTime0 : RuleTime( $ruleTimeStartOfDay4_1 : startOfDay, $ruleTimeTime4_1 : time ) and $patient1 :\n" + " SimplePatient( spaceId != null && spaceId == $patientSpaceIdRoot, birthDate != null && (birthDate after[0s,1d] $ruleTimeStartOfDay4_1) ) ) ) )\n" + "then\n" + "end"; String rule2 = "import " + MiscTest.class.getCanonicalName() + ".*\n" + "import java.util.Date\n" + "rule \"RTR - 28717 retract\"\n" + "when $listMembership0 : SimpleMembership( $listMembershipPatientSpaceIdRoot : patientSpaceId, ( listId != null && listId == \"28717\" ) )\n" + " and not ($patient0 : SimplePatient( $patientSpaceIdRoot : spaceId, spaceId != null && spaceId == $listMembershipPatientSpaceIdRoot )\n" + " and ( ($ruleTime0 : RuleTime( $ruleTimeStartOfDay4_1 : startOfDay, $ruleTimeTime4_1 : time )\n" + " and $patient1 : SimplePatient( spaceId != null && spaceId == $patientSpaceIdRoot, birthDate != null && (birthDate not after[0s,1d] $ruleTimeStartOfDay4_1) ) ) ) )\n" + "then\n" + "end"; KnowledgeBase kbase = getKnowledgeBase(); StatefulKnowledgeSession knowledgeSession = kbase.newStatefulKnowledgeSession(); kbase.addKnowledgePackages(loadKnowledgePackagesFromString( rule1 ) ); kbase.addKnowledgePackages(loadKnowledgePackagesFromString(rule2) ); } public static class RuleTime { public Date getTime() { return new Date(); } public Date getStartOfDay() { return new Date(); } } public static class SimpleMembership { public String getListId() { return ""; } public String getPatientSpaceId() { return ""; } } public class SimplePatient { public String getSpaceId() { return ""; } public String getFactHandleString() { return ""; } public Date getBirthDate() { return new Date(); } } }