github.com/gogf/gf@v1.16.9/container/gset/gset_z_unit_str_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  	"testing"
    18  	"time"
    19  
    20  	"github.com/gogf/gf/container/garray"
    21  	"github.com/gogf/gf/container/gset"
    22  	"github.com/gogf/gf/test/gtest"
    23  )
    24  
    25  func TestStrSet_Var(t *testing.T) {
    26  	gtest.C(t, func(t *gtest.T) {
    27  		var s gset.StrSet
    28  		s.Add("1", "1", "2")
    29  		s.Add([]string{"3", "4"}...)
    30  		t.Assert(s.Size(), 4)
    31  		t.AssertIN("1", s.Slice())
    32  		t.AssertIN("2", s.Slice())
    33  		t.AssertIN("3", s.Slice())
    34  		t.AssertIN("4", s.Slice())
    35  		t.AssertNI("0", s.Slice())
    36  		t.Assert(s.Contains("4"), true)
    37  		t.Assert(s.Contains("5"), false)
    38  		s.Remove("1")
    39  		t.Assert(s.Size(), 3)
    40  		s.Clear()
    41  		t.Assert(s.Size(), 0)
    42  	})
    43  }
    44  
    45  func TestStrSet_Basic(t *testing.T) {
    46  	gtest.C(t, func(t *gtest.T) {
    47  		s := gset.NewStrSet()
    48  		s.Add("1", "1", "2")
    49  		s.Add([]string{"3", "4"}...)
    50  		t.Assert(s.Size(), 4)
    51  		t.AssertIN("1", s.Slice())
    52  		t.AssertIN("2", s.Slice())
    53  		t.AssertIN("3", s.Slice())
    54  		t.AssertIN("4", s.Slice())
    55  		t.AssertNI("0", s.Slice())
    56  		t.Assert(s.Contains("4"), true)
    57  		t.Assert(s.Contains("5"), false)
    58  		s.Remove("1")
    59  		t.Assert(s.Size(), 3)
    60  		s.Clear()
    61  		t.Assert(s.Size(), 0)
    62  	})
    63  }
    64  
    65  func TestStrSet_ContainsI(t *testing.T) {
    66  	gtest.C(t, func(t *gtest.T) {
    67  		s := gset.NewStrSet()
    68  		s.Add("a", "b", "C")
    69  		t.Assert(s.Contains("A"), false)
    70  		t.Assert(s.Contains("a"), true)
    71  		t.Assert(s.ContainsI("A"), true)
    72  	})
    73  }
    74  
    75  func TestStrSet_Iterator(t *testing.T) {
    76  	gtest.C(t, func(t *gtest.T) {
    77  		s := gset.NewStrSet()
    78  		s.Add("1", "2", "3")
    79  		t.Assert(s.Size(), 3)
    80  
    81  		a1 := garray.New(true)
    82  		a2 := garray.New(true)
    83  		s.Iterator(func(v string) bool {
    84  			a1.Append("1")
    85  			return false
    86  		})
    87  		s.Iterator(func(v string) bool {
    88  			a2.Append("1")
    89  			return true
    90  		})
    91  		t.Assert(a1.Len(), 1)
    92  		t.Assert(a2.Len(), 3)
    93  	})
    94  }
    95  
    96  func TestStrSet_LockFunc(t *testing.T) {
    97  	gtest.C(t, func(t *gtest.T) {
    98  		s := gset.NewStrSet()
    99  		s.Add("1", "2", "3")
   100  		t.Assert(s.Size(), 3)
   101  		s.LockFunc(func(m map[string]struct{}) {
   102  			delete(m, "1")
   103  		})
   104  		t.Assert(s.Size(), 2)
   105  		s.RLockFunc(func(m map[string]struct{}) {
   106  			t.Assert(m, map[string]struct{}{
   107  				"3": struct{}{},
   108  				"2": struct{}{},
   109  			})
   110  		})
   111  	})
   112  }
   113  
   114  func TestStrSet_Equal(t *testing.T) {
   115  	gtest.C(t, func(t *gtest.T) {
   116  		s1 := gset.NewStrSet()
   117  		s2 := gset.NewStrSet()
   118  		s3 := gset.NewStrSet()
   119  		s1.Add("1", "2", "3")
   120  		s2.Add("1", "2", "3")
   121  		s3.Add("1", "2", "3", "4")
   122  		t.Assert(s1.Equal(s2), true)
   123  		t.Assert(s1.Equal(s3), false)
   124  	})
   125  }
   126  
   127  func TestStrSet_IsSubsetOf(t *testing.T) {
   128  	gtest.C(t, func(t *gtest.T) {
   129  		s1 := gset.NewStrSet()
   130  		s2 := gset.NewStrSet()
   131  		s3 := gset.NewStrSet()
   132  		s1.Add("1", "2")
   133  		s2.Add("1", "2", "3")
   134  		s3.Add("1", "2", "3", "4")
   135  		t.Assert(s1.IsSubsetOf(s2), true)
   136  		t.Assert(s2.IsSubsetOf(s3), true)
   137  		t.Assert(s1.IsSubsetOf(s3), true)
   138  		t.Assert(s2.IsSubsetOf(s1), false)
   139  		t.Assert(s3.IsSubsetOf(s2), false)
   140  	})
   141  }
   142  
   143  func TestStrSet_Union(t *testing.T) {
   144  	gtest.C(t, func(t *gtest.T) {
   145  		s1 := gset.NewStrSet()
   146  		s2 := gset.NewStrSet()
   147  		s1.Add("1", "2")
   148  		s2.Add("3", "4")
   149  		s3 := s1.Union(s2)
   150  		t.Assert(s3.Contains("1"), true)
   151  		t.Assert(s3.Contains("2"), true)
   152  		t.Assert(s3.Contains("3"), true)
   153  		t.Assert(s3.Contains("4"), true)
   154  	})
   155  }
   156  
   157  func TestStrSet_Diff(t *testing.T) {
   158  	gtest.C(t, func(t *gtest.T) {
   159  		s1 := gset.NewStrSet()
   160  		s2 := gset.NewStrSet()
   161  		s1.Add("1", "2", "3")
   162  		s2.Add("3", "4", "5")
   163  		s3 := s1.Diff(s2)
   164  		t.Assert(s3.Contains("1"), true)
   165  		t.Assert(s3.Contains("2"), true)
   166  		t.Assert(s3.Contains("3"), false)
   167  		t.Assert(s3.Contains("4"), false)
   168  	})
   169  }
   170  
   171  func TestStrSet_Intersect(t *testing.T) {
   172  	gtest.C(t, func(t *gtest.T) {
   173  		s1 := gset.NewStrSet()
   174  		s2 := gset.NewStrSet()
   175  		s1.Add("1", "2", "3")
   176  		s2.Add("3", "4", "5")
   177  		s3 := s1.Intersect(s2)
   178  		t.Assert(s3.Contains("1"), false)
   179  		t.Assert(s3.Contains("2"), false)
   180  		t.Assert(s3.Contains("3"), true)
   181  		t.Assert(s3.Contains("4"), false)
   182  	})
   183  }
   184  
   185  func TestStrSet_Complement(t *testing.T) {
   186  	gtest.C(t, func(t *gtest.T) {
   187  		s1 := gset.NewStrSet()
   188  		s2 := gset.NewStrSet()
   189  		s1.Add("1", "2", "3")
   190  		s2.Add("3", "4", "5")
   191  		s3 := s1.Complement(s2)
   192  		t.Assert(s3.Contains("1"), false)
   193  		t.Assert(s3.Contains("2"), false)
   194  		t.Assert(s3.Contains("4"), true)
   195  		t.Assert(s3.Contains("5"), true)
   196  	})
   197  }
   198  
   199  func TestNewIntSetFrom(t *testing.T) {
   200  	gtest.C(t, func(t *gtest.T) {
   201  		s1 := gset.NewIntSetFrom([]int{1, 2, 3, 4})
   202  		s2 := gset.NewIntSetFrom([]int{5, 6, 7, 8})
   203  		t.Assert(s1.Contains(3), true)
   204  		t.Assert(s1.Contains(5), false)
   205  		t.Assert(s2.Contains(3), false)
   206  		t.Assert(s2.Contains(5), true)
   207  	})
   208  }
   209  
   210  func TestStrSet_Merge(t *testing.T) {
   211  	gtest.C(t, func(t *gtest.T) {
   212  		s1 := gset.NewStrSet()
   213  		s2 := gset.NewStrSet()
   214  		s1.Add("1", "2", "3")
   215  		s2.Add("3", "4", "5")
   216  		s3 := s1.Merge(s2)
   217  		t.Assert(s3.Contains("1"), true)
   218  		t.Assert(s3.Contains("6"), false)
   219  		t.Assert(s3.Contains("4"), true)
   220  		t.Assert(s3.Contains("5"), true)
   221  	})
   222  }
   223  
   224  func TestNewStrSetFrom(t *testing.T) {
   225  	gtest.C(t, func(t *gtest.T) {
   226  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   227  		t.Assert(s1.Contains("b"), true)
   228  		t.Assert(s1.Contains("d"), false)
   229  	})
   230  }
   231  
   232  func TestStrSet_Join(t *testing.T) {
   233  	gtest.C(t, func(t *gtest.T) {
   234  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   235  		str1 := s1.Join(",")
   236  		t.Assert(strings.Contains(str1, "b"), true)
   237  		t.Assert(strings.Contains(str1, "d"), false)
   238  	})
   239  
   240  	gtest.C(t, func(t *gtest.T) {
   241  		s1 := gset.NewStrSet()
   242  		s1.Add("a", `"b"`, `\c`)
   243  		str1 := s1.Join(",")
   244  		t.Assert(strings.Contains(str1, `"b"`), true)
   245  		t.Assert(strings.Contains(str1, `\c`), true)
   246  		t.Assert(strings.Contains(str1, `a`), true)
   247  	})
   248  }
   249  
   250  func TestStrSet_String(t *testing.T) {
   251  	gtest.C(t, func(t *gtest.T) {
   252  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   253  		str1 := s1.String()
   254  		t.Assert(strings.Contains(str1, "b"), true)
   255  		t.Assert(strings.Contains(str1, "d"), false)
   256  	})
   257  
   258  	gtest.C(t, func(t *gtest.T) {
   259  		s1 := gset.New(true)
   260  		s1.Add("a", "a2", "b", "c")
   261  		str1 := s1.String()
   262  		t.Assert(strings.Contains(str1, "["), true)
   263  		t.Assert(strings.Contains(str1, "]"), true)
   264  		t.Assert(strings.Contains(str1, "a2"), true)
   265  	})
   266  }
   267  
   268  func TestStrSet_Sum(t *testing.T) {
   269  	gtest.C(t, func(t *gtest.T) {
   270  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   271  		s2 := gset.NewIntSetFrom([]int{2, 3, 4}, true)
   272  		t.Assert(s1.Sum(), 0)
   273  		t.Assert(s2.Sum(), 9)
   274  	})
   275  }
   276  
   277  func TestStrSet_Size(t *testing.T) {
   278  	gtest.C(t, func(t *gtest.T) {
   279  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   280  		t.Assert(s1.Size(), 3)
   281  
   282  	})
   283  }
   284  
   285  func TestStrSet_Remove(t *testing.T) {
   286  	gtest.C(t, func(t *gtest.T) {
   287  		s1 := gset.NewStrSetFrom([]string{"a", "b", "c"}, true)
   288  		s1.Remove("b")
   289  		t.Assert(s1.Contains("b"), false)
   290  		t.Assert(s1.Contains("c"), true)
   291  	})
   292  }
   293  
   294  func TestStrSet_Pop(t *testing.T) {
   295  	gtest.C(t, func(t *gtest.T) {
   296  		a := []string{"a", "b", "c", "d"}
   297  		s := gset.NewStrSetFrom(a, true)
   298  		t.Assert(s.Size(), 4)
   299  		t.AssertIN(s.Pop(), a)
   300  		t.Assert(s.Size(), 3)
   301  		t.AssertIN(s.Pop(), a)
   302  		t.Assert(s.Size(), 2)
   303  	})
   304  }
   305  
   306  func TestStrSet_Pops(t *testing.T) {
   307  	gtest.C(t, func(t *gtest.T) {
   308  		a := []string{"a", "b", "c", "d"}
   309  		s := gset.NewStrSetFrom(a, true)
   310  		array := s.Pops(2)
   311  		t.Assert(len(array), 2)
   312  		t.Assert(s.Size(), 2)
   313  		t.AssertIN(array, a)
   314  		t.Assert(s.Pops(0), nil)
   315  		t.AssertIN(s.Pops(2), a)
   316  		t.Assert(s.Size(), 0)
   317  	})
   318  
   319  	gtest.C(t, func(t *gtest.T) {
   320  		s := gset.NewStrSet(true)
   321  		a := []string{"1", "2", "3", "4"}
   322  		s.Add(a...)
   323  		t.Assert(s.Size(), 4)
   324  		t.Assert(s.Pops(-2), nil)
   325  		t.AssertIN(s.Pops(-1), a)
   326  	})
   327  }
   328  
   329  func TestStrSet_AddIfNotExist(t *testing.T) {
   330  	gtest.C(t, func(t *gtest.T) {
   331  		s := gset.NewStrSet(true)
   332  		s.Add("1")
   333  		t.Assert(s.Contains("1"), true)
   334  		t.Assert(s.AddIfNotExist("1"), false)
   335  		t.Assert(s.AddIfNotExist("2"), true)
   336  		t.Assert(s.Contains("2"), true)
   337  		t.Assert(s.AddIfNotExist("2"), false)
   338  		t.Assert(s.Contains("2"), true)
   339  	})
   340  }
   341  
   342  func TestStrSet_AddIfNotExistFunc(t *testing.T) {
   343  	gtest.C(t, func(t *gtest.T) {
   344  		s := gset.NewStrSet(true)
   345  		s.Add("1")
   346  		t.Assert(s.Contains("1"), true)
   347  		t.Assert(s.Contains("2"), false)
   348  		t.Assert(s.AddIfNotExistFunc("2", func() bool { return false }), false)
   349  		t.Assert(s.Contains("2"), false)
   350  		t.Assert(s.AddIfNotExistFunc("2", func() bool { return true }), true)
   351  		t.Assert(s.Contains("2"), true)
   352  		t.Assert(s.AddIfNotExistFunc("2", func() bool { return true }), false)
   353  		t.Assert(s.Contains("2"), true)
   354  	})
   355  	gtest.C(t, func(t *gtest.T) {
   356  		s := gset.NewStrSet(true)
   357  		wg := sync.WaitGroup{}
   358  		wg.Add(1)
   359  		go func() {
   360  			defer wg.Done()
   361  			r := s.AddIfNotExistFunc("1", func() bool {
   362  				time.Sleep(100 * time.Millisecond)
   363  				return true
   364  			})
   365  			t.Assert(r, false)
   366  		}()
   367  		s.Add("1")
   368  		wg.Wait()
   369  	})
   370  }
   371  
   372  func TestStrSet_AddIfNotExistFuncLock(t *testing.T) {
   373  	gtest.C(t, func(t *gtest.T) {
   374  		s := gset.NewStrSet(true)
   375  		wg := sync.WaitGroup{}
   376  		wg.Add(2)
   377  		go func() {
   378  			defer wg.Done()
   379  			r := s.AddIfNotExistFuncLock("1", func() bool {
   380  				time.Sleep(500 * time.Millisecond)
   381  				return true
   382  			})
   383  			t.Assert(r, true)
   384  		}()
   385  		time.Sleep(100 * time.Millisecond)
   386  		go func() {
   387  			defer wg.Done()
   388  			r := s.AddIfNotExistFuncLock("1", func() bool {
   389  				return true
   390  			})
   391  			t.Assert(r, false)
   392  		}()
   393  		wg.Wait()
   394  	})
   395  }
   396  
   397  func TestStrSet_Json(t *testing.T) {
   398  	gtest.C(t, func(t *gtest.T) {
   399  		s1 := []string{"a", "b", "d", "c"}
   400  		a1 := gset.NewStrSetFrom(s1)
   401  		b1, err1 := json.Marshal(a1)
   402  		b2, err2 := json.Marshal(s1)
   403  		t.Assert(len(b1), len(b2))
   404  		t.Assert(err1, err2)
   405  
   406  		a2 := gset.NewStrSet()
   407  		err2 = json.UnmarshalUseNumber(b2, &a2)
   408  		t.Assert(err2, nil)
   409  		t.Assert(a2.Contains("a"), true)
   410  		t.Assert(a2.Contains("b"), true)
   411  		t.Assert(a2.Contains("c"), true)
   412  		t.Assert(a2.Contains("d"), true)
   413  		t.Assert(a2.Contains("e"), false)
   414  
   415  		var a3 gset.StrSet
   416  		err := json.UnmarshalUseNumber(b2, &a3)
   417  		t.Assert(err, nil)
   418  		t.Assert(a3.Contains("a"), true)
   419  		t.Assert(a3.Contains("b"), true)
   420  		t.Assert(a3.Contains("c"), true)
   421  		t.Assert(a3.Contains("d"), true)
   422  		t.Assert(a3.Contains("e"), false)
   423  	})
   424  }
   425  
   426  func TestStrSet_Walk(t *testing.T) {
   427  	gtest.C(t, func(t *gtest.T) {
   428  		var (
   429  			set    gset.StrSet
   430  			names  = g.SliceStr{"user", "user_detail"}
   431  			prefix = "gf_"
   432  		)
   433  		set.Add(names...)
   434  		// Add prefix for given table names.
   435  		set.Walk(func(item string) string {
   436  			return prefix + item
   437  		})
   438  		t.Assert(set.Size(), 2)
   439  		t.Assert(set.Contains("gf_user"), true)
   440  		t.Assert(set.Contains("gf_user_detail"), true)
   441  	})
   442  }
   443  
   444  func TestStrSet_UnmarshalValue(t *testing.T) {
   445  	type V struct {
   446  		Name string
   447  		Set  *gset.StrSet
   448  	}
   449  	// JSON
   450  	gtest.C(t, func(t *gtest.T) {
   451  		var v *V
   452  		err := gconv.Struct(g.Map{
   453  			"name": "john",
   454  			"set":  []byte(`["1","2","3"]`),
   455  		}, &v)
   456  		t.Assert(err, nil)
   457  		t.Assert(v.Name, "john")
   458  		t.Assert(v.Set.Size(), 3)
   459  		t.Assert(v.Set.Contains("1"), true)
   460  		t.Assert(v.Set.Contains("2"), true)
   461  		t.Assert(v.Set.Contains("3"), true)
   462  		t.Assert(v.Set.Contains("4"), false)
   463  	})
   464  	// Map
   465  	gtest.C(t, func(t *gtest.T) {
   466  		var v *V
   467  		err := gconv.Struct(g.Map{
   468  			"name": "john",
   469  			"set":  g.SliceStr{"1", "2", "3"},
   470  		}, &v)
   471  		t.Assert(err, nil)
   472  		t.Assert(v.Name, "john")
   473  		t.Assert(v.Set.Size(), 3)
   474  		t.Assert(v.Set.Contains("1"), true)
   475  		t.Assert(v.Set.Contains("2"), true)
   476  		t.Assert(v.Set.Contains("3"), true)
   477  		t.Assert(v.Set.Contains("4"), false)
   478  	})
   479  }