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  }