/* * 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.integrationtests; import org.drools.compiler.Address; import org.drools.compiler.CommonTestMethodBase; import org.drools.compiler.Person; import org.junit.Test; import org.kie.api.KieBase; import org.kie.api.runtime.KieSession; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class NullSafeDereferencingTest extends CommonTestMethodBase { @Test public void testNullSafeBinding() { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( $streetName : address!.street ) \n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); assertEquals(2, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeNullComparison() { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( address!.street == null ) \n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeNullComparison2() { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $street : String()\n"+ " Person( address!.street == $street ) \n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); ksession.insert("Main Street"); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeNullComparisonReverse() { // DROOLS-82 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( \"Main Street\".equalsIgnoreCase(address!.street) )\n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeNullComparisonReverseComplex() { // DROOLS-82 String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( \"Main\".equalsIgnoreCase(address!.street!.substring(0, address!.street!.indexOf(' '))) )\n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testDoubleNullSafe() { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " Person( address!.street!.length > 15 ) \n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); Person alex = new Person("Alex", 34); alex.setAddress(new Address("The Main Very Big Street")); ksession.insert(alex); assertEquals(1, ksession.fireAllRules()); ksession.dispose(); } @Test public void testMixedNullSafes() { String str = "import org.drools.compiler.*;\n" + "rule R1 when\n" + " $p : Person( " + " address!.street!.length > 0 && ( address!.street!.length < 15 || > 20 && < 30 ) " + " && address!.zipCode!.length > 0 && address.zipCode == \"12345\" " + " ) \n" + "then\n" + " System.out.println( $p ); \n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street",null,"12345")); ksession.insert(mark); Person edson = new Person("Edson", 34); edson.setAddress(new Address(null)); ksession.insert(edson); Person alex = new Person("Alex", 34); alex.setAddress(new Address("The Main Verrry Long Street")); ksession.insert(alex); Person frank = new Person("Frank", 24); frank.setAddress(new Address("Long Street number 21",null,"12345")); ksession.insert(frank); assertEquals(2, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeMemberOf() { // DROOLS-50 String str = "declare A\n" + " list : java.util.List\n" + "end\n" + "\n" + "rule Init when\n" + "then\n" + " insert( new A( java.util.Arrays.asList( \"test\" ) ) );" + " insert( \"test\" );" + "end\n" + "rule R when\n" + " $a : A()\n" + " $s : String( this memberOf $a!.list )\n" + "then\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); assertEquals(2, ksession.fireAllRules()); ksession.dispose(); } @Test public void testNullSafeInnerConstraint() { String str = "declare Content\n" + " complexContent : Content\n" + " extension : Content\n" + "end\n" + "\n" + "declare Context\n" + " ctx : Content\n" + "end\n" + "\n" + "rule \"Complex Type Attribute\"\n" + "when\n" + " $con : Content()\n" + " Context( ctx == $con || == $con!.complexContent!.extension )\n" + "then\n" + " System.out.println( $con ); \n" + "end\n" + "\n" + "rule \"Init\"\n" + "when\n" + "then\n" + " Content ext = new Content();\n" + " Content complex = new Content( new Content( null, ext ), null );\n" + " Content complex2 = new Content( null, null );\n" + " Context ctx = new Context( ext );\n" + " Context ctx2 = new Context( complex2 );\n" + " insert( complex );\n" + " insert( complex2 );\n" + " insert( ctx );\n" + " insert( ctx2 );\n" + "end"; KieBase kbase = loadKnowledgeBaseFromString(str); KieSession ksession = kbase.newKieSession(); assertEquals( 3, ksession.fireAllRules() ); ksession.dispose(); } @Test public void testNullSafeNestedAccessors() { String str = "package org.drools.test; " + "import " + Person.class.getName() + "; " + "global java.util.List list; " + "rule R1 when " + " $street : String() "+ " Person( address!.( street == $street, $zip : zipCode ) ) " + "then " + " list.add( $zip ); " + "end"; KieBase kbase = loadKnowledgeBaseFromString( str ); KieSession ksession = kbase.newKieSession(); List list = new ArrayList(); ksession.setGlobal( "list", list ); ksession.insert(new Person("Mario", 38)); Person mark = new Person("Mark", 37); mark.setAddress(new Address("Main Street", "", "123456")); ksession.insert(mark); ksession.insert("Main Street"); assertEquals( 1, ksession.fireAllRules() ); ksession.dispose(); assertEquals( Arrays.asList( "123456" ), list ); } }