@Test
public void testCompositeAndConstraintsComplex() {
RuleModel m = new RuleModel();
m.name = "and composite complex";
FactPattern p = new FactPattern( "Goober" );
m.addLhsItem( p );
CompositeFieldConstraint comp = new CompositeFieldConstraint();
comp.setCompositeJunctionType( CompositeFieldConstraint.COMPOSITE_TYPE_AND );
p.addConstraint( comp );
final SingleFieldConstraint sfc1 = new SingleFieldConstraint();
sfc1.setFactType( "Goober" );
sfc1.setFieldName( "gooField" );
sfc1.setFieldType( DataType.TYPE_STRING );
sfc1.setConstraintValueType( SingleFieldConstraint.TYPE_LITERAL );
sfc1.setValue( "gooValue" );
sfc1.setOperator( "==" );
comp.addConstraint( sfc1 );
final SingleFieldConstraint sfc2 = new SingleFieldConstraint();
sfc2.setFactType( "Goober" );
sfc2.setFieldName( "fooField" );
sfc2.setFieldType( DataType.TYPE_OBJECT );
sfc2.setConstraintValueType( SingleFieldConstraint.TYPE_LITERAL );
sfc2.setOperator( "!= null" );
comp.addConstraint( sfc2 );
final SingleFieldConstraint sfc3 = new SingleFieldConstraint();
sfc1.setFactType( "Bar" );
sfc3.setFieldName( "barField" );
sfc3.setParent( sfc2 );
sfc3.setFieldType( DataType.TYPE_STRING );
sfc3.setConstraintValueType( SingleFieldConstraint.TYPE_LITERAL );
sfc3.setValue( "barValue" );
sfc3.setOperator( "==" );
comp.addConstraint( sfc3 );
final SingleFieldConstraint sfc4 = new SingleFieldConstraint();
sfc4.setFactType( "Goober" );
sfc4.setFieldName( "zooField" );
sfc4.setFieldType( DataType.TYPE_STRING );
sfc4.setConstraintValueType( SingleFieldConstraint.TYPE_LITERAL );
sfc4.setValue( "zooValue" );
sfc4.setOperator( "==" );
p.addConstraint( sfc4 );
ActionInsertFact ass = new ActionInsertFact( "Whee" );
m.addRhsItem( ass );
String actual = BRDRLPersistence.getInstance().marshal( m );