github.com/gogf/gf@v1.16.9/container/gset/gset_z_unit_any_test.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/gogf/gf.
     6  
     7  // go test *.go
     8  
     9  package gset_test
    10  
    11  import (
    12  	"github.com/gogf/gf/frame/g"
    13  	"github.com/gogf/gf/internal/json"
    14  	"github.com/gogf/gf/util/gconv"
    15  	"strings"
    16  	"sync"
    17  	"time"
    18  
    19  	"github.com/gogf/gf/container/garray"
    20  	"github.com/gogf/gf/container/gset"
    21  	"github.com/gogf/gf/test/gtest"
    22  
    23  	"testing"
    24  )
    25  
    26  func TestSet_Var(t *testing.T) {
    27  	gtest.C(t, func(t *gtest.T) {
    28  		var s gset.Set
    29  		s.Add(1, 1, 2)
    30  		s.Add([]interface{}{3, 4}...)
    31  		t.Assert(s.Size(), 4)
    32  		t.AssertIN(1, s.Slice())
    33  		t.AssertIN(2, s.Slice())
    34  		t.AssertIN(3, s.Slice())
    35  		t.AssertIN(4, s.Slice())
    36  		t.AssertNI(0, s.Slice())
    37  		t.Assert(s.Contains(4), true)
    38  		t.Assert(s.Contains(5), false)
    39  		s.Remove(1)
    40  		t.Assert(s.Size(), 3)
    41  		s.Clear()
    42  		t.Assert(s.Size(), 0)
    43  	})
    44  }
    45  
    46  func TestSet_New(t *testing.T) {
    47  	gtest.C(t, func(t *gtest.T) {
    48  		s := gset.New()
    49  		s.Add(1, 1, 2)
    50  		s.Add([]interface{}{3, 4}...)
    51  		t.Assert(s.Size(), 4)
    52  		t.AssertIN(1, s.Slice())
    53  		t.AssertIN(2, s.Slice())
    54  		t.AssertIN(3, s.Slice())
    55  		t.AssertIN(4, s.Slice())
    56  		t.AssertNI(0, s.Slice())
    57  		t.Assert(s.Contains(4), true)
    58  		t.Assert(s.Contains(5), false)
    59  		s.Remove(1)
    60  		t.Assert(s.Size(), 3)
    61  		s.Clear()
    62  		t.Assert(s.Size(), 0)
    63  	})
    64  }
    65  
    66  func TestSet_Basic(t *testing.T) {
    67  	gtest.C(t, func(t *gtest.T) {
    68  		s := gset.NewSet()
    69  		s.Add(1, 1, 2)
    70  		s.Add([]interface{}{3, 4}...)
    71  		t.Assert(s.Size(), 4)
    72  		t.AssertIN(1, s.Slice())
    73  		t.AssertIN(2, s.Slice())
    74  		t.AssertIN(3, s.Slice())
    75  		t.AssertIN(4, s.Slice())
    76  		t.AssertNI(0, s.Slice())
    77  		t.Assert(s.Contains(4), true)
    78  		t.Assert(s.Contains(5), false)
    79  		s.Remove(1)
    80  		t.Assert(s.Size(), 3)
    81  		s.Clear()
    82  		t.Assert(s.Size(), 0)
    83  	})
    84  }
    85  
    86  func TestSet_Iterator(t *testing.T) {
    87  	gtest.C(t, func(t *gtest.T) {
    88  		s := gset.NewSet()
    89  		s.Add(1, 2, 3)
    90  		t.Assert(s.Size(), 3)
    91  
    92  		a1 := garray.New(true)
    93  		a2 := garray.New(true)
    94  		s.Iterator(func(v interface{}) bool {
    95  			a1.Append(1)
    96  			return false
    97  		})
    98  		s.Iterator(func(v interface{}) bool {
    99  			a2.Append(1)
   100  			return true
   101  		})
   102  		t.Assert(a1.Len(), 1)
   103  		t.Assert(a2.Len(), 3)
   104  	})
   105  }
   106  
   107  func TestSet_LockFunc(t *testing.T) {
   108  	gtest.C(t, func(t *gtest.T) {
   109  		s := gset.NewSet()
   110  		s.Add(1, 2, 3)
   111  		t.Assert(s.Size(), 3)
   112  		s.LockFunc(func(m map[interface{}]struct{}) {
   113  			delete(m, 1)
   114  		})
   115  		t.Assert(s.Size(), 2)
   116  		s.RLockFunc(func(m map[interface{}]struct{}) {
   117  			t.Assert(m, map[interface{}]struct{}{
   118  				3: struct{}{},
   119  				2: struct{}{},
   120  			})
   121  		})
   122  	})
   123  }
   124  
   125  func TestSet_Equal(t *testing.T) {
   126  	gtest.C(t, func(t *gtest.T) {
   127  		s1 := gset.NewSet()
   128  		s2 := gset.NewSet()
   129  		s3 := gset.NewSet()
   130  		s1.Add(1, 2, 3)
   131  		s2.Add(1, 2, 3)
   132  		s3.Add(1, 2, 3, 4)
   133  		t.Assert(s1.Equal(s2), true)
   134  		t.Assert(s1.Equal(s3), false)
   135  	})
   136  }
   137  
   138  func TestSet_IsSubsetOf(t *testing.T) {
   139  	gtest.C(t, func(t *gtest.T) {
   140  		s1 := gset.NewSet()
   141  		s2 := gset.NewSet()
   142  		s3 := gset.NewSet()
   143  		s1.Add(1, 2)
   144  		s2.Add(1, 2, 3)
   145  		s3.Add(1, 2, 3, 4)
   146  		t.Assert(s1.IsSubsetOf(s2), true)
   147  		t.Assert(s2.IsSubsetOf(s3), true)
   148  		t.Assert(s1.IsSubsetOf(s3), true)
   149  		t.Assert(s2.IsSubsetOf(s1), false)
   150  		t.Assert(s3.IsSubsetOf(s2), false)
   151  	})
   152  }
   153  
   154  func TestSet_Union(t *testing.T) {
   155  	gtest.C(t, func(t *gtest.T) {
   156  		s1 := gset.NewSet()
   157  		s2 := gset.NewSet()
   158  		s1.Add(1, 2)
   159  		s2.Add(3, 4)
   160  		s3 := s1.Union(s2)
   161  		t.Assert(s3.Contains(1), true)
   162  		t.Assert(s3.Contains(2), true)
   163  		t.Assert(s3.Contains(3), true)
   164  		t.Assert(s3.Contains(4), true)
   165  	})
   166  }
   167  
   168  func TestSet_Diff(t *testing.T) {
   169  	gtest.C(t, func(t *gtest.T) {
   170  		s1 := gset.NewSet()
   171  		s2 := gset.NewSet()
   172  		s1.Add(1, 2, 3)
   173  		s2.Add(3, 4, 5)
   174  		s3 := s1.Diff(s2)
   175  		t.Assert(s3.Contains(1), true)
   176  		t.Assert(s3.Contains(2), true)
   177  		t.Assert(s3.Contains(3), false)
   178  		t.Assert(s3.Contains(4), false)
   179  	})
   180  }
   181  
   182  func TestSet_Intersect(t *testing.T) {
   183  	gtest.C(t, func(t *gtest.T) {
   184  		s1 := gset.NewSet()
   185  		s2 := gset.NewSet()
   186  		s1.Add(1, 2, 3)
   187  		s2.Add(3, 4, 5)
   188  		s3 := s1.Intersect(s2)
   189  		t.Assert(s3.Contains(1), false)
   190  		t.Assert(s3.Contains(2), false)
   191  		t.Assert(s3.Contains(3), true)
   192  		t.Assert(s3.Contains(4), false)
   193  	})
   194  }
   195  
   196  func TestSet_Complement(t *testing.T) {
   197  	gtest.C(t, func(t *gtest.T) {
   198  		s1 := gset.NewSet()
   199  		s2 := gset.NewSet()
   200  		s1.Add(1, 2, 3)
   201  		s2.Add(3, 4, 5)
   202  		s3 := s1.Complement(s2)
   203  		t.Assert(s3.Contains(1), false)
   204  		t.Assert(s3.Contains(2), false)
   205  		t.Assert(s3.Contains(4), true)
   206  		t.Assert(s3.Contains(5), true)
   207  	})
   208  }
   209  
   210  func TestNewFrom(t *testing.T) {
   211  	gtest.C(t, func(t *gtest.T) {
   212  		s1 := gset.NewFrom("a")
   213  		s2 := gset.NewFrom("b", false)
   214  		s3 := gset.NewFrom(3, true)
   215  		s4 := gset.NewFrom([]string{"s1", "s2"}, true)
   216  		t.Assert(s1.Contains("a"), true)
   217  		t.Assert(s2.Contains("b"), true)
   218  		t.Assert(s3.Contains(3), true)
   219  		t.Assert(s4.Contains("s1"), true)
   220  		t.Assert(s4.Contains("s3"), false)
   221  
   222  	})
   223  }
   224  
   225  func TestNew(t *testing.T) {
   226  	gtest.C(t, func(t *gtest.T) {
   227  		s1 := gset.New()
   228  		s1.Add("a", 2)
   229  		s2 := gset.New(true)
   230  		s2.Add("b", 3)
   231  		t.Assert(s1.Contains("a"), true)
   232  
   233  	})
   234  }
   235  
   236  func TestSet_Join(t *testing.T) {
   237  	gtest.C(t, func(t *gtest.T) {
   238  		s1 := gset.New(true)
   239  		s1.Add("a", "a1", "b", "c")
   240  		str1 := s1.Join(",")
   241  		t.Assert(strings.Contains(str1, "a1"), true)
   242  	})
   243  	gtest.C(t, func(t *gtest.T) {
   244  		s1 := gset.New(true)
   245  		s1.Add("a", `"b"`, `\c`)
   246  		str1 := s1.Join(",")
   247  		t.Assert(strings.Contains(str1, `"b"`), true)
   248  		t.Assert(strings.Contains(str1, `\c`), true)
   249  		t.Assert(strings.Contains(str1, `a`), true)
   250  	})
   251  }
   252  
   253  func TestSet_String(t *testing.T) {
   254  	gtest.C(t, func(t *gtest.T) {
   255  		s1 := gset.New(true)
   256  		s1.Add("a", "a2", "b", "c")
   257  		str1 := s1.String()
   258  		t.Assert(strings.Contains(str1, "["), true)
   259  		t.Assert(strings.Contains(str1, "]"), true)
   260  		t.Assert(strings.Contains(str1, "a2"), true)
   261  	})
   262  }
   263  
   264  func TestSet_Merge(t *testing.T) {
   265  	gtest.C(t, func(t *gtest.T) {
   266  		s1 := gset.New(true)
   267  		s2 := gset.New(true)
   268  		s1.Add("a", "a2", "b", "c")
   269  		s2.Add("b", "b1", "e", "f")
   270  		ss := s1.Merge(s2)
   271  		t.Assert(ss.Contains("a2"), true)
   272  		t.Assert(ss.Contains("b1"), true)
   273  
   274  	})
   275  }
   276  
   277  func TestSet_Sum(t *testing.T) {
   278  	gtest.C(t, func(t *gtest.T) {
   279  		s1 := gset.New(true)
   280  		s1.Add(1, 2, 3, 4)
   281  		t.Assert(s1.Sum(), int(10))
   282  
   283  	})
   284  }
   285  
   286  func TestSet_Pop(t *testing.T) {
   287  	gtest.C(t, func(t *gtest.T) {
   288  		s := gset.New(true)
   289  		s.Add(1, 2, 3, 4)
   290  		t.Assert(s.Size(), 4)
   291  		t.AssertIN(s.Pop(), []int{1, 2, 3, 4})
   292  		t.Assert(s.Size(), 3)
   293  	})
   294  }
   295  
   296  func TestSet_Pops(t *testing.T) {
   297  	gtest.C(t, func(t *gtest.T) {
   298  		s := gset.New(true)
   299  		s.Add(1, 2, 3, 4)
   300  		t.Assert(s.Size(), 4)
   301  		t.Assert(s.Pops(0), nil)
   302  		t.AssertIN(s.Pops(1), []int{1, 2, 3, 4})
   303  		t.Assert(s.Size(), 3)
   304  		a := s.Pops(6)
   305  		t.Assert(len(a), 3)
   306  		t.AssertIN(a, []int{1, 2, 3, 4})
   307  		t.Assert(s.Size(), 0)
   308  	})
   309  
   310  	gtest.C(t, func(t *gtest.T) {
   311  		s := gset.New(true)
   312  		a := []interface{}{1, 2, 3, 4}
   313  		s.Add(a...)
   314  		t.Assert(s.Size(), 4)
   315  		t.Assert(s.Pops(-2), nil)
   316  		t.AssertIN(s.Pops(-1), a)
   317  	})
   318  }
   319  
   320  func TestSet_Json(t *testing.T) {
   321  	gtest.C(t, func(t *gtest.T) {
   322  		s1 := []interface{}{"a", "b", "d", "c"}
   323  		a1 := gset.NewFrom(s1)
   324  		b1, err1 := json.Marshal(a1)
   325  		b2, err2 := json.Marshal(s1)
   326  		t.Assert(len(b1), len(b2))
   327  		t.Assert(err1, err2)
   328  
   329  		a2 := gset.New()
   330  		err2 = json.UnmarshalUseNumber(b2, &a2)
   331  		t.Assert(err2, nil)
   332  		t.Assert(a2.Contains("a"), true)
   333  		t.Assert(a2.Contains("b"), true)
   334  		t.Assert(a2.Contains("c"), true)
   335  		t.Assert(a2.Contains("d"), true)
   336  		t.Assert(a2.Contains("e"), false)
   337  
   338  		var a3 gset.Set
   339  		err := json.UnmarshalUseNumber(b2, &a3)
   340  		t.Assert(err, nil)
   341  		t.Assert(a3.Contains("a"), true)
   342  		t.Assert(a3.Contains("b"), true)
   343  		t.Assert(a3.Contains("c"), true)
   344  		t.Assert(a3.Contains("d"), true)
   345  		t.Assert(a3.Contains("e"), false)
   346  	})
   347  }
   348  
   349  func TestSet_AddIfNotExist(t *testing.T) {
   350  	gtest.C(t, func(t *gtest.T) {
   351  		s := gset.New(true)
   352  		s.Add(1)
   353  		t.Assert(s.Contains(1), true)
   354  		t.Assert(s.AddIfNotExist(1), false)
   355  		t.Assert(s.AddIfNotExist(2), true)
   356  		t.Assert(s.Contains(2), true)
   357  		t.Assert(s.AddIfNotExist(2), false)
   358  		t.Assert(s.Contains(2), true)
   359  	})
   360  }
   361  
   362  func TestSet_AddIfNotExistFunc(t *testing.T) {
   363  	gtest.C(t, func(t *gtest.T) {
   364  		s := gset.New(true)
   365  		s.Add(1)
   366  		t.Assert(s.Contains(1), true)
   367  		t.Assert(s.Contains(2), false)
   368  		t.Assert(s.AddIfNotExistFunc(2, func() bool { return false }), false)
   369  		t.Assert(s.Contains(2), false)
   370  		t.Assert(s.AddIfNotExistFunc(2, func() bool { return true }), true)
   371  		t.Assert(s.Contains(2), true)
   372  		t.Assert(s.AddIfNotExistFunc(2, func() bool { return true }), false)
   373  		t.Assert(s.Contains(2), true)
   374  	})
   375  	gtest.C(t, func(t *gtest.T) {
   376  		s := gset.New(true)
   377  		wg := sync.WaitGroup{}
   378  		wg.Add(1)
   379  		go func() {
   380  			defer wg.Done()
   381  			r := s.AddIfNotExistFunc(1, func() bool {
   382  				time.Sleep(100 * time.Millisecond)
   383  				return true
   384  			})
   385  			t.Assert(r, false)
   386  		}()
   387  		s.Add(1)
   388  		wg.Wait()
   389  	})
   390  }
   391  
   392  func TestSet_Walk(t *testing.T) {
   393  	gtest.C(t, func(t *gtest.T) {
   394  		var set gset.Set
   395  		set.Add(g.Slice{1, 2}...)
   396  		set.Walk(func(item interface{}) interface{} {
   397  			return gconv.Int(item) + 10
   398  		})
   399  		t.Assert(set.Size(), 2)
   400  		t.Assert(set.Contains(11), true)
   401  		t.Assert(set.Contains(12), true)
   402  	})
   403  }
   404  
   405  func TestSet_AddIfNotExistFuncLock(t *testing.T) {
   406  	gtest.C(t, func(t *gtest.T) {
   407  		s := gset.New(true)
   408  		wg := sync.WaitGroup{}
   409  		wg.Add(2)
   410  		go func() {
   411  			defer wg.Done()
   412  			r := s.AddIfNotExistFuncLock(1, func() bool {
   413  				time.Sleep(500 * time.Millisecond)
   414  				return true
   415  			})
   416  			t.Assert(r, true)
   417  		}()
   418  		time.Sleep(100 * time.Millisecond)
   419  		go func() {
   420  			defer wg.Done()
   421  			r := s.AddIfNotExistFuncLock(1, func() bool {
   422  				return true
   423  			})
   424  			t.Assert(r, false)
   425  		}()
   426  		wg.Wait()
   427  	})
   428  }
   429  
   430  func TestSet_UnmarshalValue(t *testing.T) {
   431  	type V struct {
   432  		Name string
   433  		Set  *gset.Set
   434  	}
   435  	// JSON
   436  	gtest.C(t, func(t *gtest.T) {
   437  		var v *V
   438  		err := gconv.Struct(g.Map{
   439  			"name": "john",
   440  			"set":  []byte(`["k1","k2","k3"]`),
   441  		}, &v)
   442  		t.Assert(err, nil)
   443  		t.Assert(v.Name, "john")
   444  		t.Assert(v.Set.Size(), 3)
   445  		t.Assert(v.Set.Contains("k1"), true)
   446  		t.Assert(v.Set.Contains("k2"), true)
   447  		t.Assert(v.Set.Contains("k3"), true)
   448  		t.Assert(v.Set.Contains("k4"), false)
   449  	})
   450  	// Map
   451  	gtest.C(t, func(t *gtest.T) {
   452  		var v *V
   453  		err := gconv.Struct(g.Map{
   454  			"name": "john",
   455  			"set":  g.Slice{"k1", "k2", "k3"},
   456  		}, &v)
   457  		t.Assert(err, nil)
   458  		t.Assert(v.Name, "john")
   459  		t.Assert(v.Set.Size(), 3)
   460  		t.Assert(v.Set.Contains("k1"), true)
   461  		t.Assert(v.Set.Contains("k2"), true)
   462  		t.Assert(v.Set.Contains("k3"), true)
   463  		t.Assert(v.Set.Contains("k4"), false)
   464  	})
   465  }