value_test.go

 1package csync
 2
 3import (
 4	"sync"
 5	"testing"
 6
 7	"github.com/stretchr/testify/require"
 8)
 9
10func TestValue_GetSet(t *testing.T) {
11	t.Parallel()
12
13	v := NewValue(42)
14	require.Equal(t, 42, v.Get())
15
16	v.Set(100)
17	require.Equal(t, 100, v.Get())
18}
19
20func TestValue_ZeroValue(t *testing.T) {
21	t.Parallel()
22
23	v := NewValue("")
24	require.Equal(t, "", v.Get())
25
26	v.Set("hello")
27	require.Equal(t, "hello", v.Get())
28}
29
30func TestValue_Struct(t *testing.T) {
31	t.Parallel()
32
33	type config struct {
34		Name  string
35		Count int
36	}
37
38	v := NewValue(config{Name: "test", Count: 1})
39	require.Equal(t, config{Name: "test", Count: 1}, v.Get())
40
41	v.Set(config{Name: "updated", Count: 2})
42	require.Equal(t, config{Name: "updated", Count: 2}, v.Get())
43}
44
45func TestValue_PointerPanics(t *testing.T) {
46	t.Parallel()
47
48	require.Panics(t, func() {
49		NewValue(&struct{}{})
50	})
51}
52
53func TestValue_SlicePanics(t *testing.T) {
54	t.Parallel()
55
56	require.Panics(t, func() {
57		NewValue([]string{"a", "b"})
58	})
59}
60
61func TestValue_MapPanics(t *testing.T) {
62	t.Parallel()
63
64	require.Panics(t, func() {
65		NewValue(map[string]int{"a": 1})
66	})
67}
68
69func TestValue_ConcurrentAccess(t *testing.T) {
70	t.Parallel()
71
72	v := NewValue(0)
73	var wg sync.WaitGroup
74
75	// Concurrent writers.
76	for i := range 100 {
77		wg.Add(1)
78		go func(val int) {
79			defer wg.Done()
80			v.Set(val)
81		}(i)
82	}
83
84	// Concurrent readers.
85	for range 100 {
86		wg.Add(1)
87		go func() {
88			defer wg.Done()
89			_ = v.Get()
90		}()
91	}
92
93	wg.Wait()
94
95	// Value should be one of the set values (0-99).
96	got := v.Get()
97	require.GreaterOrEqual(t, got, 0)
98	require.Less(t, got, 100)
99}