You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

113 lines
2.2 KiB

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)
}