@Override public boolean removeEdge(N nodeU, N nodeV) { return backingValueGraph.removeEdge(nodeU, nodeV) != null; }
@Override public boolean removeEdge(N nodeU, N nodeV) { return backingValueGraph.removeEdge(nodeU, nodeV) != null; } }
@Override public boolean removeEdge(N nodeU, N nodeV) { return backingValueGraph.removeEdge(nodeU, nodeV) != null; } }
@Test public void removeEdge_undirected() { graph = ValueGraphBuilder.undirected().build(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); graph.putEdgeValue(2, 3, "valueC"); assertThat(graph.removeEdge(1, 2)).isEqualTo("valueB"); assertThat(graph.removeEdge(1, 2)).isNull(); assertThat(graph.removeEdge(2, 1)).isNull(); assertThat(graph.removeEdge(2, 3)).isEqualTo("valueC"); assertThat(graph.removeEdge(2, 3)).isNull(); }
@Test public void removeEdge_directed() { graph = ValueGraphBuilder.directed().build(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); graph.putEdgeValue(2, 3, "valueC"); assertThat(graph.removeEdge(1, 2)).isEqualTo("valueA"); assertThat(graph.removeEdge(1, 2)).isNull(); assertThat(graph.removeEdge(2, 1)).isEqualTo("valueB"); assertThat(graph.removeEdge(2, 1)).isNull(); assertThat(graph.removeEdge(2, 3)).isEqualTo("valueC"); assertThat(graph.removeEdge(2, 3)).isNull(); }
@Test public void removeEdge_undirected_orderMismatch() { graph = ValueGraphBuilder.undirected().build(); graph.putEdgeValue(1, 2, "1-2"); assertThat(graph.removeEdge(EndpointPair.ordered(1, 2))).isEqualTo("1-2"); }
@Test public void removeEdge_directed_orderMismatch() { graph = ValueGraphBuilder.directed().build(); graph.putEdgeValue(1, 2, "1->2"); graph.putEdgeValue(2, 1, "2->1"); try { graph.removeEdge(EndpointPair.unordered(1, 2)); graph.removeEdge(EndpointPair.unordered(2, 1)); fail("Expected IllegalArgumentException: " + ENDPOINTS_MISMATCH); } catch (IllegalArgumentException e) { assertThat(e).hasMessageThat().contains(ENDPOINTS_MISMATCH); } }
@Test public void edgeValue_missing() { graph = ValueGraphBuilder.directed().build(); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValue(1, 2).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValue(2, 1).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(1, 2, null)).isNull(); assertThat(graph.edgeValueOrDefault(2, 1, null)).isNull(); assertThat(graph.edgeValue(1, 2).orElse(null)).isNull(); assertThat(graph.edgeValue(2, 1).orElse(null)).isNull(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo("valueA"); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo("valueB"); assertThat(graph.edgeValueOrDefault(1, 2, null)).isEqualTo("valueA"); assertThat(graph.edgeValueOrDefault(2, 1, null)).isEqualTo("valueB"); assertThat(graph.edgeValue(1, 2).get()).isEqualTo("valueA"); assertThat(graph.edgeValue(2, 1).get()).isEqualTo("valueB"); graph.removeEdge(1, 2); graph.putEdgeValue(2, 1, "valueC"); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo("valueC"); assertThat(graph.edgeValue(1, 2).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(1, 2, null)).isNull(); assertThat(graph.edgeValueOrDefault(2, 1, null)).isEqualTo("valueC"); assertThat(graph.edgeValue(1, 2).orElse(null)).isNull(); assertThat(graph.edgeValue(2, 1).get()).isEqualTo("valueC"); }
@Override public boolean removeEdge(N nodeU, N nodeV) { return backingValueGraph.removeEdge(nodeU, nodeV) != null; } }
@Override public boolean removeEdge(N nodeU, N nodeV) { return backingValueGraph.removeEdge(nodeU, nodeV) != null; } }
@Override public EndpointPair<V> removeEdge(V sourceVertex, V targetVertex) { EndpointPair<V> e = getEdge(sourceVertex, targetVertex); if (e != null) { valueGraph.removeEdge(sourceVertex, targetVertex); } return e; }
@Override public boolean removeEdge(EndpointPair<V> e) { if (e == null) { return false; } return valueGraph.removeEdge(e.nodeU(), e.nodeV()) != null; }
@VisibleForTesting static <T> LinkedList<T> sortTopologically(ValueGraph<T, Composition> graph) { // Kahn's algorithm MutableValueGraph<T, Composition> g = Graphs.copyOf(graph); LinkedList<T> sorted = Lists.newLinkedList(); Deque<T> leaves = Lists.newLinkedList(g.nodes() .stream() .filter(n -> g.inDegree(n) == 0) .collect(toList()) ); while (!leaves.isEmpty()) { T node = leaves.pop(); sorted.push(node); Set<T> successors = ImmutableSet.copyOf(g.successors(node)); for (T successor : successors) { g.removeEdge(node, successor); if (g.inDegree(successor) == 0) { leaves.addLast(successor); } } } checkArgument(g.edges().isEmpty(), "the graph contains a circular dependency %s", g); Collections.reverse(sorted); return sorted; }
@Test public void removeEdge_directed() { graph = ValueGraphBuilder.directed().build(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); graph.putEdgeValue(2, 3, "valueC"); assertThat(graph.removeEdge(1, 2)).isEqualTo("valueA"); assertThat(graph.removeEdge(1, 2)).isNull(); assertThat(graph.removeEdge(2, 1)).isEqualTo("valueB"); assertThat(graph.removeEdge(2, 1)).isNull(); assertThat(graph.removeEdge(2, 3)).isEqualTo("valueC"); assertThat(graph.removeEdge(2, 3)).isNull(); }
@Test public void removeEdge_undirected() { graph = ValueGraphBuilder.undirected().build(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); graph.putEdgeValue(2, 3, "valueC"); assertThat(graph.removeEdge(1, 2)).isEqualTo("valueB"); assertThat(graph.removeEdge(1, 2)).isNull(); assertThat(graph.removeEdge(2, 1)).isNull(); assertThat(graph.removeEdge(2, 3)).isEqualTo("valueC"); assertThat(graph.removeEdge(2, 3)).isNull(); }
@Test public void edgeValue_missing() { graph = ValueGraphBuilder.directed().build(); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValue(1, 2).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValue(2, 1).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(1, 2, null)).isNull(); assertThat(graph.edgeValueOrDefault(2, 1, null)).isNull(); assertThat(graph.edgeValue(1, 2).orElse(null)).isNull(); assertThat(graph.edgeValue(2, 1).orElse(null)).isNull(); graph.putEdgeValue(1, 2, "valueA"); graph.putEdgeValue(2, 1, "valueB"); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo("valueA"); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo("valueB"); assertThat(graph.edgeValueOrDefault(1, 2, null)).isEqualTo("valueA"); assertThat(graph.edgeValueOrDefault(2, 1, null)).isEqualTo("valueB"); assertThat(graph.edgeValue(1, 2).get()).isEqualTo("valueA"); assertThat(graph.edgeValue(2, 1).get()).isEqualTo("valueB"); graph.removeEdge(1, 2); graph.putEdgeValue(2, 1, "valueC"); assertThat(graph.edgeValueOrDefault(1, 2, DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(2, 1, DEFAULT)).isEqualTo("valueC"); assertThat(graph.edgeValue(1, 2).orElse(DEFAULT)).isEqualTo(DEFAULT); assertThat(graph.edgeValueOrDefault(1, 2, null)).isNull(); assertThat(graph.edgeValueOrDefault(2, 1, null)).isEqualTo("valueC"); assertThat(graph.edgeValue(1, 2).orElse(null)).isNull(); assertThat(graph.edgeValue(2, 1).get()).isEqualTo("valueC"); }