github.com/nutsdb/nutsdb@v1.0.4/set_test.go (about) 1 // Copyright 2023 The nutsdb Author. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package nutsdb 16 17 import ( 18 "github.com/stretchr/testify/require" 19 "testing" 20 ) 21 22 func TestSet_SAdd(t *testing.T) { 23 set := NewSet() 24 key := "key" 25 expectRecords := generateRecords(3) 26 27 values := make([][]byte, 3) 28 for i := range expectRecords { 29 values[i] = expectRecords[i].Value 30 } 31 32 require.NoError(t, set.SAdd(key, values, expectRecords)) 33 34 ok, err := set.SAreMembers(key, values...) 35 require.True(t, ok) 36 require.NoError(t, err) 37 } 38 39 func TestSet_SRem(t *testing.T) { 40 set := NewSet() 41 key := "key" 42 expectRecords := generateRecords(4) 43 values := make([][]byte, 4) 44 for i := range expectRecords { 45 values[i] = expectRecords[i].Value 46 } 47 48 require.NoError(t, set.SAdd(key, values, expectRecords)) 49 50 require.NoError(t, set.SRem(key, values[0])) 51 require.NoError(t, set.SRem(key, values[1:]...)) 52 53 require.NoError(t, set.SAdd(key, values, expectRecords)) 54 require.NoError(t, set.SRem(key, values...)) 55 56 require.Error(t, set.SRem("fake key", values...)) 57 require.Error(t, set.SRem(key, nil)) 58 } 59 60 func TestSet_SDiff(t *testing.T) { 61 set := NewSet() 62 63 key1 := "set1" 64 key2 := "set2" 65 key3 := "set3" 66 key4 := "set4" 67 68 expectRecords := generateRecords(10) 69 70 values := make([][]byte, 10) 71 for i := range expectRecords { 72 values[i] = expectRecords[i].Value 73 } 74 75 require.NoError(t, set.SAdd(key1, values[:5], expectRecords[:5])) 76 require.NoError(t, set.SAdd(key2, values[2:6], expectRecords[2:6])) 77 require.NoError(t, set.SAdd(key3, values[2:7], expectRecords[2:7])) 78 require.NoError(t, set.SAdd(key4, values[7:], expectRecords[7:])) 79 80 type args struct { 81 key1 string 82 key2 string 83 } 84 85 tests := []struct { 86 name string 87 args args 88 set *Set 89 want []*Record 90 wantErr bool 91 }{ 92 {"normal set diff1", args{key1, key2}, set, expectRecords[:2], false}, 93 {"normal set diff2", args{key1, key4}, set, expectRecords[:5], false}, 94 {"normal set diff3", args{key3, key2}, set, expectRecords[6:7], false}, 95 {"first fake set", args{"fake_key1", key2}, set, nil, true}, 96 {"second fake set", args{key1, "fake_key2"}, set, nil, true}, 97 {"two fake set", args{"fake_key1", "fake_key2"}, set, nil, true}, 98 } 99 100 for _, tt := range tests { 101 t.Run(tt.name, func(t *testing.T) { 102 got, err := tt.set.SDiff(tt.args.key1, tt.args.key2) 103 if (err != nil) != tt.wantErr { 104 require.Errorf(t, err, "Get() error = %v, wantErr %v", tt.wantErr) 105 } 106 require.ElementsMatchf(t, tt.want, got, "Get() got = %v, want %v", got, tt.want) 107 }) 108 } 109 } 110 111 func TestSet_SCard(t *testing.T) { 112 set := NewSet() 113 114 key1 := "set1" 115 key2 := "set2" 116 key3 := "set3" 117 key4 := "set4" 118 119 expectRecords := generateRecords(10) 120 121 values := make([][]byte, 10) 122 for i := range expectRecords { 123 values[i] = expectRecords[i].Value 124 } 125 126 require.NoError(t, set.SAdd(key1, values[:5], expectRecords[:5])) 127 require.NoError(t, set.SAdd(key2, values[2:6], expectRecords[2:6])) 128 require.NoError(t, set.SAdd(key3, values[2:7], expectRecords[2:7])) 129 require.NoError(t, set.SAdd(key4, values[7:], expectRecords[7:])) 130 131 tests := []struct { 132 name string 133 key string 134 set *Set 135 want int 136 }{ 137 {"normal set", key1, set, 5}, 138 {"normal set", key2, set, 4}, 139 {"normal set", key3, set, 5}, 140 {"fake key", "key_fake", set, 0}, 141 } 142 143 for _, tt := range tests { 144 t.Run(tt.name, func(t *testing.T) { 145 got := tt.set.SCard(tt.key) 146 require.Equalf(t, tt.want, got, "TestSet_SCard err") 147 }) 148 } 149 } 150 151 func TestSet_SInter(t *testing.T) { 152 set := NewSet() 153 154 key1 := "set1" 155 key2 := "set2" 156 key3 := "set3" 157 key4 := "set4" 158 159 expectRecords := generateRecords(10) 160 161 values := make([][]byte, 10) 162 for i := range expectRecords { 163 values[i] = expectRecords[i].Value 164 } 165 166 require.NoError(t, set.SAdd(key1, values[:5], expectRecords[:5])) 167 require.NoError(t, set.SAdd(key2, values[2:6], expectRecords[2:6])) 168 require.NoError(t, set.SAdd(key3, values[2:7], expectRecords[2:7])) 169 require.NoError(t, set.SAdd(key4, values[7:], expectRecords[7:])) 170 171 type args struct { 172 key1 string 173 key2 string 174 } 175 176 tests := []struct { 177 name string 178 args args 179 set *Set 180 want []*Record 181 wantErr bool 182 }{ 183 {"normal set inter1", args{key1, key2}, set, []*Record{expectRecords[2], expectRecords[3], expectRecords[4]}, false}, 184 {"normal set inter1", args{key2, key3}, set, []*Record{expectRecords[2], expectRecords[3], expectRecords[4], expectRecords[5]}, false}, 185 {"normal set inter2", args{key1, key4}, set, nil, false}, 186 {"first fake set", args{"fake_key1", key2}, set, nil, true}, 187 {"second fake set", args{key1, "fake_key2"}, set, nil, true}, 188 {"two fake set", args{"fake_key1", "fake_key2"}, set, nil, true}, 189 } 190 191 for _, tt := range tests { 192 t.Run(tt.name, func(t *testing.T) { 193 got, err := tt.set.SInter(tt.args.key1, tt.args.key2) 194 if (err != nil) != tt.wantErr { 195 require.Errorf(t, err, "Get() error = %v, wantErr %v", tt.wantErr) 196 } 197 require.ElementsMatchf(t, tt.want, got, "Get() got = %v, want %v", got, tt.want) 198 }) 199 } 200 } 201 202 func TestSet_SMembers(t *testing.T) { 203 set := NewSet() 204 205 key := "set" 206 207 expectRecords := generateRecords(3) 208 209 values := make([][]byte, 3) 210 for i := range expectRecords { 211 values[i] = expectRecords[i].Value 212 } 213 214 require.NoError(t, set.SAdd(key, values, expectRecords)) 215 216 tests := []struct { 217 name string 218 key string 219 set *Set 220 want []*Record 221 wantErr bool 222 }{ 223 {"normal SMembers", key, set, expectRecords[0:1], false}, 224 {"normal SMembers", key, set, expectRecords[1:], false}, 225 {"normal SMembers", key, set, expectRecords, false}, 226 {"fake key", "fake_key", set, nil, true}, 227 } 228 229 for _, tt := range tests { 230 t.Run(tt.name, func(t *testing.T) { 231 got, err := tt.set.SMembers(tt.key) 232 if (err != nil) != tt.wantErr { 233 require.Errorf(t, err, "Get() error = %v, wantErr %v", tt.wantErr) 234 } 235 require.Subsetf(t, got, tt.want, "SInter() got = %v, want = %v", got, tt.want) 236 }) 237 } 238 } 239 240 func TestSet_SMove(t *testing.T) { 241 set := NewSet() 242 243 key1 := "set1" 244 key2 := "set2" 245 246 expectRecords := generateRecords(3) 247 values := make([][]byte, 3) 248 for i := range expectRecords { 249 values[i] = expectRecords[i].Value 250 } 251 252 require.NoError(t, set.SAdd(key1, values[:2], expectRecords[:2])) 253 require.NoError(t, set.SAdd(key2, values[2:], expectRecords[2:])) 254 255 type args struct { 256 key1 string 257 key2 string 258 item []byte 259 } 260 261 tests := []struct { 262 name string 263 args args 264 set *Set 265 want1 []*Record 266 want2 []*Record 267 expectErr error 268 }{ 269 {"normal SMove", args{key1, key2, values[1]}, set, expectRecords[0:1], expectRecords[1:], nil}, 270 {"not exist member SMove", args{key1, key2, values[2]}, set, nil, nil, ErrSetMemberNotExist}, 271 {"fake key SMove1", args{"fake key", key2, values[2]}, set, nil, nil, ErrSetNotExist}, 272 {"fake key SMove", args{key1, "fake key", values[2]}, set, nil, nil, ErrSetNotExist}, 273 } 274 275 for _, tt := range tests { 276 t.Run(tt.name, func(t *testing.T) { 277 _, err := tt.set.SMove(tt.args.key1, tt.args.key2, tt.args.item) 278 if tt.expectErr != nil { 279 require.Error(t, err) 280 require.Equal(t, tt.expectErr, err) 281 } else { 282 got1, _ := tt.set.SMembers(tt.args.key1) 283 got2, _ := tt.set.SMembers(tt.args.key2) 284 require.ElementsMatchf(t, got1, tt.want1, "SMove() got = %v, want = %v", got1, tt.want1) 285 require.ElementsMatchf(t, got2, tt.want2, "SMove() got = %v, want = %v", got2, tt.want2) 286 } 287 }) 288 } 289 } 290 291 func TestSet_SPop(t *testing.T) { 292 set := NewSet() 293 294 key := "set" 295 296 expectRecords := generateRecords(2) 297 values := make([][]byte, 2) 298 for i := range expectRecords { 299 values[i] = expectRecords[i].Value 300 } 301 m := map[*Record]struct{}{} 302 for _, expectRecord := range expectRecords { 303 m[expectRecord] = struct{}{} 304 } 305 306 require.NoError(t, set.SAdd(key, values, expectRecords)) 307 308 tests := []struct { 309 name string 310 key string 311 set *Set 312 ok bool 313 }{ 314 {"normal set SPop", key, set, true}, 315 {"normal set SPop", key, set, true}, 316 {"normal set SPop", key, set, false}, 317 } 318 319 for _, tt := range tests { 320 t.Run(tt.name, func(t *testing.T) { 321 record := tt.set.SPop(tt.key) 322 _, ok := m[record] 323 require.Equal(t, tt.ok, ok) 324 }) 325 } 326 } 327 328 func TestSet_SIsMember(t *testing.T) { 329 set := NewSet() 330 331 key := "key" 332 333 expectRecords := generateRecords(1) 334 values := [][]byte{expectRecords[0].Value} 335 336 require.NoError(t, set.SAdd(key, values, expectRecords)) 337 tests := []struct { 338 key string 339 val []byte 340 ok bool 341 expectErr error 342 }{ 343 {key, values[0], true, nil}, 344 {key, GetRandomBytes(24), false, nil}, 345 {"fake key", GetRandomBytes(24), false, ErrSetNotExist}, 346 } 347 for _, tt := range tests { 348 ok, err := set.SIsMember(tt.key, tt.val) 349 if tt.expectErr != nil { 350 require.Equal(t, tt.expectErr, err) 351 } else { 352 require.Equal(t, tt.ok, ok) 353 } 354 } 355 } 356 357 func TestSet_SAreMembers(t *testing.T) { 358 set := NewSet() 359 360 key := "set" 361 362 expectRecords := generateRecords(4) 363 values := make([][]byte, 4) 364 for i := range expectRecords { 365 values[i] = expectRecords[i].Value 366 } 367 368 require.NoError(t, set.SAdd(key, values, expectRecords)) 369 tests := []struct { 370 key string 371 val [][]byte 372 ok bool 373 expectErr error 374 }{ 375 {key, values[0:2], true, nil}, 376 {key, values[2:], true, nil}, 377 {key, values, true, nil}, 378 {key, [][]byte{GetRandomBytes(24)}, false, nil}, 379 {"fake key", values, true, ErrSetNotExist}, 380 } 381 for _, tt := range tests { 382 ok, err := set.SAreMembers(tt.key, tt.val...) 383 if tt.expectErr != nil { 384 require.Equal(t, tt.expectErr, err) 385 } else { 386 require.Equal(t, tt.ok, ok) 387 } 388 } 389 } 390 391 func TestSet_SUnion(t *testing.T) { 392 set := NewSet() 393 394 key1 := "set1" 395 key2 := "set2" 396 key3 := "set3" 397 key4 := "set4" 398 399 expectRecords := generateRecords(10) 400 401 values := make([][]byte, 10) 402 for i := range expectRecords { 403 values[i] = expectRecords[i].Value 404 } 405 406 require.NoError(t, set.SAdd(key1, values[:5], expectRecords[:5])) 407 require.NoError(t, set.SAdd(key2, values[2:6], expectRecords[2:6])) 408 require.NoError(t, set.SAdd(key3, values[2:7], expectRecords[2:7])) 409 require.NoError(t, set.SAdd(key4, values[7:], expectRecords[7:])) 410 411 type args struct { 412 key1 string 413 key2 string 414 } 415 416 tests := []struct { 417 name string 418 args args 419 set *Set 420 want []*Record 421 wantErr bool 422 }{ 423 {"normal set Union1", args{key1, key4}, set, 424 []*Record{expectRecords[0], expectRecords[1], expectRecords[2], expectRecords[3], expectRecords[4], expectRecords[7], expectRecords[8], expectRecords[9]}, 425 false}, 426 { 427 "normal set Union2", args{key2, key3}, set, 428 []*Record{expectRecords[2], expectRecords[3], expectRecords[4], expectRecords[5], expectRecords[6]}, 429 false, 430 }, 431 {"first fake set", args{"fake_key1", key2}, set, nil, true}, 432 {"second fake set", args{key1, "fake_key2"}, set, nil, true}, 433 {"two fake set", args{"fake_key1", "fake_key2"}, set, nil, true}, 434 } 435 436 for _, tt := range tests { 437 t.Run(tt.name, func(t *testing.T) { 438 got, err := tt.set.SUnion(tt.args.key1, tt.args.key2) 439 if (err != nil) != tt.wantErr { 440 require.Errorf(t, err, "Get() error = %v, wantErr %v", tt.wantErr) 441 } 442 require.ElementsMatchf(t, tt.want, got, "Get() got = %v, want %v", got, tt.want) 443 }) 444 } 445 }