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 }