From cde576ec0005403d0664e25d1df55e3fc0a498b9 Mon Sep 17 00:00:00 2001 From: jnyman Date: Wed, 8 Jan 2020 09:39:26 -0800 Subject: [PATCH] Add incidentEdgeOrder() to the [Value]Graph interface RELNOTES=`graph`: Add `incidentEdgeOrder()` to the `[Value]Graph` interfaces ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=288714914 --- .../common/graph/AbstractGraphTest.java | 9 +++++ .../AbstractStandardDirectedGraphTest.java | 4 -- .../AbstractStandardUndirectedGraphTest.java | 4 -- .../common/graph/ImmutableValueGraphTest.java | 38 +++++++++++++++++++ .../StandardImmutableDirectedGraphTest.java | 23 +++-------- .../StandardImmutableGraphAdditionalTest.java | 16 ++++++++ .../StandardImmutableUndirectedGraphTest.java | 23 +++-------- .../google/common/graph/ValueGraphTest.java | 13 +++++++ .../common/graph/AbstractBaseGraph.java | 5 +++ .../google/common/graph/AbstractNetwork.java | 7 ++++ .../common/graph/AbstractValueGraph.java | 5 +++ .../com/google/common/graph/BaseGraph.java | 7 ++++ .../graph/ConfigurableMutableValueGraph.java | 5 +++ .../google/common/graph/ForwardingGraph.java | 5 +++ .../common/graph/ForwardingValueGraph.java | 5 +++ .../src/com/google/common/graph/Graph.java | 8 ++++ .../com/google/common/graph/GraphBuilder.java | 4 +- .../google/common/graph/ImmutableGraph.java | 5 +++ .../common/graph/ImmutableValueGraph.java | 5 +++ .../com/google/common/graph/ValueGraph.java | 8 ++++ .../common/graph/ValueGraphBuilder.java | 4 +- .../common/graph/AbstractGraphTest.java | 9 +++++ .../AbstractStandardDirectedGraphTest.java | 4 -- .../AbstractStandardUndirectedGraphTest.java | 4 -- .../common/graph/ImmutableValueGraphTest.java | 38 +++++++++++++++++++ .../StandardImmutableDirectedGraphTest.java | 23 +++-------- .../StandardImmutableGraphAdditionalTest.java | 16 ++++++++ .../StandardImmutableUndirectedGraphTest.java | 23 +++-------- .../google/common/graph/ValueGraphTest.java | 13 +++++++ .../common/graph/AbstractBaseGraph.java | 5 +++ .../google/common/graph/AbstractNetwork.java | 7 ++++ .../common/graph/AbstractValueGraph.java | 5 +++ .../com/google/common/graph/BaseGraph.java | 7 ++++ .../graph/ConfigurableMutableValueGraph.java | 5 +++ .../google/common/graph/ForwardingGraph.java | 5 +++ .../common/graph/ForwardingValueGraph.java | 5 +++ guava/src/com/google/common/graph/Graph.java | 8 ++++ .../com/google/common/graph/GraphBuilder.java | 4 +- .../google/common/graph/ImmutableGraph.java | 5 +++ .../common/graph/ImmutableValueGraph.java | 5 +++ .../com/google/common/graph/ValueGraph.java | 8 ++++ .../common/graph/ValueGraphBuilder.java | 4 +- 42 files changed, 310 insertions(+), 96 deletions(-) diff --git a/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java index dfbf78e87363..93d5612cada7 100644 --- a/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/AbstractGraphTest.java @@ -76,6 +76,10 @@ public abstract class AbstractGraphTest { /** Creates and returns an instance of the graph to be tested. */ abstract Graph createGraph(); + abstract boolean allowsSelfLoops(); + + abstract ElementOrder incidentEdgeOrder(); + /** * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable * graph implementations, this method should replace {@link #graph} with a new graph that includes @@ -224,6 +228,11 @@ public void nodes_noNodes() { assertThat(graph.nodes()).isEmpty(); } + @Test + public void incidentEdgeOrder_matchesTheValueAtConstruction() { + assertThat(graph.incidentEdgeOrder()).isEqualTo(incidentEdgeOrder()); + } + @Test public void adjacentNodes_oneEdge() { putEdge(N1, N2); diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java index 69d8f6f6a600..2d2b307a39fa 100644 --- a/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java @@ -30,10 +30,6 @@ */ public abstract class AbstractStandardDirectedGraphTest extends AbstractGraphTest { - abstract boolean allowsSelfLoops(); - - abstract ElementOrder incidentEdgeOrder(); - @Override @Test public void nodes_checkReturnedSetMutability() { diff --git a/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java index 3c1381c9ae6d..d1430608fd6c 100644 --- a/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java @@ -31,10 +31,6 @@ */ public abstract class AbstractStandardUndirectedGraphTest extends AbstractGraphTest { - abstract boolean allowsSelfLoops(); - - abstract ElementOrder incidentEdgeOrder(); - @After public void validateUndirectedEdges() { for (Integer node : graph.nodes()) { diff --git a/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java b/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java index b8d0a414c9cf..8e5e67f3046e 100644 --- a/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java @@ -50,6 +50,25 @@ public void copyOfImmutableValueGraph_optimized() { assertThat(graph2).isSameInstanceAs(graph1); } + @Test + public void incidentEdgeOrder_stable() { + ImmutableValueGraph immutableValueGraph = + ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().build()); + + assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void incidentEdgeOrder_fromUnorderedGraph_stable() { + ImmutableValueGraph immutableValueGraph = + ImmutableValueGraph.copyOf( + ValueGraphBuilder.directed() + .incidentEdgeOrder(ElementOrder.unordered()) + .build()); + + assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void immutableValueGraphBuilder_appliesGraphBuilderConfig() { ImmutableValueGraph emptyGraph = @@ -138,4 +157,23 @@ public void immutableValueGraphBuilder_incidentEdges_preservesIncidentEdgesOrder EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2)) .inOrder(); } + + @Test + public void immutableValueGraphBuilder_incidentEdgeOrder_stable() { + ImmutableValueGraph graph = + ValueGraphBuilder.directed().immutable().build(); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void immutableValueGraphBuilder_fromUnorderedBuilder_incidentEdgeOrder_stable() { + ImmutableValueGraph graph = + ValueGraphBuilder.directed() + .incidentEdgeOrder(ElementOrder.unordered()) + .immutable() + .build(); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } } diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java index eb8220816dd1..864c2e735d8c 100644 --- a/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java @@ -27,25 +27,16 @@ @RunWith(Parameterized.class) public final class StandardImmutableDirectedGraphTest extends AbstractStandardDirectedGraphTest { - @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}") + @Parameters(name = "allowsSelfLoops={0}") public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {false, ElementOrder.unordered()}, - {true, ElementOrder.unordered()}, - {false, ElementOrder.stable()}, - {true, ElementOrder.stable()} - }); + return Arrays.asList(new Object[][] {{false}, {true}}); } private final boolean allowsSelfLoops; - private final ElementOrder incidentEdgeOrder; private ImmutableGraph.Builder graphBuilder; - public StandardImmutableDirectedGraphTest( - boolean allowsSelfLoops, ElementOrder incidentEdgeOrder) { + public StandardImmutableDirectedGraphTest(boolean allowsSelfLoops) { this.allowsSelfLoops = allowsSelfLoops; - this.incidentEdgeOrder = incidentEdgeOrder; } @Override @@ -55,16 +46,12 @@ boolean allowsSelfLoops() { @Override ElementOrder incidentEdgeOrder() { - return incidentEdgeOrder; + return ElementOrder.stable(); } @Override public Graph createGraph() { - graphBuilder = - GraphBuilder.directed() - .allowsSelfLoops(allowsSelfLoops()) - .incidentEdgeOrder(incidentEdgeOrder) - .immutable(); + graphBuilder = GraphBuilder.directed().allowsSelfLoops(allowsSelfLoops()).immutable(); return graphBuilder.build(); } diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java index 15273b6acb95..47cd6a037426 100644 --- a/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java +++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java @@ -86,6 +86,22 @@ public void immutableGraphBuilder_copiesGraphBuilder() { assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.natural()); } + @Test + public void copyOf_incidentEdgeOrder() { + ImmutableGraph graph = ImmutableGraph.copyOf(GraphBuilder.undirected().build()); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void copyOf_fromUnorderedGraph_incidentEdgeOrder() { + ImmutableGraph graph = + ImmutableGraph.copyOf( + GraphBuilder.undirected().incidentEdgeOrder(ElementOrder.unordered()).build()); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void immutableGraphBuilder_addNode() { ImmutableGraph graph = GraphBuilder.directed().immutable().addNode("A").build(); diff --git a/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java b/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java index 87f981675dab..3700da81c4af 100644 --- a/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java @@ -28,25 +28,16 @@ public final class StandardImmutableUndirectedGraphTest extends AbstractStandardUndirectedGraphTest { - @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}") + @Parameters(name = "allowsSelfLoops={0}") public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {false, ElementOrder.unordered()}, - {true, ElementOrder.unordered()}, - {false, ElementOrder.stable()}, - {true, ElementOrder.stable()} - }); + return Arrays.asList(new Object[][] {{false}, {true}}); } private final boolean allowsSelfLoops; - private final ElementOrder incidentEdgeOrder; private ImmutableGraph.Builder graphBuilder; - public StandardImmutableUndirectedGraphTest( - boolean allowsSelfLoops, ElementOrder incidentEdgeOrder) { + public StandardImmutableUndirectedGraphTest(boolean allowsSelfLoops) { this.allowsSelfLoops = allowsSelfLoops; - this.incidentEdgeOrder = incidentEdgeOrder; } @Override @@ -56,16 +47,12 @@ boolean allowsSelfLoops() { @Override ElementOrder incidentEdgeOrder() { - return incidentEdgeOrder; + return ElementOrder.stable(); } @Override public Graph createGraph() { - graphBuilder = - GraphBuilder.undirected() - .allowsSelfLoops(allowsSelfLoops()) - .incidentEdgeOrder(incidentEdgeOrder) - .immutable(); + graphBuilder = GraphBuilder.undirected().allowsSelfLoops(allowsSelfLoops()).immutable(); return graphBuilder.build(); } diff --git a/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java b/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java index e41292e18a0d..691217f1bfa9 100644 --- a/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java +++ b/android/guava-tests/test/com/google/common/graph/ValueGraphTest.java @@ -51,6 +51,7 @@ public void validateGraphState() { assertThat(graph.nodes()).isEqualTo(asGraph.nodes()); assertThat(graph.edges()).isEqualTo(asGraph.edges()); assertThat(graph.nodeOrder()).isEqualTo(asGraph.nodeOrder()); + assertThat(graph.incidentEdgeOrder()).isEqualTo(asGraph.incidentEdgeOrder()); assertThat(graph.isDirected()).isEqualTo(asGraph.isDirected()); assertThat(graph.allowsSelfLoops()).isEqualTo(asGraph.allowsSelfLoops()); @@ -120,6 +121,18 @@ public void undirectedGraph() { assertThat(toString).contains("valueD"); } + @Test + public void incidentEdgeOrder_unordered() { + graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.unordered()).build(); + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.unordered()); + } + + @Test + public void incidentEdgeOrder_stable() { + graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build(); + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void hasEdgeConnecting_directed_correct() { graph = ValueGraphBuilder.directed().build(); diff --git a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java index 7fd24e6d9981..b68656b3d6e9 100644 --- a/android/guava/src/com/google/common/graph/AbstractBaseGraph.java +++ b/android/guava/src/com/google/common/graph/AbstractBaseGraph.java @@ -97,6 +97,11 @@ && nodes().contains(endpointPair.nodeU()) }; } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.unordered(); + } + @Override public Set> incidentEdges(N node) { checkNotNull(node); diff --git a/android/guava/src/com/google/common/graph/AbstractNetwork.java b/android/guava/src/com/google/common/graph/AbstractNetwork.java index 654997fc58a4..fad15145f3b5 100644 --- a/android/guava/src/com/google/common/graph/AbstractNetwork.java +++ b/android/guava/src/com/google/common/graph/AbstractNetwork.java @@ -106,6 +106,13 @@ public ElementOrder nodeOrder() { return AbstractNetwork.this.nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + // TODO(b/142723300): Return AbstractNetwork.this.incidentEdgeOrder() once Network has that + // method. + return ElementOrder.unordered(); + } + @Override public boolean isDirected() { return AbstractNetwork.this.isDirected(); diff --git a/android/guava/src/com/google/common/graph/AbstractValueGraph.java b/android/guava/src/com/google/common/graph/AbstractValueGraph.java index 62178476f01f..be2b7cce4bc0 100644 --- a/android/guava/src/com/google/common/graph/AbstractValueGraph.java +++ b/android/guava/src/com/google/common/graph/AbstractValueGraph.java @@ -67,6 +67,11 @@ public ElementOrder nodeOrder() { return AbstractValueGraph.this.nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return AbstractValueGraph.this.incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return AbstractValueGraph.this.adjacentNodes(node); diff --git a/android/guava/src/com/google/common/graph/BaseGraph.java b/android/guava/src/com/google/common/graph/BaseGraph.java index e6e2ad1f0658..debfa98449f4 100644 --- a/android/guava/src/com/google/common/graph/BaseGraph.java +++ b/android/guava/src/com/google/common/graph/BaseGraph.java @@ -56,6 +56,13 @@ interface BaseGraph extends SuccessorsFunction, PredecessorsFunction { /** Returns the order of iteration for the elements of {@link #nodes()}. */ ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java b/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java index 753be1bb23d3..bd1519f2804a 100644 --- a/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java +++ b/android/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java @@ -49,6 +49,11 @@ final class ConfigurableMutableValueGraph extends ConfigurableValueGraph incidentEdgeOrder() { + return incidentEdgeOrder; + } + @Override @CanIgnoreReturnValue public boolean addNode(N node) { diff --git a/android/guava/src/com/google/common/graph/ForwardingGraph.java b/android/guava/src/com/google/common/graph/ForwardingGraph.java index 3ad01b196472..4a3ab8c77b3b 100644 --- a/android/guava/src/com/google/common/graph/ForwardingGraph.java +++ b/android/guava/src/com/google/common/graph/ForwardingGraph.java @@ -57,6 +57,11 @@ public ElementOrder nodeOrder() { return delegate().nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return delegate().incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return delegate().adjacentNodes(node); diff --git a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java index 9d1dd520ecd2..2507890ea480 100644 --- a/android/guava/src/com/google/common/graph/ForwardingValueGraph.java +++ b/android/guava/src/com/google/common/graph/ForwardingValueGraph.java @@ -59,6 +59,11 @@ public ElementOrder nodeOrder() { return delegate().nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return delegate().incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return delegate().adjacentNodes(node); diff --git a/android/guava/src/com/google/common/graph/Graph.java b/android/guava/src/com/google/common/graph/Graph.java index 6979cbc48ff7..3afb94c216fc 100644 --- a/android/guava/src/com/google/common/graph/Graph.java +++ b/android/guava/src/com/google/common/graph/Graph.java @@ -140,6 +140,14 @@ public interface Graph extends BaseGraph { @Override ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + @Override + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/android/guava/src/com/google/common/graph/GraphBuilder.java b/android/guava/src/com/google/common/graph/GraphBuilder.java index 5b15e5ca021b..705088a48856 100644 --- a/android/guava/src/com/google/common/graph/GraphBuilder.java +++ b/android/guava/src/com/google/common/graph/GraphBuilder.java @@ -91,8 +91,8 @@ public static GraphBuilder undirected() { public static GraphBuilder from(Graph graph) { return new GraphBuilder(graph.isDirected()) .allowsSelfLoops(graph.allowsSelfLoops()) - .nodeOrder(graph.nodeOrder()); - // TODO(b/142723300): Add incidentEdgeOrder + .nodeOrder(graph.nodeOrder()) + .incidentEdgeOrder(graph.incidentEdgeOrder()); } /** diff --git a/android/guava/src/com/google/common/graph/ImmutableGraph.java b/android/guava/src/com/google/common/graph/ImmutableGraph.java index 1bd6d920a76f..16548df448e9 100644 --- a/android/guava/src/com/google/common/graph/ImmutableGraph.java +++ b/android/guava/src/com/google/common/graph/ImmutableGraph.java @@ -72,6 +72,11 @@ public static ImmutableGraph copyOf(ImmutableGraph graph) { return checkNotNull(graph); } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.stable(); + } + private static ImmutableMap> getNodeConnections( Graph graph) { // ImmutableMap.Builder maintains the order of the elements as inserted, so the map will have diff --git a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java index f3907e82faa3..0ed5eb65475e 100644 --- a/android/guava/src/com/google/common/graph/ImmutableValueGraph.java +++ b/android/guava/src/com/google/common/graph/ImmutableValueGraph.java @@ -66,6 +66,11 @@ public static ImmutableValueGraph copyOf(ImmutableValueGraph return checkNotNull(graph); } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.stable(); + } + @Override public ImmutableGraph asGraph() { return new ImmutableGraph(this); // safe because the view is effectively immutable diff --git a/android/guava/src/com/google/common/graph/ValueGraph.java b/android/guava/src/com/google/common/graph/ValueGraph.java index 770c11c79c43..1ab386217b4d 100644 --- a/android/guava/src/com/google/common/graph/ValueGraph.java +++ b/android/guava/src/com/google/common/graph/ValueGraph.java @@ -150,6 +150,14 @@ public interface ValueGraph extends BaseGraph { @Override ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + @Override + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java index 78958de47dc2..f0b3147f1d91 100644 --- a/android/guava/src/com/google/common/graph/ValueGraphBuilder.java +++ b/android/guava/src/com/google/common/graph/ValueGraphBuilder.java @@ -94,8 +94,8 @@ public static ValueGraphBuilder undirected() { public static ValueGraphBuilder from(ValueGraph graph) { return new ValueGraphBuilder(graph.isDirected()) .allowsSelfLoops(graph.allowsSelfLoops()) - .nodeOrder(graph.nodeOrder()); - // TODO(b/142723300): Add incidentEdgeOrder + .nodeOrder(graph.nodeOrder()) + .incidentEdgeOrder(graph.incidentEdgeOrder()); } /** diff --git a/guava-tests/test/com/google/common/graph/AbstractGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractGraphTest.java index dfbf78e87363..93d5612cada7 100644 --- a/guava-tests/test/com/google/common/graph/AbstractGraphTest.java +++ b/guava-tests/test/com/google/common/graph/AbstractGraphTest.java @@ -76,6 +76,10 @@ public abstract class AbstractGraphTest { /** Creates and returns an instance of the graph to be tested. */ abstract Graph createGraph(); + abstract boolean allowsSelfLoops(); + + abstract ElementOrder incidentEdgeOrder(); + /** * A proxy method that adds the node {@code n} to the graph being tested. In case of Immutable * graph implementations, this method should replace {@link #graph} with a new graph that includes @@ -224,6 +228,11 @@ public void nodes_noNodes() { assertThat(graph.nodes()).isEmpty(); } + @Test + public void incidentEdgeOrder_matchesTheValueAtConstruction() { + assertThat(graph.incidentEdgeOrder()).isEqualTo(incidentEdgeOrder()); + } + @Test public void adjacentNodes_oneEdge() { putEdge(N1, N2); diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java index 69d8f6f6a600..2d2b307a39fa 100644 --- a/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java +++ b/guava-tests/test/com/google/common/graph/AbstractStandardDirectedGraphTest.java @@ -30,10 +30,6 @@ */ public abstract class AbstractStandardDirectedGraphTest extends AbstractGraphTest { - abstract boolean allowsSelfLoops(); - - abstract ElementOrder incidentEdgeOrder(); - @Override @Test public void nodes_checkReturnedSetMutability() { diff --git a/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java index 3c1381c9ae6d..d1430608fd6c 100644 --- a/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java +++ b/guava-tests/test/com/google/common/graph/AbstractStandardUndirectedGraphTest.java @@ -31,10 +31,6 @@ */ public abstract class AbstractStandardUndirectedGraphTest extends AbstractGraphTest { - abstract boolean allowsSelfLoops(); - - abstract ElementOrder incidentEdgeOrder(); - @After public void validateUndirectedEdges() { for (Integer node : graph.nodes()) { diff --git a/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java b/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java index b8d0a414c9cf..8e5e67f3046e 100644 --- a/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java +++ b/guava-tests/test/com/google/common/graph/ImmutableValueGraphTest.java @@ -50,6 +50,25 @@ public void copyOfImmutableValueGraph_optimized() { assertThat(graph2).isSameInstanceAs(graph1); } + @Test + public void incidentEdgeOrder_stable() { + ImmutableValueGraph immutableValueGraph = + ImmutableValueGraph.copyOf(ValueGraphBuilder.directed().build()); + + assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void incidentEdgeOrder_fromUnorderedGraph_stable() { + ImmutableValueGraph immutableValueGraph = + ImmutableValueGraph.copyOf( + ValueGraphBuilder.directed() + .incidentEdgeOrder(ElementOrder.unordered()) + .build()); + + assertThat(immutableValueGraph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void immutableValueGraphBuilder_appliesGraphBuilderConfig() { ImmutableValueGraph emptyGraph = @@ -138,4 +157,23 @@ public void immutableValueGraphBuilder_incidentEdges_preservesIncidentEdgesOrder EndpointPair.ordered(2, 1), EndpointPair.ordered(2, 3), EndpointPair.ordered(1, 2)) .inOrder(); } + + @Test + public void immutableValueGraphBuilder_incidentEdgeOrder_stable() { + ImmutableValueGraph graph = + ValueGraphBuilder.directed().immutable().build(); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void immutableValueGraphBuilder_fromUnorderedBuilder_incidentEdgeOrder_stable() { + ImmutableValueGraph graph = + ValueGraphBuilder.directed() + .incidentEdgeOrder(ElementOrder.unordered()) + .immutable() + .build(); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } } diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java index eb8220816dd1..864c2e735d8c 100644 --- a/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java +++ b/guava-tests/test/com/google/common/graph/StandardImmutableDirectedGraphTest.java @@ -27,25 +27,16 @@ @RunWith(Parameterized.class) public final class StandardImmutableDirectedGraphTest extends AbstractStandardDirectedGraphTest { - @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}") + @Parameters(name = "allowsSelfLoops={0}") public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {false, ElementOrder.unordered()}, - {true, ElementOrder.unordered()}, - {false, ElementOrder.stable()}, - {true, ElementOrder.stable()} - }); + return Arrays.asList(new Object[][] {{false}, {true}}); } private final boolean allowsSelfLoops; - private final ElementOrder incidentEdgeOrder; private ImmutableGraph.Builder graphBuilder; - public StandardImmutableDirectedGraphTest( - boolean allowsSelfLoops, ElementOrder incidentEdgeOrder) { + public StandardImmutableDirectedGraphTest(boolean allowsSelfLoops) { this.allowsSelfLoops = allowsSelfLoops; - this.incidentEdgeOrder = incidentEdgeOrder; } @Override @@ -55,16 +46,12 @@ boolean allowsSelfLoops() { @Override ElementOrder incidentEdgeOrder() { - return incidentEdgeOrder; + return ElementOrder.stable(); } @Override public Graph createGraph() { - graphBuilder = - GraphBuilder.directed() - .allowsSelfLoops(allowsSelfLoops()) - .incidentEdgeOrder(incidentEdgeOrder) - .immutable(); + graphBuilder = GraphBuilder.directed().allowsSelfLoops(allowsSelfLoops()).immutable(); return graphBuilder.build(); } diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java index 15273b6acb95..47cd6a037426 100644 --- a/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java +++ b/guava-tests/test/com/google/common/graph/StandardImmutableGraphAdditionalTest.java @@ -86,6 +86,22 @@ public void immutableGraphBuilder_copiesGraphBuilder() { assertThat(emptyGraph.nodeOrder()).isEqualTo(ElementOrder.natural()); } + @Test + public void copyOf_incidentEdgeOrder() { + ImmutableGraph graph = ImmutableGraph.copyOf(GraphBuilder.undirected().build()); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + + @Test + public void copyOf_fromUnorderedGraph_incidentEdgeOrder() { + ImmutableGraph graph = + ImmutableGraph.copyOf( + GraphBuilder.undirected().incidentEdgeOrder(ElementOrder.unordered()).build()); + + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void immutableGraphBuilder_addNode() { ImmutableGraph graph = GraphBuilder.directed().immutable().addNode("A").build(); diff --git a/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java b/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java index 87f981675dab..3700da81c4af 100644 --- a/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java +++ b/guava-tests/test/com/google/common/graph/StandardImmutableUndirectedGraphTest.java @@ -28,25 +28,16 @@ public final class StandardImmutableUndirectedGraphTest extends AbstractStandardUndirectedGraphTest { - @Parameters(name = "allowsSelfLoops={0}, incidentEdgeOrder={1}") + @Parameters(name = "allowsSelfLoops={0}") public static Collection parameters() { - return Arrays.asList( - new Object[][] { - {false, ElementOrder.unordered()}, - {true, ElementOrder.unordered()}, - {false, ElementOrder.stable()}, - {true, ElementOrder.stable()} - }); + return Arrays.asList(new Object[][] {{false}, {true}}); } private final boolean allowsSelfLoops; - private final ElementOrder incidentEdgeOrder; private ImmutableGraph.Builder graphBuilder; - public StandardImmutableUndirectedGraphTest( - boolean allowsSelfLoops, ElementOrder incidentEdgeOrder) { + public StandardImmutableUndirectedGraphTest(boolean allowsSelfLoops) { this.allowsSelfLoops = allowsSelfLoops; - this.incidentEdgeOrder = incidentEdgeOrder; } @Override @@ -56,16 +47,12 @@ boolean allowsSelfLoops() { @Override ElementOrder incidentEdgeOrder() { - return incidentEdgeOrder; + return ElementOrder.stable(); } @Override public Graph createGraph() { - graphBuilder = - GraphBuilder.undirected() - .allowsSelfLoops(allowsSelfLoops()) - .incidentEdgeOrder(incidentEdgeOrder) - .immutable(); + graphBuilder = GraphBuilder.undirected().allowsSelfLoops(allowsSelfLoops()).immutable(); return graphBuilder.build(); } diff --git a/guava-tests/test/com/google/common/graph/ValueGraphTest.java b/guava-tests/test/com/google/common/graph/ValueGraphTest.java index 29bc9a3cd0eb..ab237e8633bf 100644 --- a/guava-tests/test/com/google/common/graph/ValueGraphTest.java +++ b/guava-tests/test/com/google/common/graph/ValueGraphTest.java @@ -53,6 +53,7 @@ public void validateGraphState() { assertThat(graph.nodes()).isEqualTo(asGraph.nodes()); assertThat(graph.edges()).isEqualTo(asGraph.edges()); assertThat(graph.nodeOrder()).isEqualTo(asGraph.nodeOrder()); + assertThat(graph.incidentEdgeOrder()).isEqualTo(asGraph.incidentEdgeOrder()); assertThat(graph.isDirected()).isEqualTo(asGraph.isDirected()); assertThat(graph.allowsSelfLoops()).isEqualTo(asGraph.allowsSelfLoops()); @@ -122,6 +123,18 @@ public void undirectedGraph() { assertThat(toString).contains("valueD"); } + @Test + public void incidentEdgeOrder_unordered() { + graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.unordered()).build(); + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.unordered()); + } + + @Test + public void incidentEdgeOrder_stable() { + graph = ValueGraphBuilder.directed().incidentEdgeOrder(ElementOrder.stable()).build(); + assertThat(graph.incidentEdgeOrder()).isEqualTo(ElementOrder.stable()); + } + @Test public void hasEdgeConnecting_directed_correct() { graph = ValueGraphBuilder.directed().build(); diff --git a/guava/src/com/google/common/graph/AbstractBaseGraph.java b/guava/src/com/google/common/graph/AbstractBaseGraph.java index a567e73539be..352df1995fbc 100644 --- a/guava/src/com/google/common/graph/AbstractBaseGraph.java +++ b/guava/src/com/google/common/graph/AbstractBaseGraph.java @@ -97,6 +97,11 @@ && nodes().contains(endpointPair.nodeU()) }; } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.unordered(); + } + @Override public Set> incidentEdges(N node) { checkNotNull(node); diff --git a/guava/src/com/google/common/graph/AbstractNetwork.java b/guava/src/com/google/common/graph/AbstractNetwork.java index 7d6adcf88231..648ee9bfa0de 100644 --- a/guava/src/com/google/common/graph/AbstractNetwork.java +++ b/guava/src/com/google/common/graph/AbstractNetwork.java @@ -107,6 +107,13 @@ public ElementOrder nodeOrder() { return AbstractNetwork.this.nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + // TODO(b/142723300): Return AbstractNetwork.this.incidentEdgeOrder() once Network has that + // method. + return ElementOrder.unordered(); + } + @Override public boolean isDirected() { return AbstractNetwork.this.isDirected(); diff --git a/guava/src/com/google/common/graph/AbstractValueGraph.java b/guava/src/com/google/common/graph/AbstractValueGraph.java index 4348b96d50b0..c83cff585e32 100644 --- a/guava/src/com/google/common/graph/AbstractValueGraph.java +++ b/guava/src/com/google/common/graph/AbstractValueGraph.java @@ -68,6 +68,11 @@ public ElementOrder nodeOrder() { return AbstractValueGraph.this.nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return AbstractValueGraph.this.incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return AbstractValueGraph.this.adjacentNodes(node); diff --git a/guava/src/com/google/common/graph/BaseGraph.java b/guava/src/com/google/common/graph/BaseGraph.java index e6e2ad1f0658..debfa98449f4 100644 --- a/guava/src/com/google/common/graph/BaseGraph.java +++ b/guava/src/com/google/common/graph/BaseGraph.java @@ -56,6 +56,13 @@ interface BaseGraph extends SuccessorsFunction, PredecessorsFunction { /** Returns the order of iteration for the elements of {@link #nodes()}. */ ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java b/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java index 753be1bb23d3..bd1519f2804a 100644 --- a/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java +++ b/guava/src/com/google/common/graph/ConfigurableMutableValueGraph.java @@ -49,6 +49,11 @@ final class ConfigurableMutableValueGraph extends ConfigurableValueGraph incidentEdgeOrder() { + return incidentEdgeOrder; + } + @Override @CanIgnoreReturnValue public boolean addNode(N node) { diff --git a/guava/src/com/google/common/graph/ForwardingGraph.java b/guava/src/com/google/common/graph/ForwardingGraph.java index 3ad01b196472..4a3ab8c77b3b 100644 --- a/guava/src/com/google/common/graph/ForwardingGraph.java +++ b/guava/src/com/google/common/graph/ForwardingGraph.java @@ -57,6 +57,11 @@ public ElementOrder nodeOrder() { return delegate().nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return delegate().incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return delegate().adjacentNodes(node); diff --git a/guava/src/com/google/common/graph/ForwardingValueGraph.java b/guava/src/com/google/common/graph/ForwardingValueGraph.java index 3020c9e1aa44..8db773f923ef 100644 --- a/guava/src/com/google/common/graph/ForwardingValueGraph.java +++ b/guava/src/com/google/common/graph/ForwardingValueGraph.java @@ -60,6 +60,11 @@ public ElementOrder nodeOrder() { return delegate().nodeOrder(); } + @Override + public ElementOrder incidentEdgeOrder() { + return delegate().incidentEdgeOrder(); + } + @Override public Set adjacentNodes(N node) { return delegate().adjacentNodes(node); diff --git a/guava/src/com/google/common/graph/Graph.java b/guava/src/com/google/common/graph/Graph.java index 1b5142aa6342..c725607a7b8d 100644 --- a/guava/src/com/google/common/graph/Graph.java +++ b/guava/src/com/google/common/graph/Graph.java @@ -140,6 +140,14 @@ public interface Graph extends BaseGraph { @Override ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + @Override + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/guava/src/com/google/common/graph/GraphBuilder.java b/guava/src/com/google/common/graph/GraphBuilder.java index 5b15e5ca021b..705088a48856 100644 --- a/guava/src/com/google/common/graph/GraphBuilder.java +++ b/guava/src/com/google/common/graph/GraphBuilder.java @@ -91,8 +91,8 @@ public static GraphBuilder undirected() { public static GraphBuilder from(Graph graph) { return new GraphBuilder(graph.isDirected()) .allowsSelfLoops(graph.allowsSelfLoops()) - .nodeOrder(graph.nodeOrder()); - // TODO(b/142723300): Add incidentEdgeOrder + .nodeOrder(graph.nodeOrder()) + .incidentEdgeOrder(graph.incidentEdgeOrder()); } /** diff --git a/guava/src/com/google/common/graph/ImmutableGraph.java b/guava/src/com/google/common/graph/ImmutableGraph.java index 1bd6d920a76f..16548df448e9 100644 --- a/guava/src/com/google/common/graph/ImmutableGraph.java +++ b/guava/src/com/google/common/graph/ImmutableGraph.java @@ -72,6 +72,11 @@ public static ImmutableGraph copyOf(ImmutableGraph graph) { return checkNotNull(graph); } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.stable(); + } + private static ImmutableMap> getNodeConnections( Graph graph) { // ImmutableMap.Builder maintains the order of the elements as inserted, so the map will have diff --git a/guava/src/com/google/common/graph/ImmutableValueGraph.java b/guava/src/com/google/common/graph/ImmutableValueGraph.java index f3907e82faa3..0ed5eb65475e 100644 --- a/guava/src/com/google/common/graph/ImmutableValueGraph.java +++ b/guava/src/com/google/common/graph/ImmutableValueGraph.java @@ -66,6 +66,11 @@ public static ImmutableValueGraph copyOf(ImmutableValueGraph return checkNotNull(graph); } + @Override + public ElementOrder incidentEdgeOrder() { + return ElementOrder.stable(); + } + @Override public ImmutableGraph asGraph() { return new ImmutableGraph(this); // safe because the view is effectively immutable diff --git a/guava/src/com/google/common/graph/ValueGraph.java b/guava/src/com/google/common/graph/ValueGraph.java index 9f11768e22c7..cfb4fa24765f 100644 --- a/guava/src/com/google/common/graph/ValueGraph.java +++ b/guava/src/com/google/common/graph/ValueGraph.java @@ -151,6 +151,14 @@ public interface ValueGraph extends BaseGraph { @Override ElementOrder nodeOrder(); + /** + * Returns an {@link ElementOrder} that specifies the order of iteration for the elements of + * {@link #edges()}, {@link #adjacentNodes(Object)}, {@link #predecessors(Object)}, {@link + * #successors(Object)} and {@link #incidentEdges(Object)}. + */ + @Override + ElementOrder incidentEdgeOrder(); + // // Element-level accessors // diff --git a/guava/src/com/google/common/graph/ValueGraphBuilder.java b/guava/src/com/google/common/graph/ValueGraphBuilder.java index 78958de47dc2..f0b3147f1d91 100644 --- a/guava/src/com/google/common/graph/ValueGraphBuilder.java +++ b/guava/src/com/google/common/graph/ValueGraphBuilder.java @@ -94,8 +94,8 @@ public static ValueGraphBuilder undirected() { public static ValueGraphBuilder from(ValueGraph graph) { return new ValueGraphBuilder(graph.isDirected()) .allowsSelfLoops(graph.allowsSelfLoops()) - .nodeOrder(graph.nodeOrder()); - // TODO(b/142723300): Add incidentEdgeOrder + .nodeOrder(graph.nodeOrder()) + .incidentEdgeOrder(graph.incidentEdgeOrder()); } /**