234 lines
6.8 KiB
Go
234 lines
6.8 KiB
Go
|
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))
|
||
|
}
|