@Test
  public void storeParentChildDescendantProjectsAndRetrieveAncestry() throws Exception {
    final ProjectVersionRef r = new SimpleProjectVersionRef("org.test", "root", "1");
    final ProjectVersionRef p = new SimpleProjectVersionRef("org.test", "parent", "1.0");
    final ProjectVersionRef c = new SimpleProjectVersionRef("org.test", "child", "1.0");

    final EProjectDirectRelationships root =
        new EProjectDirectRelationships.Builder(sourceUri, r).build();
    final EProjectDirectRelationships parent =
        new EProjectDirectRelationships.Builder(sourceUri, p).withParent(r).build();
    final EProjectDirectRelationships child =
        new EProjectDirectRelationships.Builder(sourceUri, c).withParent(p).build();

    graph.storeRelationships(root.getExactAllRelationships());
    graph.storeRelationships(parent.getExactAllRelationships());
    graph.storeRelationships(child.getExactAllRelationships());

    final List<ProjectVersionRef> ancestry = CartoGraphUtils.getAncestry(c, graph);
    assertThat(ancestry, notNullValue());
    assertThat(ancestry.size(), equalTo(3));

    final Iterator<ProjectVersionRef> iterator = ancestry.iterator();
    assertThat(iterator.next(), equalTo(c));
    assertThat(iterator.next(), equalTo(p));
    assertThat(iterator.next(), equalTo(r));
  }
  @Test
  public void storeAndValidateContains() throws Exception {
    final ProjectVersionRef r = new SimpleProjectVersionRef("org.test", "root", "1");
    final ProjectVersionRef d = new SimpleProjectVersionRef("org.test", "dep", "1");
    final EProjectDirectRelationships root =
        new EProjectDirectRelationships.Builder(sourceUri, r)
            .withDependency(d, null, null, null, false, false)
            .build();

    graph.storeRelationships(root.getExactAllRelationships());

    assertThat(graph.containsGraph(r), equalTo(true));
  }
  @Test
  public void storeProjectWithOneExtensionAndVerifyUsageRelationship() throws Exception {
    final ProjectVersionRef project =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");
    final ProjectVersionRef ext =
        new SimpleProjectVersionRef("org.apache.maven.wagon", "wagon-provider-webdav", "2.0");

    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(sourceUri, project)
            .withExtension(ext, false)
            .build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectRelationship<?, ?>> exts =
        graph.findDirectRelationshipsFrom(project, false, RelationshipType.EXTENSION);
    assertThat(exts.size(), equalTo(1));
    assertThat(exts.iterator().next().getTarget(), equalTo(ext));
  }
  @Test
  public void storeProjectWithOnePluginAndVerifyAnyUsageRelationship() throws Exception {
    final ProjectVersionRef project =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");
    final ProjectVersionRef plugin =
        new SimpleProjectVersionRef("org.apache.maven.plugins", "maven-compiler-plugin", "2.3.2");

    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(sourceUri, project)
            .withPlugin(plugin, false, false)
            .build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectRelationship<?, ?>> storedRels =
        graph.findDirectRelationshipsTo(plugin, false, RelationshipType.PLUGIN);

    assertThat(storedRels.size(), equalTo(1));

    final ProjectVersionRef declaring = storedRels.iterator().next().getDeclaring();

    assertThat(declaring, equalTo(project));
  }
  @Test
  public void storeProjectWithOneDependencyAndVerifyDependencyRelationship() throws Exception {
    final ProjectVersionRef p =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");
    final ProjectVersionRef d =
        new SimpleProjectVersionRef("org.apache.maven", "maven-artifact", "3.0.3");

    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(sourceUri, p)
            .withDependency(d, null, null, null, false, false)
            .build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectRelationship<?, ?>> storedRels =
        graph.findDirectRelationshipsFrom(p, false, RelationshipType.DEPENDENCY);

    assertThat(storedRels.size(), equalTo(1));

    final ArtifactRef target = (ArtifactRef) storedRels.iterator().next().getTarget();

    assertThat(target.asProjectVersionRef(), equalTo(d));
  }
  @Test
  public void storeProjectWithParentAndVerifyParentRelationship() throws Exception {
    final ProjectVersionRef project =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");
    final ProjectVersionRef parent =
        new SimpleProjectVersionRef("org.apache.maven", "maven", "3.0.3");

    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(sourceUri, project).withParent(parent).build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final ProjectVersionRef parentResult = CartoGraphUtils.getParent(project, graph);
    assertThat(parentResult, equalTo(parent));
  }
  @Test
  public void storeProjectWithOneDependencyAndRetrieveAsDependent() throws Exception {
    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(
                sourceUri, new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3"))
            .withDependency(
                new SimpleProjectVersionRef("org.apache.maven", "maven-artifact", "3.0.3"),
                null,
                null,
                null,
                false,
                false)
            .build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectRelationship<?, ?>> dependents =
        graph.findDirectRelationshipsTo(
            rels.getDependencies().get(0).getTarget(), false, RelationshipType.DEPENDENCY);

    assertThat(dependents, notNullValue());
    assertThat(dependents.size(), equalTo(1));
    assertThat(dependents.iterator().next().getDeclaring(), equalTo(rels.getProjectRef()));
  }
  @Test
  public void storeProjectWithParentAndRetrieveAsChild() throws Exception {
    final ProjectVersionRef project =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");
    final ProjectVersionRef parent =
        new SimpleProjectVersionRef("org.apache.maven", "maven", "3.0.3");

    final EProjectDirectRelationships rels =
        new EProjectDirectRelationships.Builder(sourceUri, project).withParent(parent).build();

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectVersionRef> children = CartoGraphUtils.getKnownChildren(parent, graph);

    assertThat(children.size(), equalTo(1));
    assertThat(children.iterator().next(), equalTo(project));
  }
  @Test
  public void storeProjectAndRetrieveDependentProjectForEach() throws Exception {
    //        graph.reindex();
    //
    final ProjectVersionRef p =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");

    final EProjectDirectRelationships.Builder prb =
        new EProjectDirectRelationships.Builder(sourceUri, p);

    final ProjectVersionRef parent =
        new SimpleProjectVersionRef("org.apache.maven", "maven", "3.0.3");

    int idx = 0;
    int pidx = 0;
    final DependencyRelationship papi =
        new SimpleDependencyRelationship(
            sourceUri,
            p,
            new SimpleArtifactRef(
                "org.apache.maven", "maven-plugin-api", "3.0.3", null, null, false),
            DependencyScope.compile,
            idx++,
            false,
            false);
    final DependencyRelationship art =
        new SimpleDependencyRelationship(
            sourceUri,
            p,
            new SimpleArtifactRef("org.apache.maven", "maven-artifact", "3.0.3", null, null, false),
            DependencyScope.compile,
            idx++,
            false,
            false);
    final PluginRelationship jarp =
        new SimplePluginRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef("org.apache.maven.plugins", "maven-jar-plugin", "2.2"),
            pidx++,
            false,
            false);
    final PluginRelationship comp =
        new SimplePluginRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef(
                "org.apache.maven.plugins", "maven-compiler-plugin", "2.3.2"),
            pidx++,
            false,
            false);
    final ExtensionRelationship wag =
        new SimpleExtensionRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef("org.apache.maven.wagon", "wagon-provider-webdav", "1.0"),
            0,
            false);

    prb.withParent(parent);
    prb.withDependencies(papi);
    prb.withDependencies(art);
    prb.withPlugins(jarp);
    prb.withPlugins(comp);
    prb.withExtensions(wag);

    final EProjectDirectRelationships rels = prb.build();

    final Set<ProjectRelationship<?, ?>> rejected =
        graph.storeRelationships(rels.getExactAllRelationships());
    System.out.println("Rejects: " + rejected);

    final Map<ProjectVersionRef, Set<ProjectRelationship<?, ?>>> byTarget =
        new HashMap<ProjectVersionRef, Set<ProjectRelationship<?, ?>>>() {
          private static final long serialVersionUID = 1L;

          {
            put(parent, graph.findDirectRelationshipsTo(parent, true, RelationshipType.values()));
            put(
                papi.getTarget(),
                graph.findDirectRelationshipsTo(papi.getTarget(), true, RelationshipType.values()));
            put(
                art.getTarget(),
                graph.findDirectRelationshipsTo(art.getTarget(), true, RelationshipType.values()));
            put(
                jarp.getTarget(),
                graph.findDirectRelationshipsTo(jarp.getTarget(), true, RelationshipType.values()));
            put(
                comp.getTarget(),
                graph.findDirectRelationshipsTo(comp.getTarget(), true, RelationshipType.values()));
            put(
                wag.getTarget(),
                graph.findDirectRelationshipsTo(wag.getTarget(), true, RelationshipType.values()));
          }
        };

    for (final Map.Entry<ProjectVersionRef, Set<ProjectRelationship<?, ?>>> entry :
        byTarget.entrySet()) {
      System.out.printf(
          "\n\n\nFor key: %s, dependencies:\n  %s\n\n\n",
          entry.getKey(), formatWithClassname(entry.getValue(), "\n  "));

      assertThat(
          "Null dependents set for: " + entry.getKey() + "!", entry.getValue(), notNullValue());

      assertThat(
          "Should have exactly one matching dependent of: " + entry.getKey(),
          entry.getValue().size(),
          equalTo(1));
      assertThat(
          "Invalid dependent of: " + entry.getKey(),
          entry.getValue().iterator().next().getDeclaring(),
          equalTo(rels.getProjectRef()));
    }
  }
  @Test
  public void storeProjectAndRetrieveAllRelationshipsInOneGo() throws Exception {
    final ProjectVersionRef p =
        new SimpleProjectVersionRef("org.apache.maven", "maven-core", "3.0.3");

    final EProjectDirectRelationships.Builder prb =
        new EProjectDirectRelationships.Builder(sourceUri, p);

    final ProjectVersionRef parent =
        new SimpleProjectVersionRef("org.apache.maven", "maven", "3.0.3");

    int idx = 0;
    int pidx = 0;
    final DependencyRelationship papi =
        new SimpleDependencyRelationship(
            sourceUri,
            p,
            new SimpleArtifactRef(
                "org.apache.maven", "maven-plugin-api", "3.0.3", null, null, false),
            DependencyScope.compile,
            idx++,
            false,
            false);
    final DependencyRelationship art =
        new SimpleDependencyRelationship(
            sourceUri,
            p,
            new SimpleArtifactRef("org.apache.maven", "maven-artifact", "3.0.3", null, null, false),
            DependencyScope.compile,
            idx++,
            false,
            false);
    final PluginRelationship jarp =
        new SimplePluginRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef("org.apache.maven.plugins", "maven-jar-plugin", "2.2"),
            pidx++,
            false,
            false);
    final PluginRelationship comp =
        new SimplePluginRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef(
                "org.apache.maven.plugins", "maven-compiler-plugin", "2.3.2"),
            pidx++,
            false,
            false);
    final ExtensionRelationship wag =
        new SimpleExtensionRelationship(
            sourceUri,
            p,
            new SimpleProjectVersionRef("org.apache.maven.wagon", "wagon-provider-webdav", "1.0"),
            0,
            false);

    prb.withParent(parent);
    prb.withDependencies(papi, art);
    prb.withPlugins(jarp, comp);
    prb.withExtensions(wag);

    final EProjectDirectRelationships rels = prb.build();

    assertThat(rels.getAllRelationships().size(), equalTo(6));

    graph.storeRelationships(rels.getExactAllRelationships());

    final Set<ProjectRelationship<?, ?>> resulting =
        graph.findDirectRelationshipsFrom(rels.getProjectRef(), false, RelationshipType.values());

    final Set<ProjectVersionRef> targets = RelationshipUtils.targets(resulting);

    assertThat(targets.size(), equalTo(6));
    assertThat(targets.contains(parent), equalTo(true));
    assertThat(targets.contains(papi.getTarget()), equalTo(true));
    assertThat(targets.contains(art.getTarget()), equalTo(true));
    assertThat(targets.contains(jarp.getTarget()), equalTo(true));
    assertThat(targets.contains(comp.getTarget()), equalTo(true));
    assertThat(targets.contains(wag.getTarget()), equalTo(true));
  }