Skip to content

Commit

Permalink
Add *degree() methods back to Graph/Network interfaces, with correct …
Browse files Browse the repository at this point in the history
…formal definition this time (self-loops count twice).

Replace references (in affected tests) to assert{True,False} with Truth.assertThat().is{True, False}.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130651507
  • Loading branch information
Bezier89 authored and cpovirk committed Aug 18, 2016
1 parent aad5883 commit a29aed7
Show file tree
Hide file tree
Showing 14 changed files with 390 additions and 73 deletions.
Expand Up @@ -17,8 +17,6 @@
package com.google.common.graph;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Test;

Expand Down Expand Up @@ -47,6 +45,22 @@ public void successors_oneEdge() {
assertThat(graph.successors(N2)).isEmpty();
}

@Test
public void inDegree_oneEdge() {
addEdge(N1, N2);
assertThat(graph.inDegree(N2)).isEqualTo(1);
// Edge direction handled correctly
assertThat(graph.inDegree(N1)).isEqualTo(0);
}

@Test
public void outDegree_oneEdge() {
addEdge(N1, N2);
assertThat(graph.outDegree(N1)).isEqualTo(1);
// Edge direction handled correctly
assertThat(graph.outDegree(N2)).isEqualTo(0);
}

// Element Mutation

@Test
Expand All @@ -55,26 +69,25 @@ public void addEdge_existingNodes() {
// modifications to proxy methods)
addNode(N1);
addNode(N2);
assertTrue(addEdge(N1, N2));
assertThat(addEdge(N1, N2)).isTrue();
}

@Test
public void addEdge_existingEdgeBetweenSameNodes() {
addEdge(N1, N2);
assertFalse(addEdge(N1, N2));
assertThat(addEdge(N1, N2)).isFalse();
}

@Test
public void removeEdge_antiparallelEdges() {
addEdge(N1, N2);
addEdge(N2, N1);

assertTrue(graph.removeEdge(N1, N2));
assertThat(graph.removeEdge(N1, N2)).isTrue();
assertThat(graph.successors(N1)).isEmpty();
assertThat(graph.predecessors(N1)).containsExactly(N2);
assertThat(graph.edges()).hasSize(1);

assertTrue(graph.removeEdge(N2, N1));
assertThat(graph.removeEdge(N2, N1)).isTrue();
assertThat(graph.successors(N1)).isEmpty();
assertThat(graph.predecessors(N1)).isEmpty();
assertThat(graph.edges()).isEmpty();
Expand Down
Expand Up @@ -17,9 +17,6 @@
package com.google.common.graph;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import com.google.common.collect.ImmutableSet;
Expand Down Expand Up @@ -56,7 +53,8 @@ public void validateSourceAndTarget() {
for (Integer adjacentNode : network.adjacentNodes(node)) {
Set<String> edges = network.edgesConnecting(node, adjacentNode);
Set<String> antiParallelEdges = network.edgesConnecting(adjacentNode, node);
assertTrue(node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges));
assertThat(
node.equals(adjacentNode) || Collections.disjoint(edges, antiParallelEdges)).isTrue();
}
}
}
Expand Down Expand Up @@ -113,7 +111,7 @@ public void successors_oneEdge() {
@Test
public void source_oneEdge() {
addEdge(E12, N1, N2);
assertEquals(N1, network.incidentNodes(E12).source());
assertThat(network.incidentNodes(E12).source()).isEqualTo(N1);
}

@Test
Expand All @@ -129,7 +127,7 @@ public void source_edgeNotInGraph() {
@Test
public void target_oneEdge() {
addEdge(E12, N1, N2);
assertEquals(N2, network.incidentNodes(E12).target());
assertThat(network.incidentNodes(E12).target()).isEqualTo(N2);
}

@Test
Expand All @@ -142,6 +140,22 @@ public void target_edgeNotInGraph() {
}
}

@Test
public void inDegree_oneEdge() {
addEdge(E12, N1, N2);
assertThat(network.inDegree(N2)).isEqualTo(1);
// Edge direction handled correctly
assertThat(network.inDegree(N1)).isEqualTo(0);
}

@Test
public void outDegree_oneEdge() {
addEdge(E12, N1, N2);
assertThat(network.outDegree(N1)).isEqualTo(1);
// Edge direction handled correctly
assertThat(network.outDegree(N2)).isEqualTo(0);
}

// Element Mutation

@Test
Expand All @@ -150,7 +164,7 @@ public void addEdge_existingNodes() {
// modifications to proxy methods)
addNode(N1);
addNode(N2);
assertTrue(addEdge(E12, N1, N2));
assertThat(addEdge(E12, N1, N2)).isTrue();
assertThat(network.edges()).contains(E12);
assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
// Direction of the added edge is correctly handled
Expand All @@ -161,7 +175,7 @@ public void addEdge_existingNodes() {
public void addEdge_existingEdgeBetweenSameNodes() {
addEdge(E12, N1, N2);
ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
assertFalse(addEdge(E12, N1, N2));
assertThat(addEdge(E12, N1, N2)).isFalse();
assertThat(network.edges()).containsExactlyElementsIn(edges);
}

Expand Down
71 changes: 71 additions & 0 deletions guava-tests/test/com/google/common/graph/AbstractGraphTest.java
Expand Up @@ -152,7 +152,23 @@ static <N> void validateGraph(Graph<N, ?> graph) {
sanityCheckCollection(graph.predecessors(node));
sanityCheckCollection(graph.successors(node));

if (graph.isDirected()) {
assertThat(graph.degree(node)).isEqualTo(
graph.predecessors(node).size() + graph.successors(node).size());
assertThat(graph.predecessors(node)).hasSize(graph.inDegree(node));
assertThat(graph.successors(node)).hasSize(graph.outDegree(node));
} else {
Set<N> neighbors = graph.adjacentNodes(node);
assertThat(graph.degree(node)).isEqualTo(
neighbors.size() + (neighbors.contains(node) ? 1 : 0));
assertThat(graph.inDegree(node)).isEqualTo(graph.degree(node));
assertThat(graph.outDegree(node)).isEqualTo(graph.degree(node));
}

for (N adjacentNode : graph.adjacentNodes(node)) {
if (!graph.allowsSelfLoops()) {
assertThat(node).isNotEqualTo(adjacentNode);
}
assertThat(graph.predecessors(node).contains(adjacentNode)
|| graph.successors(node).contains(adjacentNode)).isTrue();
}
Expand Down Expand Up @@ -264,6 +280,61 @@ public void successors_nodeNotInGraph() {
}
}

@Test
public void degree_oneEdge() {
addEdge(N1, N2);
assertThat(graph.degree(N1)).isEqualTo(1);
assertThat(graph.degree(N2)).isEqualTo(1);
}

@Test
public void degree_isolatedNode() {
addNode(N1);
assertThat(graph.degree(N1)).isEqualTo(0);
}

@Test
public void degree_nodeNotInGraph() {
try {
graph.degree(NODE_NOT_IN_GRAPH);
fail(ERROR_NODE_NOT_IN_GRAPH);
} catch (IllegalArgumentException e) {
assertNodeNotInGraphErrorMessage(e);
}
}

@Test
public void inDegree_isolatedNode() {
addNode(N1);
assertThat(graph.inDegree(N1)).isEqualTo(0);
}

@Test
public void inDegree_nodeNotInGraph() {
try {
graph.inDegree(NODE_NOT_IN_GRAPH);
fail(ERROR_NODE_NOT_IN_GRAPH);
} catch (IllegalArgumentException e) {
assertNodeNotInGraphErrorMessage(e);
}
}

@Test
public void outDegree_isolatedNode() {
addNode(N1);
assertThat(graph.outDegree(N1)).isEqualTo(0);
}

@Test
public void outDegree_nodeNotInGraph() {
try {
graph.outDegree(NODE_NOT_IN_GRAPH);
fail(ERROR_NODE_NOT_IN_GRAPH);
} catch (IllegalArgumentException e) {
assertNodeNotInGraphErrorMessage(e);
}
}

@Test
public void addNode_newNode() {
assertThat(addNode(N1)).isTrue();
Expand Down
12 changes: 12 additions & 0 deletions guava-tests/test/com/google/common/graph/AbstractNetworkTest.java
Expand Up @@ -215,6 +215,18 @@ static <N, E> void validateNetwork(Network<N, E> network) {
sanityCheckCollection(network.inEdges(node));
sanityCheckCollection(network.outEdges(node));

if (network.isDirected()) {
assertThat(network.degree(node)).isEqualTo(
network.inEdges(node).size() + network.outEdges(node).size());
assertThat(network.inDegree(node)).isEqualTo(network.inEdges(node).size());
assertThat(network.outDegree(node)).isEqualTo(network.outEdges(node).size());
} else {
assertThat(network.degree(node)).isEqualTo(
network.incidentEdges(node).size() + network.edgesConnecting(node, node).size());
assertThat(network.inDegree(node)).isEqualTo(network.degree(node));
assertThat(network.outDegree(node)).isEqualTo(network.degree(node));
}

for (N otherNode : network.nodes()) {
Set<E> edgesConnecting = network.edgesConnecting(node, otherNode);
boolean isSelfLoop = node.equals(otherNode);
Expand Down
Expand Up @@ -17,8 +17,6 @@
package com.google.common.graph;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import com.google.common.testing.EqualsTester;
import org.junit.After;
Expand Down Expand Up @@ -57,6 +55,20 @@ public void successors_oneEdge() {
assertThat(graph.successors(N2)).containsExactly(N1);
}

@Test
public void inDegree_oneEdge() {
addEdge(N1, N2);
assertThat(graph.inDegree(N2)).isEqualTo(1);
assertThat(graph.inDegree(N1)).isEqualTo(1);
}

@Test
public void outDegree_oneEdge() {
addEdge(N1, N2);
assertThat(graph.outDegree(N1)).isEqualTo(1);
assertThat(graph.outDegree(N2)).isEqualTo(1);
}

// Element Mutation

@Test
Expand All @@ -65,23 +77,23 @@ public void addEdge_existingNodes() {
// modifications to proxy methods)
addNode(N1);
addNode(N2);
assertTrue(addEdge(N1, N2));
assertThat(addEdge(N1, N2)).isTrue();
}

@Test
public void addEdge_existingEdgeBetweenSameNodes() {
addEdge(N1, N2);
assertFalse(addEdge(N2, N1));
assertThat(addEdge(N2, N1)).isFalse();
}

@Test
public void removeEdge_antiparallelEdges() {
addEdge(N1, N2);
addEdge(N2, N1); // no-op

assertTrue(graph.removeEdge(N1, N2));
assertThat(graph.removeEdge(N1, N2)).isTrue();
assertThat(graph.adjacentNodes(N1)).isEmpty();
assertThat(graph.edges()).isEmpty();
assertFalse(graph.removeEdge(N2, N1));
assertThat(graph.removeEdge(N2, N1)).isFalse();
}
}
Expand Up @@ -17,8 +17,6 @@
package com.google.common.graph;

import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import com.google.common.collect.ImmutableSet;
Expand Down Expand Up @@ -93,6 +91,20 @@ public void successors_oneEdge() {
assertThat(network.successors(N2)).containsExactly(N1);
}

@Test
public void inDegree_oneEdge() {
addEdge(E12, N1, N2);
assertThat(network.inDegree(N2)).isEqualTo(1);
assertThat(network.inDegree(N1)).isEqualTo(1);
}

@Test
public void outDegree_oneEdge() {
addEdge(E12, N1, N2);
assertThat(network.outDegree(N1)).isEqualTo(1);
assertThat(network.outDegree(N2)).isEqualTo(1);
}

// Element Mutation

@Test
Expand All @@ -101,7 +113,7 @@ public void addEdge_existingNodes() {
// modifications to proxy methods)
addNode(N1);
addNode(N2);
assertTrue(addEdge(E12, N1, N2));
assertThat(addEdge(E12, N1, N2)).isTrue();
assertThat(network.edges()).contains(E12);
assertThat(network.edgesConnecting(N1, N2)).containsExactly(E12);
assertThat(network.edgesConnecting(N2, N1)).containsExactly(E12);
Expand All @@ -111,9 +123,9 @@ public void addEdge_existingNodes() {
public void addEdge_existingEdgeBetweenSameNodes() {
addEdge(E12, N1, N2);
ImmutableSet<String> edges = ImmutableSet.copyOf(network.edges());
assertFalse(addEdge(E12, N1, N2));
assertThat(addEdge(E12, N1, N2)).isFalse();
assertThat(network.edges()).containsExactlyElementsIn(edges);
assertFalse(addEdge(E12, N2, N1));
assertThat(addEdge(E12, N2, N1)).isFalse();
assertThat(network.edges()).containsExactlyElementsIn(edges);
}

Expand Down

0 comments on commit a29aed7

Please sign in to comment.