/*
* 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 java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class AddRemoveTestBuilder {
private final List<TestOperation> testPlan = new ArrayList<TestOperation>();
public AddRemoveTestBuilder addOperation(final TestOperationType operationType, final Object operationParameter) {
testPlan.add(new TestOperation(operationType, operationParameter));
return this;
}
public AddRemoveTestBuilder addOperation(final TestOperationType operationType) {
testPlan.add(new TestOperation(operationType, null));
return this;
}
public List<TestOperation> build() {
return testPlan;
}
public void clear() {
testPlan.clear();
}
public static List<List<TestOperation>> getTestPlan(final String rule1, final String rule2,
final String rule1Name, final String rule2Name, final Object[] facts) {
final List<List<TestOperation>> testPlan = new ArrayList<List<TestOperation>>();
// Session with rules -> Insert facts -> Fire -> Check results -> Remove rule(s) -> Fire -> Check results
testPlan.addAll(createInsertFactsFireRulesRemoveRulesTestPlan(rule1, rule2, rule1Name, rule2Name, facts));
// Same with reverted rules
testPlan.addAll(createInsertFactsFireRulesRemoveRulesTestPlan(rule2, rule1, rule2Name, rule1Name, facts));
// Session with rules -> Fire -> Check results -> Insert facts -> Fire -> Check results -> Remove rule(s) -> Fire -> Check results
testPlan.addAll(createFireRulesInsertFactsFireRulesRemoveRulesTestPlan(rule1, rule2, rule1Name, rule2Name, facts));
// Same with reverted rules
testPlan.addAll(createFireRulesInsertFactsFireRulesRemoveRulesTestPlan(rule2, rule1, rule2Name, rule1Name, facts));
// Session with rules -> Insert facts -> Remove rule(s) -> Fire -> Check results -> Remove rule(s) -> Fire -> Check results
testPlan.addAll(createInsertFactsRemoveRulesFireRulesRemoveRulesTestPlan(rule1, rule2, rule1Name, rule2Name, facts));
// Same with reverted rules
testPlan.addAll(createInsertFactsRemoveRulesFireRulesRemoveRulesTestPlan(rule2, rule1, rule2Name, rule1Name, facts));
// Session with rules -> Insert facts -> Fire -> Check results -> Remove rule(s) -> Fire -> Reinsert rules -> Check results
testPlan.addAll(createInsertFactsFireRulesRemoveRulesReinsertRulesTestPlan(rule1, rule2, rule1Name, rule2Name, facts));
// Same with reverted rules
testPlan.addAll(createInsertFactsFireRulesRemoveRulesReinsertRulesTestPlan(rule2, rule1, rule2Name, rule1Name, facts));
return testPlan;
}
public static List<List<TestOperation>> createInsertFactsFireRulesRemoveRulesTestPlan(final String rule1,
final String rule2, final String rule1Name, final String rule2Name, final Object[] facts) {
final List<List<TestOperation>> testPlan = new ArrayList<List<TestOperation>>();
AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
return testPlan;
}
public static List<List<TestOperation>> createInsertFactsRemoveRulesFireRulesRemoveRulesTestPlan(final String rule1,
final String rule2, final String rule1Name, final String rule2Name, final Object[] facts) {
final List<List<TestOperation>> testPlan = new ArrayList<List<TestOperation>>();
AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
return testPlan;
}
public static List<List<TestOperation>> createFireRulesInsertFactsFireRulesRemoveRulesTestPlan(final String rule1,
final String rule2, final String rule1Name, final String rule2Name, final Object[] facts) {
final List<List<TestOperation>> testPlan = new ArrayList<List<TestOperation>>();
AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
return testPlan;
}
public static List<List<TestOperation>> createInsertFactsFireRulesRemoveRulesReinsertRulesTestPlan(final String rule1,
final String rule2, final String rule1Name, final String rule2Name, final Object[] facts) {
final List<List<TestOperation>> testPlan = new ArrayList<List<TestOperation>>();
AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.ADD_RULES, new String[]{rule1, rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.ADD_RULES, new String[]{rule1})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name})
.addOperation(TestOperationType.ADD_RULES, new String[]{rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
testPlan.add(builder.build());
builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule1Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{rule2Name})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{})
.addOperation(TestOperationType.ADD_RULES_REINSERT_OLD, new String[]{rule1})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name})
.addOperation(TestOperationType.ADD_RULES_REINSERT_OLD, new String[]{rule2})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{rule1Name, rule2Name});
testPlan.add(builder.build());
return testPlan;
}
public static List<TestOperation> createInsertFactsRemoveFireTestPlan(final String rule1, final String rule2,
final Object[] facts) {
final AddRemoveTestBuilder builder = new AddRemoveTestBuilder();
builder.addOperation(TestOperationType.CREATE_SESSION, new String[]{rule1, rule2})
.addOperation(TestOperationType.INSERT_FACTS, facts)
.addOperation(TestOperationType.REMOVE_RULES, new String[]{"R2"})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{"R1"})
.addOperation(TestOperationType.REMOVE_RULES, new String[]{"R1"})
.addOperation(TestOperationType.FIRE_RULES)
.addOperation(TestOperationType.CHECK_RESULTS, new String[]{});
return builder.build();
}
public static Object[] getDefaultFacts() {
return new Object[]{1, 2, "1"};
}
}