package data_test import ( "sync" "testing" "git.akyoto.dev/go/assert" "git.akyoto.dev/go/data" ) type User struct { Name string `json:"name"` } func TestCollection(t *testing.T) { users, err := data.New[User]("test", nil) assert.Nil(t, err) defer users.Sync() defer users.Clear() users.Set("1", &User{Name: "User 1"}) users.Set("2", &User{Name: "User 2"}) users.Set("3", &User{Name: "User 3"}) t.Run("All", func(t *testing.T) { count := 0 for range users.All() { count++ } assert.Equal(t, count, 3) }) t.Run("Filter", func(t *testing.T) { count := 0 f := func(user *User) bool { return user.Name == "User 2" } for range users.Filter(f) { count++ } assert.Equal(t, count, 1) }) t.Run("Get", func(t *testing.T) { user, err := users.Get("1") assert.Nil(t, err) assert.NotNil(t, user) assert.Equal(t, user.Name, "User 1") }) t.Run("Exists", func(t *testing.T) { assert.True(t, users.Exists("1")) assert.True(t, users.Exists("2")) assert.True(t, users.Exists("3")) assert.True(t, !users.Exists("4")) }) t.Run("Parallel Get and Set", func(t *testing.T) { wg := sync.WaitGroup{} for i := 0; i < 100; i++ { wg.Add(2) go func() { defer wg.Done() user, err := users.Get("1") assert.Nil(t, err) assert.NotNil(t, user) assert.Equal(t, user.Name, "User 1") }() go func() { defer wg.Done() users.Set("1", &User{Name: "User 1"}) }() } wg.Wait() }) t.Run("Delete", func(t *testing.T) { assert.True(t, users.Exists("1")) assert.True(t, users.Exists("2")) assert.True(t, users.Exists("3")) users.Delete("1") assert.True(t, !users.Exists("1")) assert.True(t, users.Exists("2")) assert.True(t, users.Exists("3")) users.Delete("2") assert.True(t, !users.Exists("1")) assert.True(t, !users.Exists("2")) assert.True(t, users.Exists("3")) users.Delete("3") assert.True(t, !users.Exists("1")) assert.True(t, !users.Exists("2")) assert.True(t, !users.Exists("3")) }) }