/* * 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. * * 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.compiler.integrationtests.incrementalcompilation; import org.junit.Ignore; import org.junit.Test; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; /** * Tests adding and removing rules with advanced operators. */ public class AddRemoveRulesAdvOperatorsTest extends AbstractAddRemoveRulesTest { @Test public void testAddRemoveSameRuleWithContains() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveSameRuleWithContainsSwitchedConstraints() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " java.util.Map(values() contains \"1\") \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndExistsAtEnd() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " exists(String()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndExistsAtBeg() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " exists(String()) \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } // TODO - the next two tests are same as tests // testAddRemoveRuleWithContainsAndExistsAtBeg and testAddRemoveRuleWithContainsAndExistsAtEnd // (in each test the rule order is also switched), // but keeping them here, because some fails occur sooner in the test here than in previous tests. // (in other words, when previous tests fail soon, the fail that will occur later in the test is not // visible, until the first one is fixed) @Test public void testAddRemoveRuleWithContainsAndExistsInFirstRuleAtBeg() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " exists(String()) \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndExistsInFirstRuleAtEnd() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " exists(String()) \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndDoubledExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " exists(String() and String()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithNotContainsAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() not contains \"2\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " java.util.Map(values() not contains \"2\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveRuleWithContainsAndNotContainsAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " java.util.Map(values() contains \"1\") \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " java.util.Map(values() not contains \"2\") \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, getFactsContains(), null); } @Test public void testAddRemoveSameRuleWithMemberOf() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveSameRuleWithMemberOfSwitchedConstraints() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleWithMemberOfAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " $s: String($s memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleWithMemberOfAndExistsAtEnd() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " exists(String()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleWithMemberOfAndExistsAtBeg() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " exists(String()) \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleWithMemberOfAndNotExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " not(exists(Integer() and Integer())) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s memberOf memberList) \n" + " not(exists(Integer() and Integer())) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleWithNotMemberOfAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s not memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " $s: String($s not memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{"fact"}, getGlobalsMemberOf("test")); } @Test public void testAddRemoveRuleWithMemberOfAndNotMemberOfAndExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " $s: String($s memberOf memberList) \n" + " String() \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " exists(String()) \n" + " $s: String($s not memberOf memberList) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString, "fact"}, getGlobalsMemberOf(memberString)); } @Test @Ignore public void testAddRemoveRuleWithContainsMatchesExists() { final String rule1 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE1_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s matches \"tes.*\") \n" + " exists(String()) \n" + " String($s memberOf memberList) \n" + " then \n" + " list.add('" + RULE1_NAME + "'); \n" + " end"; final String rule2 = "package " + PKG_NAME_TEST + ";\n" + " global java.util.List memberList\n" + " global java.util.List list \n" + " rule " + RULE2_NAME + " \n" + " when \n" + " String() \n" + " $s: String($s matches \"tes.*\") \n" + " String($s memberOf memberList) \n" + " java.util.Map(values() contains \"1\") \n" + " exists(String() and String()) \n" + " exists(String()) \n" + " then\n" + " list.add('" + RULE2_NAME + "'); \n" + " end"; final String memberString = "test"; runAddRemoveTests(rule1, rule2, RULE1_NAME, RULE2_NAME, new Object[]{memberString, "1"}, getGlobalsMemberOf(memberString)); } @Test public void testAddRemoveRuleContainsExists3Rules() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer() \n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer() \n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $s : String()\n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and exists(Integer() and Integer()))\n" + " String()\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; Map<Object, String> mapFact = new HashMap<Object, String>(1); mapFact.put(new Object(), "1"); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{mapFact, 1, "1"}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE3_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); additionalGlobals.put("globalInt", new AtomicInteger(0)); runAddRemoveTest(builder.build(), additionalGlobals); } @Test() //(timeout = 10000L) public void testAddRemoveRuleContainsExists3RulesDoubledExists() { final String rule1 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE1_NAME + " \n" + "when\n" + " $s : String()\n" + " Integer() \n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and Integer() )\n" + "then\n" + " list.add('" + RULE1_NAME + "'); \n" + "end\n"; final String rule2 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE2_NAME + " \n" + "when \n" + " $s : String()\n" + " Integer() \n" + " exists( Integer() and Integer() )\n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and Integer() )\n" + " String()\n" + "then \n" + " list.add('" + RULE2_NAME + "'); \n" + "end"; final String rule3 = "package " + PKG_NAME_TEST + ";" + "global java.util.concurrent.atomic.AtomicInteger globalInt\n" + "global java.util.List list\n" + "rule " + RULE3_NAME + " \n" + "when \n" + " $s : String()\n" + " java.util.Map(values() contains \"1\") \n" + " exists( Integer() and exists(Integer() and Integer()))\n" + " String()\n" + "then \n" + " list.add('" + RULE3_NAME + "'); \n" + "end"; Map<Object, String> mapFact = new HashMap<Object, String>(1); mapFact.put(new Object(), "1"); AddRemoveTestBuilder builder = new AddRemoveTestBuilder(); builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1}) .addOperation(TestOperationType.INSERT_FACTS, new Object[]{mapFact, 1, "1"}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule2}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE2_NAME}) .addOperation(TestOperationType.ADD_RULES, new String[]{rule3}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE3_NAME}) .addOperation(TestOperationType.REMOVE_RULES, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME}) .addOperation(TestOperationType.FIRE_RULES) .addOperation(TestOperationType.CHECK_RESULTS, new String[]{}); final Map<String, Object> additionalGlobals = new HashMap<String, Object>(); additionalGlobals.put("globalInt", new AtomicInteger(0)); runAddRemoveTest(builder.build(), additionalGlobals); } private Object[] getFactsContains() { final Map<Object, String> mapFact = new HashMap<Object, String>(1); mapFact.put(new Object(), "1"); return new Object[]{mapFact, 1, 2, "1"}; } private Map<String, Object> getGlobalsMemberOf(final String memberString) { final Map<String, Object> globals = new HashMap<String, Object>(1); final List<String> memberList = new ArrayList<String>(1); memberList.add(memberString); globals.put("memberList", memberList); return globals; } // TODO matches, not matches }