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