/*
* Copyright 2017 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.testcoverage.functional.oopath;
import java.util.ArrayList;
import java.util.List;
import org.assertj.core.api.Assertions;
import org.drools.testcoverage.common.model.Address;
import org.drools.testcoverage.common.model.Employee;
import org.drools.testcoverage.common.util.KieBaseUtil;
import org.junit.After;
import org.junit.Test;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;
/**
* Tests usage of OOPath expressions resulting in multiple conditional branches (e.g. OR operator).
*/
public class OOPathLogicalBranchesTest {
private static final KieServices KIE_SERVICES = KieServices.Factory.get();
private KieSession kieSession;
private List<String> results;
@After
public void disposeKieSession() {
if (this.kieSession != null) {
this.kieSession.dispose();
this.kieSession = null;
this.results = null;
}
}
@Test
public void testBasicOrCondition() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" Employee( $address: /address[ street == 'Elm' || city == 'Big City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City", "Small City");
}
@Test
public void testOrConstraint() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $emp: Employee( $address: /address[ street == 'Elm' || city == 'Big City' ] )\n" +
" Employee( this != $emp, /address[ street == 'Elm' || city == 'Big City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City", "Small City");
}
@Test
public void testOrConstraintWithJoin() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $emp: Employee( $address: /address[ street == 'Elm' || city == 'Big City' ] )\n" +
" Employee( this != $emp, /address[ street == $address.street || city == 'Big City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City", "Small City");
}
@Test
public void testOrConstraintNoBinding() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $emp: Employee( /address[ street == 'Elm' || city == 'Big City' ] )\n" +
" Employee( this != $emp, /address[ street == 'Elm' || city == 'Big City' ] )\n" +
"then\n" +
" list.add( $emp.getName() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Bruno", "Alice");
}
@Test
public void testOrConditionalElement() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" Employee( $address: /address[ street == 'Elm', city == 'Big City' ] )\n" +
" or " +
" Employee( $address: /address[ street == 'Elm', city == 'Small City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City", "Small City");
}
@Test
public void testOrConditionalElementNoBinding() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $employee: (\n" +
" Employee( /address[ street == 'Elm', city == 'Big City' ] )\n" +
" or " +
" Employee( /address[ street == 'Elm', city == 'Small City' ] )\n" +
" )\n" +
"then\n" +
" list.add( $employee.getName() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Bruno", "Alice");
}
@Test
public void testBasicAndCondition() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" Employee( $address: /address[ street == 'Elm' && city == 'Big City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactly("Big City");
}
@Test
public void testAndConstraint() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $emp: Employee( $address: /address[ street == 'Elm' && city == 'Big City' ] )\n" +
" Employee( this != $emp, /address[ street == 'Elm' && city == 'Small City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City");
}
@Test
public void testAndConstraintNoBinding() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $emp: Employee( /address[ street == 'Elm' && city == 'Big City' ] )\n" +
" Employee( this != $emp, /address[ street == 'Elm' && city == 'Small City' ] )\n" +
"then\n" +
" list.add( $emp.getName() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Alice");
}
@Test
public void testAndConditionalElement() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" Employee( $address: /address[ street == 'Elm', city == 'Big City' ] )\n" +
" and " +
" Employee( /address[ street == 'Elm', city == 'Small City' ] )\n" +
"then\n" +
" list.add( $address.getCity() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.initKieSession(kieBase);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Big City");
}
@Test
public void testAndConditionalElementWithNot() {
final String drl =
"import org.drools.testcoverage.common.model.Employee;\n" +
"import org.drools.testcoverage.common.model.Address;\n" +
"global java.util.List list\n" +
"\n" +
"rule R when\n" +
" $employee: Employee( /address[ street == 'Elm', city == 'Big City' ] )\n" +
" and " +
" not Employee( /address[ street == 'Elm', city == 'Small City' ] )\n" +
"then\n" +
" list.add( $employee.getName() );\n" +
"end\n";
final KieBase kieBase = KieBaseUtil.getKieBaseFromDRLResources(true, KIE_SERVICES.getResources().newByteArrayResource(drl.getBytes()));
this.createKieSession(kieBase);
final Employee bruno = this.createEmployee("Bruno", new Address("Elm", 10, "Small City"));
final FactHandle brunoFactHandle = this.kieSession.insert(bruno);
final Employee alice = this.createEmployee("Alice", new Address("Elm", 10, "Big City"));
this.kieSession.insert(alice);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).isEmpty();
this.kieSession.delete(brunoFactHandle);
this.kieSession.fireAllRules();
Assertions.assertThat(this.results).containsExactlyInAnyOrder("Alice");
}
private void initKieSession(final KieBase kieBase) {
this.createKieSession(kieBase);
this.populateKieSession();
}
private void createKieSession(final KieBase kieBase) {
this.kieSession = kieBase.newKieSession();
this.results = new ArrayList<String>();
this.kieSession.setGlobal("list", results);
}
private void populateKieSession() {
final Employee bruno = this.createEmployee("Bruno", new Address("Elm", 10, "Small City"));
this.kieSession.insert(bruno);
final Employee alice = this.createEmployee("Alice", new Address("Elm", 10, "Big City"));
this.kieSession.insert(alice);
}
private Employee createEmployee(final String name, final Address address) {
final Employee employee = new Employee(name);
employee.setAddress(address);
return employee;
}
}