Package org.drools.reteoo.test

Source Code of org.drools.reteoo.test.ReteDslTestEngineTest

/*
* Copyright 2010 JBoss Inc
*
* 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.reteoo.test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.drools.FactHandle;
import org.drools.Person;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.base.ClassObjectType;
import org.drools.common.DefaultFactHandle;
import org.drools.common.InternalFactHandle;
import org.drools.common.InternalWorkingMemory;
import org.drools.common.PropagationContextImpl;
import org.drools.core.util.LeftTupleList;
import org.drools.reteoo.BetaMemory;
import org.drools.reteoo.JoinNode;
import org.drools.reteoo.LeftInputAdapterNode;
import org.drools.reteoo.LeftTuple;
import org.drools.reteoo.LeftTupleImpl;
import org.drools.reteoo.ObjectTypeNode;
import org.drools.reteoo.ReteooRuleBase;
import org.drools.reteoo.ReteooWorkingMemory;
import org.drools.reteoo.builder.BuildContext;
import org.drools.reteoo.test.dsl.DslStep;
import org.drools.reteoo.test.dsl.NodeTestCase;
import org.drools.reteoo.test.dsl.NodeTestCaseResult;
import org.drools.reteoo.test.dsl.NodeTestCaseResult.NodeTestResult;
import org.drools.reteoo.test.dsl.NodeTestCaseResult.Result;
import org.drools.reteoo.test.dsl.NodeTestDef;
import org.drools.rule.Declaration;
import org.drools.spi.PropagationContext;
import org.junit.Test;

public class ReteDslTestEngineTest {

    @Test
    public void testDslCommandBuilder() {
        InputStream stream = getClass().getResourceAsStream( "DslTestBuilder.testCase" );
        assertNotNull( stream );
        NodeTestCase test = null;
        try {
            test = ReteDslTestEngine.compile( stream );
        } catch ( Exception e ) {
            e.printStackTrace();
            fail( "Unexpected Exception: " + e.getMessage() );
        }
        assertEquals( "Test Case Name",
                      test.getName() );

        checkSetup( test );

        assertEquals( 0,
                      test.getTearDown().size() );

        List<NodeTestDef> tests = test.getTests();
        assertEquals( 2,
                      tests.size() );

        NodeTestDef test1 = tests.get( 0 );
        assertEquals( "test 1",
                      test1.getName() );
        assertEquals( 19,
                      test1.getLine() );
        DslStep[] steps = test1.getSteps().toArray( new DslStep[0] );
        assertEquals( 6,
                      steps.length );
       
        // step 0
        int step = 0;
        assertEquals( "assert",
                      steps[step].getName() );
        assertEquals( 1, steps[step].getCommands().size() );
        checkCommand( new String[] { "left", "[h0]" },
                   steps[step].getCommands().get( 0 ) );
       
        // step 1
        step = 1;
        assertEquals( "col",
                      steps[step].getName() );
        assertEquals( 1, steps[step].getCommands().size() );
        checkCommand( new String[] { "leftMemory", "[[h0]]" },
                   steps[step].getCommands().get( 0 ) );
       
        // step 2
        step = 2;
        assertEquals( "sink",
                      steps[step].getName() );
        assertEquals( 2, steps[step].getCommands().size() );
        checkCommand( new String[] { "verify", "assert", "count", "1" },
                   steps[step].getCommands().get( 0 ) );
        checkCommand( new String[] { "verify", "assert", "tuple0[1]", "is(empty())" },
                   steps[step].getCommands().get( 1 ) );

        // Another test
        test1 = tests.get( 1 );
        assertEquals( "another test",
                      test1.getName() );
        assertEquals( 35,
                      test1.getLine() );
        steps = test1.getSteps().toArray( new DslStep[0] );
        assertEquals( 3,
                      steps.length );
       
        // step 0
        step = 0;
        assertEquals( "assert",
                      steps[step].getName() );
        assertEquals( 1, steps[step].getCommands().size() );
        checkCommand( new String[] { "left", "[h2]" },
                   steps[step].getCommands().get( 0 ) );
       
        // step 1
        step = 1;
        assertEquals( "col",
                      steps[step].getName() );
        assertEquals( 1, steps[step].getCommands().size() );
        checkCommand( new String[] { "leftMemory", "[[h2]]" },
                   steps[step].getCommands().get( 0 ) );
       
       
       
    }

    private void checkCommand(String[] expected,
                           String[] actual) {
        assertEquals( expected.length, actual.length );
        for( int i = 0; i < expected.length; i++ ) {
            assertEquals( expected[i], actual[i] );
        }
    }

    private void checkSetup(NodeTestCase test) {
        /**
         * SETUP
         */
        DslStep[] steps = test.getSetup().toArray( new DslStep[0] );
        assertEquals( 6,
                      steps.length );

        // step 0
        int step = 0;
        assertEquals( "LeftTupleSource",
                      steps[step].getName() );
        assertEquals( 4,
                      steps[step].getLine() );
        assertEquals( 1,
                      steps[step].getCommands().size() );
        assertEquals( 1,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "left",
                      steps[step].getCommands().get( 0 )[0] );
        // step 1
        step = 1;
        assertEquals( "ObjectSource",
                      steps[step].getName() );
        assertEquals( 5,
                      steps[step].getLine() );
        assertEquals( 1,
                      steps[step].getCommands().size() );
        assertEquals( 1,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "right",
                      steps[step].getCommands().get( 0 )[0] );
        // step 3
        step = 2;
        assertEquals( "LeftTupleSink",
                      steps[step].getName() );
        assertEquals( 6,
                      steps[step].getLine() );
        assertEquals( 1,
                      steps[step].getCommands().size() );
        assertEquals( 1,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "sink",
                      steps[step].getCommands().get( 0 )[0] );

        // step 3
        step = 3;
        assertEquals( "CollectNode",
                      steps[step].getName() );
        assertEquals( 7,
                      steps[step].getLine() );
        assertEquals( 2,
                      steps[step].getCommands().size() );
        assertEquals( 4,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "col",
                      steps[step].getCommands().get( 0 )[0] );
        assertEquals( "left",
                      steps[step].getCommands().get( 0 )[1] );
        assertEquals( "right",
                      steps[step].getCommands().get( 0 )[2] );
        assertEquals( "java.util.ArrayList",
                      steps[step].getCommands().get( 0 )[3] );
        assertEquals( 4,
                      steps[step].getCommands().get( 1 ).length );
        assertEquals( "source",
                      steps[step].getCommands().get( 1 )[0] );
        assertEquals( "type",
                      steps[step].getCommands().get( 1 )[1] );
        assertEquals( "==",
                      steps[step].getCommands().get( 1 )[2] );
        assertEquals( "l1",
                      steps[step].getCommands().get( 1 )[3] );

        // step 4
        step = 4;
        assertEquals( "Binding",
                      steps[step].getName() );
        assertEquals( 10,
                      steps[step].getLine() );
        assertEquals( 1,
                      steps[step].getCommands().size() );
        assertEquals( 4,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "l1",
                      steps[step].getCommands().get( 0 )[0] );
        assertEquals( "0",
                      steps[step].getCommands().get( 0 )[1] );
        assertEquals( "org.drools.Person",
                      steps[step].getCommands().get( 0 )[2] );
        assertEquals( "likes",
                      steps[step].getCommands().get( 0 )[3] );

        // step 5
        step = 5;
        assertEquals( "Facts",
                      steps[step].getName() );
        assertEquals( 12,
                      steps[step].getLine() );
        assertEquals( 1,
                      steps[step].getCommands().size() );
        assertEquals( 6,
                      steps[step].getCommands().get( 0 ).length );
        assertEquals( "org.drools.Person('darth', 35, \"brie\")",
                      steps[step].getCommands().get( 0 )[0] );
        assertEquals( "org.drools.Cheese('brie', 12)",
                      steps[step].getCommands().get( 0 )[3] );
    }

   
    @Test
    public void testObjectTypeNodeStep() throws Exception {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode :\n";
        str += "otn1, java.lang.Integer;\n";

        NodeTestResult result = executeTest( str );

        ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
        assertNotNull( otn1 );

        assertEquals( new ClassObjectType( Integer.class ),
                      otn1.getObjectType() );
    }

    @Test
    public void testLeftInputAdapterNodeStep() throws Exception {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;";

        NodeTestResult result = executeTest( str );

        ObjectTypeNode otn1 = (ObjectTypeNode) result.context.get( "otn1" );
        LeftInputAdapterNode lian0 = (LeftInputAdapterNode) result.context.get( "lian0" );
        assertNotNull( lian0 );

        assertSame( lian0,
                    otn1.getSinkPropagator().getSinks()[0] );
    }

    @Test
    public void testBindingStep() throws Exception {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";

        NodeTestResult result = executeTest( str );
        Declaration p1 = (Declaration) result.context.get( "p1" );
        assertNotNull( p1 );
    }

    @Test
    public void testJoinNodeStep() throws Exception {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, !=, p1;\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        JoinNode join1 = (JoinNode) map.get( "join1" );
        assertNotNull( join1 );

        PropagationContext context = new PropagationContextImpl( 0,
                                                                 PropagationContext.ASSERTION,
                                                                 null,
                                                                 null,
                                                                 null );
        ReteooWorkingMemory workingMemory = new ReteooWorkingMemory( 1,
                                                                     (ReteooRuleBase) RuleBaseFactory.newRuleBase() );

        BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( join1 );

        final DefaultFactHandle f0 = new DefaultFactHandle( 0,
                                                            0 );
        final LeftTupleImpl tuple0 = new LeftTupleImpl( f0,
                                                join1,
                                                true );

        // assert tuple, should add one to left memory
        join1.assertLeftTuple( tuple0,
                               context,
                               workingMemory );
        // check memories, left memory is populated, right memory is emptys
        assertEquals( 1,
                      memory.getLeftTupleMemory().size() );
        assertEquals( 0,
                      memory.getRightTupleMemory().size() );

        // assert tuple, should add left memory should be 2
        final DefaultFactHandle f1 = new DefaultFactHandle( 1,
                                                            0 );
        final LeftTupleImpl tuple1 = new LeftTupleImpl( f1,
                                                join1,
                                                true );
        join1.assertLeftTuple( tuple1,
                               context,
                               workingMemory );
        assertEquals( 2,
                      memory.getLeftTupleMemory().size() );

        LeftTuple leftTuple = ((LeftTupleList)memory.getLeftTupleMemory()).getFirst( );
        assertEquals( tuple0,
                      leftTuple );
        assertEquals( tuple1,
                      leftTuple.getNext() );
    }

    @SuppressWarnings("unchecked")
    @Test
    public void testFactsStep() throws Exception {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "Facts:\n";
        str += "    1, 2, 'hello',\n";
        str += "    'good bye', new java.util.ArrayList();\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        WorkingMemory wm = (WorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        assertNotNull( wm );
        assertNotNull( handles );

        assertEquals( 5,
                      handles.size() );

        assertEquals( 1,
                      handles.get( 0 ).getObject() );
        assertEquals( 2,
                      handles.get( 1 ).getObject() );
        assertEquals( "hello",
                      handles.get( 2 ).getObject() );
        assertEquals( "good bye",
                      handles.get( 3 ).getObject() );
        assertEquals( new ArrayList<FactHandle>(),
                      handles.get( 4 ).getObject() );
    }
   
    @SuppressWarnings("unchecked")
    @Test
    public void testWithStep() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "Facts:\n";
        str += "    1, 2, new org.drools.Person('darth', 35),\n";
        str += "    'good bye', new java.util.ArrayList();\n";
        str += "With:\n";
        str += "    h2, age = 36, city = 'la',\n";
        str += "       state = 'ca';\n";
        str += "    h4, add( 2 );\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        WorkingMemory wm = (WorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        assertNotNull( wm );
        assertNotNull( handles );

        assertEquals( 5,
                      handles.size() );
        Person p = new Person( "darth", 36);
        p.setAge( 36 );
        p.setCity( "la" );
        p.setState( "ca" );
       
        List<Integer> list = new ArrayList<Integer>();
        list.add( 2 );

        assertEquals( 1,
                      handles.get( 0 ).getObject() );
        assertEquals( 2,
                      handles.get( 1 ).getObject() );
        assertEquals( p,
                      handles.get( 2 ).getObject() );
        assertEquals( "good bye",
                      handles.get( 3 ).getObject() );
        assertEquals( list,
                      handles.get( 4 ).getObject() );
    }

    @Test
    public void testBetaNodeAssertOperations() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, !=, p1;\n";
        str += "Facts:\n";
        str += "    0, 1, 2, 3;\n";
        str += "assert:\n";
        str += "    otn2,[h0, h2];\n";
        str += "    otn1,[h1, h3];\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 2,
                      memory.getRightTupleMemory().size() );

        assertEquals( 2,
                      memory.getLeftTupleMemory().size() );
    }

    @Test
    public void testBetaNodeRetractOperations() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, !=, p1;\n";
        str += "Facts:\n";
        str += "    0, 1, 2, 3;\n";
        str += "assert:\n";
        str += "    otn1,[h1, h3];\n";
        str += "    otn2,[h0, h2];\n";
        str += "retract:\n";
        str += "    otn1,[h1];\n";
        str += "    otn2,[h2];\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 1,
                      memory.getRightTupleMemory().size() );

        assertEquals( 1,
                      memory.getLeftTupleMemory().size() );
    }

    @Test
    public void testBetaNodeSimpleMemoryChecks() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, !=, p1;\n";
        str += "Facts:\n";
        str += "    0, 1, 2, 3;\n";
        str += "assert:\n";
        str += "    otn1,[h1, h3];\n";
        str += "    otn2,[h0, h2];\n";
        str += "join1:\n";
        str += "    leftMemory,[[h1], [h3]];\n";
        str += "    rightMemory,[h0, h2];\n";
        str += "retract:\n";
        str += "    otn1,[h1];\n";
        str += "    otn2,[h2];\n";;
        str += "join1:\n";
        str += "    leftMemory,[ [h3] ];\n";
        str += "    rightMemory,[h0];\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 1,
                      memory.getRightTupleMemory().size() );

        assertEquals( 1,
                      memory.getLeftTupleMemory().size() );
    }

    @Test
    public void testBetaNodeChainedMemoryChecks() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn3, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, !=, p1;\n";
        str += "JoinNode:\n";
        str += "    join2, join1, otn3;\n";
        str += "    intValue, !=, p1;\n";
        str += "Facts:\n";
        str += "    0, 1, 2, 3, 4;\n";
        str += "assert:\n";
        str += "    otn1, [h1, h3];\n";
        str += "    otn2, [h0, h2];\n";
        str += "    otn3, [h4];\n";
        str += "join1:\n";
        str += "    leftMemory, [[h1], [h3]];\n";
        str += "    rightMemory, [h0, h2];\n";
        str += "join2:\n";
        str += "    leftMemory, [[h1, h0], [h3, h0],\n";
        str += "                [h1, h2], [h3, h2]];\n";
        str += "    rightMemory, [h4];\n";
        str += "retract:\n";
        str += "    otn1, [h1];\n";
        str += "    otn2, [h2];\n";;
        str += "join1:\n";
        str += "    leftMemory, [ [h3] ];\n";
        str += "    rightMemory, [h0];\n";
        str += "join2:\n";
        str += "    leftMemory,  [[h3, h0]];\n";
        str += "    rightMemory, [h4];\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 1,
                      memory.getRightTupleMemory().size() );

        assertEquals( 1,
                      memory.getLeftTupleMemory().size() );
    }
   
    @Test
    public void testBetaNodeChainedMemoryWithIndexChecks() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, java.lang.Integer;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn3, java.lang.Integer;\n";
        str += "Binding:\n";
        str += "     p1, 0, java.lang.Integer, intValue;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    intValue, ==, p1;\n";
        str += "JoinNode:\n";
        str += "    join2, join1, otn3;\n";
        str += "    intValue, ==, p1;\n";
        str += "Facts:\n";
        str += "    new Integer(0), new Integer(0), new Integer(0), 2, 4;\n";
        str += "assert:\n";
        str += "    otn1, [h1, h3];\n";
        str += "    otn2, [h0, h2];\n";
        str += "    otn3, [h4];\n";
        str += "join1:\n";
        str += "    leftMemory, [[h1]];\n";
        str += "    leftMemory, [[h3]];\n";
        str += "    rightMemory, [h0, h2];\n";
        str += "join2:\n";
        str += "    leftMemory, [[h1, h0],\n";
        str += "                [h1, h2]];\n";
        str += "    rightMemory, [h4];\n";
        str += "retract:\n";
        str += "    otn1, [h2];\n";
        str += "    otn2, [h3];\n";
        str += "join1:\n";
        str += "    leftMemory, [ [h1] ];\n";
        str += "    rightMemory, [h0];\n";
        str += "join2:\n";
        str += "    leftMemory,  [[h1, h0]];\n";
        str += "    rightMemory, [h4];\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 1,
                      memory.getRightTupleMemory().size() );

        assertEquals( 1,
                      memory.getLeftTupleMemory().size() );
    }
   
    @Test
    public void testBetaNodeModifyOperations() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, org.drools.Person;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn1;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn2, org.drools.Person;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn3, org.drools.Person;\n";
        str += "Binding:\n";
        str += "     p1, 0, org.drools.Person, age;\n";
        str += "JoinNode:\n";
        str += "    join1, lian0, otn2;\n";
        str += "    age, ==, p1;\n";
        str += "JoinNode:\n";
        str += "    join2, join1, otn3;\n";
        str += "    age, ==, p1;\n";
        str += "Facts:\n";
        str += "    new org.drools.Person('darth', 35), new org.drools.Person('bobba', 35),\n";
        str += "    new org.drools.Person('yoda', 35), new org.drools.Person('luke', 35),\n";
        str += "    new org.drools.Person('dave', 36);\n";
        str += "assert:\n";
        str += "    otn1, [h1, h3, h4];\n";
        str += "    otn2, [h0, h2];\n";
        str += "join1:\n";
        str += "    leftMemory, [[h1], [h3]];\n"; // check leftMemory twice, as we have two index buckets
        str += "    leftMemory, [[h4]];\n";
        str += "    rightMemory, [h0, h2];\n";
        str += "join2:\n";
        str += "    leftMemory, [[h1, h0], [h3, h0],\n";
        str += "                [h1, h2], [h3, h2]];\n";
        str += "    rightMemory, [];\n";
        str += "With:\n";
        str += "    h1, age = 36;\n";
        str += "modify:\n";
        str += "    otn1, [h1];\n";
        str += "join1:\n";
        str += "    leftMemory, [[h3]];\n";
        str += "    leftMemory, [[h4], [h1]];\n"; // notice it's moved to the new bucket  
        str += "    rightMemory, [h0, h2];\n";
        str += "join2:\n";
        str += "    leftMemory, [[h3, h0],\n";
        str += "                [h3, h2]];\n";
        str += "    rightMemory, [];\n";
       
        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        InternalWorkingMemory wm = (InternalWorkingMemory) map.get( "WorkingMemory" );
        List<InternalFactHandle> handles = (List<InternalFactHandle>) map.get( "Handles" );

        JoinNode join1 = (JoinNode) map.get( "join1" );

        BetaMemory memory = (BetaMemory) wm.getNodeMemory( join1 );
        assertEquals( 2,
                      memory.getRightTupleMemory().size() );

        assertEquals( 3,
                      memory.getLeftTupleMemory().size() );
       
        JoinNode join2 = (JoinNode) map.get( "join2" );

        memory = (BetaMemory) wm.getNodeMemory( join2 );
        assertEquals( 0,
                      memory.getRightTupleMemory().size() );

        assertEquals( 2,
                      memory.getLeftTupleMemory().size() );
    }
   
    @Test
    public void testNotNodeStep() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "ObjectTypeNode:\n";
        str += "    otn0, org.drools.Person;\n";
        str += "LeftInputAdapterNode:\n";
        str += "    lian0, otn0;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, org.drools.Person;\n";
        str += "Binding:\n";
        str += "     p1, 0, org.drools.Person, age;\n";
        str += "NotNode:\n";
        str += "    not0, lian0, otn1;\n";
        str += "    age, !=, p1;\n";
        str += "LeftTupleSink:\n";
        str += "    sink, not0;\n";
        str += "Facts:\n";
        str += "    new org.drools.Person('darth', 35), new org.drools.Person('bobba', 35);\n";
        str += "assert:\n";
        str += "    otn0, [h0];\n";
        str += "    otn1, [h1];\n";
        str += "sink:\n";
        str += "    verify, assertLeft, count, 1;\n";
        str += "With:\n";
        str += "    h1, age = 36;\n";
        str += "modify:\n";
        str += "    otn1, [h1];\n";
        str += "sink:\n";
        str += "    verify, retractLeft, count, 1;\n";

        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;
    }
   
    public void testConfigOptions() throws IOException {
        String str = "TestCase 'testOTN'\nTest 'dummy'\n";
        str += "Config:\n";
        str += "    drools.lrUnlinkingEnabled, true;\n";
        str += "ObjectTypeNode:\n";
        str += "    otn1, java.lang.Integer;\n";
       
        NodeTestResult result = executeTest( str );
        Map<String, Object> map = result.context;

        BuildContext buildCtx = (BuildContext) map.get( ReteDslTestEngine.BUILD_CONTEXT );
        assertTrue(buildCtx.getRuleBase().getConfiguration().isLRUnlinkingEnabled());
    }


    private void print(DslStep[] steps) {
        for ( DslStep command : steps ) {
            System.out.println( command );
        }
    }

    private NodeTestResult executeTest(String str) throws IOException {
        NodeTestCase testCase = ReteDslTestEngine.compile( str );
        if( testCase.hasErrors() ) {
            fail( testCase.getErrors().toString() );
        }

        ReteDslTestEngine tester = new ReteDslTestEngine();
        NodeTestCaseResult testCaseResult = tester.run( testCase, null );
       
        NodeTestResult result = testCaseResult.getResults().get( 0 );
        if( result.result != Result.SUCCESS ) {
            fail( result.getMessages() );
        }
        return result;
    }

   
}
TOP

Related Classes of org.drools.reteoo.test.ReteDslTestEngineTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.