11 "github.com/stretchr/testify/require"
14func TestNewMap(t *testing.T) {
17 m := NewMap[string, int]()
19 require.NotNil(t, m.inner)
20 require.Equal(t, 0, m.Len())
23func TestNewMapFrom(t *testing.T) {
26 original := map[string]int{
31 m := NewMapFrom(original)
33 require.Equal(t, original, m.inner)
34 require.Equal(t, 2, m.Len())
36 value, ok := m.Get("key1")
38 require.Equal(t, 1, value)
41func TestNewLazyMap(t *testing.T) {
44 synctest.Test(t, func(t *testing.T) {
47 waiter := sync.Mutex{}
51 loadFunc := func() map[string]int {
55 return map[string]int{
61 m := NewLazyMap(loadFunc)
64 waiter.Unlock() // Allow the load function to proceed
65 time.Sleep(100 * time.Millisecond)
66 require.True(t, loadCalled)
67 require.Equal(t, 2, m.Len())
69 value, ok := m.Get("key1")
71 require.Equal(t, 1, value)
75func TestMap_Reset(t *testing.T) {
78 m := NewMapFrom(map[string]int{
82 m.Reset(map[string]int{
85 value, ok := m.Get("b")
87 require.Equal(t, 20, value)
88 require.Equal(t, 1, m.Len())
91func TestMap_Set(t *testing.T) {
94 m := NewMap[string, int]()
97 value, ok := m.Get("key1")
99 require.Equal(t, 42, value)
100 require.Equal(t, 1, m.Len())
103 value, ok = m.Get("key1")
105 require.Equal(t, 100, value)
106 require.Equal(t, 1, m.Len())
109func TestMap_GetOrSet(t *testing.T) {
112 m := NewMap[string, int]()
114 require.Equal(t, 42, m.GetOrSet("key1", func() int { return 42 }))
115 require.Equal(t, 42, m.GetOrSet("key1", func() int { return 99999 }))
116 require.Equal(t, 1, m.Len())
119func TestMap_Get(t *testing.T) {
122 m := NewMap[string, int]()
124 value, ok := m.Get("nonexistent")
126 require.Equal(t, 0, value)
129 value, ok = m.Get("key1")
131 require.Equal(t, 42, value)
134func TestMap_Del(t *testing.T) {
137 m := NewMap[string, int]()
141 require.Equal(t, 2, m.Len())
144 _, ok := m.Get("key1")
146 require.Equal(t, 1, m.Len())
148 value, ok := m.Get("key2")
150 require.Equal(t, 100, value)
153 require.Equal(t, 1, m.Len())
156func TestMap_Len(t *testing.T) {
159 m := NewMap[string, int]()
160 require.Equal(t, 0, m.Len())
163 require.Equal(t, 1, m.Len())
166 require.Equal(t, 2, m.Len())
169 require.Equal(t, 1, m.Len())
172 require.Equal(t, 0, m.Len())
175func TestMap_Take(t *testing.T) {
178 m := NewMap[string, int]()
182 require.Equal(t, 2, m.Len())
184 value, ok := m.Take("key1")
186 require.Equal(t, 42, value)
187 require.Equal(t, 1, m.Len())
189 _, exists := m.Get("key1")
190 require.False(t, exists)
192 value, ok = m.Get("key2")
194 require.Equal(t, 100, value)
197func TestMap_Take_NonexistentKey(t *testing.T) {
200 m := NewMap[string, int]()
203 value, ok := m.Take("nonexistent")
205 require.Equal(t, 0, value)
206 require.Equal(t, 1, m.Len())
208 value, ok = m.Get("key1")
210 require.Equal(t, 42, value)
213func TestMap_Take_EmptyMap(t *testing.T) {
216 m := NewMap[string, int]()
218 value, ok := m.Take("key1")
220 require.Equal(t, 0, value)
221 require.Equal(t, 0, m.Len())
224func TestMap_Take_SameKeyTwice(t *testing.T) {
227 m := NewMap[string, int]()
230 value, ok := m.Take("key1")
232 require.Equal(t, 42, value)
233 require.Equal(t, 0, m.Len())
235 value, ok = m.Take("key1")
237 require.Equal(t, 0, value)
238 require.Equal(t, 0, m.Len())
241func TestMap_Seq2(t *testing.T) {
244 m := NewMap[string, int]()
249 collected := maps.Collect(m.Seq2())
251 require.Equal(t, 3, len(collected))
252 require.Equal(t, 1, collected["key1"])
253 require.Equal(t, 2, collected["key2"])
254 require.Equal(t, 3, collected["key3"])
257func TestMap_Seq2_EarlyReturn(t *testing.T) {
260 m := NewMap[string, int]()
273 require.Equal(t, 2, count)
276func TestMap_Seq2_EmptyMap(t *testing.T) {
279 m := NewMap[string, int]()
286 require.Equal(t, 0, count)
289func TestMap_Seq(t *testing.T) {
292 m := NewMap[string, int]()
297 collected := make([]int, 0)
298 for v := range m.Seq() {
299 collected = append(collected, v)
302 require.Equal(t, 3, len(collected))
303 require.Contains(t, collected, 1)
304 require.Contains(t, collected, 2)
305 require.Contains(t, collected, 3)
308func TestMap_Seq_EarlyReturn(t *testing.T) {
311 m := NewMap[string, int]()
324 require.Equal(t, 2, count)
327func TestMap_Seq_EmptyMap(t *testing.T) {
330 m := NewMap[string, int]()
337 require.Equal(t, 0, count)
340func TestMap_MarshalJSON(t *testing.T) {
343 m := NewMap[string, int]()
347 data, err := json.Marshal(m)
348 require.NoError(t, err)
350 result := &Map[string, int]{}
351 err = json.Unmarshal(data, result)
352 require.NoError(t, err)
353 require.Equal(t, 2, result.Len())
354 v1, _ := result.Get("key1")
355 v2, _ := result.Get("key2")
356 require.Equal(t, 1, v1)
357 require.Equal(t, 2, v2)
360func TestMap_MarshalJSON_EmptyMap(t *testing.T) {
363 m := NewMap[string, int]()
365 data, err := json.Marshal(m)
366 require.NoError(t, err)
367 require.Equal(t, "{}", string(data))
370func TestMap_UnmarshalJSON(t *testing.T) {
373 jsonData := `{"key1": 1, "key2": 2}`
375 m := NewMap[string, int]()
376 err := json.Unmarshal([]byte(jsonData), m)
377 require.NoError(t, err)
379 require.Equal(t, 2, m.Len())
380 value, ok := m.Get("key1")
382 require.Equal(t, 1, value)
384 value, ok = m.Get("key2")
386 require.Equal(t, 2, value)
389func TestMap_UnmarshalJSON_EmptyJSON(t *testing.T) {
394 m := NewMap[string, int]()
395 err := json.Unmarshal([]byte(jsonData), m)
396 require.NoError(t, err)
397 require.Equal(t, 0, m.Len())
400func TestMap_UnmarshalJSON_InvalidJSON(t *testing.T) {
403 jsonData := `{"key1": 1, "key2":}`
405 m := NewMap[string, int]()
406 err := json.Unmarshal([]byte(jsonData), m)
407 require.Error(t, err)
410func TestMap_UnmarshalJSON_OverwritesExistingData(t *testing.T) {
413 m := NewMap[string, int]()
414 m.Set("existing", 999)
416 jsonData := `{"key1": 1, "key2": 2}`
417 err := json.Unmarshal([]byte(jsonData), m)
418 require.NoError(t, err)
420 require.Equal(t, 2, m.Len())
421 _, ok := m.Get("existing")
424 value, ok := m.Get("key1")
426 require.Equal(t, 1, value)
429func TestMap_JSONRoundTrip(t *testing.T) {
432 original := NewMap[string, int]()
433 original.Set("key1", 1)
434 original.Set("key2", 2)
435 original.Set("key3", 3)
437 data, err := json.Marshal(original)
438 require.NoError(t, err)
440 restored := NewMap[string, int]()
441 err = json.Unmarshal(data, restored)
442 require.NoError(t, err)
444 require.Equal(t, original.Len(), restored.Len())
446 for k, v := range original.Seq2() {
447 restoredValue, ok := restored.Get(k)
449 require.Equal(t, v, restoredValue)
453func TestMap_ConcurrentAccess(t *testing.T) {
456 m := NewMap[int, int]()
457 const numGoroutines = 100
458 const numOperations = 100
460 var wg sync.WaitGroup
461 wg.Add(numGoroutines)
463 for i := range numGoroutines {
466 for j := range numOperations {
467 key := id*numOperations + j
469 value, ok := m.Get(key)
471 require.Equal(t, key*2, value)
478 require.Equal(t, numGoroutines*numOperations, m.Len())
481func TestMap_ConcurrentReadWrite(t *testing.T) {
484 m := NewMap[int, int]()
485 const numReaders = 50
486 const numWriters = 50
487 const numOperations = 100
489 for i := range 1000 {
493 var wg sync.WaitGroup
494 wg.Add(numReaders + numWriters)
496 for range numReaders {
499 for j := range numOperations {
501 value, ok := m.Get(key)
503 require.Equal(t, key, value)
510 for i := range numWriters {
513 for j := range numOperations {
514 key := 1000 + id*numOperations + j
526func TestMap_ConcurrentSeq2(t *testing.T) {
529 m := NewMap[int, int]()
534 var wg sync.WaitGroup
535 const numIterators = 10
538 for range numIterators {
542 for k, v := range m.Seq2() {
543 require.Equal(t, k*2, v)
546 require.Equal(t, 100, count)
553func TestMap_ConcurrentSeq(t *testing.T) {
556 m := NewMap[int, int]()
561 var wg sync.WaitGroup
562 const numIterators = 10
565 for range numIterators {
569 values := make(map[int]bool)
570 for v := range m.Seq() {
574 require.Equal(t, 100, count)
576 require.True(t, values[i*2])
584func TestMap_ConcurrentTake(t *testing.T) {
587 m := NewMap[int, int]()
588 const numItems = 1000
590 for i := range numItems {
594 var wg sync.WaitGroup
595 const numWorkers = 10
596 taken := make([][]int, numWorkers)
599 for i := range numWorkers {
600 go func(workerID int) {
602 taken[workerID] = make([]int, 0)
603 for j := workerID; j < numItems; j += numWorkers {
604 if value, ok := m.Take(j); ok {
605 taken[workerID] = append(taken[workerID], value)
613 require.Equal(t, 0, m.Len())
615 allTaken := make(map[int]bool)
616 for _, workerTaken := range taken {
617 for _, value := range workerTaken {
618 require.False(t, allTaken[value], "Value %d was taken multiple times", value)
619 allTaken[value] = true
623 require.Equal(t, numItems, len(allTaken))
624 for i := range numItems {
625 require.True(t, allTaken[i*2], "Expected value %d to be taken", i*2)
629func TestMap_TypeSafety(t *testing.T) {
632 stringIntMap := NewMap[string, int]()
633 stringIntMap.Set("key", 42)
634 value, ok := stringIntMap.Get("key")
636 require.Equal(t, 42, value)
638 intStringMap := NewMap[int, string]()
639 intStringMap.Set(42, "value")
640 strValue, ok := intStringMap.Get(42)
642 require.Equal(t, "value", strValue)
644 structMap := NewMap[string, struct{ Name string }]()
645 structMap.Set("key", struct{ Name string }{Name: "test"})
646 structValue, ok := structMap.Get("key")
648 require.Equal(t, "test", structValue.Name)
651func TestMap_InterfaceCompliance(t *testing.T) {
654 var _ json.Marshaler = &Map[string, any]{}
655 var _ json.Unmarshaler = &Map[string, any]{}
658func BenchmarkMap_Set(b *testing.B) {
659 m := NewMap[int, int]()
661 for i := 0; b.Loop(); i++ {
666func BenchmarkMap_Get(b *testing.B) {
667 m := NewMap[int, int]()
668 for i := range 1000 {
672 for i := 0; b.Loop(); i++ {
677func BenchmarkMap_Seq2(b *testing.B) {
678 m := NewMap[int, int]()
679 for i := range 1000 {
689func BenchmarkMap_Seq(b *testing.B) {
690 m := NewMap[int, int]()
691 for i := range 1000 {
701func BenchmarkMap_Take(b *testing.B) {
702 m := NewMap[int, int]()
703 for i := range 1000 {
708 for i := 0; b.Loop(); i++ {
713 for j := range 1000 {
721func BenchmarkMap_ConcurrentReadWrite(b *testing.B) {
722 m := NewMap[int, int]()
723 for i := range 1000 {
728 b.RunParallel(func(pb *testing.PB) {
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list