OLD | NEW |
(Empty) | |
| 1 // Copyright 2013 Google Inc. All Rights Reserved. |
| 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at |
| 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. |
| 14 |
| 15 library quiver.collection.bimap_test; |
| 16 |
| 17 import 'package:quiver/collection.dart'; |
| 18 import 'package:test/test.dart'; |
| 19 |
| 20 main() { |
| 21 group('BiMap', () { |
| 22 test('should construct a HashBiMap', () { |
| 23 expect(new BiMap() is HashBiMap, true); |
| 24 }); |
| 25 }); |
| 26 |
| 27 group('HashBiMap', () { |
| 28 BiMap<String, int> map; |
| 29 String k1 = 'k1', |
| 30 k2 = 'k2', |
| 31 k3 = 'k3'; |
| 32 int v1 = 1, |
| 33 v2 = 2, |
| 34 v3 = 3; |
| 35 |
| 36 setUp(() { |
| 37 map = new HashBiMap(); |
| 38 }); |
| 39 |
| 40 test('should initialize empty', () { |
| 41 expect(map.isEmpty, true); |
| 42 expect(map.isNotEmpty, false); |
| 43 expect(map.inverse.isEmpty, true); |
| 44 expect(map.inverse.isNotEmpty, false); |
| 45 }); |
| 46 |
| 47 test('should throw when adding a null key or value', () { |
| 48 expect(() => map[null] = v1, throwsA(new isInstanceOf<ArgumentError>())); |
| 49 expect(() => map[k1] = null, throwsA(new isInstanceOf<ArgumentError>())); |
| 50 }); |
| 51 |
| 52 test('should throw when adding a null key or value via its inverse', () { |
| 53 expect(() => map.inverse[null] = k1, |
| 54 throwsA(new isInstanceOf<ArgumentError>())); |
| 55 expect(() => map.inverse[v1] = null, |
| 56 throwsA(new isInstanceOf<ArgumentError>())); |
| 57 }); |
| 58 |
| 59 test('should not be empty after adding a mapping', () { |
| 60 map[k1] = v1; |
| 61 expect(map.isEmpty, false); |
| 62 expect(map.isNotEmpty, true); |
| 63 expect(map.inverse.isEmpty, false); |
| 64 expect(map.inverse.isNotEmpty, true); |
| 65 }); |
| 66 |
| 67 test('should not be empty after adding a mapping via its inverse', () { |
| 68 map.inverse[v1] = k1; |
| 69 expect(map.isEmpty, false); |
| 70 expect(map.isNotEmpty, true); |
| 71 expect(map.inverse.isEmpty, false); |
| 72 expect(map.inverse.isNotEmpty, true); |
| 73 }); |
| 74 |
| 75 test('should contain added mappings', () { |
| 76 map[k1] = v1; |
| 77 map[k2] = v2; |
| 78 expect(map[k1], v1); |
| 79 expect(map[k2], v2); |
| 80 expect(map.inverse[v1], k1); |
| 81 expect(map.inverse[v2], k2); |
| 82 }); |
| 83 |
| 84 test('should contain mappings added via its invese', () { |
| 85 map.inverse[v1] = k1; |
| 86 map.inverse[v2] = k2; |
| 87 expect(map[k1], v1); |
| 88 expect(map[k2], v2); |
| 89 expect(map.inverse[v1], k1); |
| 90 expect(map.inverse[v2], k2); |
| 91 }); |
| 92 |
| 93 test('should allow overwriting existing keys', () { |
| 94 map[k1] = v1; |
| 95 map[k1] = v2; |
| 96 expect(map[k1], v2); |
| 97 expect(map.inverse.containsKey(v1), false); |
| 98 expect(map.inverse[v2], k1); |
| 99 }); |
| 100 |
| 101 test('should allow overwriting existing keys via its inverse', () { |
| 102 map.inverse[v1] = k1; |
| 103 map.inverse[v1] = k2; |
| 104 expect(map[k2], v1); |
| 105 expect(map.inverse.containsKey(v2), false); |
| 106 expect(map.inverse[v1], k2); |
| 107 }); |
| 108 |
| 109 test('should allow overwriting existing key-value pairs', () { |
| 110 map[k1] = v1; |
| 111 map[k1] = v1; |
| 112 expect(map[k1], v1); |
| 113 expect(map.inverse.containsKey(v1), true); |
| 114 expect(map.inverse[v1], k1); |
| 115 }); |
| 116 |
| 117 test('should allow overwriting existing key-value pairs via its inverse', |
| 118 () { |
| 119 map.inverse[v1] = k1; |
| 120 map.inverse[v1] = k1; |
| 121 expect(map[k1], v1); |
| 122 expect(map.inverse.containsKey(v1), true); |
| 123 expect(map.inverse[v1], k1); |
| 124 }); |
| 125 |
| 126 test('should throw on overwriting unmapped keys with a mapped value', () { |
| 127 map[k1] = v1; |
| 128 expect(() => map[k2] = v1, throwsA(new isInstanceOf<ArgumentError>())); |
| 129 expect(map.containsKey(k2), false); |
| 130 expect(map.inverse.containsValue(k2), false); |
| 131 }); |
| 132 |
| 133 test( |
| 134 'should throw on overwriting unmapped keys with a mapped value via inver
se', |
| 135 () { |
| 136 map[k1] = v1; |
| 137 expect(() => map.inverse[v2] = k1, |
| 138 throwsA(new isInstanceOf<ArgumentError>())); |
| 139 expect(map.containsValue(v2), false); |
| 140 expect(map.inverse.containsKey(v2), false); |
| 141 }); |
| 142 |
| 143 test('should allow force-adding unmapped keys with a mapped value', () { |
| 144 map[k1] = v1; |
| 145 map.replace(k2, v1); |
| 146 expect(map[k2], v1); |
| 147 expect(map.containsKey(k1), false); |
| 148 expect(map.inverse[v1], k2); |
| 149 expect(map.inverse.containsValue(k1), false); |
| 150 }); |
| 151 |
| 152 test( |
| 153 'should allow force-adding unmapped keys with a mapped value via inverse
', |
| 154 () { |
| 155 map.inverse[v1] = k1; |
| 156 map.inverse.replace(v2, k1); |
| 157 expect(map[k1], v2); |
| 158 expect(map.containsValue(v1), false); |
| 159 expect(map.inverse[v2], k1); |
| 160 expect(map.inverse.containsKey(v1), false); |
| 161 }); |
| 162 |
| 163 test('should not contain removed mappings', () { |
| 164 map[k1] = v1; |
| 165 map.remove(k1); |
| 166 expect(map.containsKey(k1), false); |
| 167 expect(map.inverse.containsKey(v1), false); |
| 168 }); |
| 169 |
| 170 test('should not contain mappings removed from its inverse', () { |
| 171 map[k1] = v1; |
| 172 map.inverse.remove(v1); |
| 173 expect(map.containsKey(k1), false); |
| 174 expect(map.inverse.containsKey(v1), false); |
| 175 }); |
| 176 |
| 177 test('should be empty after clear', () { |
| 178 map[k1] = v1; |
| 179 map[k2] = v2; |
| 180 map.clear(); |
| 181 expect(map.isEmpty, true); |
| 182 expect(map.inverse.isEmpty, true); |
| 183 }); |
| 184 |
| 185 test('should be empty after inverse.clear', () { |
| 186 map[k1] = v1; |
| 187 map[k2] = v2; |
| 188 map.inverse.clear(); |
| 189 expect(map.isEmpty, true); |
| 190 expect(map.inverse.isEmpty, true); |
| 191 }); |
| 192 |
| 193 test('should contain mapped keys', () { |
| 194 map[k1] = v1; |
| 195 map[k2] = v2; |
| 196 expect(map.containsKey(k1), true); |
| 197 expect(map.containsKey(k2), true); |
| 198 expect(map.keys, unorderedEquals([k1, k2])); |
| 199 expect(map.inverse.containsKey(v1), true); |
| 200 expect(map.inverse.containsKey(v2), true); |
| 201 expect(map.inverse.keys, unorderedEquals([v1, v2])); |
| 202 }); |
| 203 |
| 204 test('should contain keys mapped via its inverse', () { |
| 205 map.inverse[v1] = k1; |
| 206 map.inverse[v2] = k2; |
| 207 expect(map.containsKey(k1), true); |
| 208 expect(map.containsKey(k2), true); |
| 209 expect(map.keys, unorderedEquals([k1, k2])); |
| 210 expect(map.inverse.containsKey(v1), true); |
| 211 expect(map.inverse.containsKey(v2), true); |
| 212 expect(map.inverse.keys, unorderedEquals([v1, v2])); |
| 213 }); |
| 214 |
| 215 test('should contain mapped values', () { |
| 216 map[k1] = v1; |
| 217 map[k2] = v2; |
| 218 expect(map.containsValue(v1), true); |
| 219 expect(map.containsValue(v2), true); |
| 220 expect(map.values, unorderedEquals([v1, v2])); |
| 221 expect(map.inverse.containsValue(k1), true); |
| 222 expect(map.inverse.containsValue(k2), true); |
| 223 expect(map.inverse.values, unorderedEquals([k1, k2])); |
| 224 }); |
| 225 |
| 226 test('should contain values mapped via its inverse', () { |
| 227 map.inverse[v1] = k1; |
| 228 map.inverse[v2] = k2; |
| 229 expect(map.containsValue(v1), true); |
| 230 expect(map.containsValue(v2), true); |
| 231 expect(map.values, unorderedEquals([v1, v2])); |
| 232 expect(map.inverse.containsValue(k1), true); |
| 233 expect(map.inverse.containsValue(k2), true); |
| 234 expect(map.inverse.values, unorderedEquals([k1, k2])); |
| 235 }); |
| 236 |
| 237 test('should add mappings via putIfAbsent if absent', () { |
| 238 map.putIfAbsent(k1, () => v1); |
| 239 expect(map[k1], v1); |
| 240 expect(map.inverse[v1], k1); |
| 241 }); |
| 242 |
| 243 test('should add mappings via inverse.putIfAbsent if absent', () { |
| 244 map.inverse.putIfAbsent(v1, () => k1); |
| 245 expect(map[k1], v1); |
| 246 expect(map.inverse[v1], k1); |
| 247 }); |
| 248 |
| 249 test('should not add mappings via putIfAbsent if present', () { |
| 250 map[k1] = v1; |
| 251 map.putIfAbsent(k1, () => v2); |
| 252 expect(map[k1], v1); |
| 253 expect(map.inverse[v1], k1); |
| 254 expect(map.inverse.containsKey(v2), false); |
| 255 }); |
| 256 |
| 257 test('should not add mappings via inverse.putIfAbsent if present', () { |
| 258 map[k1] = v1; |
| 259 map.inverse.putIfAbsent(v1, () => k2); |
| 260 expect(map[k1], v1); |
| 261 expect(map.containsKey(k2), false); |
| 262 expect(map.inverse[v1], k1); |
| 263 }); |
| 264 |
| 265 test('should contain mappings added from another map', () { |
| 266 map.addAll({k1: v1, k2: v2, k3: v3}); |
| 267 expect(map[k1], v1); |
| 268 expect(map[k2], v2); |
| 269 expect(map[k3], v3); |
| 270 expect(map.inverse[v1], k1); |
| 271 expect(map.inverse[v2], k2); |
| 272 expect(map.inverse[v3], k3); |
| 273 }); |
| 274 |
| 275 test('should contain mappings added via its inverse from another map', () { |
| 276 map.inverse.addAll({v1: k1, v2: k2, v3: k3}); |
| 277 expect(map[k1], v1); |
| 278 expect(map[k2], v2); |
| 279 expect(map[k3], v3); |
| 280 expect(map.inverse[v1], k1); |
| 281 expect(map.inverse[v2], k2); |
| 282 expect(map.inverse[v3], k3); |
| 283 }); |
| 284 |
| 285 test('should throw on adding from another map with duplicate values', () { |
| 286 expect(() => map.addAll({k1: v1, k2: v2, k3: v2}), |
| 287 throwsA(new isInstanceOf<ArgumentError>())); |
| 288 }); |
| 289 |
| 290 test( |
| 291 'should throw on adding from another map with duplicate values via inver
se', |
| 292 () { |
| 293 expect(() => map.inverse.addAll({v1: k1, v2: k2, v3: k2}), |
| 294 throwsA(new isInstanceOf<ArgumentError>())); |
| 295 }); |
| 296 |
| 297 test('should return the number of key-value pairs as its length', () { |
| 298 expect(map.length, 0); |
| 299 map[k1] = v1; |
| 300 expect(map.length, 1); |
| 301 map[k1] = v2; |
| 302 expect(map.length, 1); |
| 303 map.replace(k2, v2); |
| 304 expect(map.length, 1); |
| 305 map[k1] = v1; |
| 306 expect(map.length, 2); |
| 307 }); |
| 308 |
| 309 test('should iterate over all pairs via forEach', () { |
| 310 map[k1] = v1; |
| 311 map[k2] = v2; |
| 312 var keys = []; |
| 313 var values = []; |
| 314 map.forEach((k, v) { |
| 315 keys.add(k); |
| 316 values.add(v); |
| 317 }); |
| 318 expect(keys, unorderedEquals([k1, k2])); |
| 319 expect(values, unorderedEquals([v1, v2])); |
| 320 }); |
| 321 |
| 322 test('should iterate over all pairs via forEach of its inverse', () { |
| 323 map[k1] = v1; |
| 324 map[k2] = v2; |
| 325 var keys = []; |
| 326 var values = []; |
| 327 map.inverse.forEach((k, v) { |
| 328 keys.add(k); |
| 329 values.add(v); |
| 330 }); |
| 331 expect(keys, unorderedEquals([v1, v2])); |
| 332 expect(values, unorderedEquals([k1, k2])); |
| 333 }); |
| 334 }); |
| 335 } |
OLD | NEW |