@Test
  public void testMergePackages() {
    greenProject.addClassData(firstClass);
    greenProject.addClassData(fourthClass);
    redProject.addClassData(fifthClass);
    redProject.addClassData(sixthClass);
    redProject.addClassData(seventhClass);

    // merge with null - should not change the greenProject
    greenProject.merge(null);

    greenProject.merge(redProject);

    Iterator subpackages = greenProject.getSubPackages("").iterator();
    assertEquals("", ((PackageData) subpackages.next()).getName());
    assertEquals("beautiful", ((PackageData) subpackages.next()).getName());
    assertEquals("test", ((PackageData) subpackages.next()).getName());
    assertEquals("test.me", ((PackageData) subpackages.next()).getName());
    assertFalse(subpackages.hasNext());

    assertEquals(5, greenProject.getClasses().size());
    assertEquals(3, redProject.getClasses().size());

    assertNotNull(greenProject.getClassData("test.First"));
    assertNotNull(greenProject.getClassData("test.me.Fourth"));
    assertNotNull(greenProject.getClassData("beautiful.Fourth"));
    assertNotNull(greenProject.getClassData("Fourth"));
    assertNotNull(greenProject.getClassData("Seventh"));
    assertNull(redProject.getClassData("test.First"));

    Iterator packages = greenProject.getPackages().iterator();

    PackageData first = (PackageData) packages.next();
    assertEquals("", first.getName());
    assertEquals(2, first.getNumberOfChildren());
    assertNotNull(first.getChild("Fourth"));
    assertNotNull(first.getChild("Seventh"));

    PackageData beautiful = (PackageData) packages.next();
    assertEquals("beautiful", beautiful.getName());
    assertEquals(1, beautiful.getNumberOfChildren());
    assertNotNull(beautiful.getChild("Fourth"));

    PackageData test = (PackageData) packages.next();
    assertEquals("test", test.getName());
    assertEquals(1, test.getNumberOfChildren());
    assertNotNull(test.getChild("First"));
    assertNull(test.getChild("test/me/First.java"));
    assertNull(test.getChild("Fourth.java"));

    PackageData testMe = (PackageData) packages.next();
    assertEquals("test.me", testMe.getName());
    assertEquals(1, testMe.getNumberOfChildren());
    assertNull(testMe.getChild("test/First.java"));
    assertNotNull(testMe.getChild("Fourth"));
    assertNull(testMe.getChild("Fourth.java"));

    assertFalse(packages.hasNext());
  }
  @Test
  public void testMergeDifferentClassData() {
    greenProject.addClassData(firstClass);

    redProject.addClassData(secondClass);
    redProject.addClassData(thirdClass);

    greenProject.merge(redProject);

    assertEquals(1, greenProject.getNumberOfChildren());
    assertEquals(3, greenProject.getClasses().size());

    assertNotNull(greenProject.getClassData("test.First"));
    assertNotNull(greenProject.getClassData("test.Second"));
    assertNotNull(greenProject.getClassData("test.Third"));

    assertNull(redProject.getClassData("test.First"));
    assertNotNull(redProject.getClassData("test.Second"));
    assertNotNull(redProject.getClassData("test.Third"));
  }