golib/helper/text/transformer_test.go

234 lines
6.8 KiB
Go
Raw Normal View History

2023-08-20 13:50:39 +08:00
package text
import (
"fmt"
"reflect"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestNewNumberTransformer(t *testing.T) {
signColorsMap := map[string]Colors{
"negative": colorsNumberNegative,
"positive": colorsNumberPositive,
"zero": nil,
"nil": nil,
}
colorValuesMap := map[string]map[interface{}]string{
"negative": {
int(-5): "%05d",
int8(-5): "%05d",
int16(-5): "%05d",
int32(-5): "%05d",
int64(-5): "%05d",
float32(-5.55555): "%08.2f",
float64(-5.55555): "%08.2f",
},
"positive": {
int(5): "%05d",
int8(5): "%05d",
int16(5): "%05d",
int32(5): "%05d",
int64(5): "%05d",
uint(5): "%05d",
uint8(5): "%05d",
uint16(5): "%05d",
uint32(5): "%05d",
uint64(5): "%05d",
float32(5.55555): "%08.2f",
float64(5.55555): "%08.2f",
},
"zero": {
int(0): "%05d",
int8(0): "%05d",
int16(0): "%05d",
int32(0): "%05d",
int64(0): "%05d",
uint(0): "%05d",
uint8(0): "%05d",
uint16(0): "%05d",
uint32(0): "%05d",
uint64(0): "%05d",
float32(0.00000): "%08.2f",
float64(0.00000): "%08.2f",
},
"nil": {
nil: "%v",
},
}
for sign, valuesFormatMap := range colorValuesMap {
for value, format := range valuesFormatMap {
transformer := NewNumberTransformer(format)
expected := signColorsMap[sign].Sprintf(format, value)
if sign == "negative" {
expected = strings.Replace(expected, "-0", "-00", 1)
}
actual := transformer(value)
var kind reflect.Kind
if value != nil {
kind = reflect.TypeOf(value).Kind()
}
message := fmt.Sprintf("%s.%s: expected=%v, actual=%v; format=%#v",
sign, kind, expected, actual, format)
assert.Equal(t, expected, actual, message)
}
}
// invalid input
assert.Equal(t, "foo", NewNumberTransformer("%05d")("foo"))
}
type jsonTest struct {
Foo string `json:"foo"`
Bar int32 `json:"bar"`
Baz float64 `json:"baz"`
Nan jsonNestTest `json:"nan"`
}
type jsonNestTest struct {
A string
B int32
C float64
}
func TestNewJSONTransformer(t *testing.T) {
transformer := NewJSONTransformer("", " ")
// instance of a struct
inputObj := jsonTest{
Foo: "fooooooo",
Bar: 13,
Baz: 3.14,
Nan: jsonNestTest{
A: "a",
B: 2,
C: 3.0,
},
}
expectedOutput := `{
"foo": "fooooooo",
"bar": 13,
"baz": 3.14,
"nan": {
"A": "a",
"B": 2,
"C": 3
}
}`
assert.Equal(t, expectedOutput, transformer(inputObj))
// numbers
assert.Equal(t, "1", transformer(int(1)))
assert.Equal(t, "1.2345", transformer(float32(1.2345)))
// slices
assert.Equal(t, "[\n 1,\n 2,\n 3\n]", transformer([]uint{1, 2, 3}))
// strings
assert.Equal(t, "\"foo\"", transformer("foo"))
assert.Equal(t, "\"{foo...\"", transformer("{foo...")) // malformed JSON
// strings with valid JSON
input := "{\"foo\":\"bar\",\"baz\":[1,2,3]}"
expectedOutput = `{
"foo": "bar",
"baz": [
1,
2,
3
]
}`
assert.Equal(t, expectedOutput, transformer(input))
}
func TestNewTimeTransformer(t *testing.T) {
inStr := "2010-11-12T13:14:15-07:00"
inTime, err := time.Parse(time.RFC3339, inStr)
assert.Nil(t, err)
location, err := time.LoadLocation("America/Los_Angeles")
assert.Nil(t, err)
transformer := NewTimeTransformer(time.RFC3339, location)
expected := "2010-11-12T12:14:15-08:00"
assert.Equal(t, expected, transformer(inStr))
assert.Equal(t, expected, transformer(inTime))
for _, possibleTimeLayout := range possibleTimeLayouts {
assert.Equal(t, expected, transformer(inTime.Format(possibleTimeLayout)), possibleTimeLayout)
}
location, err = time.LoadLocation("Asia/Singapore")
assert.Nil(t, err)
transformer = NewTimeTransformer(time.UnixDate, location)
expected = "Sat Nov 13 04:14:15 +08 2010"
assert.Equal(t, expected, transformer(inStr))
assert.Equal(t, expected, transformer(inTime))
for _, possibleTimeLayout := range possibleTimeLayouts {
assert.Equal(t, expected, transformer(inTime.Format(possibleTimeLayout)), possibleTimeLayout)
}
location, err = time.LoadLocation("Europe/London")
assert.Nil(t, err)
transformer = NewTimeTransformer(time.RFC3339, location)
expected = "2010-11-12T20:14:15Z"
assert.Equal(t, expected, transformer(inStr))
assert.Equal(t, expected, transformer(inTime))
for _, possibleTimeLayout := range possibleTimeLayouts {
assert.Equal(t, expected, transformer(inTime.Format(possibleTimeLayout)), possibleTimeLayout)
}
}
func TestNewUnixTimeTransformer(t *testing.T) {
inStr := "2010-11-12T13:14:15-07:00"
inTime, err := time.Parse(time.RFC3339, inStr)
assert.Nil(t, err)
inUnixTime := inTime.Unix()
location, err := time.LoadLocation("America/Los_Angeles")
assert.Nil(t, err)
transformer := NewUnixTimeTransformer(time.RFC3339, location)
expected := "2010-11-12T12:14:15-08:00"
assert.Equal(t, expected, transformer(fmt.Sprint(inUnixTime)), "seconds in string")
assert.Equal(t, expected, transformer(inUnixTime), "seconds")
assert.Equal(t, expected, transformer(inUnixTime*1000), "milliseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000), "microseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000000), "nanoseconds")
location, err = time.LoadLocation("Asia/Singapore")
assert.Nil(t, err)
transformer = NewUnixTimeTransformer(time.UnixDate, location)
expected = "Sat Nov 13 04:14:15 +08 2010"
assert.Equal(t, expected, transformer(fmt.Sprint(inUnixTime)), "seconds in string")
assert.Equal(t, expected, transformer(inUnixTime), "seconds")
assert.Equal(t, expected, transformer(inUnixTime*1000), "milliseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000), "microseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000000), "nanoseconds")
location, err = time.LoadLocation("Europe/London")
assert.Nil(t, err)
transformer = NewUnixTimeTransformer(time.RFC3339, location)
expected = "2010-11-12T20:14:15Z"
assert.Equal(t, expected, transformer(fmt.Sprint(inUnixTime)), "seconds in string")
assert.Equal(t, expected, transformer(inUnixTime), "seconds")
assert.Equal(t, expected, transformer(inUnixTime*1000), "milliseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000), "microseconds")
assert.Equal(t, expected, transformer(inUnixTime*1000000000), "nanoseconds")
assert.Equal(t, "0.123456", transformer(float32(0.123456)))
}
func TestNewURLTransformer(t *testing.T) {
url := "https://winter.is.coming"
transformer := NewURLTransformer()
assert.Equal(t, colorsURL.Sprint(url), transformer(url))
transformer2 := NewURLTransformer(FgRed, BgWhite, Bold)
assert.Equal(t, Colors{FgRed, BgWhite, Bold}.Sprint(url), transformer2(url))
assert.Equal(t, colorsURL.Sprint(url), transformer(url))
}