/*
* 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.CommonTestMethodBase;
import org.drools.compiler.Person;
import org.drools.compiler.RoutingMessage;
import org.junit.Test;
import org.kie.api.io.ResourceType;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
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;
public class StrEvaluatorTest extends CommonTestMethodBase {
@Test
public void testStrStartsWith() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue("R1:messageBody");
ksession.insert(m);
ksession.fireAllRules();
assertTrue(list.size() == 4);
assertTrue( ((String) list.get(0)).equals("Message starts with R1") );
assertTrue( ((String) list.get(1)).equals("Message length is not 17") );
assertTrue( ((String) list.get(2)).equals("Message does not start with R2") );
assertTrue( ((String) list.get(3)).equals("Message does not end with R1") );
}
@Test
public void testStrEndsWith() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue("messageBody:R2");
ksession.insert(m);
ksession.fireAllRules();
assertTrue(list.size() == 4);
assertTrue( ((String) list.get(0)).equals("Message ends with R2") );
assertTrue( ((String) list.get(1)).equals("Message length is not 17") );
assertTrue( ((String) list.get(2)).equals("Message does not start with R2") );
assertTrue( ((String) list.get(3)).equals("Message does not end with R1") );
}
@Test
public void testStrLengthEquals() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue( "R1:messageBody:R2" );
ksession.insert( m );
ksession.fireAllRules();
assertEquals( 6, list.size() );
assertTrue(list.contains( "Message length is 17" ));
}
@Test
public void testStrNotStartsWith() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue("messageBody");
ksession.insert(m);
ksession.fireAllRules();
assertTrue( list.size() == 3 );
assertTrue( ((String) list.get(1)).equals( "Message does not start with R2" ) );
}
@Test
public void testStrNotEndsWith() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue("messageBody");
ksession.insert(m);
ksession.fireAllRules();
assertTrue( list.size() == 3 );
assertTrue( ( (String) list.get( 0 ) ).equals( "Message length is not 17" ) );
assertTrue( ((String) list.get(1)).equals("Message does not start with R2") );
assertTrue(((String) list.get(2)).equals("Message does not end with R1"));
}
@Test
public void testStrLengthNoEquals() throws Exception {
KnowledgeBase kbase = readKnowledgeBase();
StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
List list = new ArrayList();
ksession.setGlobal( "list", list );
RoutingMessage m = new RoutingMessage();
m.setRoutingValue("messageBody");
ksession.insert(m);
ksession.fireAllRules();
assertTrue(list.size() == 3);
assertTrue( ((String) list.get(0)).equals("Message length is not 17") );
assertTrue( ((String) list.get(1)).equals("Message does not start with R2") );
assertTrue( ((String) list.get(2)).equals("Message does not end with R1") );
}
@Test
public void testStrWithLogicalOr() {
String drl = "package org.drools.compiler.integrationtests\n"
+ "import org.drools.compiler.RoutingMessage\n"
+ "rule R1\n"
+ " when\n"
+ " RoutingMessage( routingValue == \"R2\" || routingValue str[startsWith] \"R1\" )\n"
+ " then\n"
+ "end\n";
KnowledgeBase kbase = loadKnowledgeBaseFromString( drl );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
try {
for (String msgValue : new String[]{ "R1something", "R2something", "R2" }) {
RoutingMessage msg = new RoutingMessage();
msg.setRoutingValue(msgValue);
ksession.insert(msg);
}
assertEquals("Wrong number of rules fired", 2, ksession.fireAllRules());
} finally {
ksession.dispose();
}
}
@Test
public void testStrWithInlineCastAndFieldOnThis() {
String drl = "package org.drools.compiler.integrationtests " +
"import " + Person.class.getName() + "; " +
"rule R1 " +
" when " +
" Object( this#" + Person.class.getName() + ".name str[startsWith] \"M\" ) " +
" then " +
"end ";
KnowledgeBase kbase = loadKnowledgeBaseFromString(drl);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
try {
ksession.insert( new Person( "Mark" ) );
assertEquals("Wrong number of rules fired", 1, ksession.fireAllRules());
} finally {
ksession.dispose();
}
}
@Test
public void testStrWithInlineCastOnThis() {
String drl = "package org.drools.compiler.integrationtests " +
"rule R1 " +
" when " +
" Object( this#String str[startsWith] \"M\" ) " +
" then " +
"end ";
KnowledgeBase kbase = loadKnowledgeBaseFromString(drl);
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
try {
ksession.insert( "Mark" );
assertEquals( "Wrong number of rules fired", 1, ksession.fireAllRules() );
} finally {
ksession.dispose();
}
}
private KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newInputStreamResource(getClass().getResourceAsStream("strevaluator_test.drl")),
ResourceType.DRL );
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge." + errors.toArray());
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
}