Skip to content

Commit

Permalink
👔 up: update some array, str and encode util func tests
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Sep 23, 2023
1 parent 91d8264 commit 8119792
Show file tree
Hide file tree
Showing 6 changed files with 136 additions and 113 deletions.
73 changes: 0 additions & 73 deletions arrutil/arrutil.go
Expand Up @@ -2,82 +2,9 @@
package arrutil

import (
"strings"

"github.com/gookit/goutil/comdef"
"github.com/gookit/goutil/mathutil"
)

// StringsRemove value form a string slice
func StringsRemove(ss []string, s string) []string {
return StringsFilter(ss, func(el string) bool {
return s != el
})
}

// StringsFilter given strings, default will filter emtpy string.
//
// Usage:
//
// // output: [a, b]
// ss := arrutil.StringsFilter([]string{"a", "", "b", ""})
func StringsFilter(ss []string, filter ...comdef.StringMatchFunc) []string {
var fn comdef.StringMatchFunc
if len(filter) > 0 && filter[0] != nil {
fn = filter[0]
} else {
fn = func(s string) bool {
return s != ""
}
}

ns := make([]string, 0, len(ss))
for _, s := range ss {
if fn(s) {
ns = append(ns, s)
}
}
return ns
}

// StringsMap handle each string item, map to new strings
func StringsMap(ss []string, mapFn func(s string) string) []string {
ns := make([]string, 0, len(ss))
for _, s := range ss {
ns = append(ns, mapFn(s))
}
return ns
}

// TrimStrings trim string slice item.
//
// Usage:
//
// // output: [a, b, c]
// ss := arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.")
func TrimStrings(ss []string, cutSet ...string) []string {
cutSetLn := len(cutSet)
hasCutSet := cutSetLn > 0 && cutSet[0] != ""

var trimSet string
if hasCutSet {
trimSet = cutSet[0]
}
if cutSetLn > 1 {
trimSet = strings.Join(cutSet, "")
}

ns := make([]string, 0, len(ss))
for _, str := range ss {
if hasCutSet {
ns = append(ns, strings.Trim(str, trimSet))
} else {
ns = append(ns, strings.TrimSpace(str))
}
}
return ns
}

// GetRandomOne get random element from an array/slice
func GetRandomOne[T any](arr []T) T { return RandomOne(arr) }

Expand Down
38 changes: 0 additions & 38 deletions arrutil/arrutil_test.go
@@ -1,50 +1,12 @@
package arrutil_test

import (
"fmt"
"testing"

"github.com/gookit/goutil/arrutil"
"github.com/gookit/goutil/testutil/assert"
)

func TestStringsRemove(t *testing.T) {
ss := []string{"a", "b", "c"}
ns := arrutil.StringsRemove(ss, "b")

assert.Contains(t, ns, "a")
assert.NotContains(t, ns, "b")
assert.Len(t, ns, 2)
}

func TestStringsFilter(t *testing.T) {
is := assert.New(t)

ss := arrutil.StringsFilter([]string{"a", "", "b", ""})
is.Eq([]string{"a", "b"}, ss)
}

func TestStringsMap(t *testing.T) {
is := assert.New(t)

ss := arrutil.StringsMap([]string{"a", "b", "c"}, func(s string) string {
return s + "1"
})
is.Eq([]string{"a1", "b1", "c1"}, ss)
}

func TestTrimStrings(t *testing.T) {
is := assert.New(t)

// TrimStrings
ss := arrutil.TrimStrings([]string{" a", "b ", " c "})
is.Eq("[a b c]", fmt.Sprint(ss))
ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.")
is.Eq("[a b c]", fmt.Sprint(ss))
ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",", ".")
is.Eq("[a b c]", fmt.Sprint(ss))
}

func TestGetRandomOne(t *testing.T) {
is := assert.New(t)
// int slice
Expand Down
98 changes: 97 additions & 1 deletion arrutil/strings.go
@@ -1,6 +1,11 @@
package arrutil

import "strconv"
import (
"strconv"
"strings"

"github.com/gookit/goutil/comdef"
)

// StringsToAnys convert []string to []any
func StringsToAnys(ss []string) []any {
Expand Down Expand Up @@ -39,3 +44,94 @@ func StringsTryInts(ss []string) (ints []int, err error) {
}
return
}

// StringsUnique unique string slice
func StringsUnique(ss []string) []string {
var unique []string
for _, s := range ss {
if !StringsContains(unique, s) {
unique = append(unique, s)
}
}
return unique
}

// StringsContains check string slice contains string
func StringsContains(ss []string, s string) bool {
for _, v := range ss {
if v == s {
return true
}
}
return false
}

// StringsRemove value form a string slice
func StringsRemove(ss []string, s string) []string {
return StringsFilter(ss, func(el string) bool {
return s != el
})
}

// StringsFilter given strings, default will filter emtpy string.
//
// Usage:
//
// // output: [a, b]
// ss := arrutil.StringsFilter([]string{"a", "", "b", ""})
func StringsFilter(ss []string, filter ...comdef.StringMatchFunc) []string {
var fn comdef.StringMatchFunc
if len(filter) > 0 && filter[0] != nil {
fn = filter[0]
} else {
fn = func(s string) bool {
return s != ""
}
}

ns := make([]string, 0, len(ss))
for _, s := range ss {
if fn(s) {
ns = append(ns, s)
}
}
return ns
}

// StringsMap handle each string item, map to new strings
func StringsMap(ss []string, mapFn func(s string) string) []string {
ns := make([]string, 0, len(ss))
for _, s := range ss {
ns = append(ns, mapFn(s))
}
return ns
}

// TrimStrings trim string slice item.
//
// Usage:
//
// // output: [a, b, c]
// ss := arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.")
func TrimStrings(ss []string, cutSet ...string) []string {
cutSetLn := len(cutSet)
hasCutSet := cutSetLn > 0 && cutSet[0] != ""

var trimSet string
if hasCutSet {
trimSet = cutSet[0]
}
if cutSetLn > 1 {
trimSet = strings.Join(cutSet, "")
}

ns := make([]string, 0, len(ss))
for _, str := range ss {
if hasCutSet {
ns = append(ns, strings.Trim(str, trimSet))
} else {
ns = append(ns, strings.TrimSpace(str))
}
}
return ns
}
37 changes: 37 additions & 0 deletions arrutil/strings_test.go
Expand Up @@ -29,3 +29,40 @@ func TestStringsToInts(t *testing.T) {
is.Eq("[]int{1, 2}", fmt.Sprintf("%#v", ints))
is.Nil(arrutil.StringsAsInts([]string{"abc"}))
}

func TestStringsRemove(t *testing.T) {
ss := []string{"a", "b", "c"}
ns := arrutil.StringsRemove(ss, "b")

assert.Contains(t, ns, "a")
assert.NotContains(t, ns, "b")
assert.Len(t, ns, 2)
}

func TestStringsFilter(t *testing.T) {
is := assert.New(t)

ss := arrutil.StringsFilter([]string{"a", "", "b", ""})
is.Eq([]string{"a", "b"}, ss)
}

func TestStringsMap(t *testing.T) {
is := assert.New(t)

ss := arrutil.StringsMap([]string{"a", "b", "c"}, func(s string) string {
return s + "1"
})
is.Eq([]string{"a1", "b1", "c1"}, ss)
}

func TestTrimStrings(t *testing.T) {
is := assert.New(t)

// TrimStrings
ss := arrutil.TrimStrings([]string{" a", "b ", " c "})
is.Eq("[a b c]", fmt.Sprint(ss))
ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",.")
is.Eq("[a b c]", fmt.Sprint(ss))
ss = arrutil.TrimStrings([]string{",a", "b.", ",.c,"}, ",", ".")
is.Eq("[a b c]", fmt.Sprint(ss))
}
2 changes: 1 addition & 1 deletion encodes/hashutil/hashutil_test.go
Expand Up @@ -3,7 +3,7 @@ package hashutil_test
import (
"testing"

"github.com/gookit/goutil/encodx/hashutil"
"github.com/gookit/goutil/encodes/hashutil"
"github.com/gookit/goutil/testutil/assert"
)

Expand Down
1 change: 1 addition & 0 deletions strutil/random.go
Expand Up @@ -5,6 +5,7 @@ import (
"time"

"github.com/gookit/goutil/byteutil"
"github.com/gookit/goutil/encodes"
)

// some consts string chars
Expand Down

0 comments on commit 8119792

Please sign in to comment.