@Test
  public void testPurgeCycles() throws Exception {
    Map<KbaChangeSetQualifier, KbaChangeSet> map = Maps.newHashMap();
    KbaChangeSetQualifier addKey = ADD_Q_CURRENT_PLATFORM;
    KbaChangeSetQualifier remKey = REM_Q_CURRENT_PLATFORM;
    KbaBinding fooCommand =
        new KbaBinding("Ctrl+Alt+F", "com.google.FooCommand", Maps.<String, String>newHashMap());
    KbaBinding barCommand =
        new KbaBinding("Ctrl+Alt+G", "com.google.BarCommand", Maps.<String, String>newHashMap());
    Iterable<KbaBinding> bindingListToAdd = Lists.newArrayList(fooCommand, barCommand);
    Iterable<KbaBinding> bindingListToRem = Lists.newArrayList(fooCommand);
    KbaChangeSet changeSetToAdd = new KbaChangeSet(addKey, bindingListToAdd);
    KbaChangeSet changeSetToRem = new KbaChangeSet(remKey, bindingListToRem);

    map.put(addKey, changeSetToAdd);
    map.put(remKey, changeSetToRem);

    Assert.assertTrue(map.get(addKey).getBindingList().contains(fooCommand));
    Assert.assertTrue(map.get(addKey).getBindingList().contains(barCommand));
    Assert.assertTrue(map.get(remKey).getBindingList().contains(fooCommand));
    Map<KbaChangeSetQualifier, KbaChangeSet> result = KbaBootstrapper.purgeCycles(map);
    Assert.assertTrue(result.get(addKey).getBindingList().contains(fooCommand));
    Assert.assertTrue(result.get(addKey).getBindingList().contains(barCommand));
    Assert.assertFalse(result.get(remKey).getBindingList().contains(fooCommand));
  }
  @Test
  public void testCombo() {

    Iterable<EclBinding> sysBs =
        Lists.newArrayList(
            sysBinding("key0", "cid0"),
            sysBinding("key1", "cid1"),
            sysBinding("key5", "cid1"),
            sysBinding("key4", "cid4", CURRENT_PLATFORM));

    Iterable<EclBinding> userBs =
        Lists.newArrayList(
            remBinding("key1"),
            remBinding("key4"),
            usrBinding("key2", "cid2"),
            usrBinding("key2", "cid2"), // Should be uniquified in the process
            usrBinding("key3", "cid3"));

    Map<KbaChangeSetQualifier, KbaChangeSet> systemBindings =
        KbaBootstrapper.buildSystemBindingsMap(sysBs);

    Map<KbaChangeSetQualifier, KbaChangeSet> userBindings =
        KbaBootstrapper.buildUserBindingsMap(
            CURRENT_PLATFORM, systemBindings, userBs, new MechanicLog(new EmptyLog()));

    KbaChangeSet actualSysBindings = systemBindings.get(ADD_Q_NULL_PLATFORM);
    Assert.assertEquals(3, actualSysBindings.getBindingList().size());

    KbaChangeSet actualSysBindingsCurrentPlatform = systemBindings.get(ADD_Q_CURRENT_PLATFORM);
    Assert.assertEquals(1, actualSysBindingsCurrentPlatform.getBindingList().size());

    KbaChangeSet actualUserAddBindings = userBindings.get(ADD_Q_NULL_PLATFORM);
    Assert.assertEquals(2, actualUserAddBindings.getBindingList().size());

    KbaChangeSet actualUserRemBindings = userBindings.get(REM_Q_NULL_PLATFORM);
    Assert.assertEquals(2, actualUserRemBindings.getBindingList().size());

    Set<KbaBinding> actualRemoved = Sets.newHashSet(actualUserRemBindings.getBindingList());
    Set<KbaBinding> expectedRemoved =
        Sets.newHashSet(
            new KbaBinding("key1", "cid1", Maps.<String, String>newHashMap()),
            new KbaBinding("key4", "cid4", Maps.<String, String>newHashMap()));
    Assert.assertEquals(expectedRemoved, actualRemoved);

    Assert.assertEquals(Action.REMOVE, actualUserRemBindings.getAction());
  }