github.com/noypi/mapk@v0.0.0-20171114041530-c9a62862a92b/map_test.go (about)

     1  package mapk_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/noypi/mapk"
     8  	assertpkg "github.com/stretchr/testify/assert"
     9  )
    10  
    11  type _kv struct {
    12  	k, v string
    13  }
    14  
    15  func testmap01(m mapk.IMap, t *testing.T) {
    16  	assert := assertpkg.New(t)
    17  
    18  	m.Put("sa1", "v1")
    19  	assert.Equal("v1", m.Get("sa1"))
    20  	assert.Equal(1, m.Len())
    21  
    22  	m.Put("sa1", "v2")
    23  	assert.Equal("v2", m.Get("sa1"))
    24  	assert.Equal(1, m.Len())
    25  
    26  	kvsexpected := []_kv{
    27  		_kv{"sa1", "v100"},
    28  		_kv{"sb3", "v3"},
    29  		_kv{"sc4", "v4"},
    30  		_kv{"sd5", "v5"},
    31  		_kv{"se6", "v6"},
    32  	}
    33  	for _, v := range kvsexpected {
    34  		m.Put(v.k, v.v)
    35  	}
    36  	assert.Equal(len(kvsexpected), m.Len())
    37  
    38  	kvs := []_kv{}
    39  	m.Each(func(a, b interface{}) bool {
    40  		kvs = append(kvs, _kv{a.(string), b.(string)})
    41  		return true
    42  	})
    43  	for i := 0; i < len(kvsexpected); i++ {
    44  		assert.Equal(kvsexpected[i], kvs[i])
    45  	}
    46  
    47  	kvs = []_kv{}
    48  	m.EachFrom("sc", func(a, b interface{}) bool {
    49  		kvs = append(kvs, _kv{a.(string), b.(string)})
    50  		return true
    51  	})
    52  
    53  	expected := kvsexpected[2:]
    54  	assert.Equal(len(expected), len(kvs))
    55  	for i := 0; i < len(expected); i++ {
    56  		assert.Equal(expected[i], kvs[i])
    57  	}
    58  }
    59  
    60  func TestMap01_Gtreap(t *testing.T) {
    61  	m := mapk.MapGTreap(func(a, b interface{}) int {
    62  		return strings.Compare(a.(string), b.(string))
    63  	})
    64  
    65  	testmap01(m, t)
    66  }
    67  
    68  func TestMap01_ThreadSafe_GTreap(t *testing.T) {
    69  	m := mapk.MapGTreap(func(a, b interface{}) int {
    70  		return strings.Compare(a.(string), b.(string))
    71  	})
    72  
    73  	testmap01(mapk.MakeThreadSafe(m), t)
    74  }
    75  
    76  // Slice Tests
    77  func TestMap01_Slice(t *testing.T) {
    78  	m := mapk.MapSlice(func(a, b interface{}) int {
    79  		return strings.Compare(a.(string), b.(string))
    80  	})
    81  
    82  	testmap01(m, t)
    83  }
    84  
    85  func TestMap01_ThreadSafe_Slice(t *testing.T) {
    86  	m := mapk.MapSlice(func(a, b interface{}) int {
    87  		return strings.Compare(a.(string), b.(string))
    88  	})
    89  
    90  	testmap01(mapk.MakeThreadSafe(m), t)
    91  }
    92  
    93  // Heap tests
    94  func TestMap01_Heap(t *testing.T) {
    95  	m := mapk.MapHeap(func(a, b interface{}) int {
    96  		return strings.Compare(a.(string), b.(string))
    97  	})
    98  
    99  	testmap01(m, t)
   100  }
   101  
   102  func TestMap01_ThreadSafe_Heap(t *testing.T) {
   103  	m := mapk.MapHeap(func(a, b interface{}) int {
   104  		return strings.Compare(a.(string), b.(string))
   105  	})
   106  
   107  	testmap01(mapk.MakeThreadSafe(m), t)
   108  }
   109  
   110  // Bencmarks
   111  
   112  var ttDataTen01 = []_kv{
   113  	_kv{"sa1", "v100"},
   114  	_kv{"sa2", "v100"},
   115  	_kv{"sb3", "v3"},
   116  	_kv{"sc4", "v4"},
   117  	_kv{"sd5", "v5"},
   118  	_kv{"se6", "v6"},
   119  	_kv{"se7", "v6"},
   120  	_kv{"se8", "v6"},
   121  	_kv{"se9", "v6"},
   122  	_kv{"se10", "v6"},
   123  }
   124  
   125  func benchmap_putten(m mapk.IMap) {
   126  	for _, v := range ttDataTen01 {
   127  		m.Put(v.k, v.v)
   128  	}
   129  }
   130  
   131  func benchmap_getten(m mapk.IMap) {
   132  	for _, v := range ttDataTen01 {
   133  		m.Get(v.k)
   134  	}
   135  }
   136  
   137  func benchmap_eachfrompartial7of10(m mapk.IMap) {
   138  	m.EachFrom("sc", func(a, b interface{}) bool {
   139  		return true
   140  	})
   141  }
   142  
   143  func benchmap_eachten(m mapk.IMap) {
   144  	m.Each(func(a, b interface{}) bool {
   145  		return true
   146  	})
   147  }
   148  
   149  func benchmap_delete5of10(m mapk.IMap) {
   150  	m.Delete("sa1")
   151  	m.Delete("se10")
   152  	m.Delete("se6")
   153  	m.Delete("sd5")
   154  	m.Delete("sb3")
   155  	m.Put("sa1", "1")
   156  	m.Put("se10", "1")
   157  	m.Put("se6", "1")
   158  	m.Put("sd5", "1")
   159  	m.Put("sb3", "1")
   160  }
   161  
   162  func BenchmarkPutTen_GTreap(b *testing.B) {
   163  	m := mapk.MapGTreap(func(a, b interface{}) int {
   164  		return strings.Compare(a.(string), b.(string))
   165  	})
   166  	b.ResetTimer()
   167  	for i := 0; i < b.N; i++ {
   168  		benchmap_putten(m)
   169  	}
   170  }
   171  
   172  func BenchmarkGetTen_GTreap(b *testing.B) {
   173  	m := mapk.MapGTreap(func(a, b interface{}) int {
   174  		return strings.Compare(a.(string), b.(string))
   175  	})
   176  	benchmap_putten(m)
   177  	b.ResetTimer()
   178  	for i := 0; i < b.N; i++ {
   179  		benchmap_getten(m)
   180  	}
   181  }
   182  
   183  func BenchmarkEachFrom7of10_GTreap(b *testing.B) {
   184  	m := mapk.MapGTreap(func(a, b interface{}) int {
   185  		return strings.Compare(a.(string), b.(string))
   186  	})
   187  	benchmap_putten(m)
   188  	b.ResetTimer()
   189  	for i := 0; i < b.N; i++ {
   190  		benchmap_eachfrompartial7of10(m)
   191  	}
   192  }
   193  
   194  func BenchmarkEachTen_GTreap(b *testing.B) {
   195  	m := mapk.MapGTreap(func(a, b interface{}) int {
   196  		return strings.Compare(a.(string), b.(string))
   197  	})
   198  	benchmap_putten(m)
   199  	b.ResetTimer()
   200  	for i := 0; i < b.N; i++ {
   201  		benchmap_eachten(m)
   202  	}
   203  }
   204  
   205  func BenchmarkDeleteAdd5of10_GTreap(b *testing.B) {
   206  	m := mapk.MapGTreap(func(a, b interface{}) int {
   207  		return strings.Compare(a.(string), b.(string))
   208  	})
   209  	benchmap_putten(m)
   210  	b.ResetTimer()
   211  	for i := 0; i < b.N; i++ {
   212  		benchmap_delete5of10(m)
   213  	}
   214  }
   215  
   216  // Slice Benchmarks
   217  
   218  func BenchmarkPutTen_Slice(b *testing.B) {
   219  	m := mapk.MapSlice(func(a, b interface{}) int {
   220  		return strings.Compare(a.(string), b.(string))
   221  	})
   222  	b.ResetTimer()
   223  	for i := 0; i < b.N; i++ {
   224  		benchmap_putten(m)
   225  	}
   226  }
   227  
   228  func BenchmarkGetTen_Slice(b *testing.B) {
   229  	m := mapk.MapSlice(func(a, b interface{}) int {
   230  		return strings.Compare(a.(string), b.(string))
   231  	})
   232  	benchmap_putten(m)
   233  	b.ResetTimer()
   234  	for i := 0; i < b.N; i++ {
   235  		benchmap_getten(m)
   236  	}
   237  }
   238  
   239  func BenchmarkEachFrom7of10_Slice(b *testing.B) {
   240  	m := mapk.MapSlice(func(a, b interface{}) int {
   241  		return strings.Compare(a.(string), b.(string))
   242  	})
   243  	benchmap_putten(m)
   244  	b.ResetTimer()
   245  	for i := 0; i < b.N; i++ {
   246  		benchmap_eachfrompartial7of10(m)
   247  	}
   248  }
   249  
   250  func BenchmarkEachTen_Slice(b *testing.B) {
   251  	m := mapk.MapSlice(func(a, b interface{}) int {
   252  		return strings.Compare(a.(string), b.(string))
   253  	})
   254  	benchmap_putten(m)
   255  	b.ResetTimer()
   256  	for i := 0; i < b.N; i++ {
   257  		benchmap_eachten(m)
   258  	}
   259  }
   260  
   261  func BenchmarkDeleteAdd5of10_Slice(b *testing.B) {
   262  	m := mapk.MapSlice(func(a, b interface{}) int {
   263  		return strings.Compare(a.(string), b.(string))
   264  	})
   265  	benchmap_putten(m)
   266  	b.ResetTimer()
   267  	for i := 0; i < b.N; i++ {
   268  		benchmap_delete5of10(m)
   269  	}
   270  }
   271  
   272  // Heap benchmarks
   273  
   274  func BenchmarkPutTen_Heap(b *testing.B) {
   275  	m := mapk.MapHeap(func(a, b interface{}) int {
   276  		return strings.Compare(a.(string), b.(string))
   277  	})
   278  	b.ResetTimer()
   279  	for i := 0; i < b.N; i++ {
   280  		benchmap_putten(m)
   281  	}
   282  }
   283  
   284  func BenchmarkGetTen_Heap(b *testing.B) {
   285  	m := mapk.MapHeap(func(a, b interface{}) int {
   286  		return strings.Compare(a.(string), b.(string))
   287  	})
   288  	benchmap_putten(m)
   289  	b.ResetTimer()
   290  	for i := 0; i < b.N; i++ {
   291  		benchmap_getten(m)
   292  	}
   293  }
   294  
   295  func BenchmarkEachFrom7of10_Heap(b *testing.B) {
   296  	m := mapk.MapHeap(func(a, b interface{}) int {
   297  		return strings.Compare(a.(string), b.(string))
   298  	})
   299  	benchmap_putten(m)
   300  	b.ResetTimer()
   301  	for i := 0; i < b.N; i++ {
   302  		benchmap_eachfrompartial7of10(m)
   303  	}
   304  }
   305  
   306  func BenchmarkEachTen_Heap(b *testing.B) {
   307  	m := mapk.MapHeap(func(a, b interface{}) int {
   308  		return strings.Compare(a.(string), b.(string))
   309  	})
   310  	benchmap_putten(m)
   311  	b.ResetTimer()
   312  	for i := 0; i < b.N; i++ {
   313  		benchmap_eachten(m)
   314  	}
   315  }
   316  
   317  func BenchmarkDeleteAdd5of10_Heap(b *testing.B) {
   318  	m := mapk.MapHeap(func(a, b interface{}) int {
   319  		return strings.Compare(a.(string), b.(string))
   320  	})
   321  	benchmap_putten(m)
   322  	b.ResetTimer()
   323  	for i := 0; i < b.N; i++ {
   324  		benchmap_delete5of10(m)
   325  	}
   326  }
   327  
   328  // Native benchmarks
   329  
   330  func BenchmarkPutTen_Native(b *testing.B) {
   331  	m := map[string]string{}
   332  	b.ResetTimer()
   333  	for i := 0; i < b.N; i++ {
   334  		for _, v := range ttDataTen01 {
   335  			m[v.k] = v.v
   336  		}
   337  	}
   338  }
   339  
   340  func BenchmarkGetTen_Native(b *testing.B) {
   341  	m := map[string]string{}
   342  	for i := 0; i < b.N; i++ {
   343  		for _, v := range ttDataTen01 {
   344  			m[v.k] = v.v
   345  		}
   346  	}
   347  
   348  	b.ResetTimer()
   349  	for i := 0; i < b.N; i++ {
   350  		for _, v := range ttDataTen01 {
   351  			_, _ = m[v.k]
   352  		}
   353  	}
   354  }
   355  
   356  func BenchmarkDeleteAdd5of10_Native(b *testing.B) {
   357  	m := map[string]string{}
   358  	for i := 0; i < b.N; i++ {
   359  		for _, v := range ttDataTen01 {
   360  			m[v.k] = v.v
   361  		}
   362  	}
   363  
   364  	b.ResetTimer()
   365  	for i := 0; i < b.N; i++ {
   366  		delete(m, "sa1")
   367  		delete(m, "se10")
   368  		delete(m, "se6")
   369  		delete(m, "sd5")
   370  		delete(m, "sb3")
   371  		m["sa1"] = "1"
   372  		m["se10"] = "1"
   373  		m["se6"] = "1"
   374  		m["sd5"] = "1"
   375  		m["sb3"] = "1"
   376  	}
   377  }
   378  
   379  func BenchmarkEachFrom_Native_NOT_SUPPORTED(b *testing.B) {
   380  }
   381  
   382  func BenchmarkEachTen_Native(b *testing.B) {
   383  	m := map[string]string{}
   384  	for i := 0; i < b.N; i++ {
   385  		for _, v := range ttDataTen01 {
   386  			m[v.k] = v.v
   387  		}
   388  	}
   389  
   390  	b.ResetTimer()
   391  	for i := 0; i < b.N; i++ {
   392  		for _, _ = range m {
   393  
   394  		}
   395  	}
   396  }