package org.drools.compiler.integrationtests.incrementalcompilation;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.kie.api.runtime.rule.FactHandle;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@RunWith(Parameterized.class)
public class AddRemoveRulesAddDeleteFactsTest extends AbstractAddRemoveRulesTest {
private StringPermutation rulesPermutation;
public AddRemoveRulesAddDeleteFactsTest(final StringPermutation rulesPermutation) {
this.rulesPermutation = rulesPermutation;
}
@Parameterized.Parameters
public static Collection<StringPermutation[]> getRulesPermutations() {
final Collection<StringPermutation[]> rulesPermutations = new HashSet<StringPermutation[]>();
final Set<StringPermutation> parametersPermutations = new HashSet<StringPermutation>();
getStringPermutations(
new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME},
new String[]{},
parametersPermutations);
for (StringPermutation permutation : parametersPermutations) {
rulesPermutations.add(new StringPermutation[]{permutation});
}
return rulesPermutations;
}
@Test
public void testAddRemoveRulesAddRemoveFacts() {
final List resultsList = new ArrayList();
final Map<String, Object> sessionGlobals = new HashMap<String, Object>();
sessionGlobals.put("list", resultsList);
final TestContext testContext = new TestContext(PKG_NAME_TEST, sessionGlobals, resultsList);
final AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, getRules())
.addOperation(TestOperationType.INSERT_FACTS, getFacts())
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{RULE1_NAME, RULE2_NAME, RULE3_NAME});
testContext.executeTestOperations(builder.build());
builder.clear();
final Set<FactHandle> insertedFacts = testContext.getActualSessionFactHandles();
builder.addOperation(TestOperationType.REMOVE_RULES, rulesPermutation.getPermutation())
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_FACTS, insertedFacts.toArray(new FactHandle[]{}))
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testContext.executeTestOperations(builder.build());
builder.clear();
}
private Object[] getFacts() {
return new Object[]{1, "1"};
}
private static void getStringPermutations(final String[] rules, final String[] partialPermutation,
final Collection<StringPermutation> foundPermutations) {
if (rules.length == 1) {
if (partialPermutation != null && partialPermutation.length > 0) {
foundPermutations.add(new StringPermutation(concatenateStringArrays(partialPermutation, rules)));
} else {
foundPermutations.add(new StringPermutation(rules));
}
} else {
for (int i = 0; i < rules.length; i++) {
if (i == 0) {
getStringPermutations(
Arrays.copyOfRange(rules, 1, rules.length),
concatenateStringArrays(partialPermutation, new String[]{rules[i]}),
foundPermutations);
} else if (i == rules.length - 1) {
getStringPermutations(
Arrays.copyOfRange(rules, 0, rules.length - 1),
concatenateStringArrays(partialPermutation, new String[]{rules[i]}),
foundPermutations);
} else {
final String[] remainingRules = concatenateStringArrays(
Arrays.copyOfRange(rules, 0, i),
Arrays.copyOfRange(rules, i + 1, rules.length));
getStringPermutations(
remainingRules,
concatenateStringArrays(partialPermutation, new String[]{rules[i]}),
foundPermutations);
}
}
}
}
private static String[] concatenateStringArrays(final String[] array1, final String[] array2) {
final String[] concatenatedArray = new String[array1.length + array2.length];
System.arraycopy(array1, 0, concatenatedArray, 0, array1.length);
System.arraycopy(array2, 0, concatenatedArray, array1.length, array2.length);
return concatenatedArray;
}
private static String[] getRules() {
final String[] rules = new String[3];
rules[0] = " package " + PKG_NAME_TEST + ";\n" +
" global java.util.List list\n" +
" rule " + RULE1_NAME + " \n" +
" when \n" +
" Integer() \n" +
" not(not(Integer() and Integer())) \n" +
" then\n" +
" list.add('" + RULE1_NAME + "'); \n" +
" end";
rules[1] = " package " + PKG_NAME_TEST + ";\n" +
" global java.util.List list\n" +
" rule " + RULE2_NAME + " \n" +
" when \n" +
" Integer() \n" +
" exists(Integer() and Integer()) \n" +
" then\n" +
" list.add('" + RULE2_NAME + "'); \n" +
" end";
rules[2] = " package " + PKG_NAME_TEST + ";\n" +
" global java.util.List list\n" +
" rule " + RULE3_NAME + " \n" +
" when \n" +
" Integer() \n" +
" exists(Integer() and Integer()) \n" +
" String() \n" +
" then\n" +
" list.add('" + RULE3_NAME + "'); \n" +
" end";
return rules;
}
}