You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ntool/narr/collection_test.go

318 lines
8.1 KiB
Go

package narr_test
import (
"git.noahlan.cn/noahlan/ntool/narr"
"git.noahlan.cn/noahlan/ntool/ntest/assert"
"testing"
)
// StringEqualComparer tests
func TestStringEqualComparerShouldEquals(t *testing.T) {
assert.Eq(t, 0, narr.StringEqualsComparer("a", "a"))
}
func TestStringEqualComparerShouldNotEquals(t *testing.T) {
assert.NotEq(t, 0, narr.StringEqualsComparer("a", "b"))
}
func TestStringEqualComparerElementNotString(t *testing.T) {
assert.Eq(t, -1, narr.StringEqualsComparer(1, "a"))
}
func TestStringEqualComparerPtr(t *testing.T) {
ptrVal := "a"
assert.Eq(t, 0, narr.StringEqualsComparer(&ptrVal, "a"))
}
// ReferenceEqualsComparer tests
func TestReferenceEqualsComparerShouldEquals(t *testing.T) {
assert.Eq(t, 0, narr.ReferenceEqualsComparer(1, 1))
}
func TestReferenceEqualsComparerShouldNotEquals(t *testing.T) {
assert.NotEq(t, 0, narr.ReferenceEqualsComparer(1, 2))
}
// ElemTypeEqualCompareFunc
func TestElemTypeEqualCompareFuncShouldEquals(t *testing.T) {
assert.Eq(t, 0, narr.ElemTypeEqualsComparer(1, 2))
}
func TestElemTypeEqualCompareFuncShouldNotEquals(t *testing.T) {
assert.NotEq(t, 0, narr.ElemTypeEqualsComparer(1, "2"))
}
func TestDifferencesShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.Differences[string](data, []string{"a", "b"}, narr.StringEqualsComparer)
assert.Eq(t, []string{"c"}, result)
result = narr.Differences[string]([]string{"a", "b"}, data, narr.StringEqualsComparer)
assert.Eq(t, []string{"c"}, result)
result = narr.Differences[string]([]string{"a", "b", "d"}, data, narr.StringEqualsComparer)
assert.Eq(t, 2, len(result))
}
func TestExceptsShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.Excepts(data, []string{"a", "b"}, narr.StringEqualsComparer)
assert.Eq(t, []string{"c"}, result.([]string))
}
func TestExceptsFirstNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Excepts([1]string{"a"}, []string{"a", "b"}, narr.StringEqualsComparer)
}
func TestExceptsSecondNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Excepts([]string{"a", "b"}, [1]string{"a"}, narr.StringEqualsComparer)
}
func TestExceptsFirstEmptyShouldReturnsEmpty(t *testing.T) {
data := []string{}
result := narr.Excepts(data, []string{"a", "b"}, narr.StringEqualsComparer).([]string)
assert.Eq(t, []string{}, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
func TestExceptsSecondEmptyShouldReturnsFirst(t *testing.T) {
data := []string{"a", "b"}
result := narr.Excepts(data, []string{}, narr.StringEqualsComparer).([]string)
assert.Eq(t, data, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
// Intersects tests
func TestIntersectsShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.Intersects(data, []string{"a", "b"}, narr.StringEqualsComparer)
assert.Eq(t, []string{"a", "b"}, result.([]string))
}
func TestIntersectsFirstNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Intersects([1]string{"a"}, []string{"a", "b"}, narr.StringEqualsComparer)
}
func TestIntersectsSecondNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Intersects([]string{"a", "b"}, [1]string{"a"}, narr.StringEqualsComparer)
}
func TestIntersectsFirstEmptyShouldReturnsEmpty(t *testing.T) {
data := []string{}
second := []string{"a", "b"}
result := narr.Intersects(data, second, narr.StringEqualsComparer).([]string)
assert.Eq(t, []string{}, result)
assert.NotSame(t, &second, &result, "should always returns new slice")
}
func TestIntersectsSecondEmptyShouldReturnsEmpty(t *testing.T) {
data := []string{"a", "b"}
second := []string{}
result := narr.Intersects(data, second, narr.StringEqualsComparer).([]string)
assert.Eq(t, []string{}, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
// Union tests
func TestUnionShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.Union(data, []string{"a", "b", "d"}, narr.StringEqualsComparer).([]string)
assert.Eq(t, []string{"a", "b", "c", "d"}, result)
}
func TestUnionFirstNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Union([1]string{"a"}, []string{"a", "b"}, narr.StringEqualsComparer)
}
func TestUnionSecondNotSliceShouldPanic(t *testing.T) {
defer func() {
if r := recover(); r != nil {
return
} else {
t.Fail()
}
}()
narr.Union([]string{"a", "b"}, [1]string{"a"}, narr.StringEqualsComparer)
}
func TestUnionFirstEmptyShouldReturnsSecond(t *testing.T) {
data := []string{}
second := []string{"a", "b"}
result := narr.Union(data, second, narr.StringEqualsComparer).([]string)
assert.Eq(t, []string{"a", "b"}, result)
assert.NotSame(t, &second, &result, "should always returns new slice")
}
func TestUnionSecondEmptyShouldReturnsFirst(t *testing.T) {
data := []string{"a", "b"}
second := []string{}
result := narr.Union(data, second, narr.StringEqualsComparer).([]string)
assert.Eq(t, data, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
// Find tests
func TestFindShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result, err := narr.Find(data, func(a any) bool { return a == "b" })
assert.Nil(t, err)
assert.Eq(t, "b", result)
_, err = narr.Find(data, func(a any) bool { return a == "d" })
assert.NotNil(t, err)
assert.Eq(t, narr.ErrElementNotFound, err)
}
func TestFindNotSliceShouldPanic(t *testing.T) {
assert.Panics(t, func() {
_, _ = narr.Find([1]string{"a"}, func(a any) bool { return a == "b" })
})
}
func TestFindEmptyReturnsErrElementNotFound(t *testing.T) {
data := []string{}
_, err := narr.Find(data, func(a any) bool { return a == "b" })
assert.NotNil(t, err)
assert.Eq(t, narr.ErrElementNotFound, err)
}
// FindOrDefault tests
func TestFindOrDefaultShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.FindOrDefault(data, func(a any) bool { return a == "b" }, "d").(string)
assert.Eq(t, "b", result)
result = narr.FindOrDefault(data, func(a any) bool { return a == "d" }, "d").(string)
assert.Eq(t, "d", result)
}
// TakeWhile tests
func TestTakeWhileShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.TakeWhile(data, func(a any) bool { return a == "b" || a == "c" }).([]string)
assert.Eq(t, []string{"b", "c"}, result)
}
func TestTakeWhileNotSliceShouldPanic(t *testing.T) {
assert.Panics(t, func() {
narr.TakeWhile([1]string{"a"}, func(a any) bool { return a == "b" || a == "c" })
})
}
func TestTakeWhileEmptyReturnsEmpty(t *testing.T) {
var data []string
result := narr.TakeWhile(data, func(a any) bool { return a == "b" || a == "c" }).([]string)
assert.Eq(t, []string{}, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
// ExceptWhile tests
func TestExceptWhileShouldPassed(t *testing.T) {
data := []string{
"a",
"b",
"c",
}
result := narr.ExceptWhile(data, func(a any) bool { return a == "b" || a == "c" }).([]string)
assert.Eq(t, []string{"a"}, result)
}
func TestExceptWhileNotSliceShouldPanic(t *testing.T) {
assert.Panics(t, func() {
narr.ExceptWhile([1]string{"a"}, func(a any) bool { return a == "b" || a == "c" })
})
}
func TestExceptWhileEmptyReturnsEmpty(t *testing.T) {
var data []string
result := narr.ExceptWhile(data, func(a any) bool { return a == "b" || a == "c" }).([]string)
assert.Eq(t, []string{}, result)
assert.NotSame(t, &data, &result, "should always returns new slice")
}
func TestMap(t *testing.T) {
list1 := []map[string]any{
{"name": "tom", "age": 23},
{"name": "john", "age": 34},
}
flatArr := narr.Column(list1, func(idx int, obj map[string]any) (val any, find bool) {
return obj["age"], true
})
assert.NotEmpty(t, flatArr)
assert.Contains(t, flatArr, 23)
assert.Len(t, flatArr, 2)
assert.Eq(t, 34, flatArr[1])
}