cloudflared-mirror/vendor/zombiezen.com/go/capnproto2/pogs/embed_test.go

361 lines
8.8 KiB
Go

package pogs
import (
"reflect"
"testing"
"zombiezen.com/go/capnproto2"
air "zombiezen.com/go/capnproto2/internal/aircraftlib"
)
type VerVal struct {
Val int16
}
type VerOneData struct {
VerVal
}
type VerTwoData struct {
*VerVal
Duo int64
}
type F16 struct {
PlaneBase `capnp:"base"`
}
func TestExtract_Embed(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v1, err := air.NewRootVerOneData(seg)
if err != nil {
t.Fatalf("NewRootVerOneData: %v", err)
}
v1.SetVal(123)
out := new(VerOneData)
if err := Extract(out, air.VerOneData_TypeID, v1.Struct); err != nil {
t.Errorf("Extract error: %v", err)
}
if out.Val != 123 {
t.Errorf("Extract produced %s; want %s", zpretty.Sprint(out), zpretty.Sprint(&VerOneData{VerVal{123}}))
}
}
func TestExtract_EmbedPtr(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v2, err := air.NewRootVerTwoData(seg)
if err != nil {
t.Fatalf("NewRootVerTwoData: %v", err)
}
v2.SetVal(123)
v2.SetDuo(456)
out := new(VerTwoData)
if err := Extract(out, air.VerTwoData_TypeID, v2.Struct); err != nil {
t.Errorf("Extract error: %v", err)
}
if out.VerVal == nil || out.Val != 123 || out.Duo != 456 {
t.Errorf("Extract produced %s; want %s", zpretty.Sprint(out), zpretty.Sprint(&VerTwoData{&VerVal{123}, 456}))
}
}
func TestExtract_EmbedOmit(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v2, err := air.NewRootVerTwoData(seg)
if err != nil {
t.Fatalf("NewRootVerTwoData: %v", err)
}
v2.SetVal(123)
v2.SetDuo(456)
out := new(VerTwoDataOmit)
if err := Extract(out, air.VerTwoData_TypeID, v2.Struct); err != nil {
t.Errorf("Extract error: %v", err)
}
if out.Val != 0 || out.Duo != 456 {
t.Errorf("Extract produced %s; want %s", zpretty.Sprint(out), zpretty.Sprint(&VerTwoDataOmit{VerVal{}, 456}))
}
}
func TestExtract_EmbedName(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
f16, err := air.NewRootF16(seg)
if err != nil {
t.Fatalf("NewRootF16: %v", err)
}
base, err := f16.NewBase()
if err != nil {
t.Fatalf("F16.NewBase: %v", err)
}
if err := base.SetName("ALL YOUR BASE"); err != nil {
t.Fatalf("Planebase.SetName: %v", err)
}
base.SetRating(5)
base.SetCanFly(true)
out := new(F16)
if err := Extract(out, air.F16_TypeID, f16.Struct); err != nil {
t.Errorf("Extract error: %v", err)
}
if out.Name != "ALL YOUR BASE" || out.Rating != 5 || !out.CanFly {
t.Errorf("Extract produced %s; want %s", zpretty.Sprint(out), zpretty.Sprint(&F16{PlaneBase{Name: "ALL YOUR BASE", Rating: 5, CanFly: true}}))
}
}
func TestInsert_Embed(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v1, err := air.NewRootVerOneData(seg)
if err != nil {
t.Fatalf("NewRootVerOneData: %v", err)
}
gv1 := &VerOneData{VerVal{123}}
err = Insert(air.VerOneData_TypeID, v1.Struct, gv1)
if err != nil {
t.Errorf("Insert(%s) error: %v", zpretty.Sprint(gv1), err)
}
if v1.Val() != 123 {
t.Errorf("Insert(%s) produced %v", zpretty.Sprint(gv1), v1)
}
}
func TestInsert_EmbedPtr(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v2, err := air.NewRootVerTwoData(seg)
if err != nil {
t.Fatalf("NewRootVerTwoData: %v", err)
}
gv2 := &VerTwoData{&VerVal{123}, 456}
err = Insert(air.VerTwoData_TypeID, v2.Struct, gv2)
if err != nil {
t.Errorf("Insert(%s) error: %v", zpretty.Sprint(gv2), err)
}
if v2.Val() != 123 || v2.Duo() != 456 {
t.Errorf("Insert(%s) produced %v", zpretty.Sprint(gv2), v2)
}
}
func TestInsert_EmbedNilPtr(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v2, err := air.NewRootVerTwoData(seg)
if err != nil {
t.Fatalf("NewRootVerTwoData: %v", err)
}
gv2 := &VerTwoData{nil, 456}
err = Insert(air.VerTwoData_TypeID, v2.Struct, gv2)
if err != nil {
t.Errorf("Insert(%s) error: %v", zpretty.Sprint(gv2), err)
}
if v2.Val() != 0 || v2.Duo() != 456 {
t.Errorf("Insert(%s) produced %v", zpretty.Sprint(gv2), v2)
}
}
func TestInsert_EmbedOmit(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v2, err := air.NewRootVerTwoData(seg)
if err != nil {
t.Fatalf("NewRootVerTwoData: %v", err)
}
in := &VerTwoDataOmit{VerVal{123}, 456}
err = Insert(air.VerTwoData_TypeID, v2.Struct, in)
if err != nil {
t.Errorf("Insert(%s) error: %v", zpretty.Sprint(in), err)
}
if v2.Val() != 0 || v2.Duo() != 456 {
t.Errorf("Insert(%s) produced %v", zpretty.Sprint(in), v2)
}
}
func TestInsert_EmbedNamed(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
f16, err := air.NewRootF16(seg)
if err != nil {
t.Fatalf("NewRootF16: %v", err)
}
in := &F16{PlaneBase{Name: "ALL YOUR BASE", Rating: 5, CanFly: true}}
err = Insert(air.F16_TypeID, f16.Struct, in)
if err != nil {
t.Errorf("Insert(%s) error: %v", zpretty.Sprint(in), err)
}
base, err := f16.Base()
if err != nil {
t.Errorf("f16.base: %v", err)
}
name, err := base.Name()
if err != nil {
t.Errorf("f16.base.name: %v", err)
}
if name != "ALL YOUR BASE" || base.Rating() != 5 || !base.CanFly() {
t.Errorf("Insert(%s) produced %v", zpretty.Sprint(in), f16)
}
}
type VerValNoTag struct {
Val int16
}
type VerValTag1 struct {
Val int16 `capnp:"val"`
}
type VerValTag2 struct {
Val int16 `capnp:"val"`
}
type VerValTag3 struct {
Val int16 `capnp:"val"`
}
type VerTwoDataOmit struct {
VerVal `capnp:"-"`
Duo int64
}
type VerOneDataTop struct {
Val int16
VerVal
}
type VerOneDataTopWithLowerCollision struct {
Val int16
VerVal
VerValNoTag
}
type VerOneDataNoTags struct {
VerVal
VerValNoTag
}
type VerOneData1Tag struct {
VerVal
VerValTag1
}
type VerOneData1TagWithUntagged struct {
VerVal
VerValTag1
VerValNoTag
}
type VerOneData2Tags struct {
VerValTag1
VerValTag2
}
type VerOneData3Tags struct {
VerValTag1
VerValTag2
VerValTag3
}
func TestExtract_EmbedCollide(t *testing.T) {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Fatalf("NewMessage: %v", err)
}
v1, err := air.NewRootVerOneData(seg)
if err != nil {
t.Fatalf("NewRootVerOneData: %v", err)
}
v1.SetVal(123)
tests := []struct {
name string
want interface{}
}{
{"top", &VerOneDataTop{Val: 123}},
{"no tags", &VerOneDataNoTags{}},
{"1 tag", &VerOneData1Tag{VerValTag1: VerValTag1{123}}},
{"1 tag with untagged", &VerOneData1TagWithUntagged{VerValTag1: VerValTag1{123}}},
{"2 tags", &VerOneData2Tags{}},
{"3 tags", &VerOneData3Tags{}},
{"top with lower collision", &VerOneDataTopWithLowerCollision{Val: 123}},
}
for _, test := range tests {
out := reflect.New(reflect.TypeOf(test.want).Elem()).Interface()
if err := Extract(out, air.VerOneData_TypeID, v1.Struct); err != nil {
t.Errorf("%s: Extract error: %v", test.name, err)
}
if !reflect.DeepEqual(out, test.want) {
t.Errorf("%s: Extract produced %s; want %s", test.name, zpretty.Sprint(out), zpretty.Sprint(test.want))
}
}
}
func TestInsert_EmbedCollide(t *testing.T) {
tests := []struct {
name string
in interface{}
val int16
}{
{"top", &VerOneDataTop{Val: 123, VerVal: VerVal{456}}, 123},
{"no tags", &VerOneDataNoTags{VerVal: VerVal{123}, VerValNoTag: VerValNoTag{456}}, 0},
{"1 tag", &VerOneData1Tag{VerVal: VerVal{123}, VerValTag1: VerValTag1{456}}, 456},
{
"1 tag with untagged",
&VerOneData1TagWithUntagged{
VerVal: VerVal{123},
VerValTag1: VerValTag1{456},
VerValNoTag: VerValNoTag{789},
},
456,
},
{"2 tags", &VerOneData2Tags{VerValTag1: VerValTag1{123}, VerValTag2: VerValTag2{456}}, 0},
{"3 tags", &VerOneData3Tags{VerValTag1: VerValTag1{123}, VerValTag2: VerValTag2{456}, VerValTag3: VerValTag3{789}}, 0},
{
"top with lower collision",
&VerOneDataTopWithLowerCollision{
Val: 123,
VerVal: VerVal{456},
VerValNoTag: VerValNoTag{789},
},
123,
},
}
for _, test := range tests {
_, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
if err != nil {
t.Errorf("%s: NewMessage: %v", test.name, err)
continue
}
v1, err := air.NewRootVerOneData(seg)
if err != nil {
t.Errorf("%s: NewRootVerOneData: %v", test.name, err)
continue
}
err = Insert(air.VerOneData_TypeID, v1.Struct, test.in)
if err != nil {
t.Errorf("%s: Insert(..., %s): %v", test.name, zpretty.Sprint(test.in), err)
}
if v1.Val() != test.val {
t.Errorf("%s: Insert(..., %s) produced %v; want (val = %d)", test.name, zpretty.Sprint(test.in), v1, test.val)
}
}
}