9 "github.com/stretchr/testify/require"
12func TestNewMap(t *testing.T) {
15 m := NewMap[string, int]()
17 require.NotNil(t, m.inner)
18 require.Equal(t, 0, m.Len())
21func TestNewMapFrom(t *testing.T) {
24 original := map[string]int{
29 m := NewMapFrom(original)
31 require.Equal(t, original, m.inner)
32 require.Equal(t, 2, m.Len())
34 value, ok := m.Get("key1")
36 require.Equal(t, 1, value)
39func TestMap_Set(t *testing.T) {
42 m := NewMap[string, int]()
45 value, ok := m.Get("key1")
47 require.Equal(t, 42, value)
48 require.Equal(t, 1, m.Len())
51 value, ok = m.Get("key1")
53 require.Equal(t, 100, value)
54 require.Equal(t, 1, m.Len())
57func TestMap_GetOrSet(t *testing.T) {
60 m := NewMap[string, int]()
62 require.Equal(t, 42, m.GetOrSet("key1", func() int { return 42 }))
63 require.Equal(t, 42, m.GetOrSet("key1", func() int { return 99999 }))
64 require.Equal(t, 1, m.Len())
67func TestMap_Get(t *testing.T) {
70 m := NewMap[string, int]()
72 value, ok := m.Get("nonexistent")
74 require.Equal(t, 0, value)
77 value, ok = m.Get("key1")
79 require.Equal(t, 42, value)
82func TestMap_Del(t *testing.T) {
85 m := NewMap[string, int]()
89 require.Equal(t, 2, m.Len())
92 _, ok := m.Get("key1")
94 require.Equal(t, 1, m.Len())
96 value, ok := m.Get("key2")
98 require.Equal(t, 100, value)
101 require.Equal(t, 1, m.Len())
104func TestMap_Len(t *testing.T) {
107 m := NewMap[string, int]()
108 require.Equal(t, 0, m.Len())
111 require.Equal(t, 1, m.Len())
114 require.Equal(t, 2, m.Len())
117 require.Equal(t, 1, m.Len())
120 require.Equal(t, 0, m.Len())
123func TestMap_Take(t *testing.T) {
126 m := NewMap[string, int]()
130 require.Equal(t, 2, m.Len())
132 value, ok := m.Take("key1")
134 require.Equal(t, 42, value)
135 require.Equal(t, 1, m.Len())
137 _, exists := m.Get("key1")
138 require.False(t, exists)
140 value, ok = m.Get("key2")
142 require.Equal(t, 100, value)
145func TestMap_Take_NonexistentKey(t *testing.T) {
148 m := NewMap[string, int]()
151 value, ok := m.Take("nonexistent")
153 require.Equal(t, 0, value)
154 require.Equal(t, 1, m.Len())
156 value, ok = m.Get("key1")
158 require.Equal(t, 42, value)
161func TestMap_Take_EmptyMap(t *testing.T) {
164 m := NewMap[string, int]()
166 value, ok := m.Take("key1")
168 require.Equal(t, 0, value)
169 require.Equal(t, 0, m.Len())
172func TestMap_Take_SameKeyTwice(t *testing.T) {
175 m := NewMap[string, int]()
178 value, ok := m.Take("key1")
180 require.Equal(t, 42, value)
181 require.Equal(t, 0, m.Len())
183 value, ok = m.Take("key1")
185 require.Equal(t, 0, value)
186 require.Equal(t, 0, m.Len())
189func TestMap_Seq2(t *testing.T) {
192 m := NewMap[string, int]()
197 collected := maps.Collect(m.Seq2())
199 require.Equal(t, 3, len(collected))
200 require.Equal(t, 1, collected["key1"])
201 require.Equal(t, 2, collected["key2"])
202 require.Equal(t, 3, collected["key3"])
205func TestMap_Seq2_EarlyReturn(t *testing.T) {
208 m := NewMap[string, int]()
221 require.Equal(t, 2, count)
224func TestMap_Seq2_EmptyMap(t *testing.T) {
227 m := NewMap[string, int]()
234 require.Equal(t, 0, count)
237func TestMap_Seq(t *testing.T) {
240 m := NewMap[string, int]()
245 collected := make([]int, 0)
246 for v := range m.Seq() {
247 collected = append(collected, v)
250 require.Equal(t, 3, len(collected))
251 require.Contains(t, collected, 1)
252 require.Contains(t, collected, 2)
253 require.Contains(t, collected, 3)
256func TestMap_Seq_EarlyReturn(t *testing.T) {
259 m := NewMap[string, int]()
272 require.Equal(t, 2, count)
275func TestMap_Seq_EmptyMap(t *testing.T) {
278 m := NewMap[string, int]()
285 require.Equal(t, 0, count)
288func TestMap_MarshalJSON(t *testing.T) {
291 m := NewMap[string, int]()
295 data, err := json.Marshal(m)
296 require.NoError(t, err)
298 result := &Map[string, int]{}
299 err = json.Unmarshal(data, result)
300 require.NoError(t, err)
301 require.Equal(t, 2, result.Len())
302 v1, _ := result.Get("key1")
303 v2, _ := result.Get("key2")
304 require.Equal(t, 1, v1)
305 require.Equal(t, 2, v2)
308func TestMap_MarshalJSON_EmptyMap(t *testing.T) {
311 m := NewMap[string, int]()
313 data, err := json.Marshal(m)
314 require.NoError(t, err)
315 require.Equal(t, "{}", string(data))
318func TestMap_UnmarshalJSON(t *testing.T) {
321 jsonData := `{"key1": 1, "key2": 2}`
323 m := NewMap[string, int]()
324 err := json.Unmarshal([]byte(jsonData), m)
325 require.NoError(t, err)
327 require.Equal(t, 2, m.Len())
328 value, ok := m.Get("key1")
330 require.Equal(t, 1, value)
332 value, ok = m.Get("key2")
334 require.Equal(t, 2, value)
337func TestMap_UnmarshalJSON_EmptyJSON(t *testing.T) {
342 m := NewMap[string, int]()
343 err := json.Unmarshal([]byte(jsonData), m)
344 require.NoError(t, err)
345 require.Equal(t, 0, m.Len())
348func TestMap_UnmarshalJSON_InvalidJSON(t *testing.T) {
351 jsonData := `{"key1": 1, "key2":}`
353 m := NewMap[string, int]()
354 err := json.Unmarshal([]byte(jsonData), m)
355 require.Error(t, err)
358func TestMap_UnmarshalJSON_OverwritesExistingData(t *testing.T) {
361 m := NewMap[string, int]()
362 m.Set("existing", 999)
364 jsonData := `{"key1": 1, "key2": 2}`
365 err := json.Unmarshal([]byte(jsonData), m)
366 require.NoError(t, err)
368 require.Equal(t, 2, m.Len())
369 _, ok := m.Get("existing")
372 value, ok := m.Get("key1")
374 require.Equal(t, 1, value)
377func TestMap_JSONRoundTrip(t *testing.T) {
380 original := NewMap[string, int]()
381 original.Set("key1", 1)
382 original.Set("key2", 2)
383 original.Set("key3", 3)
385 data, err := json.Marshal(original)
386 require.NoError(t, err)
388 restored := NewMap[string, int]()
389 err = json.Unmarshal(data, restored)
390 require.NoError(t, err)
392 require.Equal(t, original.Len(), restored.Len())
394 for k, v := range original.Seq2() {
395 restoredValue, ok := restored.Get(k)
397 require.Equal(t, v, restoredValue)
401func TestMap_ConcurrentAccess(t *testing.T) {
404 m := NewMap[int, int]()
405 const numGoroutines = 100
406 const numOperations = 100
408 var wg sync.WaitGroup
409 wg.Add(numGoroutines)
411 for i := range numGoroutines {
414 for j := range numOperations {
415 key := id*numOperations + j
417 value, ok := m.Get(key)
419 require.Equal(t, key*2, value)
426 require.Equal(t, numGoroutines*numOperations, m.Len())
429func TestMap_ConcurrentReadWrite(t *testing.T) {
432 m := NewMap[int, int]()
433 const numReaders = 50
434 const numWriters = 50
435 const numOperations = 100
437 for i := range 1000 {
441 var wg sync.WaitGroup
442 wg.Add(numReaders + numWriters)
444 for range numReaders {
447 for j := range numOperations {
449 value, ok := m.Get(key)
451 require.Equal(t, key, value)
458 for i := range numWriters {
461 for j := range numOperations {
462 key := 1000 + id*numOperations + j
474func TestMap_ConcurrentSeq2(t *testing.T) {
477 m := NewMap[int, int]()
482 var wg sync.WaitGroup
483 const numIterators = 10
486 for range numIterators {
490 for k, v := range m.Seq2() {
491 require.Equal(t, k*2, v)
494 require.Equal(t, 100, count)
501func TestMap_ConcurrentSeq(t *testing.T) {
504 m := NewMap[int, int]()
509 var wg sync.WaitGroup
510 const numIterators = 10
513 for range numIterators {
517 values := make(map[int]bool)
518 for v := range m.Seq() {
522 require.Equal(t, 100, count)
524 require.True(t, values[i*2])
532func TestMap_ConcurrentTake(t *testing.T) {
535 m := NewMap[int, int]()
536 const numItems = 1000
538 for i := range numItems {
542 var wg sync.WaitGroup
543 const numWorkers = 10
544 taken := make([][]int, numWorkers)
547 for i := range numWorkers {
548 go func(workerID int) {
550 taken[workerID] = make([]int, 0)
551 for j := workerID; j < numItems; j += numWorkers {
552 if value, ok := m.Take(j); ok {
553 taken[workerID] = append(taken[workerID], value)
561 require.Equal(t, 0, m.Len())
563 allTaken := make(map[int]bool)
564 for _, workerTaken := range taken {
565 for _, value := range workerTaken {
566 require.False(t, allTaken[value], "Value %d was taken multiple times", value)
567 allTaken[value] = true
571 require.Equal(t, numItems, len(allTaken))
572 for i := range numItems {
573 require.True(t, allTaken[i*2], "Expected value %d to be taken", i*2)
577func TestMap_TypeSafety(t *testing.T) {
580 stringIntMap := NewMap[string, int]()
581 stringIntMap.Set("key", 42)
582 value, ok := stringIntMap.Get("key")
584 require.Equal(t, 42, value)
586 intStringMap := NewMap[int, string]()
587 intStringMap.Set(42, "value")
588 strValue, ok := intStringMap.Get(42)
590 require.Equal(t, "value", strValue)
592 structMap := NewMap[string, struct{ Name string }]()
593 structMap.Set("key", struct{ Name string }{Name: "test"})
594 structValue, ok := structMap.Get("key")
596 require.Equal(t, "test", structValue.Name)
599func TestMap_InterfaceCompliance(t *testing.T) {
602 var _ json.Marshaler = &Map[string, any]{}
603 var _ json.Unmarshaler = &Map[string, any]{}
606func BenchmarkMap_Set(b *testing.B) {
607 m := NewMap[int, int]()
609 for i := 0; b.Loop(); i++ {
614func BenchmarkMap_Get(b *testing.B) {
615 m := NewMap[int, int]()
616 for i := range 1000 {
620 for i := 0; b.Loop(); i++ {
625func BenchmarkMap_Seq2(b *testing.B) {
626 m := NewMap[int, int]()
627 for i := range 1000 {
637func BenchmarkMap_Seq(b *testing.B) {
638 m := NewMap[int, int]()
639 for i := range 1000 {
649func BenchmarkMap_Take(b *testing.B) {
650 m := NewMap[int, int]()
651 for i := range 1000 {
656 for i := 0; b.Loop(); i++ {
661 for j := range 1000 {
669func BenchmarkMap_ConcurrentReadWrite(b *testing.B) {
670 m := NewMap[int, int]()
671 for i := range 1000 {
676 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