/*
* Copyright 2011 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.workbench.models.testscenarios.backend.populators;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.drools.core.base.ClassTypeResolver;
import org.drools.core.base.TypeResolver;
import org.drools.workbench.models.testscenarios.backend.Cheese;
import org.drools.workbench.models.testscenarios.backend.CheeseType;
import org.drools.workbench.models.testscenarios.backend.Cheesery;
import org.drools.workbench.models.testscenarios.backend.MyCollectionWrapper;
import org.drools.workbench.models.testscenarios.backend.OuterFact;
import org.drools.workbench.models.testscenarios.backend.Person;
import org.drools.workbench.models.testscenarios.backend.SqlDateWrapper;
import org.drools.workbench.models.testscenarios.shared.CollectionFieldData;
import org.drools.workbench.models.testscenarios.shared.FactData;
import org.drools.workbench.models.testscenarios.shared.Field;
import org.drools.workbench.models.testscenarios.shared.FieldData;
import org.junit.Before;
import org.junit.Test;
import org.kie.api.runtime.KieSession;
import static java.util.Arrays.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
public class FactPopulatorTest {
static {
try {
Class.forName( "org.drools.core.base.mvel.MVELCompilationUnit" );
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
}
}
private KieSession workingMemory;
private Map<String, Object> populatedData;
private FactPopulator factPopulator;
@Before
public void setUp() throws Exception {
workingMemory = mock( KieSession.class );
populatedData = new HashMap<String, Object>();
factPopulator = new FactPopulator( workingMemory, populatedData );
}
@Test
public void testPopulateFacts() throws Exception {
FactData factData = new FactData(
"Person",
"p1",
Arrays.<Field>asList(
new FieldData(
"name",
"mic" ),
new FieldData(
"age",
"=30 + 3" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, getTypeResolver(), factData ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "p1" ) );
Person person = (Person) populatedData.get( "p1" );
assertEquals( "mic",
person.getName() );
assertEquals( 33,
person.getAge() );
}
@Test
public void testPopulateEnum() throws Exception {
FieldData fieldData = new FieldData(
"cheeseType",
"CheeseType.CHEDDAR" );
fieldData.setNature( FieldData.TYPE_ENUM );
FactData factData = new FactData( "Cheese",
"c1",
asList( (Field) fieldData ),
false );
factPopulator.add( new NewFactPopulator( populatedData, getTypeResolver(), factData ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
Cheese cheese = (Cheese) populatedData.get( "c1" );
assertEquals( CheeseType.CHEDDAR, cheese.getCheeseType() );
}
@Test
public void testPopulateNested() throws Exception {
TypeResolver typeResolver = getTypeResolver();
FactData cheeseFactData = new FactData(
"Cheese",
"c1",
Arrays.<Field>asList(
new FieldData(
"type",
"cheddar" ),
new FieldData(
"price",
"42" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, cheeseFactData ) );
FactData outerFactData = new FactData(
"OuterFact",
"p1",
Arrays.<Field>asList(
new FieldData(
"name",
"mic" ),
new FieldData(
"innerFact",
"=c1" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, outerFactData ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.containsKey( "p1" ) );
OuterFact o = (OuterFact) populatedData.get( "p1" );
assertEquals( populatedData.get( "c1" ), o.getInnerFact() );
}
@Test
public void testPopulateNestedWrongOrder() throws Exception {
TypeResolver typeResolver = getTypeResolver();
FactData outerFactData = new FactData(
"OuterFact",
"p1",
Arrays.<Field>asList(
new FieldData(
"name",
"mic" ),
new FieldData(
"innerFact",
"=c1" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, outerFactData ) );
FactData cheeseFactData = new FactData(
"Cheese",
"c1",
Arrays.<Field>asList(
new FieldData(
"type",
"cheddar" ),
new FieldData(
"price",
"42" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, cheeseFactData ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.containsKey( "p1" ) );
OuterFact o = (OuterFact) populatedData.get( "p1" );
assertEquals( populatedData.get( "c1" ), o.getInnerFact() );
}
@Test
public void testPopulateFactWithoutFields() throws Exception {
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData( "Cheese",
"c1",
new ArrayList<Field>(),
false ) ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.get( "c1" ) instanceof Cheese );
}
@Test
public void testPopulateEmptyIntegerField() throws Exception {
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData( "Cheese",
"c1",
Arrays.<Field>asList(
new FieldData(
"price",
"" ) ),
false ) ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.get( "c1" ) instanceof Cheese );
}
@Test
public void testPopulatingExistingFact() throws Exception {
Cheese cheese = new Cheese();
cheese.setType( "whee" );
cheese.setPrice( 1 );
Map<String, Object> populatedData = new HashMap<String, Object>();
populatedData.put(
"x",
cheese );
factPopulator.add(
new ExistingFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"Cheese",
"x",
Arrays.<Field>asList(
new FieldData(
"type",
null ),
new FieldData(
"price",
"42" ) ),
false ) ) );
factPopulator.populate();
assertEquals( "whee", cheese.getType() );
assertEquals( 42, cheese.getPrice() );
}
@Test
public void testDateField() throws Exception {
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"Cheese",
"c1",
Arrays.<Field>asList(
new FieldData(
"type",
"cheddar" ),
new FieldData(
"usedBy",
"10-Jul-2008" ) ),
false ) ) );
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"OuterFact",
"p1",
Arrays.<Field>asList(
new FieldData(
"name",
"mic" ),
new FieldData(
"innerFact",
"=c1" ) ),
false ) ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.containsKey( "p1" ) );
Cheese c = (Cheese) populatedData.get( "c1" );
assertNotNull( c.getUsedBy() );
}
@Test
public void testSQLDateField() throws Exception {
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"SqlDateWrapper",
"c1",
Arrays.<Field>asList(
new FieldData(
"sqlDate",
"10-Jul-2008" ) ),
false ) ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
SqlDateWrapper sqlDateWrapper = (SqlDateWrapper) populatedData.get( "c1" );
assertNotNull( sqlDateWrapper.getSqlDate() );
}
@Test
public void testPopulateFactsWithExpressions() throws Exception {
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData( "Cheese",
"c1",
Arrays.<Field>asList(
new FieldData(
"type",
"cheddar" ),
new FieldData(
"price",
"42" ) ),
false ) ) );
factPopulator.add(
new NewFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"Cheese",
"c2",
Arrays.<Field>asList(
new FieldData(
"type",
"= c1.type" ) ),
false ) ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "c1" ) );
assertTrue( populatedData.containsKey( "c2" ) );
Cheese c = (Cheese) populatedData.get( "c1" );
assertEquals( "cheddar", c.getType() );
assertEquals( 42, c.getPrice() );
Cheese c2 = (Cheese) populatedData.get( "c2" );
assertEquals( c.getType(), c2.getType() );
}
@Test
public void testPopulateEmptyString() throws Exception {
Cheese cheese = new Cheese();
cheese.setType( "whee" );
cheese.setPrice( 1 );
populatedData.put( "x", cheese );
assertEquals( 1, cheese.getPrice() );
//An empty String is a 'value' as opposed to null
factPopulator.add(
new ExistingFactPopulator(
populatedData,
getTypeResolver(),
new FactData(
"Cheese",
"x",
Arrays.<Field>asList(
new FieldData(
"type",
"" ),
new FieldData(
"price",
"42" ) ),
false ) ) );
factPopulator.populate();
assertEquals( "", cheese.getType() );
assertEquals( 42, cheese.getPrice() );
}
@Test
public void testCollectionFieldInFacts() throws Exception {
TypeResolver typeResolver = getTypeResolver();
FactData fd1 = new FactData( "Cheese",
"f1",
Arrays.<Field>asList(
new FieldData( "type",
"" ),
new FieldData( "price",
"42" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, fd1 ) );
FactData fd2 = new FactData( "Cheese",
"f2",
Arrays.<Field>asList(
new FieldData( "type",
"" ),
new FieldData( "price",
"43" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, fd2 ) );
FactData fd3 = new FactData( "Cheese",
"f3",
Arrays.<Field>asList(
new FieldData( "type",
"" ),
new FieldData( "price",
"45" ) ),
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, fd3 ) );
FieldData field = new FieldData();
field.setName( "cheeses" );
field.setNature( FieldData.TYPE_COLLECTION );
field.setValue( "=[f1,f2,f3]" );
List<Field> lstField = new ArrayList<Field>();
lstField.add( field );
FactData lst = new FactData( "Cheesery",
"listChesse",
lstField,
false );
factPopulator.add( new NewFactPopulator( populatedData, typeResolver, lst ) );
factPopulator.populate();
Cheesery listChesse = (Cheesery) populatedData.get( "listChesse" );
Cheese f1 = (Cheese) populatedData.get( "f1" );
Cheese f2 = (Cheese) populatedData.get( "f2" );
Cheese f3 = (Cheese) populatedData.get( "f3" );
assertEquals( 3, listChesse.getCheeses().size() );
assertTrue( listChesse.getCheeses().contains( f1 ) );
assertTrue( listChesse.getCheeses().contains( f2 ) );
assertTrue( listChesse.getCheeses().contains( f3 ) );
}
@Test
public void testCollection() throws Exception {
TypeResolver typeResolver = getTypeResolver();
List<Field> fieldData = new ArrayList<Field>();
CollectionFieldData collectionFieldData = new CollectionFieldData();
collectionFieldData.setName( "cheeses" );
fieldData.add( collectionFieldData );
collectionFieldData.getCollectionFieldList().add( new FieldData( "cheeses", "=cheese1" ) );
collectionFieldData.getCollectionFieldList().add( new FieldData( "cheeses", "=cheese2" ) );
FactData cheeseryFactData = new FactData(
"Cheesery",
"cheesery",
fieldData,
false );
FactData cheeseFactData1 = new FactData(
"Cheese",
"cheese1",
Collections.<Field>emptyList(),
false
);
FactData cheeseFactData2 = new FactData(
"Cheese",
"cheese2",
Collections.<Field>emptyList(),
false
);
factPopulator.add( new NewFactPopulator(
populatedData,
typeResolver,
cheeseryFactData ) );
factPopulator.add( new NewFactPopulator(
populatedData,
typeResolver,
cheeseFactData1 ) );
factPopulator.add( new NewFactPopulator(
populatedData,
typeResolver,
cheeseFactData2 ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "cheesery" ) );
Cheesery cheesery = (Cheesery) populatedData.get( "cheesery" );
assertNotNull( cheesery );
assertEquals( 2, cheesery.getCheeses().size() );
assertNotNull( cheesery.getCheeses().get( 0 ) );
assertTrue( cheesery.getCheeses().get( 0 ) instanceof Cheese );
assertNotNull( cheesery.getCheeses().get( 1 ) );
assertTrue( cheesery.getCheeses().get( 1 ) instanceof Cheese );
}
@Test
public void testCollectionSums() throws Exception {
TypeResolver typeResolver = getTypeResolver();
List<Field> fieldData = new ArrayList<Field>();
CollectionFieldData collectionFieldData = new CollectionFieldData();
collectionFieldData.setName( "list" );
fieldData.add( collectionFieldData );
collectionFieldData.getCollectionFieldList().add( new FieldData( "list", "=1+3" ) );
FactData wrapperFactData = new FactData(
"MyCollectionWrapper",
"wrapper",
fieldData,
false );
factPopulator.add( new NewFactPopulator(
populatedData,
typeResolver,
wrapperFactData ) );
factPopulator.populate();
assertTrue( populatedData.containsKey( "wrapper" ) );
MyCollectionWrapper wrapper = (MyCollectionWrapper) populatedData.get( "wrapper" );
assertNotNull( wrapper );
assertEquals( 1, wrapper.getList().size() );
assertNotNull( wrapper.getList().get( 0 ) );
assertEquals( 4, wrapper.getList().get( 0 ) );
}
private TypeResolver getTypeResolver() {
TypeResolver resolver = new ClassTypeResolver( new HashSet<String>(), getClassLoader() );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.MyCollectionWrapper" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.Cheesery" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.Cheese" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.SqlDateWrapper" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.CheeseType" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.Person" );
resolver.addImport( "org.drools.workbench.models.testscenarios.backend.OuterFact" );
return resolver;
}
private ClassLoader getClassLoader() {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return classLoader;
}
}