7c891bd5f2
message: Initial commit, can create master commit and verify previous master commits change_hash: ADgeVBdfi1hA0TTDrBIkYHaQQYoxZaInZz1p/BAH35Ng credentials: - type: pgp_signature pub_key_id: 95C46FA6A41148AC body: iQIzBAABAgAdFiEEJ6tQKp6olvZKJ0lwlcRvpqQRSKwFAl5IbRgACgkQlcRvpqQRSKzWjg/+P0a3einWQ8wFUe05qXUbmMQ4K86Oa4I85pF6kubZlFy/UbcjiPnTPRMKAhmGZi4WCz1sW1F2al4qKvtq3nvn6+hZY8dj0SjPgGG2lkMMLEVy1hjsO7d9S9ZEfUv0cHOcvkphgVQk+InkegBXvFS45mwKQLDOiW5tPcTFDHTHBmC/nlCV/sKCrZEmQGU7KaELJKOf26LSY2zXe6fbVCa8njpIycYS7Wulu2OODcI5n6Ye2U6DvxN6MvuNvziyX7VMePS1xEdJYpltsNMhSkMMGLU7dovxbrhD617uwOsm1847YX9HTJ3Ixs+M0yobHmz8ob4OBcZx8r3AoiyDo+HNMmAZ96ue8pPHmI+2O9jEmbmbH61yq4crhUVAP8PncSTdq0tiYKj/zaSTJ8CT2W0uicX/3v9EtIFn0thqe/qZzHh6upixvpXDpNjZZ5SxiVm8MITnWzInQRbo9yvFsfgd7LqMGKZeGv5q5rgNTRM4fwGrJDuslwj8V2B4uw1ofPncL+LHmXArXWiewvvJFU2uRpfvsl+u4is2dl2SGVpe7ixm+a088gllOQCMRgLbuaN8dQ/eqdkfdxUg+SYQlx6vykrdJOSQrs9zaX/JuxnaNBTi/yLY1FqFXaXBGID6qX1cnPilw+J6vEZYt1MBtzXX+UEjHyVowIhMRsnts6Wq3Z8= account: mediocregopher
115 lines
2.5 KiB
Go
115 lines
2.5 KiB
Go
package typeobj
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/davecgh/go-spew/spew"
|
|
"gopkg.in/yaml.v2"
|
|
)
|
|
|
|
type foo struct {
|
|
A int `yaml:"a"`
|
|
}
|
|
|
|
type bar struct {
|
|
B int `yaml:"b"`
|
|
}
|
|
|
|
type outer struct {
|
|
Foo foo `type:"foo"`
|
|
Bar *bar `type:"bar"`
|
|
|
|
Other string `yaml:"other_field,omitempty"`
|
|
}
|
|
|
|
func (o outer) MarshalYAML() (interface{}, error) {
|
|
return MarshalYAML(o)
|
|
}
|
|
|
|
func (o *outer) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
|
return UnmarshalYAML(o, unmarshal)
|
|
}
|
|
|
|
func TestTypeObj(t *testing.T) {
|
|
|
|
type test struct {
|
|
descr string
|
|
str string
|
|
err bool
|
|
other string
|
|
|
|
obj outer
|
|
typeTag string
|
|
elem interface{}
|
|
}
|
|
|
|
tests := []test{
|
|
{
|
|
descr: "no type set",
|
|
str: `{}`,
|
|
err: true,
|
|
},
|
|
{
|
|
descr: "unknown type set",
|
|
str: "type: baz",
|
|
err: true,
|
|
},
|
|
{
|
|
descr: "foo set",
|
|
str: "type: foo\na: 1\n",
|
|
obj: outer{Foo: foo{A: 1}},
|
|
typeTag: "foo",
|
|
elem: foo{A: 1},
|
|
},
|
|
{
|
|
descr: "bar set",
|
|
str: "type: bar\nb: 1\n",
|
|
obj: outer{Bar: &bar{B: 1}},
|
|
typeTag: "bar",
|
|
elem: &bar{B: 1},
|
|
},
|
|
{
|
|
descr: "foo and other_field set",
|
|
str: "type: foo\na: 1\nother_field: aaa\n",
|
|
obj: outer{Foo: foo{A: 1}, Other: "aaa"},
|
|
typeTag: "foo",
|
|
elem: foo{A: 1},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.descr, func(t *testing.T) {
|
|
var o outer
|
|
err := yaml.Unmarshal([]byte(test.str), &o)
|
|
if test.err && err != nil {
|
|
return
|
|
} else if test.err && err == nil {
|
|
t.Fatal("expected error when unmarshaling but there was none")
|
|
} else if !test.err && err != nil {
|
|
t.Fatalf("unmarshaling %q returned unexpected error: %v", test.str, err)
|
|
}
|
|
|
|
if !reflect.DeepEqual(o, test.obj) {
|
|
t.Fatalf("test expected value:\n%s\nbut got value:\n%s", spew.Sprint(test.obj), spew.Sprint(o))
|
|
}
|
|
|
|
elem, typeTag, err := Element(o)
|
|
if err != nil {
|
|
t.Fatalf("error when calling Element(%s): %v", spew.Sprint(o), err)
|
|
} else if !reflect.DeepEqual(elem, test.elem) {
|
|
t.Fatalf("test expected elem value:\n%s\nbut got value:\n%s", spew.Sprint(test.elem), spew.Sprint(elem))
|
|
} else if typeTag != test.typeTag {
|
|
t.Fatalf("test expected typeTag value %q but got %q", test.typeTag, typeTag)
|
|
}
|
|
|
|
b, err := yaml.Marshal(o)
|
|
if err != nil {
|
|
t.Fatalf("error marshaling %s: %v", spew.Sprint(o), err)
|
|
} else if test.str != string(b) {
|
|
t.Fatalf("test expected to marshal to %q, but instead marshaled to %q", test.str, b)
|
|
}
|
|
})
|
|
}
|
|
}
|