package org.drools.integrationtests;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.*;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.drools.Cheese;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.Channel;
import org.drools.runtime.StatefulKnowledgeSession;
import org.mockito.exceptions.verification.NeverWantedButInvoked;
public class IntegrationInterfacesTest extends TestCase {
private KnowledgeBase getKnowledgeBase(final String resourceName) throws IOException,
ClassNotFoundException {
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newClassPathResource( resourceName,
getClass() ),
ResourceType.DRL );
assertFalse( kbuilder.getErrors().toString(),
kbuilder.hasErrors() );
KnowledgeBase kbase = getKnowledgeBase( kbuilder );
return kbase;
}
private KnowledgeBase getKnowledgeBase(final Reader[] readers) throws IOException,
ClassNotFoundException {
final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
for ( Reader reader : readers ) {
kbuilder.add( ResourceFactory.newReaderResource( reader ),
ResourceType.DRL );
}
assertFalse( kbuilder.getErrors().toString(),
kbuilder.hasErrors() );
KnowledgeBase kbase = getKnowledgeBase( kbuilder );
return kbase;
}
private KnowledgeBase getKnowledgeBase(final KnowledgeBuilder kbuilder) throws IOException,
ClassNotFoundException {
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
kbase = SerializationHelper.serializeObject( kbase );
return kbase;
}
@SuppressWarnings("unchecked")
public void testGlobals() throws Exception {
final KnowledgeBase kbase = getKnowledgeBase( "globals_rule_test.drl" );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
final List<Object> list = mock( List.class );
ksession.setGlobal( "list",
list );
ksession.setGlobal( "string",
"stilton" );
final Cheese stilton = new Cheese( "stilton",
5 );
ksession.insert( stilton );
ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
true );
ksession.fireAllRules();
verify( list,
times( 1 ) ).add( new Integer( 5 ) );
}
@SuppressWarnings("unchecked")
public void testGlobals2() throws Exception {
final KnowledgeBase kbase = getKnowledgeBase( "test_globalsAsConstraints.drl" );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
final List<Object> results = mock( List.class );
ksession.setGlobal( "results",
results );
final List<String> cheeseTypes = mock( List.class );
ksession.setGlobal( "cheeseTypes",
cheeseTypes );
when( cheeseTypes.contains( "stilton" ) ).thenReturn( Boolean.TRUE );
when( cheeseTypes.contains( "muzzarela" ) ).thenReturn( Boolean.TRUE );
final Cheese stilton = new Cheese( "stilton",
5 );
ksession.insert( stilton );
ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
true );
ksession.fireAllRules();
verify( results,
times( 1 ) ).add( "memberOf" );
final Cheese brie = new Cheese( "brie",
5 );
ksession.insert( brie );
ksession = SerializationHelper.getSerialisedStatefulKnowledgeSession( ksession,
true );
ksession.fireAllRules();
verify( results,
times( 1 ) ).add( "not memberOf" );
}
public void testGlobalMerge() throws Exception {
// from JBRULES-1512
String rule1 = "package com.sample\n" +
"rule \"rule 1\"\n" +
" salience 10\n" +
" when\n" +
" l : java.util.List()\n" +
" then\n" +
" l.add( \"rule 1 executed\" );\n" +
"end\n";
String rule2 = "package com.sample\n" +
"global String str;\n" +
"rule \"rule 2\"\n" +
" when\n" +
" l : java.util.List()\n" +
" then\n" +
" l.add( \"rule 2 executed \" + str);\n" +
"end\n";
StringReader[] readers = new StringReader[2];
readers[0] = new StringReader( rule1 );
readers[1] = new StringReader( rule2 );
final KnowledgeBase kbase = getKnowledgeBase( readers );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.setGlobal( "str",
"boo" );
List<String> list = new ArrayList<String>();
ksession.insert( list );
ksession.fireAllRules();
assertEquals( "rule 1 executed",
list.get( 0 ) );
assertEquals( "rule 2 executed boo",
list.get( 1 ) );
}
public void testChannels() throws IOException, ClassNotFoundException {
KnowledgeBase kbase = getKnowledgeBase( "test_Channels.drl" );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Channel someChannel = mock( Channel.class );
ksession.registerChannel( "someChannel", someChannel );
ksession.insert( new Cheese( "brie", 30 ) );
ksession.insert( new Cheese( "stilton", 5 ) );
ksession.fireAllRules();
verify( someChannel ).send( "brie" );
verify( someChannel, never() ).send( "stilton" );
}
}