github.com/lingyao2333/mo-zero@v1.4.1/core/collection/safemap_test.go (about) 1 package collection 2 3 import ( 4 "sync/atomic" 5 "testing" 6 7 "github.com/lingyao2333/mo-zero/core/stringx" 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestSafeMap(t *testing.T) { 12 tests := []struct { 13 size int 14 exception int 15 }{ 16 { 17 100000, 18 2000, 19 }, 20 { 21 100000, 22 50, 23 }, 24 } 25 for _, test := range tests { 26 t.Run(stringx.Rand(), func(t *testing.T) { 27 testSafeMapWithParameters(t, test.size, test.exception) 28 }) 29 } 30 } 31 32 func TestSafeMap_CopyNew(t *testing.T) { 33 const ( 34 size = 100000 35 exception1 = 5 36 exception2 = 500 37 ) 38 m := NewSafeMap() 39 40 for i := 0; i < size; i++ { 41 m.Set(i, i) 42 } 43 for i := 0; i < size; i++ { 44 if i%exception1 == 0 { 45 m.Del(i) 46 } 47 } 48 49 for i := size; i < size<<1; i++ { 50 m.Set(i, i) 51 } 52 for i := size; i < size<<1; i++ { 53 if i%exception2 != 0 { 54 m.Del(i) 55 } 56 } 57 58 for i := 0; i < size; i++ { 59 val, ok := m.Get(i) 60 if i%exception1 != 0 { 61 assert.True(t, ok) 62 assert.Equal(t, i, val.(int)) 63 } else { 64 assert.False(t, ok) 65 } 66 } 67 for i := size; i < size<<1; i++ { 68 val, ok := m.Get(i) 69 if i%exception2 == 0 { 70 assert.True(t, ok) 71 assert.Equal(t, i, val.(int)) 72 } else { 73 assert.False(t, ok) 74 } 75 } 76 } 77 78 func testSafeMapWithParameters(t *testing.T, size, exception int) { 79 m := NewSafeMap() 80 81 for i := 0; i < size; i++ { 82 m.Set(i, i) 83 } 84 for i := 0; i < size; i++ { 85 if i%exception != 0 { 86 m.Del(i) 87 } 88 } 89 90 assert.Equal(t, size/exception, m.Size()) 91 92 for i := size; i < size<<1; i++ { 93 m.Set(i, i) 94 } 95 for i := size; i < size<<1; i++ { 96 if i%exception != 0 { 97 m.Del(i) 98 } 99 } 100 101 for i := 0; i < size<<1; i++ { 102 val, ok := m.Get(i) 103 if i%exception == 0 { 104 assert.True(t, ok) 105 assert.Equal(t, i, val.(int)) 106 } else { 107 assert.False(t, ok) 108 } 109 } 110 } 111 112 func TestSafeMap_Range(t *testing.T) { 113 const ( 114 size = 100000 115 exception1 = 5 116 exception2 = 500 117 ) 118 119 m := NewSafeMap() 120 newMap := NewSafeMap() 121 122 for i := 0; i < size; i++ { 123 m.Set(i, i) 124 } 125 for i := 0; i < size; i++ { 126 if i%exception1 == 0 { 127 m.Del(i) 128 } 129 } 130 131 for i := size; i < size<<1; i++ { 132 m.Set(i, i) 133 } 134 for i := size; i < size<<1; i++ { 135 if i%exception2 != 0 { 136 m.Del(i) 137 } 138 } 139 140 var count int32 141 m.Range(func(k, v interface{}) bool { 142 atomic.AddInt32(&count, 1) 143 newMap.Set(k, v) 144 return true 145 }) 146 assert.Equal(t, int(atomic.LoadInt32(&count)), m.Size()) 147 assert.Equal(t, m.dirtyNew, newMap.dirtyNew) 148 assert.Equal(t, m.dirtyOld, newMap.dirtyOld) 149 }