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  }