(t *testing.T)
| 285 | } |
| 286 | |
| 287 | func TestRandom(t *testing.T) { |
| 288 | test := func(t *testing.T, m *Map[int, int]) { |
| 289 | e := make(map[int]int) |
| 290 | for i := 0; i < 10000; i++ { |
| 291 | switch r := rand.Float64(); { |
| 292 | case r < 0.5: // 50% inserts |
| 293 | k, v := rand.Int(), rand.Int() |
| 294 | m.Put(k, v) |
| 295 | e[k] = v |
| 296 | case r < 0.65: // 15% updates |
| 297 | if k, _, ok := m.randElement(); !ok { |
| 298 | require.EqualValues(t, 0, m.Len(), e) |
| 299 | } else { |
| 300 | v := rand.Int() |
| 301 | m.Put(k, v) |
| 302 | e[k] = v |
| 303 | } |
| 304 | case r < 0.80: // 15% deletes |
| 305 | if k, _, ok := m.randElement(); !ok { |
| 306 | require.EqualValues(t, 0, m.Len(), e) |
| 307 | } else { |
| 308 | m.Delete(k) |
| 309 | delete(e, k) |
| 310 | } |
| 311 | case r < 0.95: // 25% lookups |
| 312 | if k, v, ok := m.randElement(); !ok { |
| 313 | require.EqualValues(t, 0, m.Len(), e) |
| 314 | } else { |
| 315 | require.EqualValues(t, e[k], v) |
| 316 | } |
| 317 | default: // 5% rehash in place and iterate |
| 318 | i := rand.Intn(int(m.bucketCount())) |
| 319 | m.dir.At(uintptr(i)).rehashInPlace(m) |
| 320 | require.Equal(t, e, m.toBuiltinMap()) |
| 321 | } |
| 322 | require.EqualValues(t, len(e), m.Len()) |
| 323 | } |
| 324 | } |
| 325 | |
| 326 | t.Run("normal", func(t *testing.T) { |
| 327 | test(t, New[int, int](0)) |
| 328 | }) |
| 329 | |
| 330 | t.Run("degenerate", func(t *testing.T) { |
| 331 | testDegenerate := func(t *testing.T, h uintptr) { |
| 332 | m := New[int, int](0, |
| 333 | WithHash[int, int](func(key *int, seed uintptr) uintptr { |
| 334 | return h |
| 335 | }), |
| 336 | WithMaxBucketCapacity[int, int](512)) |
| 337 | test(t, m) |
| 338 | } |
| 339 | |
| 340 | for _, v := range []uintptr{0, ^uintptr(0)} { |
| 341 | t.Run(fmt.Sprintf("%016x", v), func(t *testing.T) { |
| 342 | testDegenerate(t, v) |
| 343 | }) |
| 344 | } |
nothing calls this directly
no test coverage detected
searching dependent graphs…