Package org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable

Source Code of org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable.RowExpanderTests

/*
* Copyright 2011 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.guvnor.client.widgets.drools.wizards.assets.decisiontable;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.jar.JarInputStream;

import org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable.RowExpander.ColumnDynamicValues;
import org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable.RowExpander.ColumnValues;
import org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable.RowExpander.RowIterator;
import org.drools.ide.common.client.modeldriven.ModelField;
import org.drools.ide.common.client.modeldriven.ModelField.FIELD_CLASS_TYPE;
import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
import org.drools.ide.common.client.modeldriven.brl.BaseSingleFieldConstraint;
import org.drools.ide.common.client.modeldriven.dt52.ActionInsertFactCol52;
import org.drools.ide.common.client.modeldriven.dt52.ActionSetFieldCol52;
import org.drools.ide.common.client.modeldriven.dt52.ConditionCol52;
import org.drools.ide.common.client.modeldriven.dt52.DTCellValue52;
import org.drools.ide.common.client.modeldriven.dt52.GuidedDecisionTable52;
import org.drools.ide.common.client.modeldriven.dt52.GuidedDecisionTable52.TableFormat;
import org.drools.ide.common.client.modeldriven.dt52.LimitedEntryActionInsertFactCol52;
import org.drools.ide.common.client.modeldriven.dt52.LimitedEntryActionSetFieldCol52;
import org.drools.ide.common.client.modeldriven.dt52.LimitedEntryConditionCol52;
import org.drools.ide.common.client.modeldriven.dt52.Pattern52;
import org.drools.ide.common.server.rules.SuggestionCompletionLoader;
import org.drools.lang.dsl.DSLTokenizedMappingFile;
import org.junit.Test;

public class RowExpanderTests {

    @Test
    @SuppressWarnings("serial")
    public void testExpansionNoExpansion() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE ),
                                new ModelField( "approved",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_BOOLEAN )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        Pattern52 p4 = new Pattern52();
        p4.setBoundName( "c4" );
        p4.setFactType( "Driver" );

        ConditionCol52 c4 = new ConditionCol52();
        c4.setFactField( "approved" );
        c4.setOperator( "==" );
        c4.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p4.getChildColumns().add( c4 );
        dtable.getConditions().add( p4 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "c1" );
        a1.setFactField( "name" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "a2" );
        a2.setFactType( "Driver" );
        a2.setFactField( "name" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 8,
                      columns.size() );
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 1,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 3 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );
        assertEquals( 1,
                      columns.get( 6 ).values.size() );
        assertEquals( 1,
                      columns.get( 7 ).values.size() );

        RowIterator ri = re.iterator();
        assertFalse( ri.hasNext() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testExpansionWithValuesList() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE ),
                                new ModelField( "approved",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_BOOLEAN )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setValueList( "c3a,c3b" );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        Pattern52 p4 = new Pattern52();
        p4.setBoundName( "c4" );
        p4.setFactType( "Driver" );

        ConditionCol52 c4 = new ConditionCol52();
        c4.setFactField( "approved" );
        c4.setOperator( "==" );
        c4.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c4.setValueList( "c4a,c4b" );
        p4.getChildColumns().add( c4 );
        dtable.getConditions().add( p4 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "c1" );
        a1.setFactField( "name" );
        a1.setValueList( "a1a,a1b" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "a2" );
        a2.setFactType( "Driver" );
        a2.setFactField( "name" );
        a2.setValueList( "a2a,a2b" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 8,
                      columns.size() );

        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 2,
                      columns.get( 3 ).values.size() );
        assertEquals( 2,
                      columns.get( 4 ).values.size() );
        assertEquals( 2,
                      columns.get( 5 ).values.size() );
        assertEquals( 1,
                      columns.get( 6 ).values.size() );
        assertEquals( 1,
                      columns.get( 7 ).values.size() );

        assertEquals( "c1a",
                      columns.get( 2 ).values.get( 0 ).getStringValue() );
        assertEquals( "c1b",
                      columns.get( 2 ).values.get( 1 ).getStringValue() );

        assertEquals( "c2a",
                      columns.get( 3 ).values.get( 0 ).getStringValue() );
        assertEquals( "c2b",
                      columns.get( 3 ).values.get( 1 ).getStringValue() );

        assertEquals( "c3a",
                      columns.get( 4 ).values.get( 0 ).getStringValue() );
        assertEquals( "c3b",
                      columns.get( 4 ).values.get( 1 ).getStringValue() );

        assertEquals( "c4a",
                      columns.get( 5 ).values.get( 0 ).getStringValue() );
        assertEquals( "c4b",
                      columns.get( 5 ).values.get( 1 ).getStringValue() );

        assertNull( columns.get( 6 ).values.get( 0 ) );

        assertNull( columns.get( 7 ).values.get( 0 ) );

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );

    }

    @Test
    public void testExpansionWithGuvnorEnums() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Driver\n"
                     + "name: String\n"
                     + "age: Integer\n"
                     + "dateOfBirth: Date\n"
                     + "approved: Boolean\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        enums.add( "'Driver.name' : ['f1a', 'f1b'], 'Driver.age' : ['f2a', 'f2b'], 'Driver.dateOfBirth' : ['f3a', 'f3b'], 'Driver.approved' : ['f4a', 'f4b']" );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        Pattern52 p4 = new Pattern52();
        p4.setBoundName( "c4" );
        p4.setFactType( "Driver" );

        ConditionCol52 c4 = new ConditionCol52();
        c4.setFactField( "approved" );
        c4.setOperator( "==" );
        c4.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p4.getChildColumns().add( c4 );
        dtable.getConditions().add( p4 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "c1" );
        a1.setFactField( "name" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "a2" );
        a2.setFactType( "Driver" );
        a2.setFactField( "name" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 8,
                      columns.size() );

        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 2,
                      columns.get( 3 ).values.size() );
        assertEquals( 2,
                      columns.get( 4 ).values.size() );
        assertEquals( 2,
                      columns.get( 5 ).values.size() );
        assertEquals( 1,
                      columns.get( 6 ).values.size() );
        assertEquals( 1,
                      columns.get( 7 ).values.size() );

        assertEquals( "f1a",
                      columns.get( 2 ).values.get( 0 ).getStringValue() );
        assertEquals( "f1b",
                      columns.get( 2 ).values.get( 1 ).getStringValue() );

        assertEquals( "f2a",
                      columns.get( 3 ).values.get( 0 ).getStringValue() );
        assertEquals( "f2b",
                      columns.get( 3 ).values.get( 1 ).getStringValue() );

        assertEquals( "f3a",
                      columns.get( 4 ).values.get( 0 ).getStringValue() );
        assertEquals( "f3b",
                      columns.get( 4 ).values.get( 1 ).getStringValue() );

        assertEquals( "f4a",
                      columns.get( 5 ).values.get( 0 ).getStringValue() );
        assertEquals( "f4b",
                      columns.get( 5 ).values.get( 1 ).getStringValue() );

        assertNull( columns.get( 6 ).values.get( 0 ) );

        assertNull( columns.get( 7 ).values.get( 0 ) );

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );

    }

    @Test
    public void testExpansionWithGuvnorDependentEnums_2enum_x_3values() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Fact\n"
                     + "field1 : String\n"
                     + "field2 : String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        final String enumDefinitions = "'Fact.field1' : ['f1a', 'f1b', 'f1c'], "
                                       + "'Fact.field2[field1=f1a]' : ['f1af2a', 'f1af2b', 'f1af2c'], "
                                       + "'Fact.field2[field1=f1b]' : ['f1bf2a', 'f1bf2b', 'f1bf2c'], "
                                       + "'Fact.field2[field1=f1c]' : ['f1cf2a', 'f1cf2b', 'f1cf2c']";

        enums.add( enumDefinitions );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "f1" );
        p1.setFactType( "Fact" );
        dtable.getConditions().add( p1 );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "field1" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "field2" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c2 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "f1" );
        a1.setFactField( "field1" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "f2" );
        a2.setFactType( "Fact" );
        a2.setFactField( "field1" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 6,
                      columns.size() );

        assertTrue( columns.get( 0 ) instanceof ColumnValues );
        assertTrue( columns.get( 1 ) instanceof ColumnValues );
        assertTrue( columns.get( 2 ) instanceof ColumnValues );
        assertTrue( columns.get( 3 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 4 ) instanceof ColumnValues );
        assertTrue( columns.get( 5 ) instanceof ColumnValues );

        //Can't check size of values for ColumnDynamicValues as they depend on the other columns
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 3,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );

        //Expected data
        // --> f1a, f1af2a
        // --> f1a, f1af2b
        // --> f1a, f1af2c
        // --> f1b, f1bf2a
        // --> f1b, f1bf2b
        // --> f1b, f1bf2c
        // --> f1c, f1cf2a
        // --> f1c, f1cf2b
        // --> f1c, f1cf2c

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );
        List<DTCellValue52> row0 = ri.next();
        assertEquals( 6,
                      row0.size() );
        assertEquals( "f1a",
                      row0.get( 2 ).getStringValue() );
        assertEquals( "f1af2a",
                      row0.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row1 = ri.next();
        assertEquals( 6,
                      row1.size() );
        assertEquals( "f1a",
                      row1.get( 2 ).getStringValue() );
        assertEquals( "f1af2b",
                      row1.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row2 = ri.next();
        assertEquals( 6,
                      row2.size() );
        assertEquals( "f1a",
                      row2.get( 2 ).getStringValue() );
        assertEquals( "f1af2c",
                      row2.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row3 = ri.next();
        assertEquals( 6,
                      row3.size() );
        assertEquals( "f1b",
                      row3.get( 2 ).getStringValue() );
        assertEquals( "f1bf2a",
                      row3.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row4 = ri.next();
        assertEquals( 6,
                      row4.size() );
        assertEquals( "f1b",
                      row4.get( 2 ).getStringValue() );
        assertEquals( "f1bf2b",
                      row4.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row5 = ri.next();
        assertEquals( 6,
                      row5.size() );
        assertEquals( "f1b",
                      row5.get( 2 ).getStringValue() );
        assertEquals( "f1bf2c",
                      row5.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row6 = ri.next();
        assertEquals( 6,
                      row6.size() );
        assertEquals( "f1c",
                      row6.get( 2 ).getStringValue() );
        assertEquals( "f1cf2a",
                      row6.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row7 = ri.next();
        assertEquals( 6,
                      row7.size() );
        assertEquals( "f1c",
                      row7.get( 2 ).getStringValue() );
        assertEquals( "f1cf2b",
                      row7.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row8 = ri.next();
        assertEquals( 6,
                      row8.size() );
        assertEquals( "f1c",
                      row8.get( 2 ).getStringValue() );
        assertEquals( "f1cf2c",
                      row8.get( 3 ).getStringValue() );

        assertFalse( ri.hasNext() );
    }

    @Test
    public void testExpansionWithGuvnorDependentEnumsExplicitExpansion1_2enum_x_2values() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Fact\n"
                     + "field1 : String\n"
                     + "field2 : String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        final String enumDefinitions = "'Fact.field1' : ['f1a', 'f1b'], "
                                       + "'Fact.field2[field1=f1a]' : ['f1af2a', 'f1af2b'], "
                                       + "'Fact.field2[field1=f1b]' : ['f1bf2a', 'f1bf2b']";

        enums.add( enumDefinitions );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "f1" );
        p1.setFactType( "Fact" );
        dtable.getConditions().add( p1 );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "field1" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "field2" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c2 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "f1" );
        a1.setFactField( "field1" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "f2" );
        a2.setFactType( "Fact" );
        a2.setFactField( "field1" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        //Explicitly set which columns to expand
        for ( ConditionCol52 c : p1.getChildColumns() ) {
            re.setExpandColumn( c,
                                true );
        }

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 6,
                      columns.size() );

        assertTrue( columns.get( 0 ) instanceof ColumnValues );
        assertTrue( columns.get( 1 ) instanceof ColumnValues );
        assertTrue( columns.get( 2 ) instanceof ColumnValues );
        assertTrue( columns.get( 3 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 4 ) instanceof ColumnValues );
        assertTrue( columns.get( 5 ) instanceof ColumnValues );

        //Can't check size of values for ColumnDynamicValues as they depend on the other columns
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );

        //Expected data
        // --> f1a, f1af2a
        // --> f1a, f1af2b
        // --> f1b, f1bf2a
        // --> f1b, f1bf2b

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );
        List<DTCellValue52> row0 = ri.next();
        assertEquals( 6,
                      row0.size() );
        assertEquals( "f1a",
                      row0.get( 2 ).getStringValue() );
        assertEquals( "f1af2a",
                      row0.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row1 = ri.next();
        assertEquals( 6,
                      row1.size() );
        assertEquals( "f1a",
                      row1.get( 2 ).getStringValue() );
        assertEquals( "f1af2b",
                      row1.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row3 = ri.next();
        assertEquals( 6,
                      row3.size() );
        assertEquals( "f1b",
                      row3.get( 2 ).getStringValue() );
        assertEquals( "f1bf2a",
                      row3.get( 3 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row4 = ri.next();
        assertEquals( 6,
                      row4.size() );
        assertEquals( "f1b",
                      row4.get( 2 ).getStringValue() );
        assertEquals( "f1bf2b",
                      row4.get( 3 ).getStringValue() );

        assertFalse( ri.hasNext() );
    }

    @Test
    public void testExpansionWithGuvnorDependentEnumsExplicitExpansion2_2enum_x_2values() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Fact\n"
                     + "field1 : String\n"
                     + "field2 : String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        final String enumDefinitions = "'Fact.field1' : ['f1a', 'f1b'], "
                                       + "'Fact.field2[field1=f1a]' : ['f1af2a', 'f1af2b'], "
                                       + "'Fact.field2[field1=f1b]' : ['f1bf2a', 'f1bf2b']";

        enums.add( enumDefinitions );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "f1" );
        p1.setFactType( "Fact" );
        dtable.getConditions().add( p1 );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "field1" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "field2" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c2 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "f1" );
        a1.setFactField( "field1" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "f2" );
        a2.setFactType( "Fact" );
        a2.setFactField( "field1" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        //Explicitly expand the first column, not the second
        re.setExpandColumn( c1,
                            true );
        re.setExpandColumn( c2,
                            false );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 6,
                      columns.size() );

        assertTrue( columns.get( 0 ) instanceof ColumnValues );
        assertTrue( columns.get( 1 ) instanceof ColumnValues );
        assertTrue( columns.get( 2 ) instanceof ColumnValues );
        assertTrue( columns.get( 3 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 4 ) instanceof ColumnValues );
        assertTrue( columns.get( 5 ) instanceof ColumnValues );

        //Can't check size of values for ColumnDynamicValues as they depend on the other columns
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );

        //Expected data
        // --> f1a, null
        // --> f1b, null

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );
        List<DTCellValue52> row0 = ri.next();
        assertEquals( 6,
                      row0.size() );
        assertEquals( "f1a",
                      row0.get( 2 ).getStringValue() );
        assertNull( row0.get( 3 ) );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row1 = ri.next();
        assertEquals( 6,
                      row1.size() );
        assertEquals( "f1b",
                      row1.get( 2 ).getStringValue() );
        assertNull( row1.get( 3 ) );

        assertFalse( ri.hasNext() );
    }

    @Test
    public void testExpansionWithGuvnorDependentEnumsExplicitExpansion3_2enum_x_2values() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Fact\n"
                     + "field1 : String\n"
                     + "field2 : String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        final String enumDefinitions = "'Fact.field1' : ['f1a', 'f1b'], "
                                       + "'Fact.field2[field1=f1a]' : ['f1af2a', 'f1af2b'], "
                                       + "'Fact.field2[field1=f1b]' : ['f1bf2a', 'f1bf2b']";

        enums.add( enumDefinitions );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "f1" );
        p1.setFactType( "Fact" );
        dtable.getConditions().add( p1 );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "field1" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "field2" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c2 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "f1" );
        a1.setFactField( "field1" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "f2" );
        a2.setFactType( "Fact" );
        a2.setFactField( "field1" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        //Explicitly expand the first column, not the second
        re.setExpandColumn( c1,
                            false );
        re.setExpandColumn( c2,
                            true );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 6,
                      columns.size() );

        assertTrue( columns.get( 0 ) instanceof ColumnValues );
        assertTrue( columns.get( 1 ) instanceof ColumnValues );
        assertTrue( columns.get( 2 ) instanceof ColumnValues );
        assertTrue( columns.get( 3 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 4 ) instanceof ColumnValues );
        assertTrue( columns.get( 5 ) instanceof ColumnValues );

        //Can't check size of values for ColumnDynamicValues as they depend on the other columns
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 1,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );

        //Expected data
        // --> null, null

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );
        List<DTCellValue52> row0 = ri.next();
        assertEquals( 6,
                      row0.size() );
        assertNull( row0.get( 2 ) );
        assertNull( row0.get( 3 ) );

        assertFalse( ri.hasNext() );
    }

    @Test
    public void testExpansionWithGuvnorDependentEnums_3enum_x_2values() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Fact\n"
                     + "field1 : String\n"
                     + "field2 : String\n"
                     + "field3 : String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        final String enumDefinitions = "'Fact.field1' : ['f1a', 'f1b'], "
                                       + "'Fact.field2[field1=f1a]' : ['f1af2a', 'f1af2b'], "
                                       + "'Fact.field2[field1=f1b]' : ['f1bf2a', 'f1bf2b'], "
                                       + "'Fact.field3[field2=f1af2a]' : ['f1af2af3a', 'f1af2af3b'], "
                                       + "'Fact.field3[field2=f1af2b]' : ['f1af2bf3a', 'f1af2bf3b'], "
                                       + "'Fact.field3[field2=f1bf2a]' : ['f1bf2af3a', 'f1bf2af3b'], "
                                       + "'Fact.field3[field2=f1bf2b]' : ['f1bf2bf3a', 'f1bf2bf3b']";

        enums.add( enumDefinitions );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "f1" );
        p1.setFactType( "Fact" );
        dtable.getConditions().add( p1 );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "field1" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "field2" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c2 );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "field3" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c3 );

        ActionSetFieldCol52 a1 = new ActionSetFieldCol52();
        a1.setBoundName( "f1" );
        a1.setFactField( "field1" );
        dtable.getActionCols().add( a1 );

        ActionInsertFactCol52 a2 = new ActionInsertFactCol52();
        a2.setBoundName( "f2" );
        a2.setFactType( "Fact" );
        a2.setFactField( "field1" );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 7,
                      columns.size() );

        assertTrue( columns.get( 0 ) instanceof ColumnValues );
        assertTrue( columns.get( 1 ) instanceof ColumnValues );
        assertTrue( columns.get( 2 ) instanceof ColumnValues );
        assertTrue( columns.get( 3 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 4 ) instanceof ColumnDynamicValues );
        assertTrue( columns.get( 5 ) instanceof ColumnValues );
        assertTrue( columns.get( 6 ) instanceof ColumnValues );

        //Can't check size of values for ColumnDynamicValues as they depend on the other columns
        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );
        assertEquals( 1,
                      columns.get( 6 ).values.size() );

        //Expected data
        // --> f1a, f1af2a, f1af2af3a
        // --> f1a, f1af2a, f1af2af3b
        // --> f1a, f1af2b, f1af2bf3a
        // --> f1a, f1af2b, f1af2bf3b
        // --> f1b, f1bf2a, f1bf2af3a
        // --> f1b, f1bf2a, f1bf2af3b
        // --> f1b, f1bf2b, f1bf2bf3a
        // --> f1b, f1bf2b, f1bf2bf3b

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );
        List<DTCellValue52> row0 = ri.next();
        assertEquals( 7,
                      row0.size() );
        assertEquals( "f1a",
                      row0.get( 2 ).getStringValue() );
        assertEquals( "f1af2a",
                      row0.get( 3 ).getStringValue() );
        assertEquals( "f1af2af3a",
                      row0.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row1 = ri.next();
        assertEquals( 7,
                      row1.size() );
        assertEquals( "f1a",
                      row1.get( 2 ).getStringValue() );
        assertEquals( "f1af2a",
                      row1.get( 3 ).getStringValue() );
        assertEquals( "f1af2af3b",
                      row1.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row2 = ri.next();
        assertEquals( 7,
                      row2.size() );
        assertEquals( "f1a",
                      row2.get( 2 ).getStringValue() );
        assertEquals( "f1af2b",
                      row2.get( 3 ).getStringValue() );
        assertEquals( "f1af2bf3a",
                      row2.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row3 = ri.next();
        assertEquals( 7,
                      row3.size() );
        assertEquals( "f1a",
                      row3.get( 2 ).getStringValue() );
        assertEquals( "f1af2b",
                      row3.get( 3 ).getStringValue() );
        assertEquals( "f1af2bf3b",
                      row3.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row4 = ri.next();
        assertEquals( 7,
                      row4.size() );
        assertEquals( "f1b",
                      row4.get( 2 ).getStringValue() );
        assertEquals( "f1bf2a",
                      row4.get( 3 ).getStringValue() );
        assertEquals( "f1bf2af3a",
                      row4.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row5 = ri.next();
        assertEquals( 7,
                      row5.size() );
        assertEquals( "f1b",
                      row5.get( 2 ).getStringValue() );
        assertEquals( "f1bf2a",
                      row5.get( 3 ).getStringValue() );
        assertEquals( "f1bf2af3b",
                      row5.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row6 = ri.next();
        assertEquals( 7,
                      row6.size() );
        assertEquals( "f1b",
                      row6.get( 2 ).getStringValue() );
        assertEquals( "f1bf2b",
                      row6.get( 3 ).getStringValue() );
        assertEquals( "f1bf2bf3a",
                      row6.get( 4 ).getStringValue() );

        assertTrue( ri.hasNext() );
        List<DTCellValue52> row7 = ri.next();
        assertEquals( 7,
                      row7.size() );
        assertEquals( "f1b",
                      row7.get( 2 ).getStringValue() );
        assertEquals( "f1bf2b",
                      row7.get( 3 ).getStringValue() );
        assertEquals( "f1bf2bf3b",
                      row7.get( 4 ).getStringValue() );

        assertFalse( ri.hasNext() );
    }

    @SuppressWarnings("serial")
    @Test
    public void testColumnValues() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 3,
                      columns.size() );

        assertEquals( "",
                      columns.get( 0 ).getCurrentValue().getStringValue() );
        assertEquals( "",
                      columns.get( 1 ).getCurrentValue().getStringValue() );
        assertEquals( "c1a",
                      columns.get( 2 ).getCurrentValue().getStringValue() );
        columns.get( 2 ).advanceColumnValue();
        assertEquals( "c1b",
                      columns.get( 2 ).getCurrentValue().getStringValue() );
        columns.get( 2 ).advanceColumnValue();
        assertEquals( "c1a",
                      columns.get( 2 ).getCurrentValue().getStringValue() );
        columns.get( 2 ).advanceColumnValue();
        assertEquals( "c1b",
                      columns.get( 2 ).getCurrentValue().getStringValue() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesList1() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        assertEquals( 3,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 2,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 1 ).get( 2 ).getStringValue() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesList2() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        assertEquals( 4,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 0 ).get( 3 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 1 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 1 ).get( 3 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 2 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 2 ).get( 3 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 3 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 3 ).get( 3 ).getStringValue() );
    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesList3() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 0 ).get( 3 ).getStringValue() );
        assertNull( rows.get( 0 ).get( 4 ) );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 1 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 1 ).get( 3 ).getStringValue() );
        assertNull( rows.get( 1 ).get( 4 ) );

        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 2 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 2 ).get( 3 ).getStringValue() );
        assertNull( rows.get( 2 ).get( 4 ) );

        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 3 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 3 ).get( 3 ).getStringValue() );
        assertNull( rows.get( 3 ).get( 4 ) );
    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesListAndDefaultValues() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        c1.setDefaultValue( new DTCellValue52( "c1default" ) );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        c2.setDefaultValue( new DTCellValue52( "c2default" ) );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setDefaultValue( new DTCellValue52( "c3default" ) );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 0 ).get( 3 ).getStringValue() );
        assertEquals( "c3default",
                      rows.get( 0 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 1 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 1 ).get( 3 ).getStringValue() );
        assertEquals( "c3default",
                      rows.get( 1 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 2 ).get( 2 ).getStringValue() );
        assertEquals( "c2a",
                      rows.get( 2 ).get( 3 ).getStringValue() );
        assertEquals( "c3default",
                      rows.get( 2 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 3 ).get( 2 ).getStringValue() );
        assertEquals( "c2b",
                      rows.get( 3 ).get( 3 ).getStringValue() );
        assertEquals( "c3default",
                      rows.get( 3 ).get( 4 ).getStringValue() );
    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesListAndColumnExpansionDisabled1() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setValueList( "c3a,c3b" );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );
        re.setExpandColumn( c1,
                            false );
        re.setExpandColumn( c2,
                            false );
        re.setExpandColumn( c3,
                            false );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        assertFalse( i.hasNext() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesListAndColumnExpansionDisabled2() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setValueList( "c3a,c3b" );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );
        re.setExpandColumn( c1,
                            false );
        re.setExpandColumn( c2,
                            false );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 2,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertNull( rows.get( 0 ).get( 2 ) );
        assertNull( rows.get( 0 ).get( 3 ) );
        assertEquals( "c3a",
                      rows.get( 0 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertNull( rows.get( 1 ).get( 2 ) );
        assertNull( rows.get( 1 ).get( 3 ) );
        assertEquals( "c3b",
                      rows.get( 1 ).get( 4 ).getStringValue() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesListAndColumnExpansionDisabled3() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setValueList( "c3a,c3b" );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );
        re.setExpandColumn( c2,
                            false );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertNull( rows.get( 0 ).get( 3 ) );
        assertEquals( "c3a",
                      rows.get( 0 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 1 ).get( 2 ).getStringValue() );
        assertNull( rows.get( 1 ).get( 3 ) );
        assertEquals( "c3b",
                      rows.get( 1 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 2 ).get( 2 ).getStringValue() );
        assertNull( rows.get( 2 ).get( 3 ) );
        assertEquals( "c3a",
                      rows.get( 2 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 3 ).get( 2 ).getStringValue() );
        assertNull( rows.get( 3 ).get( 3 ) );
        assertEquals( "c3b",
                      rows.get( 3 ).get( 4 ).getStringValue() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testRowExpansionWithValuesListAndColumnExpansionDisabledAndDefaultValues() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValueList( "c1a,c1b" );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        ConditionCol52 c2 = new ConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c2.setValueList( "c2a,c2b" );
        c2.setDefaultValue( new DTCellValue52( "c2default" ) );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        Pattern52 p3 = new Pattern52();
        p3.setBoundName( "c3" );
        p3.setFactType( "Driver" );

        ConditionCol52 c3 = new ConditionCol52();
        c3.setFactField( "dateOfBirth" );
        c3.setOperator( "==" );
        c3.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c3.setValueList( "c3a,c3b" );
        p3.getChildColumns().add( c3 );
        dtable.getConditions().add( p3 );

        RowExpander re = new RowExpander( dtable,
                                          sce );
        re.setExpandColumn( c2,
                            false );

        assertEquals( 5,
                      re.getColumns().size() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 0 ).get( 2 ).getStringValue() );
        assertEquals( "c2default",
                      rows.get( 0 ).get( 3 ).getStringValue() );
        assertEquals( "c3a",
                      rows.get( 0 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "c1a",
                      rows.get( 1 ).get( 2 ).getStringValue() );
        assertEquals( "c2default",
                      rows.get( 1 ).get( 3 ).getStringValue() );
        assertEquals( "c3b",
                      rows.get( 1 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 2 ).get( 2 ).getStringValue() );
        assertEquals( "c2default",
                      rows.get( 2 ).get( 3 ).getStringValue() );
        assertEquals( "c3a",
                      rows.get( 2 ).get( 4 ).getStringValue() );

        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( "c1b",
                      rows.get( 3 ).get( 2 ).getStringValue() );
        assertEquals( "c2default",
                      rows.get( 3 ).get( 3 ).getStringValue() );
        assertEquals( "c3b",
                      rows.get( 3 ).get( 4 ).getStringValue() );

    }

    @Test
    @SuppressWarnings("serial")
    public void testExpansionWithLimitedEntry() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();
        dtable.setTableFormat( TableFormat.LIMITED_ENTRY );
        SuggestionCompletionEngine sce = new SuggestionCompletionEngine();

        sce.setFieldsForTypes( new HashMap<String, ModelField[]>() {
            {
                put( "Driver",
                        new ModelField[]{
                                new ModelField( "age",
                                                Integer.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_NUMERIC_INTEGER ),
                                new ModelField( "name",
                                                String.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_STRING ),
                                new ModelField( "dateOfBirth",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_DATE ),
                                new ModelField( "approved",
                                                Boolean.class.getName(),
                                                FIELD_CLASS_TYPE.REGULAR_CLASS,
                                                SuggestionCompletionEngine.TYPE_BOOLEAN )
                        } );
            }
        } );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        LimitedEntryConditionCol52 c1 = new LimitedEntryConditionCol52();
        c1.setFactField( "name" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValue( new DTCellValue52( "Mike" ) );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );

        Pattern52 p2 = new Pattern52();
        p2.setBoundName( "c2" );
        p2.setFactType( "Driver" );

        LimitedEntryConditionCol52 c2 = new LimitedEntryConditionCol52();
        c2.setFactField( "age" );
        c2.setOperator( "==" );
        c2.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        c1.setValue( new DTCellValue52( 25 ) );
        p2.getChildColumns().add( c2 );
        dtable.getConditions().add( p2 );

        LimitedEntryActionSetFieldCol52 a1 = new LimitedEntryActionSetFieldCol52();
        a1.setBoundName( "c1" );
        a1.setFactField( "name" );
        a1.setValue( new DTCellValue52( "a1name" ) );
        dtable.getActionCols().add( a1 );

        LimitedEntryActionInsertFactCol52 a2 = new LimitedEntryActionInsertFactCol52();
        a2.setBoundName( "a2" );
        a2.setFactType( "Driver" );
        a2.setFactField( "name" );
        a2.setValue( new DTCellValue52( "a2name" ) );
        dtable.getActionCols().add( a2 );

        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 6,
                      columns.size() );

        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );
        assertEquals( 2,
                      columns.get( 3 ).values.size() );
        assertEquals( 1,
                      columns.get( 4 ).values.size() );
        assertEquals( 1,
                      columns.get( 5 ).values.size() );

        assertEquals( Boolean.TRUE,
                      columns.get( 2 ).values.get( 0 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      columns.get( 2 ).values.get( 1 ).getBooleanValue() );

        assertEquals( Boolean.TRUE,
                      columns.get( 3 ).values.get( 0 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      columns.get( 3 ).values.get( 1 ).getBooleanValue() );

        assertEquals( Boolean.FALSE,
                      columns.get( 4 ).values.get( 0 ).getBooleanValue() );

        assertEquals( Boolean.FALSE,
                      columns.get( 5 ).values.get( 0 ).getBooleanValue() );

        RowIterator i = re.iterator();
        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( i.hasNext() ) {
            List<DTCellValue52> row = i.next();
            rows.add( row );
        }

        assertEquals( 4,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( Boolean.TRUE,
                      rows.get( 0 ).get( 2 ).getBooleanValue() );
        assertEquals( Boolean.TRUE,
                      rows.get( 0 ).get( 3 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 0 ).get( 4 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 0 ).get( 5 ).getBooleanValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( Boolean.TRUE,
                      rows.get( 1 ).get( 2 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 1 ).get( 3 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 1 ).get( 4 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 1 ).get( 5 ).getBooleanValue() );

        assertEquals( "",
                      rows.get( 2 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 2 ).get( 1 ).getStringValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 2 ).get( 2 ).getBooleanValue() );
        assertEquals( Boolean.TRUE,
                      rows.get( 2 ).get( 3 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 2 ).get( 4 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 2 ).get( 5 ).getBooleanValue() );

        assertEquals( "",
                      rows.get( 3 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 3 ).get( 1 ).getStringValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 3 ).get( 2 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 3 ).get( 3 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 3 ).get( 4 ).getBooleanValue() );
        assertEquals( Boolean.FALSE,
                      rows.get( 3 ).get( 5 ).getBooleanValue() );

    }

    @Test
    //GUVNOR-1960
    public void testExpansionObjectUniqueness() {
        GuidedDecisionTable52 dtable = new GuidedDecisionTable52();

        String pkg = "package org.test\n"
                     + "declare Driver\n"
                     + "gender: String\n"
                     + "end\n";

        SuggestionCompletionLoader loader = new SuggestionCompletionLoader();

        List<String> enums = new ArrayList<String>();

        enums.add( "'Driver.gender' : ['M', 'F']" );

        SuggestionCompletionEngine sce = loader.getSuggestionEngine( pkg,
                                                                     new ArrayList<JarInputStream>(),
                                                                     new ArrayList<DSLTokenizedMappingFile>(),
                                                                     enums );

        Pattern52 p1 = new Pattern52();
        p1.setBoundName( "c1" );
        p1.setFactType( "Driver" );

        ConditionCol52 c1 = new ConditionCol52();
        c1.setFactField( "gender" );
        c1.setOperator( "==" );
        c1.setConstraintValueType( BaseSingleFieldConstraint.TYPE_LITERAL );
        p1.getChildColumns().add( c1 );
        dtable.getConditions().add( p1 );
        RowExpander re = new RowExpander( dtable,
                                          sce );

        List<ColumnValues> columns = re.getColumns();
        assertEquals( 3,
                      columns.size() );

        assertEquals( 1,
                      columns.get( 0 ).values.size() );
        assertEquals( 1,
                      columns.get( 1 ).values.size() );
        assertEquals( 2,
                      columns.get( 2 ).values.size() );

        RowIterator ri = re.iterator();
        assertTrue( ri.hasNext() );

        List<List<DTCellValue52>> rows = new ArrayList<List<DTCellValue52>>();
        while ( ri.hasNext() ) {
            List<DTCellValue52> row = ri.next();
            rows.add( row );
        }

        assertEquals( 2,
                      rows.size() );

        assertEquals( "",
                      rows.get( 0 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 0 ).get( 1 ).getStringValue() );
        assertEquals( "M",
                      rows.get( 0 ).get( 2 ).getStringValue() );

        assertEquals( "",
                      rows.get( 1 ).get( 0 ).getStringValue() );
        assertEquals( "",
                      rows.get( 1 ).get( 1 ).getStringValue() );
        assertEquals( "F",
                      rows.get( 1 ).get( 2 ).getStringValue() );

        assertTrue( rows.get( 0 ).get( 0 ) != rows.get( 1 ).get( 0 ) );
        assertTrue( rows.get( 0 ).get( 1 ) != rows.get( 1 ).get( 1 ) );
    }

}
TOP

Related Classes of org.drools.guvnor.client.widgets.drools.wizards.assets.decisiontable.RowExpanderTests

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.