diff --git a/README.md b/README.md index ee0cff3..4bb2230 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,10 @@
![Go version](https://img.shields.io/badge/go-%3E%3D1.16-9cf) -[![Project version](https://img.shields.io/badge/version-1.0.2-green.svg)](https://github.com/duke-git/lancet/releases) +[![Release](https://img.shields.io/badge/release-1.0.3-green.svg)](https://github.com/duke-git/lancet/releases) [![GoDoc](https://godoc.org/github.com//duke-git/lancet?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet) [![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet)](https://goreportcard.com/report/github.com/duke-git/lancet) +[![codecov](https://codecov.io/gh/duke-git/lancet/branch/main/graph/badge.svg?token=FC48T1F078)](https://codecov.io/gh/duke-git/lancet) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/duke-git/lancet/blob/main/LICENSE)
diff --git a/README_zh-CN.md b/README_zh-CN.md index d16945f..78cebe4 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -6,9 +6,10 @@
![Go version](https://img.shields.io/badge/go-%3E%3D1.16-9cf) -[![Project version](https://img.shields.io/badge/version-1.0.2-green.svg)](https://github.com/duke-git/lancet/releases) +[![Release](https://img.shields.io/badge/release-1.0.3-green.svg)](https://github.com/duke-git/lancet/releases) [![GoDoc](https://godoc.org/github.com//duke-git/lancet?status.svg)](https://pkg.go.dev/github.com/duke-git/lancet) [![Go Report Card](https://goreportcard.com/badge/github.com/duke-git/lancet)](https://goreportcard.com/report/github.com/duke-git/lancet) +[![codecov](https://codecov.io/gh/duke-git/lancet/branch/main/graph/badge.svg?token=FC48T1F078)](https://codecov.io/gh/duke-git/lancet) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/duke-git/lancet/blob/main/LICENSE)
diff --git a/convertor/convertor_test.go b/convertor/convertor_test.go index 7c84a9e..d0c3764 100644 --- a/convertor/convertor_test.go +++ b/convertor/convertor_test.go @@ -2,9 +2,10 @@ package convertor import ( "fmt" - "github.com/duke-git/lancet/utils" "reflect" "testing" + + "github.com/duke-git/lancet/utils" ) func TestToChar(t *testing.T) { @@ -58,8 +59,12 @@ func TestToBytes(t *testing.T) { } func TestToInt(t *testing.T) { - cases := []interface{}{"123", "-123", 123, "abc", false, "111111111111111111111111111111111111111"} - expected := []int64{123, -123, 123, 0, 0, 0} + cases := []interface{}{"123", "-123", 123, + uint(123), uint8(123), uint16(123), uint32(123), uint64(123), + float32(12.3), float64(12.3), + "abc", false, "111111111111111111111111111111111111111"} + + expected := []int64{123, -123, 123, 123, 123, 123, 123, 123, 12, 12, 0, 0, 0} for i := 0; i < len(cases); i++ { res, _ := ToInt(cases[i]) @@ -71,8 +76,14 @@ func TestToInt(t *testing.T) { } func TestToFloat(t *testing.T) { - cases := []interface{}{"", "-1", "-.11", "1.23e3", ".123e10", "abc"} - expected := []float64{0, -1, -0.11, 1230, 0.123e10, 0} + cases := []interface{}{ + "", "-1", "-.11", "1.23e3", ".123e10", "abc", + int(0), int8(1), int16(-1), int32(123), int64(123), + uint(123), uint8(123), uint16(123), uint32(123), uint64(123), + float64(12.3), float32(12.3), + } + expected := []float64{0, -1, -0.11, 1230, 0.123e10, 0, + 0, 1, -1, 123, 123, 123, 123, 123, 123, 123, 12.3, 12.300000190734863} for i := 0; i < len(cases); i++ { res, _ := ToFloat(cases[i]) @@ -84,41 +95,37 @@ func TestToFloat(t *testing.T) { } func TestToString(t *testing.T) { - // basic type - toString(t, "a1", "a1") - toString(t, 111, "111") - toString(t, 111.01, "111.01") - toString(t, true, "true") - //toString(t, 1.5+10i, "(1.5+10i)") - - // slice - aSlice := []int{1, 2, 3} - toString(t, aSlice, "[1,2,3]") - // map aMap := make(map[string]int) aMap["a"] = 1 aMap["b"] = 2 aMap["c"] = 3 - toString(t, aMap, "{\"a\":1,\"b\":2,\"c\":3}") - // struct type TestStruct struct { Name string } aStruct := TestStruct{Name: "TestStruct"} - toString(t, aStruct, "{\"Name\":\"TestStruct\"}") -} -func toString(t *testing.T, test interface{}, expected string) { - res := ToString(test) - if res != expected { - utils.LogFailedTestInfo(t, "ToString", test, expected, res) - t.FailNow() + cases := []interface{}{ + int(0), int8(1), int16(-1), int32(123), int64(123), + uint(123), uint8(123), uint16(123), uint32(123), uint64(123), + float64(12.3), float32(12.3), + true, false, + []int{1, 2, 3}, aMap, aStruct, []byte{104, 101, 108, 108, 111}} + + expected := []string{"0", "1", "-1", "123", "123", "123", "123", "123", + "123", "123", "12.3", "12.300000190734863", "true", "false", + "[1,2,3]", "{\"a\":1,\"b\":2,\"c\":3}", "{\"Name\":\"TestStruct\"}", "hello"} + + for i := 0; i < len(cases); i++ { + res := ToString(cases[i]) + if res != expected[i] { + utils.LogFailedTestInfo(t, "ToString", cases[i], expected[i], res) + t.FailNow() + } } } - func TestToJson(t *testing.T) { // map aMap := make(map[string]int) diff --git a/formatter/formatter_test.go b/formatter/formatter_test.go index f29713c..ff742b9 100644 --- a/formatter/formatter_test.go +++ b/formatter/formatter_test.go @@ -9,6 +9,8 @@ import ( func TestComma(t *testing.T) { comma(t, "", "", "") comma(t, "aa", "", "") + comma(t, "aa.a", "", "") + comma(t, []int{1}, "", "") comma(t, "123", "", "123") comma(t, "12345", "", "12,345") comma(t, 12345, "", "12,345") diff --git a/netutil/request_test.go b/netutil/request_test.go index 3871993..639ef32 100644 --- a/netutil/request_test.go +++ b/netutil/request_test.go @@ -11,6 +11,11 @@ import ( ) func TestHttpGet(t *testing.T) { + _, e := HttpGet("", nil) + if e == nil { + t.FailNow() + } + url := "https://gutendex.com/books?" queryParams := make(map[string]interface{}) queryParams["ids"] = "1" diff --git a/random/random_test.go b/random/random_test.go index 1528233..b248bcf 100644 --- a/random/random_test.go +++ b/random/random_test.go @@ -2,10 +2,11 @@ package random import ( "fmt" - "github.com/duke-git/lancet/utils" "reflect" "regexp" "testing" + + "github.com/duke-git/lancet/utils" ) func TestRandString(t *testing.T) { @@ -21,26 +22,44 @@ func TestRandString(t *testing.T) { } func TestRandInt(t *testing.T) { - randInt := RandInt(1, 10) + res1 := RandInt(1, 10) + if res1 < 1 || res1 >= 10 { + utils.LogFailedTestInfo(t, "RandInt", "RandInt(1, 10)", "RandInt(1, 10) should between [1, 10) ", res1) + t.FailNow() + } - if randInt < 1 || randInt >= 10 { - utils.LogFailedTestInfo(t, "RandInt", "RandInt(1, 10)", "RandInt(1, 10) should between [1, 10) ", randInt) + res2 := RandInt(1, 1) + if res2 != 1 { + utils.LogFailedTestInfo(t, "RandInt", "RandInt(1, 1)", "RandInt(1, 1) should be 1 ", res2) + t.FailNow() + } + + res3 := RandInt(10, 1) + if res3 < 1 || res3 >= 10 { + utils.LogFailedTestInfo(t, "RandInt", "RandInt(10, 1)", "RandInt(10, 1) should between [1, 10) ", res3) t.FailNow() } } func TestRandBytes(t *testing.T) { randBytes := RandBytes(4) - if len(randBytes) != 4 { utils.LogFailedTestInfo(t, "RandBytes", "RandBytes(4)", "RandBytes(4) should return 4 element of []bytes", randBytes) t.FailNow() } - v := reflect.ValueOf(randBytes) et := v.Type().Elem() if v.Kind() != reflect.Slice || et.Kind() != reflect.Uint8 { utils.LogFailedTestInfo(t, "RandBytes", "RandBytes(4)", "RandBytes(4) should return 4 element of []bytes", randBytes) t.FailNow() } + + randErr := RandBytes(0) + if randErr != nil { + utils.LogFailedTestInfo(t, "RandBytes", "RandBytes(0)", "RandBytes(0) should return nil", randErr) + t.FailNow() + } + + + } diff --git a/slice/slice.go b/slice/slice.go index 8bedb49..1bf06f0 100644 --- a/slice/slice.go +++ b/slice/slice.go @@ -137,17 +137,16 @@ func Map(slice, function interface{}) interface{} { // The function signature should be func(index int, value1, value2 interface{}) interface{} . func Reduce(slice, function, zero interface{}) interface{} { sv := sliceValue(slice) + elementType := sv.Type().Elem() len := sv.Len() if len == 0 { return zero } else if len == 1 { - return sv.Index(0) + return sv.Index(0).Interface() } - elementType := sv.Type().Elem() fn := functionValue(function) - if checkSliceCallbackFuncSignature(fn, elementType, elementType, elementType) { t := elementType.String() panic("Reduce function must be of type func(int, " + t + ", " + t + ")" + t) diff --git a/slice/slice_test.go b/slice/slice_test.go index c9cc1e4..6942a70 100644 --- a/slice/slice_test.go +++ b/slice/slice_test.go @@ -14,6 +14,15 @@ func TestContain(t *testing.T) { var t2 []string contain(t, t2, "1", false) + + m := make(map[string]int) + m["a"] = 1 + contain(t, m, "a", true) + contain(t, m, "b", false) + + s := "hello" + contain(t, s, "h", true) + contain(t, s, "s", false) } func contain(t *testing.T, test interface{}, value interface{}, expected bool) { @@ -167,28 +176,21 @@ func TestMap(t *testing.T) { } func TestReduce(t *testing.T) { - s1 := []int{1, 2, 3, 4} - f1 := func(i, v1, v2 int) int { + cases := [][]int{ + {}, + {1}, + {1, 2, 3, 4}} + expected := []int{0, 1, 10} + f := func(i, v1, v2 int) int { return v1 + v2 } - e1 := 10 - r1 := Reduce(s1, f1, 0) - if e1 != r1 { - utils.LogFailedTestInfo(t, "Reduce", s1, e1, r1) - t.FailNow() + for i := 0; i < len(cases); i++ { + res := Reduce(cases[i], f, 0) + if res != expected[i] { + utils.LogFailedTestInfo(t, "Reduce", cases[i], expected[i], res) + t.FailNow() + } } - - // failed Reduce function should be func(i int, v1, v2 int) int - //s1 := []int{1, 2, 3, 4} - //f1 := func(i string, v1, v2 int) int { //i should be int - // return v1+v2 - //} - //e1 := 10 - //r1 := Reduce(s1, f1, 0) - //if e1 != r1 { - // utils.LogFailedTestInfo(t, "Reduce", s1, e1, r1) - // t.FailNow() - //} } func TestIntSlice(t *testing.T) {