From 1afab62decdfecb190405c3781bd069ca17381f4 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 1 Feb 2019 18:33:53 +0800 Subject: [PATCH] fulfil unit test cases for garray --- g/container/garray/garray_normal_int.go | 12 +- g/container/garray/garray_normal_interface.go | 8 +- g/container/garray/garray_normal_string.go | 10 ++ .../garray/garray_z_unit_interface_test.go | 168 ++++++++++++++++++ 4 files changed, 194 insertions(+), 4 deletions(-) create mode 100644 g/container/garray/garray_z_unit_interface_test.go diff --git a/g/container/garray/garray_normal_int.go b/g/container/garray/garray_normal_int.go index 43ee7f37a..452f74d39 100644 --- a/g/container/garray/garray_normal_int.go +++ b/g/container/garray/garray_normal_int.go @@ -97,7 +97,7 @@ func (a *IntArray) Sum() (sum int) { return } -// 将数组重新排序(从小到大). +// 将数组重新排序. func (a *IntArray) Sort(reverse...bool) *IntArray { a.mu.Lock() defer a.mu.Unlock() @@ -114,6 +114,16 @@ func (a *IntArray) Sort(reverse...bool) *IntArray { return a } +// 使用自定义的排序函数将数组重新排序. +func (a *IntArray) SortFunc(less func(v1, v2 int) bool) *IntArray { + a.mu.Lock() + defer a.mu.Unlock() + sort.Slice(a.array, func(i, j int) bool { + return less(a.array[i], a.array[j]) + }) + return a +} + // 在当前索引位置前插入一个数据项, 调用方注意判断数组边界 func (a *IntArray) InsertBefore(index int, value int) *IntArray { a.mu.Lock() diff --git a/g/container/garray/garray_normal_interface.go b/g/container/garray/garray_normal_interface.go index e838bcce8..5876dcf17 100644 --- a/g/container/garray/garray_normal_interface.go +++ b/g/container/garray/garray_normal_interface.go @@ -101,11 +101,13 @@ func (a *Array) Sum() (sum int) { return } -// 将数组重新排序. -func (a *Array) Sort(less func(i, j int) bool) *Array { +// 使用自定义的排序函数将数组重新排序. +func (a *Array) SortFunc(less func(v1, v2 interface{}) bool) *Array { a.mu.Lock() defer a.mu.Unlock() - sort.Slice(a.array, less) + sort.Slice(a.array, func(i, j int) bool { + return less(a.array[i], a.array[j]) + }) return a } diff --git a/g/container/garray/garray_normal_string.go b/g/container/garray/garray_normal_string.go index 49f4f7eeb..205bf3281 100644 --- a/g/container/garray/garray_normal_string.go +++ b/g/container/garray/garray_normal_string.go @@ -114,6 +114,16 @@ func (a *StringArray) Sort(reverse...bool) *StringArray { return a } +// 使用自定义的排序函数将数组重新排序. +func (a *StringArray) SortFunc(less func(v1, v2 string) bool) *StringArray { + a.mu.Lock() + defer a.mu.Unlock() + sort.Slice(a.array, func(i, j int) bool { + return less(a.array[i], a.array[j]) + }) + return a +} + // 在当前索引位置前插入一个数据项, 调用方注意判断数组边界 func (a *StringArray) InsertBefore(index int, value string) *StringArray { a.mu.Lock() diff --git a/g/container/garray/garray_z_unit_interface_test.go b/g/container/garray/garray_z_unit_interface_test.go new file mode 100644 index 000000000..fe82b1861 --- /dev/null +++ b/g/container/garray/garray_z_unit_interface_test.go @@ -0,0 +1,168 @@ +// Copyright 2018 gf Author(https://gitee.com/johng/gf). All Rights Reserved. +// +// This Source Code Form is subject to the terms of the MIT License. +// If a copy of the MIT was not distributed with this file, +// You can obtain one at https://gitee.com/johng/gf. + +// go test *.go + +package garray_test + +import ( + "gitee.com/johng/gf/g/container/garray" + "gitee.com/johng/gf/g/test/gtest" + "testing" +) + +func Test_Array_Basic(t *testing.T) { + gtest.Case(t, func() { + expect := []interface{}{0, 1, 2, 3} + array := garray.NewArrayFrom(expect) + gtest.Assert(array.Slice(), expect) + array.Set(0, 100) + gtest.Assert(array.Get(0), 100) + gtest.Assert(array.Get(1), 1) + gtest.Assert(array.Search(100), 0) + gtest.Assert(array.Contains(100), true) + gtest.Assert(array.Remove(0), 100) + gtest.Assert(array.Contains(100), false) + array.Append(4) + gtest.Assert(array.Len(), 4) + array.InsertBefore(0, 100) + array.InsertAfter(0, 200) + gtest.Assert(array.Slice(), []interface{}{100, 200, 1, 2, 3, 4}) + array.InsertBefore(5, 300) + array.InsertAfter(6, 400) + gtest.Assert(array.Slice(), []interface{}{100, 200, 1, 2, 3, 300, 4, 400}) + gtest.Assert(array.Clear().Len(), 0) + }) +} + +func TestArray_Sort(t *testing.T) { + gtest.Case(t, func() { + expect1 := []interface{}{0, 1, 2, 3} + expect2 := []interface{}{3, 2, 1, 0} + array := garray.NewArray(0, 0) + for i := 3; i >= 0; i-- { + array.Append(i) + } + array.SortFunc(func(v1, v2 interface{}) bool { + return v1.(int) < v2.(int) + }) + gtest.Assert(array.Slice(), expect1) + array.SortFunc(func(v1, v2 interface{}) bool { + return v1.(int) > v2.(int) + }) + gtest.Assert(array.Slice(), expect2) + }) +} + +func TestArray_Unique(t *testing.T) { + gtest.Case(t, func() { + expect := []interface{}{1, 1, 2, 3} + array := garray.NewArrayFrom(expect) + gtest.Assert(array.Unique().Slice(), []interface{}{1, 2, 3}) + }) +} + +func TestArray_PushAndPop(t *testing.T) { + gtest.Case(t, func() { + expect := []interface{}{0, 1, 2, 3} + array := garray.NewArrayFrom(expect) + gtest.Assert(array.Slice(), expect) + gtest.Assert(array.PopLeft(), 0) + gtest.Assert(array.PopRight(), 3) + gtest.AssertIN(array.PopRand(), []interface{}{1, 2}) + gtest.AssertIN(array.PopRand(), []interface{}{1, 2}) + gtest.Assert(array.Len(), 0) + array.PushLeft(1).PushRight(2) + gtest.Assert(array.Slice(), []interface{}{1, 2}) + }) +} + +func TestArray_Merge(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0, 1, 2, 3} + a2 := []interface{}{4, 5, 6, 7} + array1 := garray.NewArrayFrom(a1) + array2 := garray.NewArrayFrom(a2) + gtest.Assert(array1.Merge(array2).Slice(), []interface{}{0,1,2,3,4,5,6,7}) + }) +} + +func TestArray_Fill(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0} + a2 := []interface{}{0} + array1 := garray.NewArrayFrom(a1) + array2 := garray.NewArrayFrom(a2) + gtest.Assert(array1.Fill(1, 2, 100).Slice(), []interface{}{0,100,100}) + gtest.Assert(array2.Fill(0, 2, 100).Slice(), []interface{}{100,100}) + }) +} + +func TestArray_Chunk(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{1,2,3,4,5} + array1 := garray.NewArrayFrom(a1) + chunks := array1.Chunk(2) + gtest.Assert(len(chunks), 3) + gtest.Assert(chunks[0], []interface{}{1,2}) + gtest.Assert(chunks[1], []interface{}{3,4}) + gtest.Assert(chunks[2], []interface{}{5}) + }) +} + +func TestArray_Pad(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(array1.Pad(3, 1).Slice(), []interface{}{0,1,1}) + gtest.Assert(array1.Pad(-4, 1).Slice(), []interface{}{1,0,1,1}) + gtest.Assert(array1.Pad(3, 1).Slice(), []interface{}{1,0,1,1}) + }) +} + +func TestArray_SubSlice(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0,1,2,3,4,5,6} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(array1.SubSlice(0, 2), []interface{}{0,1}) + gtest.Assert(array1.SubSlice(2, 2), []interface{}{2,3}) + gtest.Assert(array1.SubSlice(5, 8), []interface{}{5,6}) + }) +} + +func TestArray_Rand(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0,1,2,3,4,5,6} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(len(array1.Rand(2)), 2) + gtest.Assert(len(array1.Rand(10)), 7) + gtest.AssertIN(array1.Rand(1)[0], a1) + }) +} + +func TestArray_Shuffle(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0,1,2,3,4,5,6} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(array1.Shuffle().Len(), 7) + }) +} + +func TestArray_Reverse(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0,1,2,3,4,5,6} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(array1.Reverse().Slice(), []interface{}{6,5,4,3,2,1,0}) + }) +} + +func TestArray_Join(t *testing.T) { + gtest.Case(t, func() { + a1 := []interface{}{0,1,2,3,4,5,6} + array1 := garray.NewArrayFrom(a1) + gtest.Assert(array1.Join("."), "0.1.2.3.4.5.6") + }) +} \ No newline at end of file