assertSame( listOtn,
rete.getObjectTypeNodes().get( new ClassObjectType( List.class ) ) );
// ArrayConf should match two ObjectTypenodes for List and ArrayList
ObjectHashMap memory = (ObjectHashMap) workingMemory.getNodeMemory( rete );
ObjectTypeConf arrayConf = (ObjectTypeConf) memory.get( ArrayList.class );
final ObjectTypeNode arrayOtn = arrayConf.getConcreteObjectTypeNode();
assertEquals( 2,
arrayConf.getObjectTypeNodes().length );
// Check it contains List and ArrayList
List nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
assertEquals(2, nodes.size() );
assertTrue( nodes.contains( arrayOtn ) );
assertTrue( nodes.contains( listOtn ) );
// Nodes are there, retract the fact so we can check both nodes are populated
workingMemory.retract( handle );
// Add MockSinks so we can track assertions
final MockObjectSink listSink = new MockObjectSink();
listOtn.addObjectSink( listSink );
final MockObjectSink arraySink = new MockObjectSink();
listOtn.addObjectSink( arraySink );
workingMemory.insert( new ArrayList() );
assertEquals( 1,
listSink.getAsserted().size() );
assertEquals( 1,
arraySink.getAsserted().size() );
// Add a Collection ObjectTypeNode, so that we can check that the data from ArrayList is sent to it
final ObjectTypeNode collectionOtn = new ObjectTypeNode( idGenerator.getNextId(),
new ClassObjectType( Collection.class ),
rete,
3 );
final MockObjectSink collectionSink = new MockObjectSink();
collectionOtn.addObjectSink( collectionSink );
collectionOtn.attach( new InternalWorkingMemory[]{workingMemory} );
assertEquals( 1,
collectionSink.getAsserted().size() );
// check that ArrayListConf was updated with the new ObjectTypeNode
nodes = Arrays.asList( arrayConf.getObjectTypeNodes() );
assertEquals(3, nodes.size() );
assertTrue( nodes.contains( arrayOtn ) );
assertTrue( nodes.contains( listOtn ) );
assertTrue( nodes.contains( collectionOtn ) );
}