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 }