@Test
  public void testKBaseModified() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");
    kbase1.setEqualsBehavior(AssertBehaviorOption.IDENTITY);
    kbase1.setEventProcessingMode(EventProcessingOption.CLOUD);

    kbase1.setEqualsBehavior(AssertBehaviorOption.EQUALITY);

    assertTrue(dirtyLog.getAddedKBases().contains(kbase1.getQName()));

    dirtyLog.reset();

    kbase1.setEventProcessingMode(EventProcessingOption.STREAM);
    assertTrue(dirtyLog.getAddedKBases().contains(kbase1.getQName()));

    dirtyLog.reset();

    kbase1.setFiles(new ArrayList<String>());
    assertTrue(dirtyLog.getAddedKBases().contains(kbase1.getQName()));

    kproj.removeKBase(kbase1.getQName());
    assertEquals(1, dirtyLog.getRemovedKBases().size());
    assertEquals(0, dirtyLog.getAddedKBases().size());
    assertTrue(dirtyLog.getRemovedKBases().contains(kbase1.getQName()));
  }
  @Test
  public void testKSessionModified() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    assertFalse(dirtyLog.isKProjectDirty());

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");

    KSession kSession = kbase1.newKSession("org.test1", "KSession1");
    kSession.setClockType(ClockTypeOption.get("pseudo"));
    kSession.setType("stateless");

    kSession.setClockType(ClockTypeOption.get("realtime"));
    assertTrue(dirtyLog.getAddedKSessions().contains("org.test1.KSession1"));

    dirtyLog.reset();

    kSession.setType("stateful");
    assertTrue(dirtyLog.getAddedKSessions().contains("org.test1.KSession1"));

    kbase1.removeKSession(kSession.getQName());
    assertFalse(dirtyLog.getAddedKSessions().contains("org.test1.KSession1"));
    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test1.KSession1"));
  }
  @Test
  public void testKSessioExistsnQNameModified() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    assertFalse(dirtyLog.isKProjectDirty());

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");

    KSession kSession = kbase1.newKSession("org.test1", "KSession1");

    dirtyLog.reset();

    kSession.setNamespace("org.test2");

    assertTrue(dirtyLog.getAddedKSessions().contains("org.test2.KSession1"));
    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test1.KSession1"));

    kSession.setName("KSession2");

    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test2.KSession1"));
    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test1.KSession1"));
    assertTrue(dirtyLog.getAddedKSessions().contains("org.test2.KSession2"));
  }
  @Test
  public void testKSessionExistsModifyRemovedAdded() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");

    KSession kSession = kbase1.newKSession("org.test1", "KSession1");

    dirtyLog.reset();

    kSession.setNamespace("org.test2");

    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test1.KSession1"));
    assertTrue(dirtyLog.getAddedKSessions().contains("org.test2.KSession1"));

    kbase1.removeKSession(kSession.getQName());
    assertEquals(2, dirtyLog.getRemovedKSessions().size());
    assertEquals(0, dirtyLog.getAddedKSessions().size());
    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test2.KSession1"));

    kbase1.newKSession(kSession.getNamespace(), kSession.getName());

    assertEquals(1, dirtyLog.getRemovedKSessions().size());
    assertEquals(1, dirtyLog.getAddedKSessions().size());
    assertTrue(dirtyLog.getRemovedKSessions().contains("org.test1.KSession1"));
    assertTrue(dirtyLog.getAddedKSessions().contains("org.test2.KSession1"));
  }
  @Test
  public void testKBaseExistsModifyRemovedAddedWithOverlappingNames() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");
    KBase kbase2 = kproj.newKBase("org.test1", "KBase2");

    dirtyLog.reset();

    kbase1.setNamespace("org.test2");
    kbase2.setName("KBase1");

    assertEquals(1, dirtyLog.getRemovedKBases().size());
    assertEquals(2, dirtyLog.getAddedKBases().size());

    assertTrue(dirtyLog.getAddedKBases().contains("org.test2.KBase1"));
    assertTrue(dirtyLog.getAddedKBases().contains("org.test1.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase2"));

    kproj.removeKBase(kbase1.getQName());

    assertEquals(2, dirtyLog.getRemovedKBases().size());
    assertEquals(1, dirtyLog.getAddedKBases().size());

    assertTrue(dirtyLog.getRemovedKBases().contains("org.test2.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase2"));

    assertTrue(dirtyLog.getAddedKBases().contains("org.test1.KBase1"));

    kproj.removeKBase(kbase2.getQName());
    assertEquals(3, dirtyLog.getRemovedKBases().size());
    assertEquals(0, dirtyLog.getAddedKBases().size());

    assertTrue(dirtyLog.getRemovedKBases().contains("org.test2.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase2"));

    kproj.newKBase(kbase1.getNamespace(), kbase1.getName());
    assertEquals(2, dirtyLog.getRemovedKBases().size());
    assertEquals(1, dirtyLog.getAddedKBases().size());

    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase2"));
    assertTrue(dirtyLog.getAddedKBases().contains("org.test2.KBase1"));
  }
  @Test
  public void testKBaseExistsRemovedAdded() {
    KProject kproj = new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");

    dirtyLog.reset();

    kproj.removeKBase(kbase1.getQName());
    assertTrue(dirtyLog.getRemovedKBases().contains(kbase1.getQName()));

    kbase1 = kproj.newKBase("org.test1", "KBase1");
    assertFalse(dirtyLog.getRemovedKBases().contains(kbase1.getQName()));
    assertTrue(dirtyLog.getAddedKBases().contains(kbase1.getQName()));
  }
  @Test
  public void testKBaseExistsQNameModified() {
    KProjectImpl kproj = (KProjectImpl) new KProjectImpl();

    KProjectChangeLog dirtyLog = new KProjectChangeLog();
    kproj.setListener(dirtyLog);

    KBase kbase1 = kproj.newKBase("org.test1", "KBase1");
    dirtyLog.reset();

    kbase1.setNamespace("org.test2");

    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase1"));
    assertTrue(dirtyLog.getAddedKBases().contains("org.test2.KBase1"));

    kbase1.setName("KBase2");

    assertEquals(2, dirtyLog.getRemovedKBases().size());
    assertEquals(1, dirtyLog.getAddedKBases().size());
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test1.KBase1"));
    assertTrue(dirtyLog.getRemovedKBases().contains("org.test2.KBase1"));
    assertTrue(dirtyLog.getAddedKBases().contains("org.test2.KBase2"));
  }