1package csync
 2
 3import (
 4	"testing"
 5
 6	"github.com/stretchr/testify/require"
 7)
 8
 9func TestVersionedMap_Set(t *testing.T) {
10	t.Parallel()
11
12	vm := NewVersionedMap[string, int]()
13	require.Equal(t, uint64(0), vm.Version())
14
15	vm.Set("key1", 42)
16	require.Equal(t, uint64(1), vm.Version())
17
18	value, ok := vm.Get("key1")
19	require.True(t, ok)
20	require.Equal(t, 42, value)
21}
22
23func TestVersionedMap_Del(t *testing.T) {
24	t.Parallel()
25
26	vm := NewVersionedMap[string, int]()
27	vm.Set("key1", 42)
28	initialVersion := vm.Version()
29
30	vm.Del("key1")
31	require.Equal(t, initialVersion+1, vm.Version())
32
33	_, ok := vm.Get("key1")
34	require.False(t, ok)
35}
36
37func TestVersionedMap_VersionIncrement(t *testing.T) {
38	t.Parallel()
39
40	vm := NewVersionedMap[string, int]()
41	initialVersion := vm.Version()
42
43	// Setting a value should increment the version
44	vm.Set("key1", 42)
45	require.Equal(t, initialVersion+1, vm.Version())
46
47	// Deleting a value should increment the version
48	vm.Del("key1")
49	require.Equal(t, initialVersion+2, vm.Version())
50
51	// Deleting a non-existent key should still increment the version
52	vm.Del("nonexistent")
53	require.Equal(t, initialVersion+3, vm.Version())
54}
55
56func TestVersionedMap_ConcurrentAccess(t *testing.T) {
57	t.Parallel()
58
59	vm := NewVersionedMap[int, int]()
60	const numGoroutines = 100
61	const numOperations = 100
62
63	// Initial version
64	initialVersion := vm.Version()
65
66	// Perform concurrent Set and Del operations
67	for i := range numGoroutines {
68		go func(id int) {
69			for j := range numOperations {
70				key := id*numOperations + j
71				vm.Set(key, key*2)
72				vm.Del(key)
73			}
74		}(i)
75	}
76
77	// Wait for operations to complete by checking the version
78	// This is a simplified check - in a real test you might want to use sync.WaitGroup
79	expectedMinVersion := initialVersion + uint64(numGoroutines*numOperations*2)
80
81	// Allow some time for operations to complete
82	for vm.Version() < expectedMinVersion {
83		// Busy wait - in a real test you'd use proper synchronization
84	}
85
86	// Final version should be at least the expected minimum
87	require.GreaterOrEqual(t, vm.Version(), expectedMinVersion)
88	require.Equal(t, 0, vm.Len())
89}