/* * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler.integrationtests; import org.kie.api.io.ResourceType; import org.kie.internal.KnowledgeBase; import org.kie.internal.KnowledgeBaseFactory; import org.kie.internal.builder.CompositeKnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilder; import org.kie.internal.builder.KnowledgeBuilderFactory; import org.kie.internal.io.ResourceFactory; import org.kie.internal.runtime.StatefulKnowledgeSession; import java.util.ArrayList; import java.util.List; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class RuleExtensionTest { @Test public void testRuleExtendsNonexistingRule() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + "\n" + "rule \"ExtYes\" extends \"Bas\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL ); assertTrue( kbuilder.hasErrors() ); kbuilder.getErrors().iterator().next().toString().contains("Base"); } @Test public void testRuleExtendsBetweenDRLs() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); kbuilder.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ); assertFalse(kbuilder.hasErrors()); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession knowledgeSession = kb.newStatefulKnowledgeSession(); List list = new ArrayList(); knowledgeSession.setGlobal( "list", list ); knowledgeSession.fireAllRules(); assertEquals(0, list.size()); knowledgeSession.insert( "go" ); knowledgeSession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testRuleExtendsOnIncrementalKB() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newByteArrayResource(str.getBytes()), ResourceType.DRL); assertFalse(kbuilder.hasErrors()); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); KnowledgeBuilder kbuilder2 = KnowledgeBuilderFactory.newKnowledgeBuilder( kb ); kbuilder2.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ); assertFalse(kbuilder2.hasErrors()); StatefulKnowledgeSession knowledgeSession = kb.newStatefulKnowledgeSession(); List list = new ArrayList(); knowledgeSession.setGlobal( "list", list ); knowledgeSession.fireAllRules(); assertEquals( 0, list.size() ); knowledgeSession.insert( "go" ); knowledgeSession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testRuleExtendsMissingOnIncrementalKB() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"Bse\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); assertFalse(kbuilder.hasErrors()); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); KnowledgeBuilder kbuilder2 = KnowledgeBuilderFactory.newKnowledgeBuilder( kb ); kbuilder2.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ); assertTrue(kbuilder2.hasErrors()); } @Test public void testRuleExtendsWithCompositeKBuilder() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .build(); assertFalse( kbuilder.hasErrors() ); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession knowledgeSession = kb.newStatefulKnowledgeSession(); List list = new ArrayList(); knowledgeSession.setGlobal( "list", list ); knowledgeSession.fireAllRules(); assertEquals( 0, list.size() ); knowledgeSession.insert( "go" ); knowledgeSession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testRuleExtendsNonExistingWithCompositeKBuilder() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"ase\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .build(); assertTrue( kbuilder.hasErrors() ); } @Test public void testRuleExtendsNonExistingWithCompositeKBuilderOutOfOrder() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"ase\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ) .build(); assertTrue( kbuilder.hasErrors() ); System.out.println( kbuilder.getErrors() ); assertFalse( kbuilder.getErrors().toString().contains( "Circular" ) ); assertTrue( kbuilder.getErrors().toString().contains( "Base" ) ); } @Test public void testRuleExtendsWithCompositeKBuilderFreeOrder() { // DROOLS-100 String str = "package org.drools.test;\n" + "\n" + "global java.util.List list;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " String( this == \"go\" )\n" + "then\n" + "end\n" + ""; String str2 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + "then\n" + " list.add( 1 );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ) .build(); assertFalse( kbuilder.hasErrors() ); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession knowledgeSession = kb.newStatefulKnowledgeSession(); List list = new ArrayList(); knowledgeSession.setGlobal( "list", list ); knowledgeSession.fireAllRules(); assertEquals( 0, list.size() ); knowledgeSession.insert( "go" ); knowledgeSession.fireAllRules(); assertEquals( 1, list.size() ); } @Test public void testRuleExtendsExtendsWithCompositeKBuilderFreeOrder() { // DROOLS-100 String str1 = "package org.drools.test;\n" + "\n" + "rule \"Base\"\n" + "when\n" + " $i : Integer( this < 5 )\n" + "then\n" + "end\n"; String str2 = "package org.drools.test;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + " $j : Integer( this > 5 )\n" + "then\n" + "end\n"; String str3 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"FinalRule\" extends \"ExtYes\"\n" + "when\n" + "then\n" + " list.add( $i + $j );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str3.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str1.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .build(); assertFalse( kbuilder.hasErrors() ); KnowledgeBase kb = KnowledgeBaseFactory.newKnowledgeBase(); kb.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession knowledgeSession = kb.newStatefulKnowledgeSession(); List<Integer> list = new ArrayList<Integer>(); knowledgeSession.setGlobal( "list", list ); knowledgeSession.fireAllRules(); assertEquals( 0, list.size() ); knowledgeSession.insert( 4 ); knowledgeSession.insert( 6 ); knowledgeSession.fireAllRules(); assertEquals( 1, list.size() ); assertEquals( 10, (int)list.get(0) ); } @Test public void testRuleCircularExtension() { // DROOLS-100 String str1 = "package org.drools.test;\n" + "\n" + "rule \"Base\" extends \"FinalRule\"\n" + "when\n" + " $i : Integer( this < 5 )\n" + "then\n" + "end\n"; String str2 = "package org.drools.test;\n" + "\n" + "rule \"ExtYes\" extends \"Base\"\n" + "when\n" + " $j : Integer( this > 5 )\n" + "then\n" + "end\n"; String str3 = "package org.drools.test;\n" + "global java.util.List list;\n" + "\n" + "rule \"Dummy\"\n" + "when\n" + "then\n" + "end\n" + "rule \"FinalRule\" extends \"ExtYes\"\n" + "when\n" + "then\n" + " list.add( $i + $j );\n" + "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); CompositeKnowledgeBuilder ckb = kbuilder.batch(); ckb.add( ResourceFactory.newByteArrayResource( str3.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str1.getBytes() ), ResourceType.DRL ) .add( ResourceFactory.newByteArrayResource( str2.getBytes() ), ResourceType.DRL ) .build(); assertTrue( kbuilder.hasErrors() ); assertEquals( 1, kbuilder.getErrors().size() ); assertTrue( kbuilder.getErrors().iterator().next().toString().contains("Circular") ); } }