• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Guava Authors
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.google.common.graph;
18 
19 import static com.google.common.base.Preconditions.checkNotNull;
20 import static com.google.common.graph.ElementOrder.insertion;
21 import static com.google.common.graph.ElementOrder.unordered;
22 import static com.google.common.truth.Truth.assertThat;
23 
24 import com.google.common.collect.Ordering;
25 import java.util.Comparator;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.junit.runners.JUnit4;
29 
30 /** Tests for ordering the elements of graphs. */
31 @RunWith(JUnit4.class)
32 public final class ElementOrderTest {
33   // Node order tests
34 
35   @Test
nodeOrder_none()36   public void nodeOrder_none() {
37     MutableGraph<Integer> graph = GraphBuilder.directed().nodeOrder(unordered()).build();
38 
39     assertThat(graph.nodeOrder()).isEqualTo(unordered());
40   }
41 
42   @Test
nodeOrder_insertion()43   public void nodeOrder_insertion() {
44     MutableGraph<Integer> graph = GraphBuilder.directed().nodeOrder(insertion()).build();
45 
46     addNodes(graph);
47 
48     assertThat(graph.nodeOrder()).isEqualTo(insertion());
49     assertThat(graph.nodes()).containsExactly(3, 1, 4).inOrder();
50   }
51 
52   // The default ordering is INSERTION unless otherwise specified.
53   @Test
nodeOrder_default()54   public void nodeOrder_default() {
55     MutableGraph<Integer> graph = GraphBuilder.directed().build();
56 
57     addNodes(graph);
58 
59     assertThat(graph.nodeOrder()).isEqualTo(insertion());
60     assertThat(graph.nodes()).containsExactly(3, 1, 4).inOrder();
61   }
62 
63   @Test
nodeOrder_natural()64   public void nodeOrder_natural() {
65     MutableGraph<Integer> graph =
66         GraphBuilder.directed().nodeOrder(ElementOrder.<Integer>natural()).build();
67 
68     addNodes(graph);
69 
70     assertThat(graph.nodeOrder()).isEqualTo(ElementOrder.sorted(Ordering.<Integer>natural()));
71     assertThat(graph.nodes()).containsExactly(1, 3, 4).inOrder();
72   }
73 
74   @Test
nodeOrder_sorted()75   public void nodeOrder_sorted() {
76     MutableGraph<Integer> graph =
77         GraphBuilder.directed()
78             .nodeOrder(ElementOrder.sorted(Ordering.<Integer>natural().reverse()))
79             .build();
80 
81     addNodes(graph);
82 
83     assertThat(graph.nodeOrder())
84         .isEqualTo(ElementOrder.sorted(Ordering.<Integer>natural().reverse()));
85     assertThat(graph.nodes()).containsExactly(4, 3, 1).inOrder();
86   }
87 
88   // Edge order tests
89 
90   @Test
edgeOrder_none()91   public void edgeOrder_none() {
92     MutableNetwork<Integer, String> network =
93         NetworkBuilder.directed().edgeOrder(unordered()).build();
94 
95     assertThat(network.edgeOrder()).isEqualTo(unordered());
96     assertThat(network.nodeOrder()).isEqualTo(insertion()); // default
97   }
98 
99   @Test
edgeOrder_insertion()100   public void edgeOrder_insertion() {
101     MutableNetwork<Integer, String> network =
102         NetworkBuilder.directed().edgeOrder(insertion()).build();
103 
104     addEdges(network);
105 
106     assertThat(network.edgeOrder()).isEqualTo(ElementOrder.insertion());
107     assertThat(network.edges()).containsExactly("i", "e", "p").inOrder();
108     assertThat(network.nodeOrder()).isEqualTo(ElementOrder.insertion()); // default
109   }
110 
111   // The default ordering is INSERTION unless otherwise specified.
112   @Test
edgeOrder_default()113   public void edgeOrder_default() {
114     MutableNetwork<Integer, String> network = NetworkBuilder.directed().build();
115 
116     addEdges(network);
117 
118     assertThat(network.edgeOrder()).isEqualTo(ElementOrder.insertion());
119     assertThat(network.edges()).containsExactly("i", "e", "p").inOrder();
120     assertThat(network.nodeOrder()).isEqualTo(ElementOrder.insertion()); // default
121   }
122 
123   @Test
edgeOrder_natural()124   public void edgeOrder_natural() {
125     MutableNetwork<Integer, String> network =
126         NetworkBuilder.directed().edgeOrder(ElementOrder.<String>natural()).build();
127 
128     addEdges(network);
129 
130     assertThat(network.edgeOrder()).isEqualTo(ElementOrder.sorted(Ordering.<String>natural()));
131     assertThat(network.edges()).containsExactly("e", "i", "p").inOrder();
132     assertThat(network.nodeOrder()).isEqualTo(insertion()); // default
133   }
134 
135   @Test
edgeOrder_sorted()136   public void edgeOrder_sorted() {
137     MutableNetwork<Integer, String> network =
138         NetworkBuilder.directed()
139             .edgeOrder(ElementOrder.sorted(Ordering.<String>natural().reverse()))
140             .build();
141 
142     addEdges(network);
143 
144     assertThat(network.edgeOrder())
145         .isEqualTo(ElementOrder.sorted(Ordering.<String>natural().reverse()));
146     assertThat(network.edges()).containsExactly("p", "i", "e").inOrder();
147     assertThat(network.nodeOrder()).isEqualTo(ElementOrder.insertion()); // default
148   }
149 
150   // Combined node and edge order tests
151 
152   @Test
nodeOrderUnorderedAndEdgesSorted()153   public void nodeOrderUnorderedAndEdgesSorted() {
154     MutableNetwork<Integer, String> network =
155         NetworkBuilder.directed()
156             .nodeOrder(unordered())
157             .edgeOrder(ElementOrder.sorted(Ordering.<String>natural().reverse()))
158             .build();
159 
160     addEdges(network);
161 
162     assertThat(network.edgeOrder())
163         .isEqualTo(ElementOrder.sorted(Ordering.<String>natural().reverse()));
164     assertThat(network.edges()).containsExactly("p", "i", "e").inOrder();
165     assertThat(network.nodeOrder()).isEqualTo(unordered());
166     assertThat(network.nodes()).containsExactly(4, 1, 3);
167   }
168 
169   // Sorting of user-defined classes
170 
171   @Test
customComparator()172   public void customComparator() {
173     Comparator<NonComparableSuperClass> comparator =
174         new Comparator<NonComparableSuperClass>() {
175           @Override
176           public int compare(NonComparableSuperClass left, NonComparableSuperClass right) {
177             return left.value.compareTo(right.value);
178           }
179         };
180 
181     MutableGraph<NonComparableSuperClass> graph =
182         GraphBuilder.undirected().nodeOrder(ElementOrder.sorted(comparator)).build();
183 
184     NonComparableSuperClass node1 = new NonComparableSuperClass(1);
185     NonComparableSuperClass node3 = new NonComparableSuperClass(3);
186     NonComparableSuperClass node5 = new NonComparableSuperClass(5);
187     NonComparableSuperClass node7 = new NonComparableSuperClass(7);
188 
189     graph.addNode(node1);
190     graph.addNode(node7);
191     graph.addNode(node5);
192     graph.addNode(node3);
193 
194     assertThat(graph.nodeOrder().comparator()).isEqualTo(comparator);
195     assertThat(graph.nodes()).containsExactly(node1, node3, node5, node7).inOrder();
196   }
197 
198   @Test
customComparable()199   public void customComparable() {
200     MutableGraph<ComparableSubClass> graph =
201         GraphBuilder.undirected().nodeOrder(ElementOrder.<ComparableSubClass>natural()).build();
202 
203     ComparableSubClass node2 = new ComparableSubClass(2);
204     ComparableSubClass node4 = new ComparableSubClass(4);
205     ComparableSubClass node6 = new ComparableSubClass(6);
206     ComparableSubClass node8 = new ComparableSubClass(8);
207 
208     graph.addNode(node4);
209     graph.addNode(node2);
210     graph.addNode(node6);
211     graph.addNode(node8);
212 
213     assertThat(graph.nodeOrder().comparator()).isEqualTo(Ordering.natural());
214     assertThat(graph.nodes()).containsExactly(node2, node4, node6, node8).inOrder();
215   }
216 
addNodes(MutableGraph<Integer> graph)217   private static void addNodes(MutableGraph<Integer> graph) {
218     graph.addNode(3);
219     graph.addNode(1);
220     graph.addNode(4);
221   }
222 
addEdges(MutableNetwork<Integer, String> network)223   private static void addEdges(MutableNetwork<Integer, String> network) {
224     network.addEdge(3, 1, "i");
225     network.addEdge(1, 4, "e");
226     network.addEdge(4, 3, "p");
227   }
228 
229   private static class NonComparableSuperClass {
230     final Integer value;
231 
NonComparableSuperClass(Integer value)232     NonComparableSuperClass(Integer value) {
233       this.value = checkNotNull(value);
234     }
235 
236     @Override
toString()237     public String toString() {
238       return "value=" + value;
239     }
240   }
241 
242   @SuppressWarnings("ComparableType")
243   private static class ComparableSubClass extends NonComparableSuperClass
244       implements Comparable<NonComparableSuperClass> {
245 
ComparableSubClass(Integer value)246     ComparableSubClass(Integer value) {
247       super(value);
248     }
249 
250     @Override
compareTo(NonComparableSuperClass other)251     public int compareTo(NonComparableSuperClass other) {
252       return value.compareTo(other.value);
253     }
254   }
255 }
256