package com.vistatec.ocelot.rules;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.*;
import com.vistatec.ocelot.rules.RuleConfiguration.FilterMode;
import com.vistatec.ocelot.rules.RuleConfiguration.StateQualifierMode;
import static com.vistatec.ocelot.rules.RulesTestHelpers.lqi;
import static org.junit.Assert.*;
import static com.vistatec.ocelot.rules.StateQualifier.*;
public class TestRuleConfiguration {
@Test
public void testRuleEnablingAndRuleListener() {
TestRuleListener listener = new TestRuleListener();
RuleConfiguration config = new RuleConfiguration(listener);
config.addRuleConstaint("rule1",
new RuleMatcher(DataCategoryField.LQI_COMMENT, new NullMatcher()));
config.addRuleConstaint("rule2",
new RuleMatcher(DataCategoryField.LQI_SEVERITY, new NullMatcher()));
assertFalse(config.getRule("rule1").getEnabled());
assertFalse(config.getRule("rule2").getEnabled());
Rule rule1 = config.getRule("rule1");
Rule rule2 = config.getRule("rule2");
config.enableRule(rule1, true);
assertTrue(rule1.getEnabled());
assertFalse(rule2.getEnabled());
assertTrue(listener.isEnabled("rule1"));
assertFalse(listener.isEnabled("rule2"));
config.enableRule(rule2, true);
assertTrue(rule1.getEnabled());
assertTrue(rule2.getEnabled());
assertTrue(listener.isEnabled("rule1"));
assertTrue(listener.isEnabled("rule2"));
config.enableRule(rule1, false);
config.enableRule(rule2, false);
assertFalse(rule1.getEnabled());
assertFalse(rule2.getEnabled());
assertFalse(listener.isEnabled("rule1"));
assertFalse(listener.isEnabled("rule2"));
}
@Test
public void testStateQualifierRuleListener() {
TestRuleListener listener = new TestRuleListener();
RuleConfiguration config = new RuleConfiguration(listener);
// Verify initial state
assertFalse(config.getStateQualifierEnabled(EXACT));
assertFalse(config.getStateQualifierEnabled(FUZZY));
assertFalse(config.getStateQualifierEnabled(ID));
assertFalse(config.getStateQualifierEnabled(MT));
// Verify that setting them generates the appropriate rule
// listener events
config.setStateQualifierEnabled(EXACT, true);
config.setStateQualifierEnabled(FUZZY, true);
config.setStateQualifierEnabled(ID, true);
config.setStateQualifierEnabled(MT, true);
assertTrue(listener.enabledRules.get(EXACT.getName()));
assertTrue(listener.enabledRules.get(FUZZY.getName()));
assertTrue(listener.enabledRules.get(ID.getName()));
assertTrue(listener.enabledRules.get(MT.getName()));
// Verify that we don't notify the listener if the
// state doesn't change
listener.enabledRules.clear();
config.setStateQualifierEnabled(EXACT, true);
config.setStateQualifierEnabled(FUZZY, true);
config.setStateQualifierEnabled(ID, true);
config.setStateQualifierEnabled(MT, true);
assertEquals(0, listener.enabledRules.size());
}
@Test
public void testFilterModeListener() {
TestRuleListener listener = new TestRuleListener();
RuleConfiguration config = new RuleConfiguration(listener);
config.setFilterMode(FilterMode.ALL);
assertEquals(FilterMode.ALL, listener.filterMode);
config.setFilterMode(FilterMode.ALL_WITH_METADATA);
assertEquals(FilterMode.ALL_WITH_METADATA, listener.filterMode);
config.setFilterMode(FilterMode.SELECTED_SEGMENTS);
assertEquals(FilterMode.SELECTED_SEGMENTS, listener.filterMode);
}
@Test
public void testStateQualifierListener() {
TestRuleListener listener = new TestRuleListener();
RuleConfiguration config = new RuleConfiguration(listener);
config.setStateQualifierMode(StateQualifierMode.ALL);
assertEquals(StateQualifierMode.ALL, listener.stateQualifierMode);
config.setStateQualifierMode(StateQualifierMode.SELECTED_STATES);
assertEquals(StateQualifierMode.SELECTED_STATES, listener.stateQualifierMode);
}
@Test
public void testGetFlagForMetadata() {
RuleConfiguration config = new RuleConfiguration(new TestRuleListener());
DataCategoryFlag flag1 = new DataCategoryFlag();
DataCategoryFlag flag2 = new DataCategoryFlag();
config.addRule(createRule(new RuleMatcher(DataCategoryField.LQI_SEVERITY, Matchers.numeric(80, 100)), flag1));
config.addRule(createRule(new RuleMatcher(DataCategoryField.LQI_SEVERITY, Matchers.numeric(90, 100)), flag2));
assertEquals(flag1, config.getFlagForMetadata(lqi("omission", 85)));
assertEquals(flag2, config.getFlagForMetadata(lqi("omission", 95)));
assertEquals(null, config.getFlagForMetadata(lqi("omission", 50)));
}
private Rule createRule(RuleMatcher matcher, DataCategoryFlag flag) {
Rule r = new Rule();
r.addRuleMatcher(matcher);
r.setFlag(flag);
return r;
}
class TestRuleListener implements RuleListener {
Map<String, Boolean> enabledRules = new HashMap<String, Boolean>();
RuleConfiguration.FilterMode filterMode;
RuleConfiguration.StateQualifierMode stateQualifierMode;
boolean isEnabled(String ruleLabel) {
return enabledRules.containsKey(ruleLabel) && enabledRules.get(ruleLabel);
}
@Override
public void enabledRule(String ruleLabel, boolean enabled) {
enabledRules.put(ruleLabel, enabled);
}
@Override
public void setFilterMode(RuleConfiguration.FilterMode mode) {
this.filterMode = mode;
}
@Override
public void setStateQualifierMode(StateQualifierMode mode) {
this.stateQualifierMode = mode;
}
}
class NullMatcher implements DataCategoryField.Matcher {
@Override
public boolean validatePattern(String pattern) {
return false;
}
@Override
public void setPattern(String pattern) {
}
@Override
public boolean matches(Object value) {
return false;
}
}
}