github.com/gogf/gf/v2@v2.7.4/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/gogf/gf.
     6  
     7  // go test *.go
     8  
     9  package garray_test
    10  
    11  import (
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/gogf/gf/v2/internal/empty"
    16  
    17  	"github.com/gogf/gf/v2/container/garray"
    18  	"github.com/gogf/gf/v2/frame/g"
    19  	"github.com/gogf/gf/v2/internal/json"
    20  	"github.com/gogf/gf/v2/test/gtest"
    21  	"github.com/gogf/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  }