168 lines
3.7 KiB
Go
168 lines
3.7 KiB
Go
package reflectbuild_test
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/pelletier/go-toml/v2/internal/reflectbuild"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestNewBuilderSuccess(t *testing.T) {
|
|
x := struct{}{}
|
|
_, err := reflectbuild.NewBuilder(&x)
|
|
assert.NoError(t, err)
|
|
}
|
|
|
|
func TestNewBuilderNil(t *testing.T) {
|
|
_, err := reflectbuild.NewBuilder(nil)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestNewBuilderNonPtr(t *testing.T) {
|
|
_, err := reflectbuild.NewBuilder(struct{}{})
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestDigField(t *testing.T) {
|
|
x := struct {
|
|
Field string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
assert.Error(t, b.DigField("oops"))
|
|
assert.NoError(t, b.DigField("Field"))
|
|
assert.Error(t, b.DigField("does not work on strings"))
|
|
}
|
|
|
|
func TestBack(t *testing.T) {
|
|
x := struct {
|
|
A string
|
|
B string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
b.Save()
|
|
assert.NoError(t, b.DigField("A"))
|
|
assert.NoError(t, b.SetString("A"))
|
|
b.Load()
|
|
b.Save()
|
|
assert.NoError(t, b.DigField("B"))
|
|
assert.NoError(t, b.SetString("B"))
|
|
assert.Equal(t, "A", x.A)
|
|
assert.Equal(t, "B", x.B)
|
|
b.Load() // back to root
|
|
assert.Panics(t, func() {
|
|
b.Load() // oops
|
|
})
|
|
}
|
|
|
|
func TestReset(t *testing.T) {
|
|
x := struct {
|
|
A []string
|
|
B string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
require.NoError(t, b.DigField("A"))
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("hello"))
|
|
b.Reset()
|
|
require.NoError(t, b.DigField("B"))
|
|
require.NoError(t, b.SetString("world"))
|
|
|
|
assert.Equal(t, []string{"hello"}, x.A)
|
|
assert.Equal(t, "world", x.B)
|
|
}
|
|
|
|
func TestSetString(t *testing.T) {
|
|
x := struct {
|
|
Field string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
assert.Error(t, b.SetString("oops"))
|
|
require.NoError(t, b.DigField("Field"))
|
|
require.NoError(t, b.SetString("hello!"))
|
|
assert.Equal(t, "hello!", x.Field)
|
|
}
|
|
|
|
func TestSliceNewElem(t *testing.T) {
|
|
x := struct {
|
|
Field []string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
require.NoError(t, b.DigField("Field"))
|
|
b.Save()
|
|
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("Val1"))
|
|
b.Load()
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("Val2"))
|
|
|
|
require.Error(t, b.SliceNewElem())
|
|
|
|
assert.Equal(t, []string{"Val1", "Val2"}, x.Field)
|
|
}
|
|
|
|
func TestSliceNewElemNested(t *testing.T) {
|
|
x := struct {
|
|
Field [][]string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
require.NoError(t, b.DigField("Field"))
|
|
|
|
b.Save()
|
|
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("Val1.1"))
|
|
b.Load()
|
|
b.Save()
|
|
|
|
require.NoError(t, b.SliceNewElem())
|
|
b.Save()
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("Val2.1"))
|
|
b.Load()
|
|
require.NoError(t, b.SliceNewElem())
|
|
require.NoError(t, b.SetString("Val2.2"))
|
|
b.Load()
|
|
require.NoError(t, b.SliceNewElem())
|
|
|
|
assert.Equal(t, [][]string{{"Val1.1"}, {"Val2.1", "Val2.2"}, nil}, x.Field)
|
|
}
|
|
|
|
func TestIncorrectKindError(t *testing.T) {
|
|
err := reflectbuild.IncorrectKindError{
|
|
Actual: reflect.String,
|
|
Expected: reflect.Struct,
|
|
}
|
|
assert.NotEmpty(t, err.Error())
|
|
}
|
|
|
|
func TestFieldNotFoundError(t *testing.T) {
|
|
err := reflectbuild.FieldNotFoundError{
|
|
Struct: reflect.ValueOf(struct {
|
|
Blah string
|
|
}{}),
|
|
FieldName: "Foo",
|
|
}
|
|
assert.NotEmpty(t, err.Error())
|
|
}
|
|
|
|
func TestCursor(t *testing.T) {
|
|
x := struct {
|
|
Field string
|
|
}{}
|
|
b, err := reflectbuild.NewBuilder(&x)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, b.Cursor().Kind(), reflect.Struct)
|
|
require.NoError(t, b.DigField("Field"))
|
|
assert.Equal(t, b.Cursor().Kind(), reflect.String)
|
|
}
|