You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
206 lines
4.0 KiB
206 lines
4.0 KiB
package paladin |
|
|
|
import ( |
|
"fmt" |
|
"testing" |
|
"time" |
|
|
|
"github.com/stretchr/testify/assert" |
|
) |
|
|
|
type testUnmarshler struct { |
|
Text string |
|
Int int |
|
} |
|
|
|
func TestValueUnmarshal(t *testing.T) { |
|
s := ` |
|
int = 100 |
|
text = "hello" |
|
` |
|
v := Value{val: s, raw: s} |
|
obj := new(testUnmarshler) |
|
assert.Nil(t, v.UnmarshalTOML(obj)) |
|
// error |
|
v = Value{val: nil, raw: ""} |
|
assert.NotNil(t, v.UnmarshalTOML(obj)) |
|
} |
|
|
|
func TestValue(t *testing.T) { |
|
var tests = []struct { |
|
in interface{} |
|
out interface{} |
|
}{ |
|
{ |
|
"text", |
|
"text", |
|
}, |
|
{ |
|
time.Duration(time.Second * 10), |
|
"10s", |
|
}, |
|
{ |
|
int64(100), |
|
int64(100), |
|
}, |
|
{ |
|
float64(100.1), |
|
float64(100.1), |
|
}, |
|
{ |
|
true, |
|
true, |
|
}, |
|
{ |
|
nil, |
|
nil, |
|
}, |
|
} |
|
for _, test := range tests { |
|
t.Run(fmt.Sprint(test.in), func(t *testing.T) { |
|
v := Value{val: test.in, raw: fmt.Sprint(test.in)} |
|
switch test.in.(type) { |
|
case nil: |
|
s, err := v.String() |
|
assert.NotNil(t, err) |
|
assert.Equal(t, s, "", test.in) |
|
i, err := v.Int64() |
|
assert.NotNil(t, err) |
|
assert.Equal(t, i, int64(0), test.in) |
|
f, err := v.Float64() |
|
assert.NotNil(t, err) |
|
assert.Equal(t, f, float64(0.0), test.in) |
|
b, err := v.Bool() |
|
assert.NotNil(t, err) |
|
assert.Equal(t, b, false, test.in) |
|
case string: |
|
val, err := v.String() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val, test.out.(string), test.in) |
|
case int64: |
|
val, err := v.Int() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val, int(test.out.(int64)), test.in) |
|
val32, err := v.Int32() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val32, int32(test.out.(int64)), test.in) |
|
val64, err := v.Int64() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val64, test.out.(int64), test.in) |
|
case float64: |
|
val32, err := v.Float32() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val32, float32(test.out.(float64)), test.in) |
|
val64, err := v.Float64() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val64, test.out.(float64), test.in) |
|
case bool: |
|
val, err := v.Bool() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val, test.out.(bool), test.in) |
|
case time.Duration: |
|
v.val = test.out |
|
val, err := v.Duration() |
|
assert.Nil(t, err) |
|
assert.Equal(t, val, test.in.(time.Duration), test.out) |
|
} |
|
}) |
|
} |
|
} |
|
|
|
func TestValueSlice(t *testing.T) { |
|
var tests = []struct { |
|
in interface{} |
|
out interface{} |
|
}{ |
|
{ |
|
nil, |
|
nil, |
|
}, |
|
{ |
|
[]interface{}{"a", "b", "c"}, |
|
[]string{"a", "b", "c"}, |
|
}, |
|
{ |
|
[]interface{}{1, 2, 3}, |
|
[]int64{1, 2, 3}, |
|
}, |
|
{ |
|
[]interface{}{1.1, 1.2, 1.3}, |
|
[]float64{1.1, 1.2, 1.3}, |
|
}, |
|
{ |
|
[]interface{}{true, false, true}, |
|
[]bool{true, false, true}, |
|
}, |
|
} |
|
for _, test := range tests { |
|
t.Run(fmt.Sprint(test.in), func(t *testing.T) { |
|
v := Value{val: test.in, raw: fmt.Sprint(test.in)} |
|
switch test.in.(type) { |
|
case nil: |
|
var s []string |
|
assert.NotNil(t, v.Slice(&s)) |
|
case []string: |
|
var s []string |
|
assert.Nil(t, v.Slice(&s)) |
|
assert.Equal(t, s, test.out) |
|
case []int64: |
|
var s []int64 |
|
assert.Nil(t, v.Slice(&s)) |
|
assert.Equal(t, s, test.out) |
|
case []float64: |
|
var s []float64 |
|
assert.Nil(t, v.Slice(&s)) |
|
assert.Equal(t, s, test.out) |
|
case []bool: |
|
var s []bool |
|
assert.Nil(t, v.Slice(&s)) |
|
assert.Equal(t, s, test.out) |
|
} |
|
}) |
|
} |
|
} |
|
|
|
func BenchmarkValueInt(b *testing.B) { |
|
v := &Value{val: int64(100), raw: "100"} |
|
b.RunParallel(func(pb *testing.PB) { |
|
for pb.Next() { |
|
v.Int64() |
|
} |
|
}) |
|
} |
|
func BenchmarkValueFloat(b *testing.B) { |
|
v := &Value{val: float64(100.1), raw: "100.1"} |
|
b.RunParallel(func(pb *testing.PB) { |
|
for pb.Next() { |
|
v.Float64() |
|
} |
|
}) |
|
} |
|
func BenchmarkValueBool(b *testing.B) { |
|
v := &Value{val: true, raw: "true"} |
|
b.RunParallel(func(pb *testing.PB) { |
|
for pb.Next() { |
|
v.Bool() |
|
} |
|
}) |
|
} |
|
func BenchmarkValueString(b *testing.B) { |
|
v := &Value{val: "text", raw: "text"} |
|
b.RunParallel(func(pb *testing.PB) { |
|
for pb.Next() { |
|
v.String() |
|
} |
|
}) |
|
} |
|
|
|
func BenchmarkValueSlice(b *testing.B) { |
|
v := &Value{val: []interface{}{1, 2, 3}, raw: "100"} |
|
b.RunParallel(func(pb *testing.PB) { |
|
var slice []int64 |
|
for pb.Next() { |
|
v.Slice(&slice) |
|
} |
|
}) |
|
}
|
|
|