/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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.workbench.services.verifier.webworker.client; import java.util.ArrayList; import com.google.gwtmockito.GwtMockitoTestRunner; import org.drools.workbench.models.datamodel.imports.Import; import org.drools.workbench.models.datamodel.oracle.DataType; import org.drools.workbench.models.guided.dtable.shared.model.DTCellValue52; import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52; import org.drools.workbench.services.verifier.api.client.reporting.Severity; import org.drools.workbench.services.verifier.webworker.client.testutil.ExtendedGuidedDecisionTableBuilder; import org.drools.workbench.services.verifier.webworker.client.testutil.LimitedGuidedDecisionTableBuilder; import org.junit.Test; import org.junit.runner.RunWith; import static org.drools.workbench.services.verifier.webworker.client.testutil.TestUtil.*; import static org.junit.Assert.*; @RunWith(GwtMockitoTestRunner.class) public class DecisionTableAnalyzerTest extends AnalyzerUpdateTestBase { @Test public void testEmpty() throws Exception { table52 = new GuidedDecisionTable52(); fireUpAnalyzer(); assertTrue(analyzerProvider.getAnalysisReport().isEmpty()); } @Test public void testEmptyRow() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withData(new Object[][]{{1, "description", ""}}) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 1); } @Test public void testMultipleEmptyRows() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", "==") .withData(new Object[][]{{1, "description", ""}, {2, "description", ""} }) .buildTable(); fireUpAnalyzer(); assertEquals(4, analyzerProvider.getAnalysisReport().size()); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 1); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 2); assertOnlyContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, SINGLE_HIT_LOST); } @Test public void testRuleHasNoAction() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withData(new Object[][]{{1, "description", 0}}) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING); } @Test public void testMultipleRuleHasNoActions() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withData(new Object[][]{{1, "description", 0}, {2, "description", 1}}) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING, 1); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING, 2); } @Test public void ruleHasNoActionShouldNotIgnoreRetract() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withRetract() .withData(DataBuilderProvider .row(0, "a") .end()) .buildTable(); fireUpAnalyzer(); assertDoesNotContain(RULE_HAS_NO_ACTION, analyzerProvider.getAnalysisReport()); } @Test public void testRuleHasNoActionSet() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withActionSetField("a", "age", DataType.TYPE_NUMERIC_INTEGER) .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN) .withActionSetField("a", "name", DataType.TYPE_STRING) .withData(new Object[][]{ {1, "description", 0, null, null, ""}, {2, "description", null, null, null, null} }) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING, 1); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 2); assertDoesNotContain(EMPTY_RULE, analyzerProvider.getAnalysisReport(), 1); assertDoesNotContain(RULE_HAS_NO_ACTION, analyzerProvider.getAnalysisReport(), 2); } @Test public void testRuleHasNoRestrictions() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<>(), "mytable") .withActionInsertFact("Person", "a", "approved", DataType.TYPE_BOOLEAN) .withData(new Object[][]{{1, "description", true}}) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, Severity.NOTE); } @Test public void testRuleHasNoRestrictionsSet() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withStringColumn("a", "Person", "name", "==") .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN) .withData(new Object[][]{ {1, "description", null, "", true}, {2, "description", null, null, null} }) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, Severity.NOTE, 1); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 2); assertDoesNotContain(EMPTY_RULE, analyzerProvider.getAnalysisReport(), 1); assertDoesNotContain(RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, analyzerProvider.getAnalysisReport(), 2); } @Test public void testMultipleValuesForOneAction() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN) .withActionSetField("a", "approved", DataType.TYPE_BOOLEAN) .withData(new Object[][]{{1, "description", 100, true, false}}) .buildTable(); analyzer = analyzerProvider.makeAnalyser(table52); analyzer.start(); assertContains(analyzerProvider.getAnalysisReport(), MULTIPLE_VALUES_FOR_ONE_ACTION, Severity.WARNING); } @Test public void testRedundancy() throws Exception { table52 = new LimitedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withIntegerColumn("a", "Person", "age", "==", 0) .withAction("a", "Person", "approved", new DTCellValue52() { { setBooleanValue(true); } }).withAction("a", "Person", "approved", new DTCellValue52() { { setBooleanValue(true); } }) .withData(new Object[][]{ {1, "description", true, true, false}, {2, "description", true, false, true}}) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), REDUNDANT_ROWS, Severity.WARNING, 1, 2); assertNotNull(analyzerProvider.getStatus()); } // GUVNOR-2546: Verification & Validation: BRL fragments are ignored @Test public void testRuleHasNoActionBRLFragmentHasAction() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withActionBRLFragment() .withData(new Object[][]{{1, "description", 0, true}}) .buildTable(); fireUpAnalyzer(); assertDoesNotContain(EMPTY_RULE, analyzerProvider.getAnalysisReport(), 1); assertDoesNotContain(RULE_HAS_NO_ACTION, analyzerProvider.getAnalysisReport()); } /** * Check if the message about missing action is thrown * if the action is defined as BRLAction */ @Test public void testMissingActionForBrlAction() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withActionBRLFragment() .withData(new Object[][]{{1, "description", Integer.MIN_VALUE, null}}) .buildTable(); fireUpAnalyzer(); assertEquals(1, analyzerProvider.getAnalysisReport().size()); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING); } /** * Check that there is message about missing condition * if the action is defined as BRLAction */ @Test public void testMissingRestrictionForBrlAction() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionIntegerColumn("a", "Person", "age", ">") .withActionBRLFragment() .withData(new Object[][]{{1, "description", null, true}}) .buildTable(); fireUpAnalyzer(); assertEquals(1, analyzerProvider.getAnalysisReport().size()); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, Severity.NOTE); } // GUVNOR-2546: Verification & Validation: BRL fragments are ignored @Test public void testConditionsShouldNotBeIgnored() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionBRLColumn() .withActionInsertFact("Application", "a", "approved", DataType.TYPE_BOOLEAN) .withData(new Object[][]{ {1, "description", null, true}, {2, "description", null, null} }) .buildTable(); fireUpAnalyzer(); assertContains(analyzerProvider.getAnalysisReport(), EMPTY_RULE, Severity.WARNING, 2); assertDoesNotContain(EMPTY_RULE, analyzerProvider.getAnalysisReport(), 1); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, Severity.NOTE, 1); assertDoesNotContain(RULE_HAS_NO_RESTRICTIONS_AND_WILL_ALWAYS_FIRE, analyzerProvider.getAnalysisReport(), 2); } /** * Check if the message about missing action is thrown * if the condition is defined as BRLCondition */ @Test public void testMissingActionForBrlCondition() throws Exception { table52 = new ExtendedGuidedDecisionTableBuilder("org.test", new ArrayList<Import>(), "mytable") .withConditionBRLColumn() .withActionInsertFact("Application", "a", "approved", DataType.TYPE_BOOLEAN) .withData(new Object[][]{{1, "description", "value", null}}) .buildTable(); fireUpAnalyzer(); assertEquals(1, analyzerProvider.getAnalysisReport().size()); assertContains(analyzerProvider.getAnalysisReport(), RULE_HAS_NO_ACTION, Severity.WARNING); } }