github.com/mymmsc/gox@v1.3.33/util/linkedhashset/linkedhashset_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 linkedhashset
     6  
     7  import (
     8  	"fmt"
     9  	"testing"
    10  )
    11  
    12  func TestSetNew(t *testing.T) {
    13  	set := New(2, 1)
    14  	if actualValue := set.Size(); actualValue != 2 {
    15  		t.Errorf("Got %v expected %v", actualValue, 2)
    16  	}
    17  	values := set.Values()
    18  	if actualValue := values[0]; actualValue != 2 {
    19  		t.Errorf("Got %v expected %v", actualValue, 2)
    20  	}
    21  	if actualValue := values[1]; actualValue != 1 {
    22  		t.Errorf("Got %v expected %v", actualValue, 1)
    23  	}
    24  }
    25  
    26  func TestSetAdd(t *testing.T) {
    27  	set := New()
    28  	set.Add()
    29  	set.Add(1)
    30  	set.Add(2)
    31  	set.Add(2, 3)
    32  	set.Add()
    33  	if actualValue := set.Empty(); actualValue != false {
    34  		t.Errorf("Got %v expected %v", actualValue, false)
    35  	}
    36  	if actualValue := set.Size(); actualValue != 3 {
    37  		t.Errorf("Got %v expected %v", actualValue, 3)
    38  	}
    39  }
    40  
    41  func TestSetContains(t *testing.T) {
    42  	set := New()
    43  	set.Add(3, 1, 2)
    44  	set.Add(2, 3)
    45  	set.Add()
    46  	if actualValue := set.Contains(); actualValue != true {
    47  		t.Errorf("Got %v expected %v", actualValue, true)
    48  	}
    49  	if actualValue := set.Contains(1); actualValue != true {
    50  		t.Errorf("Got %v expected %v", actualValue, true)
    51  	}
    52  	if actualValue := set.Contains(1, 2, 3); actualValue != true {
    53  		t.Errorf("Got %v expected %v", actualValue, true)
    54  	}
    55  	if actualValue := set.Contains(1, 2, 3, 4); actualValue != false {
    56  		t.Errorf("Got %v expected %v", actualValue, false)
    57  	}
    58  }
    59  
    60  func TestSetRemove(t *testing.T) {
    61  	set := New()
    62  	set.Add(3, 1, 2)
    63  	set.Remove()
    64  	if actualValue := set.Size(); actualValue != 3 {
    65  		t.Errorf("Got %v expected %v", actualValue, 3)
    66  	}
    67  	set.Remove(1)
    68  	if actualValue := set.Size(); actualValue != 2 {
    69  		t.Errorf("Got %v expected %v", actualValue, 2)
    70  	}
    71  	set.Remove(3)
    72  	set.Remove(3)
    73  	set.Remove()
    74  	set.Remove(2)
    75  	if actualValue := set.Size(); actualValue != 0 {
    76  		t.Errorf("Got %v expected %v", actualValue, 0)
    77  	}
    78  }
    79  
    80  func TestSetEach(t *testing.T) {
    81  	set := New()
    82  	set.Add("c", "a", "b")
    83  	set.Each(func(index int, value interface{}) {
    84  		switch index {
    85  		case 0:
    86  			if actualValue, expectedValue := value, "c"; actualValue != expectedValue {
    87  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
    88  			}
    89  		case 1:
    90  			if actualValue, expectedValue := value, "a"; actualValue != expectedValue {
    91  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
    92  			}
    93  		case 2:
    94  			if actualValue, expectedValue := value, "b"; actualValue != expectedValue {
    95  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
    96  			}
    97  		default:
    98  			t.Errorf("Too many")
    99  		}
   100  	})
   101  }
   102  
   103  func TestSetMap(t *testing.T) {
   104  	set := New()
   105  	set.Add("c", "a", "b")
   106  	mappedSet := set.Map(func(index int, value interface{}) interface{} {
   107  		return "mapped: " + value.(string)
   108  	})
   109  	if actualValue, expectedValue := mappedSet.Contains("mapped: c", "mapped: b", "mapped: a"), true; actualValue != expectedValue {
   110  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   111  	}
   112  	if actualValue, expectedValue := mappedSet.Contains("mapped: c", "mapped: b", "mapped: x"), false; actualValue != expectedValue {
   113  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   114  	}
   115  	if mappedSet.Size() != 3 {
   116  		t.Errorf("Got %v expected %v", mappedSet.Size(), 3)
   117  	}
   118  }
   119  
   120  func TestSetSelect(t *testing.T) {
   121  	set := New()
   122  	set.Add("c", "a", "b")
   123  	selectedSet := set.Select(func(index int, value interface{}) bool {
   124  		return value.(string) >= "a" && value.(string) <= "b"
   125  	})
   126  	if actualValue, expectedValue := selectedSet.Contains("a", "b"), true; actualValue != expectedValue {
   127  		fmt.Println("A: ", selectedSet.Contains("b"))
   128  		t.Errorf("Got %v (%v) expected %v (%v)", actualValue, selectedSet.Values(), expectedValue, "[a b]")
   129  	}
   130  	if actualValue, expectedValue := selectedSet.Contains("a", "b", "c"), false; actualValue != expectedValue {
   131  		t.Errorf("Got %v (%v) expected %v (%v)", actualValue, selectedSet.Values(), expectedValue, "[a b]")
   132  	}
   133  	if selectedSet.Size() != 2 {
   134  		t.Errorf("Got %v expected %v", selectedSet.Size(), 3)
   135  	}
   136  }
   137  
   138  func TestSetAny(t *testing.T) {
   139  	set := New()
   140  	set.Add("c", "a", "b")
   141  	any := set.Any(func(index int, value interface{}) bool {
   142  		return value.(string) == "c"
   143  	})
   144  	if any != true {
   145  		t.Errorf("Got %v expected %v", any, true)
   146  	}
   147  	any = set.Any(func(index int, value interface{}) bool {
   148  		return value.(string) == "x"
   149  	})
   150  	if any != false {
   151  		t.Errorf("Got %v expected %v", any, false)
   152  	}
   153  }
   154  
   155  func TestSetAll(t *testing.T) {
   156  	set := New()
   157  	set.Add("c", "a", "b")
   158  	all := set.All(func(index int, value interface{}) bool {
   159  		return value.(string) >= "a" && value.(string) <= "c"
   160  	})
   161  	if all != true {
   162  		t.Errorf("Got %v expected %v", all, true)
   163  	}
   164  	all = set.All(func(index int, value interface{}) bool {
   165  		return value.(string) >= "a" && value.(string) <= "b"
   166  	})
   167  	if all != false {
   168  		t.Errorf("Got %v expected %v", all, false)
   169  	}
   170  }
   171  
   172  func TestSetFind(t *testing.T) {
   173  	set := New()
   174  	set.Add("c", "a", "b")
   175  	foundIndex, foundValue := set.Find(func(index int, value interface{}) bool {
   176  		return value.(string) == "c"
   177  	})
   178  	if foundValue != "c" || foundIndex != 0 {
   179  		t.Errorf("Got %v at %v expected %v at %v", foundValue, foundIndex, "c", 0)
   180  	}
   181  	foundIndex, foundValue = set.Find(func(index int, value interface{}) bool {
   182  		return value.(string) == "x"
   183  	})
   184  	if foundValue != nil || foundIndex != -1 {
   185  		t.Errorf("Got %v at %v expected %v at %v", foundValue, foundIndex, nil, nil)
   186  	}
   187  }
   188  
   189  func TestSetChaining(t *testing.T) {
   190  	set := New()
   191  	set.Add("c", "a", "b")
   192  }
   193  
   194  func TestSetIteratorPrevOnEmpty(t *testing.T) {
   195  	set := New()
   196  	it := set.Iterator()
   197  	for it.Prev() {
   198  		t.Errorf("Shouldn't iterate on empty set")
   199  	}
   200  }
   201  
   202  func TestSetIteratorNext(t *testing.T) {
   203  	set := New()
   204  	set.Add("c", "a", "b")
   205  	it := set.Iterator()
   206  	count := 0
   207  	for it.Next() {
   208  		count++
   209  		index := it.Index()
   210  		value := it.Value()
   211  		switch index {
   212  		case 0:
   213  			if actualValue, expectedValue := value, "c"; actualValue != expectedValue {
   214  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   215  			}
   216  		case 1:
   217  			if actualValue, expectedValue := value, "a"; actualValue != expectedValue {
   218  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   219  			}
   220  		case 2:
   221  			if actualValue, expectedValue := value, "b"; actualValue != expectedValue {
   222  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   223  			}
   224  		default:
   225  			t.Errorf("Too many")
   226  		}
   227  		if actualValue, expectedValue := index, count-1; actualValue != expectedValue {
   228  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   229  		}
   230  	}
   231  	if actualValue, expectedValue := count, 3; actualValue != expectedValue {
   232  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   233  	}
   234  }
   235  
   236  func TestSetIteratorPrev(t *testing.T) {
   237  	set := New()
   238  	set.Add("c", "a", "b")
   239  	it := set.Iterator()
   240  	for it.Prev() {
   241  	}
   242  	count := 0
   243  	for it.Next() {
   244  		count++
   245  		index := it.Index()
   246  		value := it.Value()
   247  		switch index {
   248  		case 0:
   249  			if actualValue, expectedValue := value, "c"; actualValue != expectedValue {
   250  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   251  			}
   252  		case 1:
   253  			if actualValue, expectedValue := value, "a"; actualValue != expectedValue {
   254  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   255  			}
   256  		case 2:
   257  			if actualValue, expectedValue := value, "b"; actualValue != expectedValue {
   258  				t.Errorf("Got %v expected %v", actualValue, expectedValue)
   259  			}
   260  		default:
   261  			t.Errorf("Too many")
   262  		}
   263  		if actualValue, expectedValue := index, count-1; actualValue != expectedValue {
   264  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   265  		}
   266  	}
   267  	if actualValue, expectedValue := count, 3; actualValue != expectedValue {
   268  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   269  	}
   270  }
   271  
   272  func TestSetIteratorBegin(t *testing.T) {
   273  	set := New()
   274  	it := set.Iterator()
   275  	it.Begin()
   276  	set.Add("a", "b", "c")
   277  	for it.Next() {
   278  	}
   279  	it.Begin()
   280  	it.Next()
   281  	if index, value := it.Index(), it.Value(); index != 0 || value != "a" {
   282  		t.Errorf("Got %v,%v expected %v,%v", index, value, 0, "a")
   283  	}
   284  }
   285  
   286  func TestSetIteratorEnd(t *testing.T) {
   287  	set := New()
   288  	it := set.Iterator()
   289  
   290  	if index := it.Index(); index != -1 {
   291  		t.Errorf("Got %v expected %v", index, -1)
   292  	}
   293  
   294  	it.End()
   295  	if index := it.Index(); index != 0 {
   296  		t.Errorf("Got %v expected %v", index, 0)
   297  	}
   298  
   299  	set.Add("a", "b", "c")
   300  	it.End()
   301  	if index := it.Index(); index != set.Size() {
   302  		t.Errorf("Got %v expected %v", index, set.Size())
   303  	}
   304  
   305  	it.Prev()
   306  	if index, value := it.Index(), it.Value(); index != set.Size()-1 || value != "c" {
   307  		t.Errorf("Got %v,%v expected %v,%v", index, value, set.Size()-1, "c")
   308  	}
   309  }
   310  
   311  func TestSetIteratorFirst(t *testing.T) {
   312  	set := New()
   313  	set.Add("a", "b", "c")
   314  	it := set.Iterator()
   315  	if actualValue, expectedValue := it.First(), true; actualValue != expectedValue {
   316  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   317  	}
   318  	if index, value := it.Index(), it.Value(); index != 0 || value != "a" {
   319  		t.Errorf("Got %v,%v expected %v,%v", index, value, 0, "a")
   320  	}
   321  }
   322  
   323  func TestSetIteratorLast(t *testing.T) {
   324  	set := New()
   325  	set.Add("a", "b", "c")
   326  	it := set.Iterator()
   327  	if actualValue, expectedValue := it.Last(), true; actualValue != expectedValue {
   328  		t.Errorf("Got %v expected %v", actualValue, expectedValue)
   329  	}
   330  	if index, value := it.Index(), it.Value(); index != 2 || value != "c" {
   331  		t.Errorf("Got %v,%v expected %v,%v", index, value, 3, "c")
   332  	}
   333  }
   334  
   335  func TestSetSerialization(t *testing.T) {
   336  	set := New()
   337  	set.Add("a", "b", "c")
   338  
   339  	var err error
   340  	assert := func() {
   341  		if actualValue, expectedValue := set.Size(), 3; actualValue != expectedValue {
   342  			t.Errorf("Got %v expected %v", actualValue, expectedValue)
   343  		}
   344  		if actualValue := set.Contains("a", "b", "c"); actualValue != true {
   345  			t.Errorf("Got %v expected %v", actualValue, true)
   346  		}
   347  		if err != nil {
   348  			t.Errorf("Got error %v", err)
   349  		}
   350  	}
   351  
   352  	assert()
   353  
   354  	json, err := set.ToJSON()
   355  	assert()
   356  
   357  	err = set.FromJSON(json)
   358  	assert()
   359  }
   360  
   361  func benchmarkContains(b *testing.B, set *Set, size int) {
   362  	for i := 0; i < b.N; i++ {
   363  		for n := 0; n < size; n++ {
   364  			set.Contains(n)
   365  		}
   366  	}
   367  }
   368  
   369  func benchmarkAdd(b *testing.B, set *Set, size int) {
   370  	for i := 0; i < b.N; i++ {
   371  		for n := 0; n < size; n++ {
   372  			set.Add(n)
   373  		}
   374  	}
   375  }
   376  
   377  func benchmarkRemove(b *testing.B, set *Set, size int) {
   378  	for i := 0; i < b.N; i++ {
   379  		for n := 0; n < size; n++ {
   380  			set.Remove(n)
   381  		}
   382  	}
   383  }
   384  
   385  func BenchmarkHashSetContains100(b *testing.B) {
   386  	b.StopTimer()
   387  	size := 100
   388  	set := New()
   389  	for n := 0; n < size; n++ {
   390  		set.Add(n)
   391  	}
   392  	b.StartTimer()
   393  	benchmarkContains(b, set, size)
   394  }
   395  
   396  func BenchmarkHashSetContains1000(b *testing.B) {
   397  	b.StopTimer()
   398  	size := 1000
   399  	set := New()
   400  	for n := 0; n < size; n++ {
   401  		set.Add(n)
   402  	}
   403  	b.StartTimer()
   404  	benchmarkContains(b, set, size)
   405  }
   406  
   407  func BenchmarkHashSetContains10000(b *testing.B) {
   408  	b.StopTimer()
   409  	size := 10000
   410  	set := New()
   411  	for n := 0; n < size; n++ {
   412  		set.Add(n)
   413  	}
   414  	b.StartTimer()
   415  	benchmarkContains(b, set, size)
   416  }
   417  
   418  func BenchmarkHashSetContains100000(b *testing.B) {
   419  	b.StopTimer()
   420  	size := 100000
   421  	set := New()
   422  	for n := 0; n < size; n++ {
   423  		set.Add(n)
   424  	}
   425  	b.StartTimer()
   426  	benchmarkContains(b, set, size)
   427  }
   428  
   429  func BenchmarkHashSetAdd100(b *testing.B) {
   430  	b.StopTimer()
   431  	size := 100
   432  	set := New()
   433  	b.StartTimer()
   434  	benchmarkAdd(b, set, size)
   435  }
   436  
   437  func BenchmarkHashSetAdd1000(b *testing.B) {
   438  	b.StopTimer()
   439  	size := 1000
   440  	set := New()
   441  	for n := 0; n < size; n++ {
   442  		set.Add(n)
   443  	}
   444  	b.StartTimer()
   445  	benchmarkAdd(b, set, size)
   446  }
   447  
   448  func BenchmarkHashSetAdd10000(b *testing.B) {
   449  	b.StopTimer()
   450  	size := 10000
   451  	set := New()
   452  	for n := 0; n < size; n++ {
   453  		set.Add(n)
   454  	}
   455  	b.StartTimer()
   456  	benchmarkAdd(b, set, size)
   457  }
   458  
   459  func BenchmarkHashSetAdd100000(b *testing.B) {
   460  	b.StopTimer()
   461  	size := 100000
   462  	set := New()
   463  	for n := 0; n < size; n++ {
   464  		set.Add(n)
   465  	}
   466  	b.StartTimer()
   467  	benchmarkAdd(b, set, size)
   468  }
   469  
   470  func BenchmarkHashSetRemove100(b *testing.B) {
   471  	b.StopTimer()
   472  	size := 100
   473  	set := New()
   474  	for n := 0; n < size; n++ {
   475  		set.Add(n)
   476  	}
   477  	b.StartTimer()
   478  	benchmarkRemove(b, set, size)
   479  }
   480  
   481  func BenchmarkHashSetRemove1000(b *testing.B) {
   482  	b.StopTimer()
   483  	size := 1000
   484  	set := New()
   485  	for n := 0; n < size; n++ {
   486  		set.Add(n)
   487  	}
   488  	b.StartTimer()
   489  	benchmarkRemove(b, set, size)
   490  }
   491  
   492  func BenchmarkHashSetRemove10000(b *testing.B) {
   493  	b.StopTimer()
   494  	size := 10000
   495  	set := New()
   496  	for n := 0; n < size; n++ {
   497  		set.Add(n)
   498  	}
   499  	b.StartTimer()
   500  	benchmarkRemove(b, set, size)
   501  }
   502  
   503  func BenchmarkHashSetRemove100000(b *testing.B) {
   504  	b.StopTimer()
   505  	size := 100000
   506  	set := New()
   507  	for n := 0; n < size; n++ {
   508  		set.Add(n)
   509  	}
   510  	b.StartTimer()
   511  	benchmarkRemove(b, set, size)
   512  }