/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.compiler; import java.util.ArrayList; import java.util.List; import org.junit.Test; import org.kie.internal.KnowledgeBase; import org.kie.internal.runtime.StatefulKnowledgeSession; public class InlineCastTest extends CommonTestMethodBase { @Test public void testInlineCast() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", address#LongAddress.country == \"uk\" )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastWithBinding() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", $country : address#LongAddress.country == \"uk\" )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastOnlyBinding() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", $country : address#LongAddress.country )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastWithFQN() throws Exception { String str = "import org.drools.compiler.Person;\n" + "rule R1 when\n" + " Person( name == \"mark\", address#org.drools.compiler.LongAddress.country == \"uk\" )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastOnRightOperand() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $person : Person( )\n" + " String( this == $person.address#LongAddress.country )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); ksession.insert("uk"); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastOnRightOperandWithFQN() throws Exception { String str = "import org.drools.compiler.Person;\n" + "rule R1 when\n" + " $person : Person( )\n" + " String( this == $person.address#org.drools.compiler.LongAddress.country )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); ksession.insert("uk"); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInferredCast() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", address instanceof LongAddress, address.country == \"uk\" )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineTypeCast() throws Exception { // DROOLS-136 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", address#LongAddress )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastWithNestedAccces() throws Exception { // DROOLS-127 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", address#LongAddress.country.length == 2 )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new Address()); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastWithNestedAcccesAndNullSafeDereferencing() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( name == \"mark\", address#LongAddress.country!.length == 2 )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new LongAddress( null ) ); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testInlineCastWithNestedAcccesAndNullSafeDereferencing2() throws Exception { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( " + " name == \"mark\", " + " name == \"john\" || address#LongAddress.country!.length == 2 )\n" + "then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); Person mark2 = new Person("mark"); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new LongAddress( null ) ); ksession.insert(mark3); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testSuperclass() { String drl = "package org.drools.compiler.integrationtests\n" + "import org.drools.compiler.*;\n" + "rule R1\n" + " when\n" + " Person( address#LongAddress.country str[startsWith] \"United\" )\n" + " then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); try { Person mark1 = new Person("mark"); mark1.setAddress(new Address()); ksession.insert(mark1); Person mark2 = new Person("mark"); mark2.setAddress(new LongAddress("United Kingdom")); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new LongAddress("Czech Republic")); ksession.insert(mark3); assertEquals("wrong number of rules fired", 1, ksession.fireAllRules()); } finally { ksession.dispose(); } } @Test public void testGroupedAccess() { String drl = "package org.drools.compiler.integrationtests\n" + "import org.drools.compiler.*;\n" + "rule R1\n" + " when\n" + " Person( address#LongAddress.(country == \"United States\" || country == \"United Kingdom\") )\n" + " then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); try { Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("United States")); ksession.insert(mark1); Person mark2 = new Person("mark"); mark2.setAddress(new LongAddress("United Kingdom")); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new LongAddress("Czech Republic")); ksession.insert(mark3); assertEquals("wrong number of rules fired", 2, ksession.fireAllRules()); } finally { ksession.dispose(); } } @Test public void testMatchesOperator() { // BZ-971008 String drl = "package org.drools.compiler.integrationtests\n" + "import org.drools.compiler.*;\n" + "rule R1\n" + " when\n" + " Person( address#LongAddress.country matches \"[Uu]nited.*\" )\n" + " then\n" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); try { Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("United States")); ksession.insert(mark1); Person mark2 = new Person("mark"); mark2.setAddress(new LongAddress("United Kingdom")); ksession.insert(mark2); Person mark3 = new Person("mark"); mark3.setAddress(new LongAddress("Czech Republic")); ksession.insert(mark3); assertEquals( "wrong number of rules fired", 2, ksession.fireAllRules() ); } finally { ksession.dispose(); } } @Test public void testInlineCastWithThis() { String drl = "package org.drools.compiler.integrationtests " + "import org.drools.compiler.*; " + "rule R1 " + " when " + " Object( this#String matches \"[Uu]nited.*\" ) " + " then " + "end "; KnowledgeBase kbase = loadKnowledgeBaseFromString(drl); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); try { ksession.insert( "United States" ); ksession.insert( "United Kingdom" ); ksession.insert( "Italy" ); assertEquals( "wrong number of rules fired", 2, ksession.fireAllRules() ); } finally { ksession.dispose(); } } @Test public void testInlineCastWithFQNAndMethodInvocation() throws Exception { // DROOLS-1337 String str = "import org.drools.compiler.Person;\n" + "global java.util.List list;\n" + "rule R1 when\n" + " Person( name == \"mark\", $x : address#org.drools.compiler.LongAddress.country.substring(1) )\n" + "then\n" + " list.add($x);" + "end\n"; KnowledgeBase kbase = loadKnowledgeBaseFromString(str); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); List<String> list = new ArrayList<String>(); ksession.setGlobal( "list", list ); Person mark1 = new Person("mark"); mark1.setAddress(new LongAddress("uk")); ksession.insert(mark1); assertEquals(1, ksession.fireAllRules()); assertEquals(1, list.size()); assertEquals("k", list.get(0)); ksession.dispose(); } }