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 }