package cmap import ( "fmt" "strings" "sync" "testing" "github.com/stretchr/testify/assert" ) func TestIterateKeysWithValues(t *testing.T) { cmap := NewCMap() for i := 1; i <= 10; i++ { cmap.Set(fmt.Sprintf("key%d", i), fmt.Sprintf("value%d", i)) } // Testing size assert.Equal(t, 10, cmap.Size()) assert.Equal(t, 10, len(cmap.Keys())) assert.Equal(t, 10, len(cmap.Values())) // Iterating Keys, checking for matching Value for _, key := range cmap.Keys() { val := strings.ReplaceAll(key, "key", "value") assert.Equal(t, val, cmap.Get(key)) } // Test if all keys are within []Keys() keys := cmap.Keys() for i := 1; i <= 10; i++ { assert.Contains(t, keys, fmt.Sprintf("key%d", i), "cmap.Keys() should contain key") } // Delete 1 Key cmap.Delete("key1") assert.NotEqual( t, len(keys), len(cmap.Keys()), "[]keys and []Keys() should not be equal, they are copies, one item was removed", ) } func TestContains(t *testing.T) { cmap := NewCMap() cmap.Set("key1", "value1") // Test for known values assert.True(t, cmap.Has("key1")) assert.Equal(t, "value1", cmap.Get("key1")) // Test for unknown values assert.False(t, cmap.Has("key2")) assert.Nil(t, cmap.Get("key2")) } func BenchmarkCMapHas(b *testing.B) { m := NewCMap() for i := 0; i < 1000; i++ { m.Set(string(rune(i)), i) } b.ResetTimer() for i := 0; i < b.N; i++ { m.Has(string(rune(i))) } } func TestCMap_GetOrSet_Parallel(t *testing.T) { tests := []struct { name string newValue interface{} parallelism int }{ {"test1", "a", 4}, {"test2", "a", 40}, {"test3", "a", 1}, } //nolint:scopelint for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { cm := NewCMap() wg := sync.WaitGroup{} wg.Add(tt.parallelism) for i := 0; i < tt.parallelism; i++ { go func() { defer wg.Done() gotValue, _ := cm.GetOrSet(tt.name, tt.newValue) assert.EqualValues(t, tt.newValue, gotValue) }() } wg.Wait() }) } } func TestCMap_GetOrSet_Exists(t *testing.T) { cm := NewCMap() gotValue, exists := cm.GetOrSet("key", 1000) assert.False(t, exists) assert.EqualValues(t, 1000, gotValue) gotValue, exists = cm.GetOrSet("key", 2000) assert.True(t, exists) assert.EqualValues(t, 1000, gotValue) }