1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
package options
import (
"testing"
"gotest.tools/v3/assert"
is "gotest.tools/v3/assert/cmp"
)
func TestGenerate(t *testing.T) {
gen := Generic{
"Int": 1,
"Rune": 'b',
"Float64": 2.0,
}
type Model struct {
Int int
Rune rune
Float64 float64
}
expected := Model{
Int: 1,
Rune: 'b',
Float64: 2.0,
}
result, err := GenerateFromModel(gen, Model{})
assert.Check(t, err)
assert.Check(t, is.DeepEqual(result, expected))
}
func TestGeneratePtr(t *testing.T) {
gen := Generic{
"Int": 1,
"Rune": 'b',
"Float64": 2.0,
}
type Model struct {
Int int
Rune rune
Float64 float64
}
expected := &Model{
Int: 1,
Rune: 'b',
Float64: 2.0,
}
result, err := GenerateFromModel(gen, &Model{})
assert.NilError(t, err)
assert.Check(t, is.DeepEqual(result, expected))
}
func TestGenerateMissingField(t *testing.T) {
type Model struct{}
gen := Generic{"foo": "bar"}
_, err := GenerateFromModel(gen, Model{})
const expected = `no field "foo" in type "options.Model"`
assert.Check(t, is.Error(err, expected))
assert.Check(t, is.ErrorType(err, NoSuchFieldError{}))
}
func TestFieldCannotBeSet(t *testing.T) {
type Model struct {
foo int //nolint:nolintlint,unused // un-exported field is used to test error-handling
}
gen := Generic{"foo": "bar"}
_, err := GenerateFromModel(gen, Model{})
const expected = `cannot set field "foo" of type "options.Model"`
assert.Check(t, is.Error(err, expected))
assert.Check(t, is.ErrorType(err, CannotSetFieldError{}))
}
func TestTypeMismatchError(t *testing.T) {
type Model struct {
Foo int
}
gen := Generic{"Foo": "bar"}
_, err := GenerateFromModel(gen, Model{})
const expected = `type mismatch, field Foo require type int, actual type string`
assert.Check(t, is.Error(err, expected))
assert.Check(t, is.ErrorType(err, TypeMismatchError{}))
}
|