github.com/wangyougui/gf/v2@v2.6.5/container/garray/garray_z_unit_normal_int_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/wangyougui/gf. 6 7 // go test *.go 8 9 package garray_test 10 11 import ( 12 "testing" 13 "time" 14 15 "github.com/wangyougui/gf/v2/internal/empty" 16 17 "github.com/wangyougui/gf/v2/container/garray" 18 "github.com/wangyougui/gf/v2/frame/g" 19 "github.com/wangyougui/gf/v2/internal/json" 20 "github.com/wangyougui/gf/v2/test/gtest" 21 "github.com/wangyougui/gf/v2/util/gconv" 22 ) 23 24 func Test_IntArray_Basic(t *testing.T) { 25 gtest.C(t, func(t *gtest.T) { 26 expect := []int{0, 1, 2, 3} 27 expect2 := []int{} 28 array := garray.NewIntArrayFrom(expect) 29 array2 := garray.NewIntArrayFrom(expect2) 30 t.Assert(array.Slice(), expect) 31 t.Assert(array.Interfaces(), expect) 32 array.Set(0, 100) 33 34 v, ok := array.Get(0) 35 t.Assert(v, 100) 36 t.Assert(ok, true) 37 38 v, ok = array.Get(1) 39 t.Assert(v, 1) 40 t.Assert(ok, true) 41 42 t.Assert(array.Search(100), 0) 43 t.Assert(array2.Search(100), -1) 44 t.Assert(array.Contains(100), true) 45 46 v, ok = array.Remove(0) 47 t.Assert(v, 100) 48 t.Assert(ok, true) 49 50 v, ok = array.Remove(-1) 51 t.Assert(v, 0) 52 t.Assert(ok, false) 53 54 v, ok = array.Remove(100000) 55 t.Assert(v, 0) 56 t.Assert(ok, false) 57 58 t.Assert(array.Contains(100), false) 59 array.Append(4) 60 t.Assert(array.Len(), 4) 61 array.InsertBefore(0, 100) 62 array.InsertAfter(0, 200) 63 t.Assert(array.Slice(), []int{100, 200, 1, 2, 3, 4}) 64 array.InsertBefore(5, 300) 65 array.InsertAfter(6, 400) 66 t.Assert(array.Slice(), []int{100, 200, 1, 2, 3, 300, 4, 400}) 67 t.Assert(array.Clear().Len(), 0) 68 err := array.InsertBefore(99, 300) 69 t.AssertNE(err, nil) 70 err = array.InsertAfter(99, 400) 71 t.AssertNE(err, nil) 72 }) 73 74 gtest.C(t, func(t *gtest.T) { 75 array := garray.NewIntArrayFrom([]int{0, 1, 2, 3}) 76 copyArray := array.DeepCopy().(*garray.IntArray) 77 copyArray.Set(0, 1) 78 cval, _ := copyArray.Get(0) 79 val, _ := array.Get(0) 80 t.AssertNE(cval, val) 81 }) 82 } 83 84 func TestIntArray_Sort(t *testing.T) { 85 gtest.C(t, func(t *gtest.T) { 86 expect1 := []int{0, 1, 2, 3} 87 expect2 := []int{3, 2, 1, 0} 88 array := garray.NewIntArray() 89 array2 := garray.NewIntArray(true) 90 for i := 3; i >= 0; i-- { 91 array.Append(i) 92 array2.Append(i) 93 } 94 array.Sort() 95 t.Assert(array.Slice(), expect1) 96 array.Sort(true) 97 t.Assert(array.Slice(), expect2) 98 t.Assert(array2.Slice(), expect2) 99 }) 100 } 101 102 func TestIntArray_Unique(t *testing.T) { 103 gtest.C(t, func(t *gtest.T) { 104 expect := []int{1, 2, 3, 4, 5, 3, 2, 2, 3, 5, 5} 105 array := garray.NewIntArrayFrom(expect) 106 t.Assert(array.Unique().Slice(), []int{1, 2, 3, 4, 5}) 107 array2 := garray.NewIntArrayFrom([]int{}) 108 t.Assert(array2.Unique().Slice(), []int{}) 109 }) 110 } 111 112 func TestIntArray_PushAndPop(t *testing.T) { 113 gtest.C(t, func(t *gtest.T) { 114 expect := []int{0, 1, 2, 3} 115 array := garray.NewIntArrayFrom(expect) 116 t.Assert(array.Slice(), expect) 117 118 v, ok := array.PopLeft() 119 t.Assert(v, 0) 120 t.Assert(ok, true) 121 122 v, ok = array.PopRight() 123 t.Assert(v, 3) 124 t.Assert(ok, true) 125 126 v, ok = array.PopRand() 127 t.AssertIN(v, []int{1, 2}) 128 t.Assert(ok, true) 129 130 v, ok = array.PopRand() 131 t.AssertIN(v, []int{1, 2}) 132 t.Assert(ok, true) 133 134 v, ok = array.PopRand() 135 t.Assert(v, 0) 136 t.Assert(ok, false) 137 138 t.Assert(array.Len(), 0) 139 array.PushLeft(1).PushRight(2) 140 t.Assert(array.Slice(), []int{1, 2}) 141 }) 142 } 143 144 func TestIntArray_PopLeftsAndPopRights(t *testing.T) { 145 gtest.C(t, func(t *gtest.T) { 146 array := garray.NewIntArray() 147 148 v, ok := array.PopLeft() 149 t.Assert(v, 0) 150 t.Assert(ok, false) 151 152 t.Assert(array.PopLefts(10), nil) 153 154 v, ok = array.PopRight() 155 t.Assert(v, 0) 156 t.Assert(ok, false) 157 158 t.Assert(array.PopRights(10), nil) 159 160 v, ok = array.PopRand() 161 t.Assert(v, 0) 162 t.Assert(ok, false) 163 164 t.Assert(array.PopRands(10), nil) 165 }) 166 167 gtest.C(t, func(t *gtest.T) { 168 value1 := []int{0, 1, 2, 3, 4, 5, 6} 169 value2 := []int{0, 1, 2, 3, 4, 5, 6} 170 array1 := garray.NewIntArrayFrom(value1) 171 array2 := garray.NewIntArrayFrom(value2) 172 t.Assert(array1.PopLefts(2), []int{0, 1}) 173 t.Assert(array1.Slice(), []int{2, 3, 4, 5, 6}) 174 t.Assert(array1.PopRights(2), []int{5, 6}) 175 t.Assert(array1.Slice(), []int{2, 3, 4}) 176 t.Assert(array1.PopRights(20), []int{2, 3, 4}) 177 t.Assert(array1.Slice(), []int{}) 178 t.Assert(array2.PopLefts(20), []int{0, 1, 2, 3, 4, 5, 6}) 179 t.Assert(array2.Slice(), []int{}) 180 }) 181 } 182 183 func TestIntArray_Range(t *testing.T) { 184 gtest.C(t, func(t *gtest.T) { 185 value1 := []int{0, 1, 2, 3, 4, 5, 6} 186 array1 := garray.NewIntArrayFrom(value1) 187 array2 := garray.NewIntArrayFrom(value1, true) 188 t.Assert(array1.Range(0, 1), []int{0}) 189 t.Assert(array1.Range(1, 2), []int{1}) 190 t.Assert(array1.Range(0, 2), []int{0, 1}) 191 t.Assert(array1.Range(10, 2), nil) 192 t.Assert(array1.Range(-1, 10), value1) 193 t.Assert(array2.Range(1, 2), []int{1}) 194 }) 195 } 196 197 func TestIntArray_Merge(t *testing.T) { 198 gtest.C(t, func(t *gtest.T) { 199 func1 := func(v1, v2 interface{}) int { 200 if gconv.Int(v1) < gconv.Int(v2) { 201 return 0 202 } 203 return 1 204 } 205 206 n1 := []int{0, 1, 2, 3} 207 n2 := []int{4, 5, 6, 7} 208 i1 := []interface{}{"1", "2"} 209 s1 := []string{"a", "b", "c"} 210 s2 := []string{"e", "f"} 211 a1 := garray.NewIntArrayFrom(n1) 212 a2 := garray.NewIntArrayFrom(n2) 213 a3 := garray.NewArrayFrom(i1) 214 a4 := garray.NewStrArrayFrom(s1) 215 216 a5 := garray.NewSortedStrArrayFrom(s2) 217 a6 := garray.NewSortedIntArrayFrom([]int{1, 2, 3}) 218 219 a7 := garray.NewSortedStrArrayFrom(s1) 220 a8 := garray.NewSortedArrayFrom([]interface{}{4, 5}, func1) 221 222 t.Assert(a1.Merge(a2).Slice(), []int{0, 1, 2, 3, 4, 5, 6, 7}) 223 t.Assert(a1.Merge(a3).Len(), 10) 224 t.Assert(a1.Merge(a4).Len(), 13) 225 t.Assert(a1.Merge(a5).Len(), 15) 226 t.Assert(a1.Merge(a6).Len(), 18) 227 t.Assert(a1.Merge(a7).Len(), 21) 228 t.Assert(a1.Merge(a8).Len(), 23) 229 }) 230 } 231 232 func TestIntArray_Fill(t *testing.T) { 233 gtest.C(t, func(t *gtest.T) { 234 a1 := []int{0} 235 a2 := []int{0} 236 array1 := garray.NewIntArrayFrom(a1) 237 array2 := garray.NewIntArrayFrom(a2) 238 t.Assert(array1.Fill(1, 2, 100), nil) 239 t.Assert(array1.Slice(), []int{0, 100, 100}) 240 241 t.Assert(array2.Fill(0, 2, 100), nil) 242 t.Assert(array2.Slice(), []int{100, 100}) 243 244 t.AssertNE(array2.Fill(-1, 2, 100), nil) 245 t.Assert(array2.Slice(), []int{100, 100}) 246 }) 247 } 248 249 func TestIntArray_PopLeft(t *testing.T) { 250 gtest.C(t, func(t *gtest.T) { 251 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3}) 252 v, ok := array.PopLeft() 253 t.Assert(v, 1) 254 t.Assert(ok, true) 255 t.Assert(array.Len(), 2) 256 v, ok = array.PopLeft() 257 t.Assert(v, 2) 258 t.Assert(ok, true) 259 t.Assert(array.Len(), 1) 260 v, ok = array.PopLeft() 261 t.Assert(v, 3) 262 t.Assert(ok, true) 263 t.Assert(array.Len(), 0) 264 }) 265 } 266 267 func TestIntArray_PopRight(t *testing.T) { 268 gtest.C(t, func(t *gtest.T) { 269 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3}) 270 271 v, ok := array.PopRight() 272 t.Assert(v, 3) 273 t.Assert(ok, true) 274 t.Assert(array.Len(), 2) 275 276 v, ok = array.PopRight() 277 t.Assert(v, 2) 278 t.Assert(ok, true) 279 t.Assert(array.Len(), 1) 280 281 v, ok = array.PopRight() 282 t.Assert(v, 1) 283 t.Assert(ok, true) 284 t.Assert(array.Len(), 0) 285 }) 286 } 287 288 func TestIntArray_PopLefts(t *testing.T) { 289 gtest.C(t, func(t *gtest.T) { 290 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3}) 291 t.Assert(array.PopLefts(2), g.Slice{1, 2}) 292 t.Assert(array.Len(), 1) 293 t.Assert(array.PopLefts(2), g.Slice{3}) 294 t.Assert(array.Len(), 0) 295 }) 296 } 297 298 func TestIntArray_PopRights(t *testing.T) { 299 gtest.C(t, func(t *gtest.T) { 300 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3}) 301 t.Assert(array.PopRights(2), g.Slice{2, 3}) 302 t.Assert(array.Len(), 1) 303 t.Assert(array.PopLefts(2), g.Slice{1}) 304 t.Assert(array.Len(), 0) 305 }) 306 } 307 308 func TestIntArray_Chunk(t *testing.T) { 309 gtest.C(t, func(t *gtest.T) { 310 a1 := []int{1, 2, 3, 4, 5} 311 array1 := garray.NewIntArrayFrom(a1) 312 chunks := array1.Chunk(2) 313 t.Assert(len(chunks), 3) 314 t.Assert(chunks[0], []int{1, 2}) 315 t.Assert(chunks[1], []int{3, 4}) 316 t.Assert(chunks[2], []int{5}) 317 t.Assert(array1.Chunk(0), nil) 318 }) 319 gtest.C(t, func(t *gtest.T) { 320 a1 := []int{1, 2, 3, 4, 5} 321 array1 := garray.NewIntArrayFrom(a1) 322 chunks := array1.Chunk(3) 323 t.Assert(len(chunks), 2) 324 t.Assert(chunks[0], []int{1, 2, 3}) 325 t.Assert(chunks[1], []int{4, 5}) 326 t.Assert(array1.Chunk(0), nil) 327 }) 328 gtest.C(t, func(t *gtest.T) { 329 a1 := []int{1, 2, 3, 4, 5, 6} 330 array1 := garray.NewIntArrayFrom(a1) 331 chunks := array1.Chunk(2) 332 t.Assert(len(chunks), 3) 333 t.Assert(chunks[0], []int{1, 2}) 334 t.Assert(chunks[1], []int{3, 4}) 335 t.Assert(chunks[2], []int{5, 6}) 336 t.Assert(array1.Chunk(0), nil) 337 }) 338 gtest.C(t, func(t *gtest.T) { 339 a1 := []int{1, 2, 3, 4, 5, 6} 340 array1 := garray.NewIntArrayFrom(a1) 341 chunks := array1.Chunk(3) 342 t.Assert(len(chunks), 2) 343 t.Assert(chunks[0], []int{1, 2, 3}) 344 t.Assert(chunks[1], []int{4, 5, 6}) 345 t.Assert(array1.Chunk(0), nil) 346 }) 347 } 348 349 func TestIntArray_Pad(t *testing.T) { 350 gtest.C(t, func(t *gtest.T) { 351 a1 := []int{0} 352 array1 := garray.NewIntArrayFrom(a1) 353 t.Assert(array1.Pad(3, 1).Slice(), []int{0, 1, 1}) 354 t.Assert(array1.Pad(-4, 1).Slice(), []int{1, 0, 1, 1}) 355 t.Assert(array1.Pad(3, 1).Slice(), []int{1, 0, 1, 1}) 356 }) 357 } 358 359 func TestIntArray_SubSlice(t *testing.T) { 360 gtest.C(t, func(t *gtest.T) { 361 a1 := []int{0, 1, 2, 3, 4, 5, 6} 362 array1 := garray.NewIntArrayFrom(a1) 363 array2 := garray.NewIntArrayFrom(a1, true) 364 t.Assert(array1.SubSlice(6), []int{6}) 365 t.Assert(array1.SubSlice(5), []int{5, 6}) 366 t.Assert(array1.SubSlice(8), nil) 367 t.Assert(array1.SubSlice(0, 2), []int{0, 1}) 368 t.Assert(array1.SubSlice(2, 2), []int{2, 3}) 369 t.Assert(array1.SubSlice(5, 8), []int{5, 6}) 370 t.Assert(array1.SubSlice(-1, 1), []int{6}) 371 t.Assert(array1.SubSlice(-1, 9), []int{6}) 372 t.Assert(array1.SubSlice(-2, 3), []int{5, 6}) 373 t.Assert(array1.SubSlice(-7, 3), []int{0, 1, 2}) 374 t.Assert(array1.SubSlice(-8, 3), nil) 375 t.Assert(array1.SubSlice(-1, -3), []int{3, 4, 5}) 376 t.Assert(array1.SubSlice(-9, 3), nil) 377 t.Assert(array1.SubSlice(1, -1), []int{0}) 378 t.Assert(array1.SubSlice(1, -3), nil) 379 t.Assert(array2.SubSlice(0, 2), []int{0, 1}) 380 }) 381 } 382 383 func TestIntArray_Rand(t *testing.T) { 384 gtest.C(t, func(t *gtest.T) { 385 a1 := []int{0, 1, 2, 3, 4, 5, 6} 386 array1 := garray.NewIntArrayFrom(a1) 387 t.Assert(len(array1.Rands(2)), 2) 388 t.Assert(len(array1.Rands(10)), 10) 389 t.AssertIN(array1.Rands(1)[0], a1) 390 391 v, ok := array1.Rand() 392 t.AssertIN(v, a1) 393 t.Assert(ok, true) 394 395 array2 := garray.NewIntArrayFrom([]int{}) 396 v, ok = array2.Rand() 397 t.Assert(v, 0) 398 t.Assert(ok, false) 399 400 intSlices := array2.Rands(1) 401 t.Assert(intSlices, nil) 402 }) 403 } 404 405 func TestIntArray_PopRands(t *testing.T) { 406 gtest.C(t, func(t *gtest.T) { 407 a1 := []int{100, 200, 300, 400, 500, 600} 408 array := garray.NewIntArrayFrom(a1) 409 ns1 := array.PopRands(2) 410 t.AssertIN(ns1, []int{100, 200, 300, 400, 500, 600}) 411 t.Assert(len(ns1), 2) 412 413 ns2 := array.PopRands(7) 414 t.Assert(len(ns2), 4) 415 t.AssertIN(ns2, []int{100, 200, 300, 400, 500, 600}) 416 }) 417 } 418 419 func TestIntArray_Shuffle(t *testing.T) { 420 gtest.C(t, func(t *gtest.T) { 421 a1 := []int{0, 1, 2, 3, 4, 5, 6} 422 array1 := garray.NewIntArrayFrom(a1) 423 t.Assert(array1.Shuffle().Len(), 7) 424 }) 425 } 426 427 func TestIntArray_Reverse(t *testing.T) { 428 gtest.C(t, func(t *gtest.T) { 429 a1 := []int{0, 1, 2, 3, 4, 5, 6} 430 array1 := garray.NewIntArrayFrom(a1) 431 t.Assert(array1.Reverse().Slice(), []int{6, 5, 4, 3, 2, 1, 0}) 432 }) 433 } 434 435 func TestIntArray_Join(t *testing.T) { 436 gtest.C(t, func(t *gtest.T) { 437 a1 := []int{0, 1, 2, 3, 4, 5, 6} 438 array1 := garray.NewIntArrayFrom(a1) 439 t.Assert(array1.Join("."), "0.1.2.3.4.5.6") 440 }) 441 } 442 443 func TestIntArray_String(t *testing.T) { 444 gtest.C(t, func(t *gtest.T) { 445 a1 := []int{0, 1, 2, 3, 4, 5, 6} 446 array1 := garray.NewIntArrayFrom(a1) 447 t.Assert(array1.String(), "[0,1,2,3,4,5,6]") 448 array1 = nil 449 t.Assert(array1.String(), "") 450 }) 451 } 452 453 func TestIntArray_SetArray(t *testing.T) { 454 gtest.C(t, func(t *gtest.T) { 455 a1 := []int{1, 2, 3, 5} 456 a2 := []int{6, 7} 457 array1 := garray.NewIntArrayFrom(a1) 458 array1.SetArray(a2) 459 t.Assert(array1.Len(), 2) 460 t.Assert(array1, []int{6, 7}) 461 }) 462 } 463 464 func TestIntArray_Replace(t *testing.T) { 465 gtest.C(t, func(t *gtest.T) { 466 a1 := []int{1, 2, 3, 5} 467 a2 := []int{6, 7} 468 a3 := []int{9, 10, 11, 12, 13} 469 array1 := garray.NewIntArrayFrom(a1) 470 array1.Replace(a2) 471 t.Assert(array1, []int{6, 7, 3, 5}) 472 473 array1.Replace(a3) 474 t.Assert(array1, []int{9, 10, 11, 12}) 475 }) 476 } 477 478 func TestIntArray_Clear(t *testing.T) { 479 gtest.C(t, func(t *gtest.T) { 480 a1 := []int{1, 2, 3, 5} 481 array1 := garray.NewIntArrayFrom(a1) 482 array1.Clear() 483 t.Assert(array1.Len(), 0) 484 }) 485 } 486 487 func TestIntArray_Clone(t *testing.T) { 488 gtest.C(t, func(t *gtest.T) { 489 a1 := []int{1, 2, 3, 5} 490 array1 := garray.NewIntArrayFrom(a1) 491 array2 := array1.Clone() 492 t.Assert(array1, array2) 493 }) 494 } 495 496 func TestArray_Get(t *testing.T) { 497 gtest.C(t, func(t *gtest.T) { 498 a1 := []int{1, 2, 3, 5} 499 array1 := garray.NewIntArrayFrom(a1) 500 v, ok := array1.Get(2) 501 t.Assert(v, 3) 502 t.Assert(ok, true) 503 t.Assert(array1.Len(), 4) 504 }) 505 } 506 507 func TestIntArray_Sum(t *testing.T) { 508 gtest.C(t, func(t *gtest.T) { 509 a1 := []int{1, 2, 3, 5} 510 array1 := garray.NewIntArrayFrom(a1) 511 t.Assert(array1.Sum(), 11) 512 }) 513 } 514 515 func TestIntArray_CountValues(t *testing.T) { 516 gtest.C(t, func(t *gtest.T) { 517 a1 := []int{1, 2, 3, 5, 3} 518 array1 := garray.NewIntArrayFrom(a1) 519 m1 := array1.CountValues() 520 t.Assert(len(m1), 4) 521 t.Assert(m1[1], 1) 522 t.Assert(m1[3], 2) 523 }) 524 } 525 526 func TestNewIntArrayFromCopy(t *testing.T) { 527 gtest.C(t, func(t *gtest.T) { 528 a1 := []int{1, 2, 3, 5, 3} 529 array1 := garray.NewIntArrayFromCopy(a1) 530 t.Assert(array1.Len(), 5) 531 t.Assert(array1, a1) 532 }) 533 } 534 535 func TestIntArray_Remove(t *testing.T) { 536 gtest.C(t, func(t *gtest.T) { 537 a1 := []int{1, 2, 3, 5, 4} 538 array1 := garray.NewIntArrayFrom(a1) 539 v, ok := array1.Remove(1) 540 t.Assert(v, 2) 541 t.Assert(ok, true) 542 t.Assert(array1.Len(), 4) 543 544 v, ok = array1.Remove(0) 545 t.Assert(v, 1) 546 t.Assert(ok, true) 547 t.Assert(array1.Len(), 3) 548 549 v, ok = array1.Remove(2) 550 t.Assert(v, 4) 551 t.Assert(ok, true) 552 t.Assert(array1.Len(), 2) 553 }) 554 } 555 556 func TestIntArray_LockFunc(t *testing.T) { 557 gtest.C(t, func(t *gtest.T) { 558 s1 := []int{1, 2, 3, 4} 559 a1 := garray.NewIntArrayFrom(s1, true) 560 561 ch1 := make(chan int64, 3) 562 ch2 := make(chan int64, 3) 563 // go1 564 go a1.LockFunc(func(n1 []int) { // 读写锁 565 time.Sleep(2 * time.Second) // 暂停2秒 566 n1[2] = 6 567 ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 568 }) 569 570 // go2 571 go func() { 572 time.Sleep(100 * time.Millisecond) // 故意暂停0.01秒,等go1执行锁后,再开始执行. 573 ch1 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 574 a1.Len() 575 ch1 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 576 }() 577 578 t1 := <-ch1 579 t2 := <-ch1 580 <-ch2 // 等待go1完成 581 582 // 防止ci抖动,以豪秒为单位 583 t.AssertGT(t2-t1, 20) // go1加的读写互斥锁,所go2读的时候被阻塞。 584 t.Assert(a1.Contains(6), true) 585 }) 586 } 587 588 func TestIntArray_SortFunc(t *testing.T) { 589 gtest.C(t, func(t *gtest.T) { 590 s1 := []int{1, 4, 3, 2} 591 a1 := garray.NewIntArrayFrom(s1) 592 func1 := func(v1, v2 int) bool { 593 return v1 < v2 594 } 595 a11 := a1.SortFunc(func1) 596 t.Assert(a11, []int{1, 2, 3, 4}) 597 598 }) 599 } 600 601 func TestIntArray_RLockFunc(t *testing.T) { 602 gtest.C(t, func(t *gtest.T) { 603 s1 := []int{1, 2, 3, 4} 604 a1 := garray.NewIntArrayFrom(s1, true) 605 606 ch1 := make(chan int64, 3) 607 ch2 := make(chan int64, 1) 608 // go1 609 go a1.RLockFunc(func(n1 []int) { // 读锁 610 time.Sleep(2 * time.Second) // 暂停1秒 611 n1[2] = 6 612 ch2 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 613 }) 614 615 // go2 616 go func() { 617 time.Sleep(100 * time.Millisecond) // 故意暂停0.01秒,等go1执行锁后,再开始执行. 618 ch1 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 619 a1.Len() 620 ch1 <- gconv.Int64(time.Now().UnixNano() / 1000 / 1000) 621 }() 622 623 t1 := <-ch1 624 t2 := <-ch1 625 <-ch2 // 等待go1完成 626 627 // 防止ci抖动,以豪秒为单位 628 t.AssertLT(t2-t1, 20) // go1加的读锁,所go2读的时候,并没有阻塞。 629 t.Assert(a1.Contains(6), true) 630 }) 631 } 632 633 func TestIntArray_Json(t *testing.T) { 634 // array pointer 635 gtest.C(t, func(t *gtest.T) { 636 s1 := []int{1, 4, 3, 2} 637 a1 := garray.NewIntArrayFrom(s1) 638 b1, err1 := json.Marshal(a1) 639 b2, err2 := json.Marshal(s1) 640 t.Assert(b1, b2) 641 t.Assert(err1, err2) 642 643 a2 := garray.NewIntArray() 644 err1 = json.UnmarshalUseNumber(b2, &a2) 645 t.AssertNil(err1) 646 t.Assert(a2.Slice(), s1) 647 648 var a3 garray.IntArray 649 err := json.UnmarshalUseNumber(b2, &a3) 650 t.AssertNil(err) 651 t.Assert(a3.Slice(), s1) 652 }) 653 // array value 654 gtest.C(t, func(t *gtest.T) { 655 s1 := []int{1, 4, 3, 2} 656 a1 := *garray.NewIntArrayFrom(s1) 657 b1, err1 := json.Marshal(a1) 658 b2, err2 := json.Marshal(s1) 659 t.Assert(b1, b2) 660 t.Assert(err1, err2) 661 662 a2 := garray.NewIntArray() 663 err1 = json.UnmarshalUseNumber(b2, &a2) 664 t.AssertNil(err1) 665 t.Assert(a2.Slice(), s1) 666 667 var a3 garray.IntArray 668 err := json.UnmarshalUseNumber(b2, &a3) 669 t.AssertNil(err) 670 t.Assert(a3.Slice(), s1) 671 }) 672 // array pointer 673 gtest.C(t, func(t *gtest.T) { 674 type User struct { 675 Name string 676 Scores *garray.IntArray 677 } 678 data := g.Map{ 679 "Name": "john", 680 "Scores": []int{99, 100, 98}, 681 } 682 b, err := json.Marshal(data) 683 t.AssertNil(err) 684 685 user := new(User) 686 err = json.UnmarshalUseNumber(b, user) 687 t.AssertNil(err) 688 t.Assert(user.Name, data["Name"]) 689 t.Assert(user.Scores, data["Scores"]) 690 }) 691 // array value 692 gtest.C(t, func(t *gtest.T) { 693 type User struct { 694 Name string 695 Scores garray.IntArray 696 } 697 data := g.Map{ 698 "Name": "john", 699 "Scores": []int{99, 100, 98}, 700 } 701 b, err := json.Marshal(data) 702 t.AssertNil(err) 703 704 user := new(User) 705 err = json.UnmarshalUseNumber(b, user) 706 t.AssertNil(err) 707 t.Assert(user.Name, data["Name"]) 708 t.Assert(user.Scores, data["Scores"]) 709 }) 710 } 711 712 func TestIntArray_Iterator(t *testing.T) { 713 slice := g.SliceInt{10, 20, 30, 40} 714 array := garray.NewIntArrayFrom(slice) 715 gtest.C(t, func(t *gtest.T) { 716 array.Iterator(func(k int, v int) bool { 717 t.Assert(v, slice[k]) 718 return true 719 }) 720 }) 721 gtest.C(t, func(t *gtest.T) { 722 array.IteratorAsc(func(k int, v int) bool { 723 t.Assert(v, slice[k]) 724 return true 725 }) 726 }) 727 gtest.C(t, func(t *gtest.T) { 728 array.IteratorDesc(func(k int, v int) bool { 729 t.Assert(v, slice[k]) 730 return true 731 }) 732 }) 733 gtest.C(t, func(t *gtest.T) { 734 index := 0 735 array.Iterator(func(k int, v int) bool { 736 index++ 737 return false 738 }) 739 t.Assert(index, 1) 740 }) 741 gtest.C(t, func(t *gtest.T) { 742 index := 0 743 array.IteratorAsc(func(k int, v int) bool { 744 index++ 745 return false 746 }) 747 t.Assert(index, 1) 748 }) 749 gtest.C(t, func(t *gtest.T) { 750 index := 0 751 array.IteratorDesc(func(k int, v int) bool { 752 index++ 753 return false 754 }) 755 t.Assert(index, 1) 756 }) 757 } 758 759 func TestIntArray_RemoveValue(t *testing.T) { 760 slice := g.SliceInt{10, 20, 30, 40} 761 array := garray.NewIntArrayFrom(slice) 762 gtest.C(t, func(t *gtest.T) { 763 t.Assert(array.RemoveValue(99), false) 764 t.Assert(array.RemoveValue(20), true) 765 t.Assert(array.RemoveValue(10), true) 766 t.Assert(array.RemoveValue(20), false) 767 t.Assert(array.RemoveValue(88), false) 768 t.Assert(array.Len(), 2) 769 }) 770 } 771 772 func TestIntArray_RemoveValues(t *testing.T) { 773 slice := g.SliceInt{10, 20, 30, 40} 774 array := garray.NewIntArrayFrom(slice) 775 gtest.C(t, func(t *gtest.T) { 776 array.RemoveValues(10, 20, 40) 777 t.Assert(array.Slice(), g.SliceInt{30}) 778 }) 779 } 780 781 func TestIntArray_UnmarshalValue(t *testing.T) { 782 type V struct { 783 Name string 784 Array *garray.IntArray 785 } 786 // JSON 787 gtest.C(t, func(t *gtest.T) { 788 var v *V 789 err := gconv.Struct(g.Map{ 790 "name": "john", 791 "array": []byte(`[1,2,3]`), 792 }, &v) 793 t.AssertNil(err) 794 t.Assert(v.Name, "john") 795 t.Assert(v.Array.Slice(), g.Slice{1, 2, 3}) 796 }) 797 // Map 798 // gtest.C(t, func(t *gtest.T) { 799 // var v *V 800 // err := gconv.Struct(g.Map{ 801 // "name": "john", 802 // "array": g.Slice{1, 2, 3}, 803 // }, &v) 804 // t.AssertNil(err) 805 // t.Assert(v.Name, "john") 806 // t.Assert(v.Array.Slice(), g.Slice{1, 2, 3}) 807 // }) 808 } 809 810 func TestIntArray_Filter(t *testing.T) { 811 gtest.C(t, func(t *gtest.T) { 812 array := garray.NewIntArrayFrom(g.SliceInt{0, 1, 2, 3, 4, 0}) 813 t.Assert(array.Filter(func(index int, value int) bool { 814 return empty.IsEmpty(value) 815 }), g.SliceInt{1, 2, 3, 4}) 816 }) 817 gtest.C(t, func(t *gtest.T) { 818 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3, 4}) 819 t.Assert(array.Filter(func(index int, value int) bool { 820 return empty.IsEmpty(value) 821 822 }), g.SliceInt{1, 2, 3, 4}) 823 }) 824 gtest.C(t, func(t *gtest.T) { 825 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3, 4}) 826 t.Assert(array.Filter(func(index int, value int) bool { 827 return value%2 == 0 828 }), g.SliceInt{1, 3}) 829 }) 830 gtest.C(t, func(t *gtest.T) { 831 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3, 4}) 832 t.Assert(array.Filter(func(index int, value int) bool { 833 return value%2 == 1 834 }), g.SliceInt{2, 4}) 835 }) 836 } 837 838 func TestIntArray_FilterEmpty(t *testing.T) { 839 gtest.C(t, func(t *gtest.T) { 840 array := garray.NewIntArrayFrom(g.SliceInt{0, 1, 2, 3, 4, 0}) 841 t.Assert(array.FilterEmpty(), g.SliceInt{1, 2, 3, 4}) 842 }) 843 gtest.C(t, func(t *gtest.T) { 844 array := garray.NewIntArrayFrom(g.SliceInt{1, 2, 3, 4}) 845 t.Assert(array.FilterEmpty(), g.SliceInt{1, 2, 3, 4}) 846 }) 847 } 848 849 func TestIntArray_Walk(t *testing.T) { 850 gtest.C(t, func(t *gtest.T) { 851 array := garray.NewIntArrayFrom(g.SliceInt{1, 2}) 852 t.Assert(array.Walk(func(value int) int { 853 return 10 + value 854 }), g.Slice{11, 12}) 855 }) 856 } 857 858 func TestIntArray_NewIntArrayRange(t *testing.T) { 859 gtest.C(t, func(t *gtest.T) { 860 array := garray.NewIntArrayRange(0, 128, 4) 861 t.Assert(array.String(), `[0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128]`) 862 }) 863 gtest.C(t, func(t *gtest.T) { 864 array := garray.NewIntArrayRange(1, 128, 4) 865 t.Assert(array.String(), `[1,5,9,13,17,21,25,29,33,37,41,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125]`) 866 }) 867 }