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