//This product is provided under the terms of EPL (Eclipse Public License) //version 1.0. // //The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php package org.dtangler.swingui.rulesselector.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.dtangler.core.configuration.Arguments; import org.dtangler.core.configuration.Group; import org.dtangler.swingui.groupselector.MockGroupSelector; import org.dtangler.swingui.rulememberselector.MockRuleMemberSelector; import org.dtangler.swingui.rulesselector.RulesSelector; import org.dtangler.swingui.windowmanager.MockWindowManager; import org.junit.Before; import org.junit.Test; public class RulesSelectorFeatureTest { private RulesSelector selector; private MockWindowManager windowManager; private MockRuleMemberSelector ruleMemberSelector; private Arguments arguments; private MockGroupSelector groupSelector; @Before public void setUp() { windowManager = new MockWindowManager(); ruleMemberSelector = new MockRuleMemberSelector(); Map<String, Set<String>> forbiddenDeps = new HashMap(); forbiddenDeps.put("rule1", new HashSet(Arrays.asList("foo"))); forbiddenDeps.put("rule2", new HashSet(Arrays.asList("foo", "bar"))); arguments = new Arguments(); arguments.setForbiddenDependencies(forbiddenDeps); groupSelector = new MockGroupSelector(); selector = new RulesSelectorImpl(ruleMemberSelector, windowManager, groupSelector); } @Test public void testAddAndRemoveForbiddenRules() { selector.selectRules(new Arguments()); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testAddAndRemoveRules(view.forbiddenDeps); } @Test public void testAddAndRemoveAllowedRules() { selector.selectRules(new Arguments()); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testAddAndRemoveRules(view.allowedDeps); } private void testAddAndRemoveRules(RuleSelectorViewDriver view) { ruleMemberSelector.setNextValue("foo"); view.addRuleButton.click(); ruleMemberSelector.setNextValue("bar"); view.addRuleButton.click(); ruleMemberSelector.setNextValue("bay"); view.addRuleButton.click(); assertTrue(view.rules.contentEquals( new String[] { "bar", "bay", "foo" }).isTrue()); view.rules.selectIndices(new int[] { 0, 2 }); view.removeRulesButton.click(); assertTrue(view.rules.contentEquals(new String[] { "bay" }).isTrue()); ruleMemberSelector.setNextValue(null); view.addRuleButton.click(); assertTrue(view.rules.contentEquals(new String[] { "bay" }).isTrue()); ruleMemberSelector.setNextValue("bay"); view.addRuleButton.click(); assertTrue(view.rules.contentEquals(new String[] { "bay" }).isTrue()); } @Test public void testAddAndRemoveForbiddenRuleItems() { selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testAddAndRemoveRuleItems(view.forbiddenDeps); } @Test public void testAddAndRemoveAllowedRuleItems() { arguments.setAllowedDependencies(arguments.getForbiddenDependencies()); arguments.setForbiddenDependencies(Collections.EMPTY_MAP); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testAddAndRemoveRuleItems(view.allowedDeps); } private void testAddAndRemoveRuleItems(RuleSelectorViewDriver view) { view.rules.select("rule2"); assertTrue(view.ruleItems.contentEquals(new String[] { "bar", "foo" }) .isTrue()); ruleMemberSelector.setNextValue("bay"); view.addRuleItemButton.click(); assertTrue(view.ruleItems.contentEquals( new String[] { "bar", "bay", "foo" }).isTrue()); view.ruleItems.selectIndices(new int[] { 0, 2 }); view.removeRuleItemsButton.click(); assertTrue(view.ruleItems.contentEquals(new String[] { "bay" }) .isTrue()); ruleMemberSelector.setNextValue(null); view.addRuleItemButton.click(); assertTrue(view.ruleItems.contentEquals(new String[] { "bay" }) .isTrue()); ruleMemberSelector.setNextValue("bay"); view.addRuleItemButton.click(); assertTrue(view.ruleItems.contentEquals(new String[] { "bay" }) .isTrue()); } @Test public void testRemoveForbiddenRuleButtonIsOnlyEnabledWhenRulesSelected() { selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testRemoveRuleButtonIsOnlyEnabledWhenRulesSelected(view.forbiddenDeps); } @Test public void testRemoveAllowedRuleButtonIsOnlyEnabledWhenRulesSelected() { arguments.setAllowedDependencies(arguments.getForbiddenDependencies()); arguments.setForbiddenDependencies(Collections.EMPTY_MAP); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); testRemoveRuleButtonIsOnlyEnabledWhenRulesSelected(view.allowedDeps); } private void testRemoveRuleButtonIsOnlyEnabledWhenRulesSelected( RuleSelectorViewDriver view) { assertFalse(view.removeRulesButton.isEnabled().isTrue()); view.rules.select("rule1"); assertTrue(view.removeRulesButton.isEnabled().isTrue()); view.rules.select(new String[] { "rule1", "rule2" }); assertTrue(view.removeRulesButton.isEnabled().isTrue()); } @Test public void testOk() { windowManager.setTestCodeForNextModal(new Runnable() { public void run() { RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); ruleMemberSelector.setNextValue("newForbiddenRule"); view.forbiddenDeps.addRuleButton.click(); ruleMemberSelector.setNextValue("newAllowedRule"); view.allowedDeps.addRuleButton.click(); groupSelector.setNextResult(new Group("newGroup", Collections.EMPTY_SET)); view.newGroupButton.click(); view.okButton.click(); } }); Arguments result = selector.selectRules(arguments); assertNotNull(result); assertNotSame(arguments, result); assertRulesContains(arguments.getForbiddenDependencies(), result .getForbiddenDependencies()); assertTrue(result.getForbiddenDependencies().containsKey( "newForbiddenRule")); assertRulesContains(arguments.getAllowedDependencies(), result .getAllowedDependencies()); assertTrue(result.getAllowedDependencies() .containsKey("newAllowedRule")); assertTrue(result.getGroups().keySet().containsAll( arguments.getGroups().keySet())); assertTrue(result.getGroups().containsKey("newGroup")); assertNull("window was closed", windowManager.getLastShownView()); } private void assertRulesContains(Map<String, Set<String>> expected, Map<String, Set<String>> actual) { for (Entry<String, Set<String>> entry : expected.entrySet()) assertEquals(entry.getValue(), actual.get(entry.getKey())); } @Test public void testCancel() { windowManager.setTestCodeForNextModal(new Runnable() { public void run() { RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.cancelButton.click(); } }); assertNull(selector.selectRules(arguments)); assertNull("window was closed", windowManager.getLastShownView()); } @Test public void testGetGroupNames() { arguments.setGroups(createGroups("Foo", "Bar")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); assertTrue(view.groups.contentEquals(new String[] { "Bar", "Foo" }) .isTrue()); } private Map<String, Group> createGroups(String... names) { Map<String, Group> groups = new HashMap(); for (String name : names) groups.put(name, new Group(name, Collections.EMPTY_SET)); return groups; } @Test public void testGroupNamesAreProvidedToRuleMemberSelector() { arguments.setGroups(createGroups("bar", "bay", "foo")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.forbiddenDeps.addRuleButton.click(); assertEquals(Arrays.asList("bar", "bay", "foo"), ruleMemberSelector .getLastUsedGroupNames()); } @Test public void testAddGroup() { arguments.setGroups(createGroups("Foo", "Bar")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); groupSelector.setNextResult(null); view.newGroupButton.click(); assertTrue(view.groups.contentEquals(new String[] { "Bar", "Foo" }) .isTrue()); groupSelector.setNextResult(new Group("Coco", Collections.EMPTY_SET)); view.newGroupButton.click(); assertTrue(view.groups.contentEquals( new String[] { "Bar", "Coco", "Foo" }).isTrue()); } @Test public void testRemoveGroup() { arguments .setGroups(createGroups("Group1", "Group2", "Group3", "Group4")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.groups.select("Group2"); view.removeGroupButton.click(); assertTrue(view.groups.contentEquals( new String[] { "Group1", "Group3", "Group4" }).isTrue()); view.groups.select(new String[] { "Group1", "Group4" }); view.removeGroupButton.click(); assertTrue(view.groups.contentEquals(new String[] { "Group3" }) .isTrue()); } @Test public void testEditGroup() { Group groupToEdit = new Group("MyGroup", Collections.EMPTY_SET); arguments.setGroups(Collections.singletonMap(groupToEdit.getName(), groupToEdit)); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); groupSelector.setNextResult(null); view.groups.select("MyGroup"); view.editGroupButton.click(); assertTrue(view.groups.contentEquals(new String[] { "MyGroup" }) .isTrue()); assertSame(groupToEdit, groupSelector.lastEditedGroup()); groupSelector.setNextResult(new Group("Edited Group", Collections.EMPTY_SET)); view.groups.select("MyGroup"); view.editGroupButton.click(); assertTrue(view.groups.contentEquals(new String[] { "Edited Group" }) .isTrue()); assertSame(groupToEdit, groupSelector.lastEditedGroup()); } @Test public void testRemoveGroupIsOnlyEnabledWhenOneOrMoreGroupsSelected() { arguments.setGroups(createGroups("bar", "bay", "foo")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.groups.selectIndex(-1); assertFalse(view.removeGroupButton.isEnabled().isTrue()); view.groups.select("bar"); assertTrue(view.removeGroupButton.isEnabled().isTrue()); view.groups.select(new String[] { "bar", "bay" }); assertTrue(view.removeGroupButton.isEnabled().isTrue()); } @Test public void testEditGroupIsOnlyEnabledWhenOneGroupSelected() { arguments.setGroups(createGroups("bar", "bay", "foo")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.groups.selectIndex(-1); assertFalse(view.editGroupButton.isEnabled().isTrue()); view.groups.select("bar"); assertTrue(view.editGroupButton.isEnabled().isTrue()); view.groups.select(new String[] { "bar", "bay" }); assertFalse(view.editGroupButton.isEnabled().isTrue()); } @Test public void testGroupNameChangeAlsoUpdatesRules() { Set<String> ruleItems = new HashSet(Arrays.asList("@group1", "@group2")); arguments.setForbiddenDependencies(Collections.singletonMap("@group1", ruleItems)); arguments.setAllowedDependencies(Collections.singletonMap("@group1", ruleItems)); arguments.setGroups(createGroups("group1", "group2")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); groupSelector.setNextResult(new Group("EditedGroup", Collections.EMPTY_SET)); view.groups.select("group1"); view.editGroupButton.click(); assertTrue(view.groups.contentEquals( new String[] { "EditedGroup", "group2" }).isTrue()); assertTrue(view.forbiddenDeps.rules.contentEquals( new String[] { "@EditedGroup" }).isTrue()); view.forbiddenDeps.rules.select("@EditedGroup"); assertTrue(view.forbiddenDeps.ruleItems.contentEquals( new String[] { "@EditedGroup", "@group2" }).isTrue()); assertTrue(view.allowedDeps.rules.contentEquals( new String[] { "@EditedGroup" }).isTrue()); view.allowedDeps.rules.select("@EditedGroup"); assertTrue(view.allowedDeps.ruleItems.contentEquals( new String[] { "@EditedGroup", "@group2" }).isTrue()); } @Test public void testRemoveGroupAlsoremovesGroupFromRules() { Set<String> ruleItems = new HashSet(Arrays.asList("@group1", "@group2")); Map<String, Set<String>> forbiddenDeps = new HashMap(); forbiddenDeps.put("@group1", ruleItems); forbiddenDeps.put("@group2", ruleItems); arguments.setForbiddenDependencies(forbiddenDeps); Map<String, Set<String>> allowedDeps = new HashMap(); allowedDeps.put("@group1", ruleItems); allowedDeps.put("@group2", ruleItems); arguments.setAllowedDependencies(allowedDeps); arguments.setGroups(createGroups("group1", "group2")); selector.selectRules(arguments); RulesSelectorViewDriver view = new RulesSelectorViewDriver( windowManager.getLastShownView()); view.groups.select("group1"); view.removeGroupButton.click(); assertTrue(view.groups.contentEquals(new String[] { "group2" }) .isTrue()); assertTrue(view.forbiddenDeps.rules.contentEquals( new String[] { "@group2" }).isTrue()); view.forbiddenDeps.rules.select("@group2"); assertTrue(view.forbiddenDeps.ruleItems.contentEquals( new String[] { "@group2" }).isTrue()); assertTrue(view.allowedDeps.rules.contentEquals( new String[] { "@group2" }).isTrue()); view.allowedDeps.rules.select("@group2"); assertTrue(view.allowedDeps.ruleItems.contentEquals( new String[] { "@group2" }).isTrue()); } }