@Test
//https://issues.jboss.org/browse/GUVNOR-2030
public void testMissingTemplateKeyValues_RHSInsertThenUpdate() {

    final ConversionResult result = new ConversionResult();
    final List<DataListener> listeners = new ArrayList<DataListener>();
    addModelField("org.test.Transaction",
                  "this",
                  "org.test.Transaction",
                  DataType.TYPE_THIS);
    addModelField("org.test.Transaction",
                  "enabled",
                  Boolean.class.getName(),
                  DataType.TYPE_BOOLEAN);
    final GuidedDecisionTableGeneratorListener listener = new GuidedDecisionTableGeneratorListener(result,
                                                                                                   dmo);
    listeners.add(listener);
    //Convert
    final ExcelParser parser = new ExcelParser(listeners);
    final InputStream is = this.getClass().getResourceAsStream("GUVNOR-2030 (RHS insert then update).xls");
    try {
        parser.parseFile(is);
    } finally {
        try {
            is.close();
        } catch (IOException ioe) {
            fail(ioe.getMessage());
        }
    }
    //Check conversion results
    assertEquals(0,
                 result.getMessages().size());
    //Check basics
    final List<GuidedDecisionTable52> dtables = listener.getGuidedDecisionTables();
    assertNotNull(dtables);
    assertEquals(1,
                 dtables.size());
    GuidedDecisionTable52 dtable = dtables.get(0);
    assertEquals("asd",
                 dtable.getTableName());
    assertEquals(GuidedDecisionTable52.TableFormat.EXTENDED_ENTRY,
                 dtable.getTableFormat());
    //Check expanded columns
    List<BaseColumn> columns = dtable.getExpandedColumns();
    assertNotNull(columns);
    assertEquals(7,
                 columns.size());
    assertTrue(columns.get(0) instanceof RowNumberCol52);
    assertTrue(columns.get(1) instanceof RuleNameColumn);
    assertTrue(columns.get(2) instanceof DescriptionCol52);
    assertTrue(columns.get(3) instanceof BRLConditionVariableColumn);
    assertTrue(columns.get(4) instanceof BRLActionVariableColumn);
    assertTrue(columns.get(5) instanceof BRLActionVariableColumn);
    assertTrue(columns.get(6) instanceof BRLActionVariableColumn);
    //Check individual condition columns
    assertEquals(1,
                 dtable.getConditions().size());
    assertTrue(dtable.getConditions().get(0) instanceof BRLConditionColumn);
    //Column 1
    BRLConditionColumn conditionCol0 = ((BRLConditionColumn) dtable.getConditions().get(0));
    assertEquals("Converted from ['Disabled']",
                 conditionCol0.getHeader());
    assertEquals(1,
                 conditionCol0.getChildColumns().size());
    List<IPattern> conditionCol0definition = conditionCol0.getDefinition();
    assertEquals(1,
                 conditionCol0definition.size());
    assertTrue(conditionCol0definition.get(0) instanceof FactPattern);
    FactPattern conditionCol0fp = (FactPattern) conditionCol0definition.get(0);
    assertEquals("Transaction",
                 conditionCol0fp.getFactType());
    assertEquals(1,
                 conditionCol0fp.getNumberOfConstraints());
    assertTrue(conditionCol0fp.getConstraint(0) instanceof SingleFieldConstraint);
    final SingleFieldConstraint conditionCol0fpsfc0 = (SingleFieldConstraint) conditionCol0fp.getConstraint(0);
    assertEquals("enabled",
                 conditionCol0fpsfc0.getFieldName());
    assertEquals("==",
                 conditionCol0fpsfc0.getOperator());
    assertEquals("param1",
                 conditionCol0fpsfc0.getValue());
    assertEquals(SingleFieldConstraint.TYPE_TEMPLATE,
                 conditionCol0fpsfc0.getConstraintValueType());
    assertEquals(DataType.TYPE_BOOLEAN,
                 conditionCol0fpsfc0.getFieldType());
    //Column 1 - Variable 1
    BRLConditionVariableColumn conditionCol0param0 = conditionCol0.getChildColumns().get(0);
    assertEquals("param1",
                 conditionCol0param0.getVarName());
    assertEquals("Disabled",
                 conditionCol0param0.getHeader());
    assertEquals(DataType.TYPE_BOOLEAN,
                 conditionCol0param0.getFieldType());
    assertEquals("Transaction",
                 conditionCol0param0.getFactType());
    assertEquals("enabled",
                 conditionCol0param0.getFactField());
    //Check individual action columns
    assertEquals(3,
                 dtable.getActionCols().size());
    assertTrue(dtable.getActionCols().get(0) instanceof BRLActionColumn);
    //Column 2
    BRLActionColumn actionCol0 = ((BRLActionColumn) dtable.getActionCols().get(0));
    assertEquals("Converted from ['Enable']",
                 actionCol0.getHeader());
    assertEquals(1,
                 actionCol0.getChildColumns().size());
    List<IAction> actionCol0definition = actionCol0.getDefinition();
    assertEquals(1,
                 actionCol0definition.size());
    assertTrue(actionCol0definition.get(0) instanceof ActionSetField);
    ActionSetField actionCol0asf0 = (ActionSetField) actionCol0definition.get(0);
    assertEquals("$t",
                 actionCol0asf0.getVariable());
    ActionFieldValue[] actionCol0asf0afvs = actionCol0asf0.getFieldValues();
    assertEquals(1,
                 actionCol0asf0afvs.length);
    ActionFieldValue actionCol0asf0afv0 = actionCol0asf0afvs[0];
    assertEquals("enabled",
                 actionCol0asf0afv0.getField());
    assertEquals("param2",
                 actionCol0asf0afv0.getValue());
    assertEquals(FieldNatureType.TYPE_TEMPLATE,
                 actionCol0asf0afv0.getNature());
    assertEquals(DataType.TYPE_BOOLEAN,
                 actionCol0asf0afv0.getType());
    //Column 3
    BRLActionColumn actionCol1 = ((BRLActionColumn) dtable.getActionCols().get(1));
    assertEquals("Converted from ['New']",
                 actionCol1.getHeader());
    assertEquals(1,
                 actionCol1.getChildColumns().size());
    List<IAction> actionCol1definition = actionCol1.getDefinition();
    assertEquals(1,
                 actionCol1definition.size());
    assertTrue(actionCol1definition.get(0) instanceof ActionInsertFact);
    ActionInsertFact actionCol1aif0 = (ActionInsertFact) actionCol1definition.get(0);
    assertEquals("$t2",
                 actionCol1aif0.getBoundName());
    assertEquals("Transaction",
                 actionCol1aif0.getFactType());
    ActionFieldValue[] actionCol1aif0afvs = actionCol1aif0.getFieldValues();
    assertEquals(0,
                 actionCol1aif0afvs.length);
    //Column 4
    BRLActionColumn actionCol2 = ((BRLActionColumn) dtable.getActionCols().get(2));
    assertEquals("Converted from ['Disable']",
                 actionCol2.getHeader());
    assertEquals(1,
                 actionCol2.getChildColumns().size());
    List<IAction> actionCol2definition = actionCol2.getDefinition();
    assertEquals(1,
                 actionCol2definition.size());
    assertTrue(actionCol2definition.get(0) instanceof ActionSetField);
    ActionSetField actionCol2asf0 = (ActionSetField) actionCol2definition.get(0);
    assertEquals("$t2",
                 actionCol2asf0.getVariable());
    ActionFieldValue[] actionCol2asf0afvs = actionCol2asf0.getFieldValues();
    assertEquals(1,
                 actionCol2asf0afvs.length);
    ActionFieldValue actionCol2asf0afv0 = actionCol2asf0afvs[0];
    assertEquals("enabled",
                 actionCol2asf0afv0.getField());
    assertEquals("param3",
                 actionCol2asf0afv0.getValue());
    assertEquals(FieldNatureType.TYPE_TEMPLATE,
                 actionCol2asf0afv0.getNature());
    assertEquals(DataType.TYPE_BOOLEAN,
                 actionCol2asf0afv0.getType());
    //Check data
    assertEquals(1,
                 dtable.getData().size());
    assertTrue(isRowEquivalent(new Object[]{1, "", "asd", false, true, false, false},
                               dtable.getData().get(0)));
}