feat: add.

This commit is contained in:
tx7do
2023-11-06 14:11:20 +08:00
parent 83bb818ade
commit da82d442cc
20 changed files with 545 additions and 94 deletions

View File

@@ -0,0 +1,301 @@
package sliceutil_test
import (
"strconv"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/tx7do/go-utils/sliceutil"
)
type MyInt int
type Pluckable struct {
Code string
Value string
}
var numerals = []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var numeralsWithUserDefinedType = []MyInt{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var days = []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
var lastNames = []string{"Jacobs", "Vin", "Jacobs", "Smith"}
func TestFilter(t *testing.T) {
expectedResult := []int{0, 2, 4, 6, 8}
actualResult := sliceutil.Filter(numerals, func(value int, _ int, _ []int) bool {
return value%2 == 0
})
assert.Equal(t, expectedResult, actualResult)
}
func TestForEach(t *testing.T) {
result := 0
sliceutil.ForEach(numerals, func(value int, _ int, _ []int) {
result += value
})
assert.Equal(t, 45, result)
}
func TestMap(t *testing.T) {
expectedResult := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
actualResult := sliceutil.Map(numerals, func(value int, _ int, _ []int) string {
return strconv.Itoa(value)
})
assert.Equal(t, expectedResult, actualResult)
assert.Nil(t, sliceutil.Map([]int{}, func(_ int, _ int, _ []int) string {
return ""
}))
assert.Nil(t, sliceutil.Map([]int(nil), func(_ int, _ int, _ []int) string {
return ""
}))
}
func TestReduce(t *testing.T) {
expectedResult := map[string]string{"result": "0123456789"}
actualResult := sliceutil.Reduce(
numerals,
func(acc map[string]string, cur int, _ int, _ []int) map[string]string {
acc["result"] += strconv.Itoa(cur)
return acc
},
map[string]string{"result": ""},
)
assert.Equal(t, expectedResult, actualResult)
}
func TestFind(t *testing.T) {
expectedResult := "Wednesday"
actualResult := sliceutil.Find(days, func(value string, index int, slice []string) bool {
return strings.Contains(value, "Wed")
})
assert.Equal(t, expectedResult, *actualResult)
assert.Nil(t, sliceutil.Find(days, func(value string, index int, slice []string) bool {
return strings.Contains(value, "Rishon")
}))
}
func TestFindIndex(t *testing.T) {
expectedResult := 3
actualResult := sliceutil.FindIndex(days, func(value string, index int, slice []string) bool {
return strings.Contains(value, "Wed")
})
assert.Equal(t, expectedResult, actualResult)
assert.Equal(t, -1, sliceutil.FindIndex(days, func(value string, index int, slice []string) bool {
return strings.Contains(value, "Rishon")
}))
}
func TestFindIndexOf(t *testing.T) {
expectedResult := 3
actualResult := sliceutil.FindIndexOf(days, "Wednesday")
assert.Equal(t, expectedResult, actualResult)
assert.Equal(t, -1, sliceutil.FindIndexOf(days, "Rishon"))
}
func TestFindLastIndex(t *testing.T) {
expectedResult := 2
actualResult := sliceutil.FindLastIndex(lastNames, func(value string, index int, slice []string) bool {
return value == "Jacobs"
})
assert.Equal(t, expectedResult, actualResult)
assert.Equal(t, -1, sliceutil.FindLastIndex(lastNames, func(value string, index int, slice []string) bool {
return value == "Hamudi"
}))
}
func TestFindLastIndexOf(t *testing.T) {
expectedResult := 2
actualResult := sliceutil.FindLastIndexOf(lastNames, "Jacobs")
assert.Equal(t, expectedResult, actualResult)
assert.Equal(t, -1, sliceutil.FindLastIndexOf(lastNames, "Hamudi"))
}
func TestFindIndexes(t *testing.T) {
expectedResult := []int{0, 2}
actualResult := sliceutil.FindIndexes(lastNames, func(value string, index int, slice []string) bool {
return value == "Jacobs"
})
assert.Equal(t, expectedResult, actualResult)
assert.Nil(t, sliceutil.FindIndexes(lastNames, func(value string, index int, slice []string) bool {
return value == "Hamudi"
}))
}
func TestFindIndexesOf(t *testing.T) {
expectedResult := []int{0, 2}
actualResult := sliceutil.FindIndexesOf(lastNames, "Jacobs")
assert.Equal(t, expectedResult, actualResult)
assert.Nil(t, sliceutil.FindIndexesOf(lastNames, "Hamudi"))
}
func TestIncludes(t *testing.T) {
assert.True(t, sliceutil.Includes(numerals, 1))
assert.False(t, sliceutil.Includes(numerals, 11))
}
func TestAny(t *testing.T) {
assert.True(t, sliceutil.Some(numerals, func(value int, _ int, _ []int) bool {
return value%5 == 0
}))
assert.False(t, sliceutil.Some(numerals, func(value int, _ int, _ []int) bool {
return value == 11
}))
}
func TestAll(t *testing.T) {
assert.True(t, sliceutil.Every([]int{1, 1, 1}, func(value int, _ int, _ []int) bool {
return value == 1
}))
assert.False(t, sliceutil.Every([]int{1, 1, 1, 2}, func(value int, _ int, _ []int) bool {
return value == 1
}))
}
func TestMerge(t *testing.T) {
result := sliceutil.Merge(numerals[:5], numerals[5:])
assert.Equal(t, numerals, result)
assert.Nil(t, sliceutil.Merge([]int(nil), []int(nil)))
assert.Nil(t, sliceutil.Merge([]int{}, []int{}))
}
func TestSum(t *testing.T) {
result := sliceutil.Sum(numerals)
assert.Equal(t, 45, result)
}
func TestSum2(t *testing.T) {
result := sliceutil.Sum(numeralsWithUserDefinedType)
assert.Equal(t, MyInt(45), result)
}
func TestRemove(t *testing.T) {
testSlice := []int{1, 2, 3}
result := sliceutil.Remove(testSlice, 1)
assert.Equal(t, []int{1, 3}, result)
assert.Equal(t, []int{1, 2, 3}, testSlice)
result = sliceutil.Remove(result, 1)
assert.Equal(t, []int{1}, result)
result = sliceutil.Remove(result, 3)
assert.Equal(t, []int{1}, result)
result = sliceutil.Remove(result, 0)
assert.Equal(t, []int{}, result)
result = sliceutil.Remove(result, 1)
assert.Equal(t, []int{}, result)
}
func TestCopy(t *testing.T) {
testSlice := []int{1, 2, 3}
copiedSlice := sliceutil.Copy(testSlice)
copiedSlice[0] = 2
assert.NotEqual(t, testSlice, copiedSlice)
}
func TestInsert(t *testing.T) {
testSlice := []int{1, 2}
result := sliceutil.Insert(testSlice, 0, 3)
assert.Equal(t, []int{3, 1, 2}, result)
assert.NotEqual(t, testSlice, result)
assert.Equal(t, []int{1, 3, 2}, sliceutil.Insert(testSlice, 1, 3))
assert.Equal(t, []int{1, 2, 3}, sliceutil.Insert(testSlice, 2, 3))
}
func TestIntersection(t *testing.T) {
expectedResult := []int{3, 4, 5}
first := []int{1, 2, 3, 4, 5}
second := []int{2, 3, 4, 5, 6}
third := []int{3, 4, 5, 6, 7}
assert.Equal(t, expectedResult, sliceutil.Intersection(first, second, third))
}
func TestDifference(t *testing.T) {
expectedResult := []int{1, 7}
first := []int{1, 2, 3, 4, 5}
second := []int{2, 3, 4, 5, 6}
third := []int{3, 4, 5, 6, 7}
assert.Equal(t, expectedResult, sliceutil.Difference(first, second, third))
}
func TestUnion(t *testing.T) {
expectedResult := []int{1, 2, 3, 4, 5, 6, 7}
first := []int{1, 2, 3, 4, 5}
second := []int{2, 3, 4, 5, 6}
third := []int{3, 4, 5, 6, 7}
assert.Equal(t, expectedResult, sliceutil.Union(first, second, third))
}
func TestReverse(t *testing.T) {
expectedResult := []int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
assert.Equal(t, expectedResult, sliceutil.Reverse(numerals))
// ensure does not modify the original
assert.Equal(t, expectedResult, sliceutil.Reverse(numerals))
// test basic odd length case
expectedResult = []int{9, 8, 7, 6, 5, 4, 3, 2, 1}
assert.Equal(t, expectedResult, sliceutil.Reverse(numerals[1:]))
}
func TestUnique(t *testing.T) {
duplicates := []int{6, 6, 6, 9, 0, 0, 0}
expectedResult := []int{6, 9, 0}
assert.Equal(t, expectedResult, sliceutil.Unique(duplicates))
// Ensure original is unaltered
assert.NotEqual(t, expectedResult, duplicates)
}
func TestChunk(t *testing.T) {
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
assert.Equal(t, [][]int{{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}}, sliceutil.Chunk(numbers, 2))
assert.Equal(t, [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10}}, sliceutil.Chunk(numbers, 3))
}
func TestPluck(t *testing.T) {
items := []Pluckable{
{
Code: "azer",
Value: "Azer",
},
{
Code: "tyuio",
Value: "Tyuio",
},
}
assert.Equal(t, []string{"azer", "tyuio"}, sliceutil.Pluck(items, func(item Pluckable) *string {
return &item.Code
}))
assert.Equal(t, []string{"Azer", "Tyuio"}, sliceutil.Pluck(items, func(item Pluckable) *string {
return &item.Value
}))
}
func TestFlatten(t *testing.T) {
items := [][]int{
{1, 2, 3, 4},
{5, 6},
{7, 8},
{9, 10, 11},
}
flattened := sliceutil.Flatten(items)
assert.Equal(t, []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, flattened)
assert.Nil(t, sliceutil.Flatten([][]int{}))
assert.Nil(t, sliceutil.Flatten([][]int(nil)))
assert.Nil(t, sliceutil.Flatten([][]int{{}, {}}))
assert.Nil(t, sliceutil.Flatten([][]int{nil, nil}))
assert.Nil(t, sliceutil.Flatten([][]int{{}, nil}))
}