github.com/mymmsc/gox@v1.3.33/util/treebidimap/treebidimap_test.go (about) 1 // Copyright (c) 2015, Emir Pasic. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package treebidimap 6 7 import ( 8 "fmt" 9 "github.com/mymmsc/gox/util" 10 "testing" 11 ) 12 13 func TestMapPut(t *testing.T) { 14 m := NewWith(util.IntComparator, util.StringComparator) 15 m.Put(5, "e") 16 m.Put(6, "f") 17 m.Put(7, "g") 18 m.Put(3, "c") 19 m.Put(4, "d") 20 m.Put(1, "x") 21 m.Put(2, "b") 22 m.Put(1, "a") //overwrite 23 24 if actualValue := m.Size(); actualValue != 7 { 25 t.Errorf("Got %v expected %v", actualValue, 7) 26 } 27 if actualValue, expectedValue := m.Keys(), []interface{}{1, 2, 3, 4, 5, 6, 7}; !sameElements(actualValue, expectedValue) { 28 t.Errorf("Got %v expected %v", actualValue, expectedValue) 29 } 30 if actualValue, expectedValue := m.Values(), []interface{}{"a", "b", "c", "d", "e", "f", "g"}; !sameElements(actualValue, expectedValue) { 31 t.Errorf("Got %v expected %v", actualValue, expectedValue) 32 } 33 34 // key,expectedValue,expectedFound 35 tests1 := [][]interface{}{ 36 {1, "a", true}, 37 {2, "b", true}, 38 {3, "c", true}, 39 {4, "d", true}, 40 {5, "e", true}, 41 {6, "f", true}, 42 {7, "g", true}, 43 {8, nil, false}, 44 } 45 46 for _, test := range tests1 { 47 // retrievals 48 actualValue, actualFound := m.Get(test[0]) 49 if actualValue != test[1] || actualFound != test[2] { 50 t.Errorf("Got %v expected %v", actualValue, test[1]) 51 } 52 } 53 } 54 55 func TestMapRemove(t *testing.T) { 56 m := NewWith(util.IntComparator, util.StringComparator) 57 m.Put(5, "e") 58 m.Put(6, "f") 59 m.Put(7, "g") 60 m.Put(3, "c") 61 m.Put(4, "d") 62 m.Put(1, "x") 63 m.Put(2, "b") 64 m.Put(1, "a") //overwrite 65 66 m.Remove(5) 67 m.Remove(6) 68 m.Remove(7) 69 m.Remove(8) 70 m.Remove(5) 71 72 if actualValue, expectedValue := m.Keys(), []interface{}{1, 2, 3, 4}; !sameElements(actualValue, expectedValue) { 73 t.Errorf("Got %v expected %v", actualValue, expectedValue) 74 } 75 76 if actualValue, expectedValue := m.Values(), []interface{}{"a", "b", "c", "d"}; !sameElements(actualValue, expectedValue) { 77 t.Errorf("Got %v expected %v", actualValue, expectedValue) 78 } 79 if actualValue := m.Size(); actualValue != 4 { 80 t.Errorf("Got %v expected %v", actualValue, 4) 81 } 82 83 tests2 := [][]interface{}{ 84 {1, "a", true}, 85 {2, "b", true}, 86 {3, "c", true}, 87 {4, "d", true}, 88 {5, nil, false}, 89 {6, nil, false}, 90 {7, nil, false}, 91 {8, nil, false}, 92 } 93 94 for _, test := range tests2 { 95 actualValue, actualFound := m.Get(test[0]) 96 if actualValue != test[1] || actualFound != test[2] { 97 t.Errorf("Got %v expected %v", actualValue, test[1]) 98 } 99 } 100 101 m.Remove(1) 102 m.Remove(4) 103 m.Remove(2) 104 m.Remove(3) 105 m.Remove(2) 106 m.Remove(2) 107 108 if actualValue, expectedValue := fmt.Sprintf("%s", m.Keys()), "[]"; actualValue != expectedValue { 109 t.Errorf("Got %v expected %v", actualValue, expectedValue) 110 } 111 if actualValue, expectedValue := fmt.Sprintf("%s", m.Values()), "[]"; actualValue != expectedValue { 112 t.Errorf("Got %v expected %v", actualValue, expectedValue) 113 } 114 if actualValue := m.Size(); actualValue != 0 { 115 t.Errorf("Got %v expected %v", actualValue, 0) 116 } 117 if actualValue := m.Empty(); actualValue != true { 118 t.Errorf("Got %v expected %v", actualValue, true) 119 } 120 } 121 122 func TestMapGetKey(t *testing.T) { 123 m := NewWith(util.IntComparator, util.StringComparator) 124 m.Put(5, "e") 125 m.Put(6, "f") 126 m.Put(7, "g") 127 m.Put(3, "c") 128 m.Put(4, "d") 129 m.Put(1, "x") 130 m.Put(2, "b") 131 m.Put(1, "a") //overwrite 132 133 // key,expectedValue,expectedFound 134 tests1 := [][]interface{}{ 135 {1, "a", true}, 136 {2, "b", true}, 137 {3, "c", true}, 138 {4, "d", true}, 139 {5, "e", true}, 140 {6, "f", true}, 141 {7, "g", true}, 142 {nil, "x", false}, 143 } 144 145 for _, test := range tests1 { 146 // retrievals 147 actualValue, actualFound := m.GetKey(test[1]) 148 if actualValue != test[0] || actualFound != test[2] { 149 t.Errorf("Got %v expected %v", actualValue, test[0]) 150 } 151 } 152 } 153 154 func sameElements(a []interface{}, b []interface{}) bool { 155 if len(a) != len(b) { 156 return false 157 } 158 for _, av := range a { 159 found := false 160 for _, bv := range b { 161 if av == bv { 162 found = true 163 break 164 } 165 } 166 if !found { 167 return false 168 } 169 } 170 return true 171 } 172 173 func TestMapEach(t *testing.T) { 174 m := NewWith(util.StringComparator, util.IntComparator) 175 m.Put("c", 3) 176 m.Put("a", 1) 177 m.Put("b", 2) 178 count := 0 179 m.Each(func(key interface{}, value interface{}) { 180 count++ 181 if actualValue, expectedValue := count, value; actualValue != expectedValue { 182 t.Errorf("Got %v expected %v", actualValue, expectedValue) 183 } 184 switch value { 185 case 1: 186 if actualValue, expectedValue := key, "a"; actualValue != expectedValue { 187 t.Errorf("Got %v expected %v", actualValue, expectedValue) 188 } 189 case 2: 190 if actualValue, expectedValue := key, "b"; actualValue != expectedValue { 191 t.Errorf("Got %v expected %v", actualValue, expectedValue) 192 } 193 case 3: 194 if actualValue, expectedValue := key, "c"; actualValue != expectedValue { 195 t.Errorf("Got %v expected %v", actualValue, expectedValue) 196 } 197 default: 198 t.Errorf("Too many") 199 } 200 }) 201 } 202 203 func TestMapMap(t *testing.T) { 204 m := NewWith(util.StringComparator, util.IntComparator) 205 m.Put("c", 3) 206 m.Put("a", 1) 207 m.Put("b", 2) 208 mappedMap := m.Map(func(key1 interface{}, value1 interface{}) (key2 interface{}, value2 interface{}) { 209 return key1, value1.(int) * value1.(int) 210 }) 211 if actualValue, _ := mappedMap.Get("a"); actualValue != 1 { 212 t.Errorf("Got %v expected %v", actualValue, "mapped: a") 213 } 214 if actualValue, _ := mappedMap.Get("b"); actualValue != 4 { 215 t.Errorf("Got %v expected %v", actualValue, "mapped: b") 216 } 217 if actualValue, _ := mappedMap.Get("c"); actualValue != 9 { 218 t.Errorf("Got %v expected %v", actualValue, "mapped: c") 219 } 220 if mappedMap.Size() != 3 { 221 t.Errorf("Got %v expected %v", mappedMap.Size(), 3) 222 } 223 } 224 225 func TestMapSelect(t *testing.T) { 226 m := NewWith(util.StringComparator, util.IntComparator) 227 m.Put("c", 3) 228 m.Put("a", 1) 229 m.Put("b", 2) 230 selectedMap := m.Select(func(key interface{}, value interface{}) bool { 231 return key.(string) >= "a" && key.(string) <= "b" 232 }) 233 if actualValue, _ := selectedMap.Get("a"); actualValue != 1 { 234 t.Errorf("Got %v expected %v", actualValue, "value: a") 235 } 236 if actualValue, _ := selectedMap.Get("b"); actualValue != 2 { 237 t.Errorf("Got %v expected %v", actualValue, "value: b") 238 } 239 if selectedMap.Size() != 2 { 240 t.Errorf("Got %v expected %v", selectedMap.Size(), 2) 241 } 242 } 243 244 func TestMapAny(t *testing.T) { 245 m := NewWith(util.StringComparator, util.IntComparator) 246 m.Put("c", 3) 247 m.Put("a", 1) 248 m.Put("b", 2) 249 any := m.Any(func(key interface{}, value interface{}) bool { 250 return value.(int) == 3 251 }) 252 if any != true { 253 t.Errorf("Got %v expected %v", any, true) 254 } 255 any = m.Any(func(key interface{}, value interface{}) bool { 256 return value.(int) == 4 257 }) 258 if any != false { 259 t.Errorf("Got %v expected %v", any, false) 260 } 261 } 262 263 func TestMapAll(t *testing.T) { 264 m := NewWith(util.StringComparator, util.IntComparator) 265 m.Put("c", 3) 266 m.Put("a", 1) 267 m.Put("b", 2) 268 all := m.All(func(key interface{}, value interface{}) bool { 269 return key.(string) >= "a" && key.(string) <= "c" 270 }) 271 if all != true { 272 t.Errorf("Got %v expected %v", all, true) 273 } 274 all = m.All(func(key interface{}, value interface{}) bool { 275 return key.(string) >= "a" && key.(string) <= "b" 276 }) 277 if all != false { 278 t.Errorf("Got %v expected %v", all, false) 279 } 280 } 281 282 func TestMapFind(t *testing.T) { 283 m := NewWith(util.StringComparator, util.IntComparator) 284 m.Put("c", 3) 285 m.Put("a", 1) 286 m.Put("b", 2) 287 foundKey, foundValue := m.Find(func(key interface{}, value interface{}) bool { 288 return key.(string) == "c" 289 }) 290 if foundKey != "c" || foundValue != 3 { 291 t.Errorf("Got %v -> %v expected %v -> %v", foundKey, foundValue, "c", 3) 292 } 293 foundKey, foundValue = m.Find(func(key interface{}, value interface{}) bool { 294 return key.(string) == "x" 295 }) 296 if foundKey != nil || foundValue != nil { 297 t.Errorf("Got %v at %v expected %v at %v", foundValue, foundKey, nil, nil) 298 } 299 } 300 301 func TestMapChaining(t *testing.T) { 302 m := NewWith(util.StringComparator, util.IntComparator) 303 m.Put("c", 3) 304 m.Put("a", 1) 305 m.Put("b", 2) 306 chainedMap := m.Select(func(key interface{}, value interface{}) bool { 307 return value.(int) > 1 308 }).Map(func(key interface{}, value interface{}) (interface{}, interface{}) { 309 return key.(string) + key.(string), value.(int) * value.(int) 310 }) 311 if actualValue := chainedMap.Size(); actualValue != 2 { 312 t.Errorf("Got %v expected %v", actualValue, 2) 313 } 314 if actualValue, found := chainedMap.Get("aa"); actualValue != nil || found { 315 t.Errorf("Got %v expected %v", actualValue, nil) 316 } 317 if actualValue, found := chainedMap.Get("bb"); actualValue != 4 || !found { 318 t.Errorf("Got %v expected %v", actualValue, 4) 319 } 320 if actualValue, found := chainedMap.Get("cc"); actualValue != 9 || !found { 321 t.Errorf("Got %v expected %v", actualValue, 9) 322 } 323 } 324 325 func TestMapIteratorNextOnEmpty(t *testing.T) { 326 m := NewWithStringComparators() 327 it := m.Iterator() 328 it = m.Iterator() 329 for it.Next() { 330 t.Errorf("Shouldn't iterate on empty map") 331 } 332 } 333 334 func TestMapIteratorPrevOnEmpty(t *testing.T) { 335 m := NewWithStringComparators() 336 it := m.Iterator() 337 it = m.Iterator() 338 for it.Prev() { 339 t.Errorf("Shouldn't iterate on empty map") 340 } 341 } 342 343 func TestMapIteratorNext(t *testing.T) { 344 m := NewWith(util.StringComparator, util.IntComparator) 345 m.Put("c", 3) 346 m.Put("a", 1) 347 m.Put("b", 2) 348 349 it := m.Iterator() 350 count := 0 351 for it.Next() { 352 count++ 353 key := it.Key() 354 value := it.Value() 355 switch key { 356 case "a": 357 if actualValue, expectedValue := value, 1; actualValue != expectedValue { 358 t.Errorf("Got %v expected %v", actualValue, expectedValue) 359 } 360 case "b": 361 if actualValue, expectedValue := value, 2; actualValue != expectedValue { 362 t.Errorf("Got %v expected %v", actualValue, expectedValue) 363 } 364 case "c": 365 if actualValue, expectedValue := value, 3; actualValue != expectedValue { 366 t.Errorf("Got %v expected %v", actualValue, expectedValue) 367 } 368 default: 369 t.Errorf("Too many") 370 } 371 if actualValue, expectedValue := value, count; actualValue != expectedValue { 372 t.Errorf("Got %v expected %v", actualValue, expectedValue) 373 } 374 } 375 if actualValue, expectedValue := count, 3; actualValue != expectedValue { 376 t.Errorf("Got %v expected %v", actualValue, expectedValue) 377 } 378 } 379 380 func TestMapIteratorPrev(t *testing.T) { 381 m := NewWith(util.StringComparator, util.IntComparator) 382 m.Put("c", 3) 383 m.Put("a", 1) 384 m.Put("b", 2) 385 386 it := m.Iterator() 387 for it.Next() { 388 } 389 countDown := m.Size() 390 for it.Prev() { 391 key := it.Key() 392 value := it.Value() 393 switch key { 394 case "a": 395 if actualValue, expectedValue := value, 1; actualValue != expectedValue { 396 t.Errorf("Got %v expected %v", actualValue, expectedValue) 397 } 398 case "b": 399 if actualValue, expectedValue := value, 2; actualValue != expectedValue { 400 t.Errorf("Got %v expected %v", actualValue, expectedValue) 401 } 402 case "c": 403 if actualValue, expectedValue := value, 3; actualValue != expectedValue { 404 t.Errorf("Got %v expected %v", actualValue, expectedValue) 405 } 406 default: 407 t.Errorf("Too many") 408 } 409 if actualValue, expectedValue := value, countDown; actualValue != expectedValue { 410 t.Errorf("Got %v expected %v", actualValue, expectedValue) 411 } 412 countDown-- 413 } 414 if actualValue, expectedValue := countDown, 0; actualValue != expectedValue { 415 t.Errorf("Got %v expected %v", actualValue, expectedValue) 416 } 417 } 418 419 func TestMapIteratorBegin(t *testing.T) { 420 m := NewWith(util.IntComparator, util.StringComparator) 421 it := m.Iterator() 422 it.Begin() 423 m.Put(3, "c") 424 m.Put(1, "a") 425 m.Put(2, "b") 426 for it.Next() { 427 } 428 it.Begin() 429 it.Next() 430 if key, value := it.Key(), it.Value(); key != 1 || value != "a" { 431 t.Errorf("Got %v,%v expected %v,%v", key, value, 1, "a") 432 } 433 } 434 435 func TestMapTreeIteratorEnd(t *testing.T) { 436 m := NewWith(util.IntComparator, util.StringComparator) 437 it := m.Iterator() 438 m.Put(3, "c") 439 m.Put(1, "a") 440 m.Put(2, "b") 441 it.End() 442 it.Prev() 443 if key, value := it.Key(), it.Value(); key != 3 || value != "c" { 444 t.Errorf("Got %v,%v expected %v,%v", key, value, 3, "c") 445 } 446 } 447 448 func TestMapIteratorFirst(t *testing.T) { 449 m := NewWith(util.IntComparator, util.StringComparator) 450 m.Put(3, "c") 451 m.Put(1, "a") 452 m.Put(2, "b") 453 it := m.Iterator() 454 if actualValue, expectedValue := it.First(), true; actualValue != expectedValue { 455 t.Errorf("Got %v expected %v", actualValue, expectedValue) 456 } 457 if key, value := it.Key(), it.Value(); key != 1 || value != "a" { 458 t.Errorf("Got %v,%v expected %v,%v", key, value, 1, "a") 459 } 460 } 461 462 func TestMapIteratorLast(t *testing.T) { 463 m := NewWith(util.IntComparator, util.StringComparator) 464 m.Put(3, "c") 465 m.Put(1, "a") 466 m.Put(2, "b") 467 it := m.Iterator() 468 if actualValue, expectedValue := it.Last(), true; actualValue != expectedValue { 469 t.Errorf("Got %v expected %v", actualValue, expectedValue) 470 } 471 if key, value := it.Key(), it.Value(); key != 3 || value != "c" { 472 t.Errorf("Got %v,%v expected %v,%v", key, value, 3, "c") 473 } 474 } 475 476 func TestMapSerialization(t *testing.T) { 477 for i := 0; i < 10; i++ { 478 original := NewWith(util.StringComparator, util.StringComparator) 479 original.Put("d", "4") 480 original.Put("e", "5") 481 original.Put("c", "3") 482 original.Put("b", "2") 483 original.Put("a", "1") 484 485 assertSerialization(original, "A", t) 486 487 serialized, err := original.ToJSON() 488 if err != nil { 489 t.Errorf("Got error %v", err) 490 } 491 assertSerialization(original, "B", t) 492 493 deserialized := NewWith(util.StringComparator, util.StringComparator) 494 err = deserialized.FromJSON(serialized) 495 if err != nil { 496 t.Errorf("Got error %v", err) 497 } 498 assertSerialization(deserialized, "C", t) 499 } 500 } 501 502 //noinspection GoBoolExpressions 503 func assertSerialization(m *Map, txt string, t *testing.T) { 504 if actualValue := m.Keys(); false || 505 actualValue[0].(string) != "a" || 506 actualValue[1].(string) != "b" || 507 actualValue[2].(string) != "c" || 508 actualValue[3].(string) != "d" || 509 actualValue[4].(string) != "e" { 510 t.Errorf("[%s] Got %v expected %v", txt, actualValue, "[a,b,c,d,e]") 511 } 512 if actualValue := m.Values(); false || 513 actualValue[0].(string) != "1" || 514 actualValue[1].(string) != "2" || 515 actualValue[2].(string) != "3" || 516 actualValue[3].(string) != "4" || 517 actualValue[4].(string) != "5" { 518 t.Errorf("[%s] Got %v expected %v", txt, actualValue, "[1,2,3,4,5]") 519 } 520 if actualValue, expectedValue := m.Size(), 5; actualValue != expectedValue { 521 t.Errorf("[%s] Got %v expected %v", txt, actualValue, expectedValue) 522 } 523 } 524 525 func benchmarkGet(b *testing.B, m *Map, size int) { 526 for i := 0; i < b.N; i++ { 527 for n := 0; n < size; n++ { 528 m.Get(n) 529 } 530 } 531 } 532 533 func benchmarkPut(b *testing.B, m *Map, size int) { 534 for i := 0; i < b.N; i++ { 535 for n := 0; n < size; n++ { 536 m.Put(n, n) 537 } 538 } 539 } 540 541 func benchmarkRemove(b *testing.B, m *Map, size int) { 542 for i := 0; i < b.N; i++ { 543 for n := 0; n < size; n++ { 544 m.Remove(n) 545 } 546 } 547 } 548 549 func BenchmarkTreeBidiMapGet100(b *testing.B) { 550 b.StopTimer() 551 size := 100 552 m := NewWithIntComparators() 553 for n := 0; n < size; n++ { 554 m.Put(n, n) 555 } 556 b.StartTimer() 557 benchmarkGet(b, m, size) 558 } 559 560 func BenchmarkTreeBidiMapGet1000(b *testing.B) { 561 b.StopTimer() 562 size := 1000 563 m := NewWithIntComparators() 564 for n := 0; n < size; n++ { 565 m.Put(n, n) 566 } 567 b.StartTimer() 568 benchmarkGet(b, m, size) 569 } 570 571 func BenchmarkTreeBidiMapGet10000(b *testing.B) { 572 b.StopTimer() 573 size := 10000 574 m := NewWithIntComparators() 575 for n := 0; n < size; n++ { 576 m.Put(n, n) 577 } 578 b.StartTimer() 579 benchmarkGet(b, m, size) 580 } 581 582 func BenchmarkTreeBidiMapGet100000(b *testing.B) { 583 b.StopTimer() 584 size := 100000 585 m := NewWithIntComparators() 586 for n := 0; n < size; n++ { 587 m.Put(n, n) 588 } 589 b.StartTimer() 590 benchmarkGet(b, m, size) 591 } 592 593 func BenchmarkTreeBidiMapPut100(b *testing.B) { 594 b.StopTimer() 595 size := 100 596 m := NewWithIntComparators() 597 b.StartTimer() 598 benchmarkPut(b, m, size) 599 } 600 601 func BenchmarkTreeBidiMapPut1000(b *testing.B) { 602 b.StopTimer() 603 size := 1000 604 m := NewWithIntComparators() 605 for n := 0; n < size; n++ { 606 m.Put(n, n) 607 } 608 b.StartTimer() 609 benchmarkPut(b, m, size) 610 } 611 612 func BenchmarkTreeBidiMapPut10000(b *testing.B) { 613 b.StopTimer() 614 size := 10000 615 m := NewWithIntComparators() 616 for n := 0; n < size; n++ { 617 m.Put(n, n) 618 } 619 b.StartTimer() 620 benchmarkPut(b, m, size) 621 } 622 623 func BenchmarkTreeBidiMapPut100000(b *testing.B) { 624 b.StopTimer() 625 size := 100000 626 m := NewWithIntComparators() 627 for n := 0; n < size; n++ { 628 m.Put(n, n) 629 } 630 b.StartTimer() 631 benchmarkPut(b, m, size) 632 } 633 634 func BenchmarkTreeBidiMapRemove100(b *testing.B) { 635 b.StopTimer() 636 size := 100 637 m := NewWithIntComparators() 638 for n := 0; n < size; n++ { 639 m.Put(n, n) 640 } 641 b.StartTimer() 642 benchmarkRemove(b, m, size) 643 } 644 645 func BenchmarkTreeBidiMapRemove1000(b *testing.B) { 646 b.StopTimer() 647 size := 1000 648 m := NewWithIntComparators() 649 for n := 0; n < size; n++ { 650 m.Put(n, n) 651 } 652 b.StartTimer() 653 benchmarkRemove(b, m, size) 654 } 655 656 func BenchmarkTreeBidiMapRemove10000(b *testing.B) { 657 b.StopTimer() 658 size := 10000 659 m := NewWithIntComparators() 660 for n := 0; n < size; n++ { 661 m.Put(n, n) 662 } 663 b.StartTimer() 664 benchmarkRemove(b, m, size) 665 } 666 667 func BenchmarkTreeBidiMapRemove100000(b *testing.B) { 668 b.StopTimer() 669 size := 100000 670 m := NewWithIntComparators() 671 for n := 0; n < size; n++ { 672 m.Put(n, n) 673 } 674 b.StartTimer() 675 benchmarkRemove(b, m, size) 676 }