| 210 | } |
| 211 | |
| 212 | func TestBasic(t *testing.T) { |
| 213 | test := func(t *testing.T, m *Map[int, int]) { |
| 214 | const count = 100 |
| 215 | |
| 216 | e := make(map[int]int) |
| 217 | require.EqualValues(t, 0, m.Len()) |
| 218 | require.EqualValues(t, 0, m.dir.At(0).growthLeft) |
| 219 | |
| 220 | // Non-existent. |
| 221 | for i := 0; i < count; i++ { |
| 222 | _, ok := m.Get(i) |
| 223 | require.False(t, ok) |
| 224 | } |
| 225 | |
| 226 | // Insert. |
| 227 | for i := 0; i < count; i++ { |
| 228 | m.Put(i, i+count) |
| 229 | e[i] = i + count |
| 230 | v, ok := m.Get(i) |
| 231 | require.True(t, ok) |
| 232 | require.EqualValues(t, i+count, v) |
| 233 | require.EqualValues(t, i+1, m.Len()) |
| 234 | require.Equal(t, e, m.toBuiltinMap()) |
| 235 | } |
| 236 | |
| 237 | // Update. |
| 238 | for i := 0; i < count; i++ { |
| 239 | m.Put(i, i+2*count) |
| 240 | e[i] = i + 2*count |
| 241 | v, ok := m.Get(i) |
| 242 | require.True(t, ok) |
| 243 | require.EqualValues(t, i+2*count, v) |
| 244 | require.EqualValues(t, count, m.Len()) |
| 245 | require.Equal(t, e, m.toBuiltinMap()) |
| 246 | } |
| 247 | |
| 248 | // Delete. |
| 249 | for i := 0; i < count; i++ { |
| 250 | m.Delete(i) |
| 251 | delete(e, i) |
| 252 | require.EqualValues(t, count-i-1, m.Len()) |
| 253 | _, ok := m.Get(i) |
| 254 | require.False(t, ok) |
| 255 | require.Equal(t, e, m.toBuiltinMap()) |
| 256 | } |
| 257 | } |
| 258 | |
| 259 | t.Run("normal", func(t *testing.T) { |
| 260 | test(t, New[int, int](0)) |
| 261 | }) |
| 262 | |
| 263 | t.Run("degenerate", func(t *testing.T) { |
| 264 | testDegenerate := func(t *testing.T, h uintptr) { |
| 265 | m := New[int, int](0, |
| 266 | WithHash[int, int](func(key *int, seed uintptr) uintptr { |
| 267 | return h |
| 268 | }), |
| 269 | WithMaxBucketCapacity[int, int](8)) |