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