1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 21:02:27 +08:00
Files
lancet/maputil/concurrentmap_test.go
2023-07-25 10:21:11 +08:00

124 lines
2.2 KiB
Go

package maputil
import (
"fmt"
"sync"
"testing"
"github.com/duke-git/lancet/v2/internal"
)
func TestConcurrentMap_Set_Get(t *testing.T) {
assert := internal.NewAssert(t, "TestConcurrentMap_Set_Get")
cm := NewConcurrentMap[string, int](100)
var wg1 sync.WaitGroup
wg1.Add(10)
for i := 0; i < 10; i++ {
go func(n int) {
cm.Set(fmt.Sprintf("%d", n), n)
wg1.Done()
}(i)
}
wg1.Wait()
var wg2 sync.WaitGroup
wg2.Add(10)
for j := 0; j < 10; j++ {
go func(n int) {
val, ok := cm.Get(fmt.Sprintf("%d", n))
assert.Equal(n, val)
assert.Equal(true, ok)
wg2.Done()
}(j)
}
wg2.Wait()
}
func TestConcurrentMap_GetOrSet(t *testing.T) {
assert := internal.NewAssert(t, "TestConcurrentMap_GetOrSet")
cm := NewConcurrentMap[string, int](100)
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i++ {
go func(n int) {
val, ok := cm.GetOrSet(fmt.Sprintf("%d", n), n)
assert.Equal(n, val)
assert.Equal(false, ok)
wg.Done()
}(i)
}
wg.Wait()
for j := 0; j < 5; j++ {
go func(n int) {
val, ok := cm.Get(fmt.Sprintf("%d", n))
assert.Equal(n, val)
assert.Equal(true, ok)
}(j)
}
}
func TestConcurrentMap_Delete(t *testing.T) {
assert := internal.NewAssert(t, "TestConcurrentMap_Delete")
cm := NewConcurrentMap[string, int](100)
var wg1 sync.WaitGroup
wg1.Add(10)
for i := 0; i < 10; i++ {
go func(n int) {
cm.Set(fmt.Sprintf("%d", n), n)
wg1.Done()
}(i)
}
wg1.Wait()
var wg2 sync.WaitGroup
wg2.Add(10)
for i := 0; i < 10; i++ {
go func(n int) {
cm.Delete(fmt.Sprintf("%d", n))
wg2.Done()
}(i)
}
wg2.Wait()
for j := 0; j < 10; j++ {
go func(n int) {
_, ok := cm.Get(fmt.Sprintf("%d", n))
assert.Equal(false, ok)
}(j)
}
}
func TestConcurrentMap_GetAndDelete(t *testing.T) {
assert := internal.NewAssert(t, "TestConcurrentMap_GetAndDelete")
cm := NewConcurrentMap[string, int](100)
for i := 0; i < 10; i++ {
go func(n int) {
cm.Set(fmt.Sprintf("%d", n), n)
}(i)
}
for j := 0; j < 10; j++ {
go func(n int) {
val, ok := cm.GetAndDelete(fmt.Sprintf("%d", n))
assert.Equal(n, val)
assert.Equal(true, ok)
_, ok = cm.Get(fmt.Sprintf("%d", n))
assert.Equal(false, ok)
}(j)
}
}