Skip to content

Commit

Permalink
[DROOLS-6325] Enhance executable model node sharing test coverage (ap…
Browse files Browse the repository at this point in the history
  • Loading branch information
tkobayas committed May 7, 2021
1 parent 0a340cc commit 63f2903
Show file tree
Hide file tree
Showing 2 changed files with 202 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,23 @@
package org.drools.modelcompiler;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.drools.core.base.ClassObjectType;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.reteoo.AccumulateNode;
import org.drools.core.reteoo.AlphaNode;
import org.drools.core.reteoo.BetaNode;
import org.drools.core.reteoo.EntryPointNode;
import org.drools.core.reteoo.ExistsNode;
import org.drools.core.reteoo.FromNode;
import org.drools.core.reteoo.LeftInputAdapterNode;
import org.drools.core.reteoo.NotNode;
import org.drools.core.reteoo.ObjectTypeNode;
import org.drools.modelcompiler.domain.Address;
import org.drools.modelcompiler.domain.Person;
import org.drools.modelcompiler.domain.Result;
import org.junit.Test;
Expand Down Expand Up @@ -275,4 +281,169 @@ public void testShareEval() {
LeftInputAdapterNode lian = (LeftInputAdapterNode) otn.getSinks()[0];
assertEquals(1, lian.getSinks().length);
}

public void testShareFrom() {
String str =
"import " + Person.class.getCanonicalName() + ";\n" +
"import " + Address.class.getCanonicalName() + ";\n" +
"global java.util.List list\n" +
"rule R1 when\n" +
" $p : Person()\n" +
" $a : Address(city == \"Tokyo\") from $p.addresses\n" +
"then\n" +
" list.add($a);\n" +
"end\n" +
"rule R2 when\n" +
" $p : Person()\n" +
" $a : Address(city == \"Tokyo\") from $p.addresses\n" +
"then\n" +
" list.add($a);\n" +
"end\n";

KieSession ksession = getKieSession(str);

List<Address> list = new ArrayList<>();
ksession.setGlobal("list", list);

Person p = new Person("John");
p.getAddresses().add(new Address("ABC", 1, "Tokyo"));
p.getAddresses().add(new Address("DEF", 2, "Tokyo"));
p.getAddresses().add(new Address("GHI", 3, "Osaka"));

ksession.insert(p);
assertEquals(4, ksession.fireAllRules());
assertEquals(4, list.size());

assertEquals(1, ReteDumper.collectNodes(ksession).stream().filter(FromNode.class::isInstance).count());
}

@Test
public void testShareAccumulate() {
String str =
"import " + Person.class.getCanonicalName() + ";" +
"import " + Result.class.getCanonicalName() + ";" +
"rule X1 when\n" +
" accumulate ( $p: Person ( getName().startsWith(\"M\") ); \n" +
" $sum : sum($p.getAge()) \n" +
" ) \n" +
"then\n" +
" insert(new Result($sum));\n" +
"end\n" +
"rule X2 when\n" +
" accumulate ( $p: Person ( getName().startsWith(\"M\") ); \n" +
" $sum : sum($p.getAge()) \n" +
" ) \n" +
"then\n" +
" insert(new Result($sum));\n" +
"end";

KieSession ksession = getKieSession(str);

ksession.insert(new Person("Mark", 37));
ksession.insert(new Person("Edson", 35));
ksession.insert(new Person("Mario", 40));

assertEquals(2, ksession.fireAllRules());

Collection<Result> results = getObjectsIntoList(ksession, Result.class);
assertEquals(2, results.size());
assertEquals(77, results.iterator().next().getValue());

assertEquals(1, ReteDumper.collectNodes(ksession).stream().filter(AccumulateNode.class::isInstance).count());
}

@Test
public void testShareFromAccumulate() {
String str =
"import " + Person.class.getCanonicalName() + ";" +
"import " + Result.class.getCanonicalName() + ";" +
"rule X1 when\n" +
" $sum : Number( intValue() > 0 )from accumulate ( $p: Person ( getName().startsWith(\"M\") ); \n" +
" sum($p.getAge()) \n" +
" )\n" +
"then\n" +
" insert(new Result($sum));\n" +
"end\n" +
"rule X2 when\n" +
" $sum : Number( intValue() > 0 )from accumulate ( $p: Person ( getName().startsWith(\"M\") ); \n" +
" sum($p.getAge()) \n" +
" )\n" +
"then\n" +
" insert(new Result($sum));\n" +
"end";

KieSession ksession = getKieSession(str);

ksession.insert(new Person("Mark", 37));
ksession.insert(new Person("Edson", 35));
ksession.insert(new Person("Mario", 40));

assertEquals(2, ksession.fireAllRules());

Collection<Result> results = getObjectsIntoList(ksession, Result.class);
assertEquals(2, results.size());
assertEquals(77, results.iterator().next().getValue());

assertEquals(1, ReteDumper.collectNodes(ksession).stream().filter(AccumulateNode.class::isInstance).count());
}

@Test
public void testShareExists() {
String str =
"import " + Person.class.getCanonicalName() + ";" +
"import " + Result.class.getCanonicalName() + ";" +
"rule R1 when\n" +
" exists Person( name.length == 5 )\n" +
"then\n" +
" insert(new Result(\"ok\"));\n" +
"end\n" +
"rule R2 when\n" +
" exists Person( name.length == 5 )\n" +
"then\n" +
" insert(new Result(\"ok\"));\n" +
"end";

KieSession ksession = getKieSession(str);

Person mario = new Person("Mario", 40);

ksession.insert(mario);
assertEquals(2, ksession.fireAllRules());

Collection<Result> results = getObjectsIntoList(ksession, Result.class);
assertEquals(2, results.size());
assertEquals("ok", results.iterator().next().getValue());

assertEquals(1, ReteDumper.collectNodes(ksession).stream().filter(ExistsNode.class::isInstance).count());
}

@Test
public void testShareNot() {
String str =
"import " + Person.class.getCanonicalName() + ";" +
"import " + Result.class.getCanonicalName() + ";" +
"rule R1 when\n" +
" not( Person( name.length == 4 ) )\n" +
"then\n" +
" insert(new Result(\"ok\"));\n" +
"end\n" +
"rule R2 when\n" +
" not( Person( name.length == 4 ) )\n" +
"then\n" +
" insert(new Result(\"ok\"));\n" +
"end";

KieSession ksession = getKieSession(str);

Person mario = new Person("Mario", 40);

ksession.insert(mario);
assertEquals(2, ksession.fireAllRules());

Collection<Result> results = getObjectsIntoList(ksession, Result.class);
assertEquals(2, results.size());
assertEquals("ok", results.iterator().next().getValue());

assertEquals(1, ReteDumper.collectNodes(ksession).stream().filter(NotNode.class::isInstance).count());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
import java.util.Collection;
import java.util.List;

import org.drools.core.base.ClassObjectType;
import org.drools.core.impl.InternalKnowledgeBase;
import org.drools.core.reteoo.EntryPointNode;
import org.drools.core.reteoo.ObjectTypeNode;
import org.drools.testcoverage.common.model.FactWithList;
import org.drools.testcoverage.common.util.KieBaseTestConfiguration;
import org.drools.testcoverage.common.util.KieBaseUtil;
Expand Down Expand Up @@ -79,6 +83,16 @@ public void testShouldAlphaShareBecauseSameConstantDespiteDifferentSyntax() {
"";

final KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("sharing-test", kieBaseTestConfiguration, drl1, drl2);

EntryPointNode epn = ((InternalKnowledgeBase) kbase).getRete().getEntryPointNodes().values().iterator().next();
ObjectTypeNode otn = epn.getObjectTypeNodes().get(new ClassObjectType(TestObject.class));

if (kieBaseTestConfiguration.isExecutableModel()) {
assertEquals(3, otn.getSinks().length); // See DROOLS-6328
} else {
assertEquals(2, otn.getSinks().length);
}

final KieSession kieSession = kbase.newKieSession();
try {
kieSession.insert(new TestObject(1));
Expand Down Expand Up @@ -111,6 +125,11 @@ public void testShouldAlphaShareNotEqualsInDifferentPackages() {
"";

final KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("sharing-test", kieBaseTestConfiguration, drl1, drl2);

EntryPointNode epn = ((InternalKnowledgeBase) kbase).getRete().getEntryPointNodes().values().iterator().next();
ObjectTypeNode otn = epn.getObjectTypeNodes().get(new ClassObjectType(TestObject.class));
assertEquals(2, otn.getSinks().length);

final KieSession kieSession = kbase.newKieSession();
try {
kieSession.insert(new TestObject(1));
Expand Down Expand Up @@ -144,6 +163,11 @@ public void testShouldAlphaShareNotEqualsInDifferentPackages2() {
"";

final KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("sharing-test", kieBaseTestConfiguration, drl1, drl2);

EntryPointNode epn = ((InternalKnowledgeBase) kbase).getRete().getEntryPointNodes().values().iterator().next();
ObjectTypeNode otn = epn.getObjectTypeNodes().get(new ClassObjectType(FactWithList.class));
assertEquals(2, otn.getSinks().length);

final KieSession kieSession = kbase.newKieSession();
try {
final FactWithList factWithList = new FactWithList("test");
Expand Down Expand Up @@ -188,6 +212,13 @@ public void testSubnetworkSharing() {
"end\n";

final KieBase kbase = KieBaseUtil.getKieBaseFromKieModuleFromDrl("sharing-test", kieBaseTestConfiguration, drl);

EntryPointNode epn = ((InternalKnowledgeBase) kbase).getRete().getEntryPointNodes().values().iterator().next();
ObjectTypeNode otnA = epn.getObjectTypeNodes().get(new ClassObjectType(A.class));
assertEquals(2, otnA.getSinks().length);
ObjectTypeNode otnB = epn.getObjectTypeNodes().get(new ClassObjectType(B.class));
assertEquals(1, otnB.getSinks().length);

final KieSession kieSession = kbase.newKieSession();
try {
final List<String> list = new ArrayList<>();
Expand Down

0 comments on commit 63f2903

Please sign in to comment.