@Test
  public void testMergedTPC() throws Exception {
    final List<Model> hierarchy = asList(new Model(), new Model());
    final Model pluginModel = hierarchy.get(0);
    final Model moduleModel = hierarchy.get(1);

    Xpp3Dom pluginCfg =
        getConfiguration(
            getPlugin(pluginModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, true), true);
    addValueNode(pluginCfg, "pluginValue", "from plugin");

    Xpp3Dom moduleCfg =
        getConfiguration(
            getPlugin(moduleModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, true), true);
    addValueNode(moduleCfg, "moduleValue", "from module");

    tpcAssembler.assembleTPCInheritance(hierarchy);

    Plugin mergedTPC = getPlugin(pluginModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, false);
    assertNotNull(mergedTPC);

    Xpp3Dom configuration = getConfiguration(mergedTPC, false);
    assertNotNull(configuration);
    assertEquals(2, configuration.getChildCount());
  }
  @Test
  public void testTPCNotExists() throws Exception {
    final Model model = new Model();
    final List<Model> hierarchy = asList(model);

    tpcAssembler.assembleTPCInheritance(hierarchy);

    assertSame(model, hierarchy.get(0));
    assertNull(model.getBuild());
  }
  @Test
  public void testNullAndEmptyHierarchy() throws Exception {
    try {
      tpcAssembler.assembleTPCInheritance(null);
      fail();
    } catch (NullPointerException e) { // expected
    }

    try {
      final List<Model> hierarchy = new ArrayList<Model>();
      hierarchy.add(null);
      tpcAssembler.assembleTPCInheritance(hierarchy);
      fail();
    } catch (NullPointerException e) { // expected
    }

    try {
      tpcAssembler.assembleTPCInheritance(Collections.<Model>emptyList());
      fail();
    } catch (IllegalArgumentException e) { // expected
    }
  }
  @Test
  public void testUseTPCFromPlugin() throws Exception {
    final List<Model> hierarchy = asList(new Model(), new Model());
    final Model pluginModel = hierarchy.get(0);

    Plugin pluginTPC = getPlugin(pluginModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, true);
    Xpp3Dom pluginCfg = getConfiguration(pluginTPC, true);
    addValueNode(pluginCfg, "foo", "bar");

    tpcAssembler.assembleTPCInheritance(hierarchy);

    Plugin actualPluginTPC =
        getPlugin(pluginModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, false);
    assertNotNull(actualPluginTPC);
    // assertSame(pluginTPC, actualPluginTPC);
    assertEquals(1, pluginModel.getBuild().getPlugins().size());
    assertPluginEquals(pluginTPC, actualPluginTPC);
  }
  @Test
  public void testUseTPCFromModule() throws Exception {
    final List<Model> hierarchy = asList(new Model(), new Model());
    final Model pluginModel = hierarchy.get(0);
    final Model moduleModel = hierarchy.get(1);

    Plugin moduleTPC = getPlugin(moduleModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, true);
    Xpp3Dom moduleCfg = getConfiguration(moduleTPC, true);
    addValueNode(moduleCfg, "foo", "bar");

    tpcAssembler.assembleTPCInheritance(hierarchy);

    Plugin pluginTPC = getPlugin(pluginModel, TYCHO_GROUP_ID, TYCHO_TPC_PLUGIN_ARTIFACT_ID, false);
    assertNotNull(pluginTPC);
    assertNotSame(moduleTPC, pluginTPC);
    assertPluginEquals(moduleTPC, pluginTPC);

    Xpp3Dom pluginCfg = getConfiguration(pluginTPC, false);
    assertNotNull(pluginCfg);
    assertEquals(1, pluginCfg.getChildCount());
    assertEquals("bar", pluginCfg.getChild("foo").getValue());
  }