ea225df3ed
``` name old time/op new time/op delta UnmarshalDataset/config-32 86.7ms ± 2% 87.5ms ± 2% ~ (p=0.113 n=9+10) UnmarshalDataset/canada-32 129ms ± 4% 106ms ± 3% -17.94% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 59.4ms ± 5% 58.7ms ± 5% ~ (p=0.393 n=10+10) UnmarshalDataset/twitter-32 27.0ms ± 7% 26.9ms ± 6% ~ (p=0.720 n=10+9) UnmarshalDataset/code-32 326ms ± 4% 322ms ± 7% ~ (p=0.661 n=9+10) UnmarshalDataset/example-32 510µs ±11% 526µs ± 7% ~ (p=0.182 n=10+9) UnmarshalSimple-32 1.41µs ± 6% 1.41µs ± 4% ~ (p=0.736 n=10+9) ReferenceFile-32 45.6µs ± 3% 43.9µs ±10% ~ (p=0.089 n=10+10) name old speed new speed delta UnmarshalDataset/config-32 12.1MB/s ± 2% 12.0MB/s ± 2% ~ (p=0.108 n=9+10) UnmarshalDataset/canada-32 17.1MB/s ± 4% 20.9MB/s ± 3% +21.86% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 9.41MB/s ± 5% 9.51MB/s ± 5% ~ (p=0.362 n=10+10) UnmarshalDataset/twitter-32 16.4MB/s ± 8% 16.5MB/s ± 6% ~ (p=0.704 n=10+9) UnmarshalDataset/code-32 8.24MB/s ± 4% 8.34MB/s ± 7% ~ (p=0.675 n=9+10) UnmarshalDataset/example-32 15.9MB/s ±11% 15.4MB/s ± 7% ~ (p=0.182 n=10+9) ReferenceFile-32 115MB/s ± 4% 120MB/s ±10% ~ (p=0.085 n=10+10) name old alloc/op new alloc/op delta UnmarshalDataset/config-32 16.9MB ± 0% 16.9MB ± 0% -0.02% (p=0.000 n=10+10) UnmarshalDataset/canada-32 76.8MB ± 0% 74.3MB ± 0% -3.31% (p=0.000 n=10+10) UnmarshalDataset/citm_catalog-32 37.3MB ± 0% 37.1MB ± 0% -0.60% (p=0.000 n=9+10) UnmarshalDataset/twitter-32 15.6MB ± 0% 15.6MB ± 0% -0.09% (p=0.000 n=10+10) UnmarshalDataset/code-32 60.2MB ± 0% 59.3MB ± 0% -1.51% (p=0.000 n=10+9) UnmarshalDataset/example-32 238kB ± 0% 238kB ± 0% -0.18% (p=0.000 n=10+10) ReferenceFile-32 11.8kB ± 0% 11.8kB ± 0% ~ (all equal) name old allocs/op new allocs/op delta UnmarshalDataset/config-32 653k ± 0% 645k ± 0% -1.20% (p=0.000 n=10+6) UnmarshalDataset/canada-32 1.01M ± 0% 0.90M ± 0% -11.04% (p=0.000 n=9+10) UnmarshalDataset/citm_catalog-32 384k ± 0% 370k ± 0% -3.75% (p=0.000 n=10+10) UnmarshalDataset/twitter-32 160k ± 0% 157k ± 0% -1.32% (p=0.000 n=10+10) UnmarshalDataset/code-32 2.97M ± 0% 2.91M ± 0% -2.15% (p=0.000 n=10+7) UnmarshalDataset/example-32 3.69k ± 0% 3.63k ± 0% -1.52% (p=0.000 n=10+10) ReferenceFile-32 253 ± 0% 253 ± 0% ~ (all equal) ```
208 lines
4.1 KiB
Go
208 lines
4.1 KiB
Go
package toml
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestStructTarget_Ensure(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
examples := []struct {
|
|
desc string
|
|
input reflect.Value
|
|
name string
|
|
test func(v reflect.Value, err error)
|
|
}{
|
|
{
|
|
desc: "handle a nil slice of string",
|
|
input: reflect.ValueOf(&struct{ A []string }{}).Elem(),
|
|
name: "A",
|
|
test: func(v reflect.Value, err error) {
|
|
assert.NoError(t, err)
|
|
assert.False(t, v.IsNil())
|
|
},
|
|
},
|
|
{
|
|
desc: "handle an existing slice of string",
|
|
input: reflect.ValueOf(&struct{ A []string }{A: []string{"foo"}}).Elem(),
|
|
name: "A",
|
|
test: func(v reflect.Value, err error) {
|
|
assert.NoError(t, err)
|
|
require.False(t, v.IsNil())
|
|
|
|
s, ok := v.Interface().([]string)
|
|
if !ok {
|
|
t.Errorf("interface %v should be castable into []string", s)
|
|
return
|
|
}
|
|
|
|
assert.Equal(t, []string{"foo"}, s)
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, e := range examples {
|
|
e := e
|
|
t.Run(e.desc, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
d := decoder{}
|
|
target, _, err := d.scopeTableTarget(false, valueTarget(e.input), e.name)
|
|
require.NoError(t, err)
|
|
err = ensureValueIndexable(target)
|
|
v := target.get()
|
|
e.test(v, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestStructTarget_SetString(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
str := "value"
|
|
|
|
examples := []struct {
|
|
desc string
|
|
input reflect.Value
|
|
name string
|
|
test func(v reflect.Value, err error)
|
|
}{
|
|
{
|
|
desc: "sets a string",
|
|
input: reflect.ValueOf(&struct{ A string }{}).Elem(),
|
|
name: "A",
|
|
test: func(v reflect.Value, err error) {
|
|
assert.NoError(t, err)
|
|
assert.Equal(t, str, v.String())
|
|
},
|
|
},
|
|
{
|
|
desc: "fails on a float",
|
|
input: reflect.ValueOf(&struct{ A float64 }{}).Elem(),
|
|
name: "A",
|
|
test: func(v reflect.Value, err error) {
|
|
assert.Error(t, err)
|
|
},
|
|
},
|
|
{
|
|
desc: "fails on a slice",
|
|
input: reflect.ValueOf(&struct{ A []string }{}).Elem(),
|
|
name: "A",
|
|
test: func(v reflect.Value, err error) {
|
|
assert.Error(t, err)
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, e := range examples {
|
|
e := e
|
|
t.Run(e.desc, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
d := decoder{}
|
|
target, _, err := d.scopeTableTarget(false, valueTarget(e.input), e.name)
|
|
require.NoError(t, err)
|
|
err = setString(target, str)
|
|
v := target.get()
|
|
e.test(v, err)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestPushNew(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
t.Run("slice of strings", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
type Doc struct {
|
|
A []string
|
|
}
|
|
d := Doc{}
|
|
|
|
dec := decoder{}
|
|
x, _, err := dec.scopeTableTarget(false, valueTarget(reflect.ValueOf(&d).Elem()), "A")
|
|
require.NoError(t, err)
|
|
|
|
n := elementAt(x, 0)
|
|
n.setString("hello")
|
|
require.Equal(t, []string{"hello"}, d.A)
|
|
|
|
n = elementAt(x, 1)
|
|
n.setString("world")
|
|
require.Equal(t, []string{"hello", "world"}, d.A)
|
|
})
|
|
|
|
t.Run("slice of interfaces", func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
type Doc struct {
|
|
A []interface{}
|
|
}
|
|
d := Doc{}
|
|
|
|
dec := decoder{}
|
|
x, _, err := dec.scopeTableTarget(false, valueTarget(reflect.ValueOf(&d).Elem()), "A")
|
|
require.NoError(t, err)
|
|
|
|
n := elementAt(x, 0)
|
|
require.NoError(t, setString(n, "hello"))
|
|
require.Equal(t, []interface{}{"hello"}, d.A)
|
|
|
|
n = elementAt(x, 1)
|
|
require.NoError(t, setString(n, "world"))
|
|
require.Equal(t, []interface{}{"hello", "world"}, d.A)
|
|
})
|
|
}
|
|
|
|
func TestScope_Struct(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
examples := []struct {
|
|
desc string
|
|
input reflect.Value
|
|
name string
|
|
err bool
|
|
found bool
|
|
idx []int
|
|
}{
|
|
{
|
|
desc: "simple field",
|
|
input: reflect.ValueOf(&struct{ A string }{}).Elem(),
|
|
name: "A",
|
|
idx: []int{0},
|
|
found: true,
|
|
},
|
|
{
|
|
desc: "fails not-exported field",
|
|
input: reflect.ValueOf(&struct{ a string }{}).Elem(),
|
|
name: "a",
|
|
err: false,
|
|
found: false,
|
|
},
|
|
}
|
|
|
|
for _, e := range examples {
|
|
e := e
|
|
t.Run(e.desc, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
dec := decoder{}
|
|
x, found, err := dec.scopeTableTarget(false, valueTarget(e.input), e.name)
|
|
assert.Equal(t, e.found, found)
|
|
if e.err {
|
|
assert.Error(t, err)
|
|
}
|
|
if found {
|
|
x2, ok := x.(valueTarget)
|
|
require.True(t, ok)
|
|
x2.get()
|
|
}
|
|
})
|
|
}
|
|
}
|