blob: 5de3cf751f8e9282e6b7e2a61b0925a1b710f31c [file] [log] [blame]
/*
* Copyright (C) 2014 The Guava Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.common.graph;
import static com.google.common.truth.Truth.assertThat;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for {@link ImmutableNetwork}. */
@RunWith(JUnit4.class)
public class ImmutableNetworkTest {
@Test
public void immutableNetwork() {
MutableNetwork<String, Integer> mutableNetwork = NetworkBuilder.directed().build();
mutableNetwork.addNode("A");
ImmutableNetwork<String, Integer> immutableNetwork = ImmutableNetwork.copyOf(mutableNetwork);
assertThat(immutableNetwork.asGraph()).isInstanceOf(ImmutableGraph.class);
assertThat(immutableNetwork).isNotInstanceOf(MutableNetwork.class);
assertThat(immutableNetwork).isEqualTo(mutableNetwork);
mutableNetwork.addNode("B");
assertThat(immutableNetwork).isNotEqualTo(mutableNetwork);
}
@Test
public void copyOfImmutableNetwork_optimized() {
Network<String, String> network1 =
ImmutableNetwork.copyOf(NetworkBuilder.directed().<String, String>build());
Network<String, String> network2 = ImmutableNetwork.copyOf(network1);
assertThat(network2).isSameInstanceAs(network1);
}
@Test
public void edgesConnecting_directed() {
MutableNetwork<String, String> mutableNetwork =
NetworkBuilder.directed().allowsSelfLoops(true).build();
mutableNetwork.addEdge("A", "A", "AA");
mutableNetwork.addEdge("A", "B", "AB");
Network<String, String> network = ImmutableNetwork.copyOf(mutableNetwork);
assertThat(network.edgesConnecting("A", "A")).containsExactly("AA");
assertThat(network.edgesConnecting("A", "B")).containsExactly("AB");
assertThat(network.edgesConnecting("B", "A")).isEmpty();
}
@Test
public void edgesConnecting_undirected() {
MutableNetwork<String, String> mutableNetwork =
NetworkBuilder.undirected().allowsSelfLoops(true).build();
mutableNetwork.addEdge("A", "A", "AA");
mutableNetwork.addEdge("A", "B", "AB");
Network<String, String> network = ImmutableNetwork.copyOf(mutableNetwork);
assertThat(network.edgesConnecting("A", "A")).containsExactly("AA");
assertThat(network.edgesConnecting("A", "B")).containsExactly("AB");
assertThat(network.edgesConnecting("B", "A")).containsExactly("AB");
}
@Test
public void immutableNetworkBuilder_appliesNetworkBuilderConfig() {
ImmutableNetwork<String, Integer> emptyNetwork =
NetworkBuilder.directed()
.allowsSelfLoops(true)
.nodeOrder(ElementOrder.<String>natural())
.<String, Integer>immutable()
.build();
assertThat(emptyNetwork.isDirected()).isTrue();
assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
}
/**
* Tests that the ImmutableNetwork.Builder doesn't change when the creating NetworkBuilder
* changes.
*/
@Test
@SuppressWarnings("CheckReturnValue")
public void immutableNetworkBuilder_copiesNetworkBuilder() {
NetworkBuilder<String, Object> networkBuilder =
NetworkBuilder.directed()
.allowsSelfLoops(true)
.<String>nodeOrder(ElementOrder.<String>natural());
ImmutableNetwork.Builder<String, Integer> immutableNetworkBuilder =
networkBuilder.<String, Integer>immutable();
// Update NetworkBuilder, but this shouldn't impact immutableNetworkBuilder
networkBuilder.allowsSelfLoops(false).nodeOrder(ElementOrder.<String>unordered());
ImmutableNetwork<String, Integer> emptyNetwork = immutableNetworkBuilder.build();
assertThat(emptyNetwork.isDirected()).isTrue();
assertThat(emptyNetwork.allowsSelfLoops()).isTrue();
assertThat(emptyNetwork.nodeOrder()).isEqualTo(ElementOrder.<String>natural());
}
@Test
public void immutableNetworkBuilder_addNode() {
ImmutableNetwork<String, Integer> network =
NetworkBuilder.directed().<String, Integer>immutable().addNode("A").build();
assertThat(network.nodes()).containsExactly("A");
assertThat(network.edges()).isEmpty();
}
@Test
public void immutableNetworkBuilder_putEdgeFromNodes() {
ImmutableNetwork<String, Integer> network =
NetworkBuilder.directed().<String, Integer>immutable().addEdge("A", "B", 10).build();
assertThat(network.nodes()).containsExactly("A", "B");
assertThat(network.edges()).containsExactly(10);
assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
}
@Test
public void immutableNetworkBuilder_putEdgeFromEndpointPair() {
ImmutableNetwork<String, Integer> network =
NetworkBuilder.directed()
.<String, Integer>immutable()
.addEdge(EndpointPair.ordered("A", "B"), 10)
.build();
assertThat(network.nodes()).containsExactly("A", "B");
assertThat(network.edges()).containsExactly(10);
assertThat(network.incidentNodes(10)).isEqualTo(EndpointPair.ordered("A", "B"));
}
}