199 lines
3.4 KiB
Go
Raw Normal View History

2023-07-05 15:23:50 +00:00
package ocean_test
import (
2023-07-06 17:40:33 +00:00
"sync"
2023-07-05 15:23:50 +00:00
"testing"
"git.akyoto.dev/go/assert"
"git.akyoto.dev/go/ocean"
)
2023-07-06 12:10:12 +00:00
type User struct {
Name string `json:"name"`
}
2023-07-06 15:50:48 +00:00
func TestAll(t *testing.T) {
2023-07-06 13:02:50 +00:00
users, err := ocean.New[User]("test")
2023-07-05 21:59:49 +00:00
assert.Nil(t, err)
2023-07-06 12:10:12 +00:00
defer users.Clear()
2023-07-05 21:59:49 +00:00
2023-07-06 12:10:12 +00:00
users.Set("1", &User{Name: "User 1"})
2023-07-06 15:50:48 +00:00
users.Set("2", &User{Name: "User 2"})
2023-07-06 21:46:47 +00:00
users.Set("3", &User{Name: "User 3"})
2023-07-06 15:50:48 +00:00
count := 0
2023-07-05 15:23:50 +00:00
2023-07-06 15:50:48 +00:00
for range users.All() {
count++
}
2023-07-06 21:46:47 +00:00
assert.Equal(t, count, 3)
}
func TestFilter(t *testing.T) {
users, err := ocean.New[User]("test")
assert.Nil(t, err)
defer users.Clear()
users.Set("1", &User{Name: "User 1"})
users.Set("2", &User{Name: "User 2"})
users.Set("3", &User{Name: "User 3"})
count := 0
f := func(user *User) bool {
return user.Name == "User 2"
}
for range users.Filter(f) {
count++
}
assert.Equal(t, count, 1)
2023-07-05 20:02:16 +00:00
}
2023-07-06 15:50:48 +00:00
func TestGet(t *testing.T) {
2023-07-06 15:36:22 +00:00
users, err := ocean.New[User]("test")
assert.Nil(t, err)
defer users.Clear()
users.Set("1", &User{Name: "User 1"})
2023-07-06 15:50:48 +00:00
user, err := users.Get("1")
2023-07-06 15:36:22 +00:00
2023-07-06 15:50:48 +00:00
assert.Nil(t, err)
assert.NotNil(t, user)
2023-07-06 15:36:22 +00:00
}
2023-07-05 20:02:16 +00:00
func TestInteraction(t *testing.T) {
2023-07-06 13:02:50 +00:00
users, err := ocean.New[User]("test")
2023-07-05 21:59:49 +00:00
assert.Nil(t, err)
2023-07-06 12:10:12 +00:00
defer users.Clear()
2023-07-05 20:02:16 +00:00
assert.True(t, !users.Exists("1"))
assert.True(t, !users.Exists("2"))
2023-07-05 15:23:50 +00:00
2023-07-06 12:10:12 +00:00
users.Set("1", &User{Name: "User 1"})
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
assert.True(t, users.Exists("1"))
assert.True(t, !users.Exists("2"))
2023-07-05 15:23:50 +00:00
2023-07-06 12:10:12 +00:00
users.Set("2", &User{Name: "User 1"})
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
assert.True(t, users.Exists("1"))
assert.True(t, users.Exists("2"))
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
users.Delete("1")
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
assert.True(t, !users.Exists("1"))
assert.True(t, users.Exists("2"))
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
users.Delete("2")
2023-07-05 15:23:50 +00:00
2023-07-05 20:02:16 +00:00
assert.True(t, !users.Exists("1"))
assert.True(t, !users.Exists("2"))
2023-07-05 15:23:50 +00:00
}
2023-07-06 12:10:12 +00:00
2023-07-06 15:36:22 +00:00
func TestPersistence(t *testing.T) {
2023-07-06 13:02:50 +00:00
users, err := ocean.New[User]("test")
2023-07-06 12:10:12 +00:00
assert.Nil(t, err)
defer users.Clear()
users.Set("1", &User{Name: "User 1"})
users.Set("2", &User{Name: "User 2"})
2023-07-06 15:36:22 +00:00
again, err := ocean.New[User]("test")
assert.Nil(t, err)
2023-07-06 12:10:12 +00:00
2023-07-06 15:36:22 +00:00
user1, err := again.Get("1")
assert.Nil(t, err)
user2, err := again.Get("2")
assert.Nil(t, err)
assert.NotNil(t, user1)
assert.NotNil(t, user2)
2023-07-06 12:10:12 +00:00
}
2023-07-06 17:40:33 +00:00
func TestParallel(t *testing.T) {
users, err := ocean.New[User]("test")
assert.Nil(t, err)
defer users.Clear()
users.Set("1", &User{Name: "User 1"})
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()
}
func BenchmarkGet(b *testing.B) {
users, err := ocean.New[User]("test")
assert.Nil(b, err)
defer users.Clear()
users.Set("1", &User{Name: "User 1"})
b.ReportAllocs()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
_, err := users.Get("1")
if err != nil {
b.Fail()
}
}
})
b.StopTimer()
}
func BenchmarkSet(b *testing.B) {
users, err := ocean.New[User]("test")
assert.Nil(b, err)
defer users.Clear()
user := &User{Name: "User 1"}
b.ReportAllocs()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
users.Set("1", user)
}
})
b.StopTimer()
}
func BenchmarkDelete(b *testing.B) {
users, err := ocean.New[User]("test")
assert.Nil(b, err)
defer users.Clear()
b.ReportAllocs()
b.ResetTimer()
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
users.Delete("1")
}
})
b.StopTimer()
}