func TestV1DataVersioningBiggerToEmpty(t *testing.T) { //expTwoSet := CapnpEncode("(mylist = [(val = 27, duo = 26),(val = 42, duo = 41)])", "HoldsVerTwoDataList") //expOneDataOneDefault := CapnpEncode("(mylist = [(val = 27, duo = 0),(val = 42, duo = 0)])", "HoldsVerTwoDataList") //expTwoEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerTwoDataList") //expEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerEmptyList") //expOne := CapnpEncode("(mylist = [(val = 27),(val = 42)])", "HoldsVerOneDataList") cv.Convey("Given a struct with 0 data/0 ptr fields, and a newer version of the struct with 2 data fields", t, func() { cv.Convey("then reading serialized bigger-struct-list into the smaller (empty or one data-member) list should work, truncating/ignoring the new fields", func() { seg := capn.NewBuffer(nil) scratch := capn.NewBuffer(nil) holder := air.NewRootHoldsVerTwoDataList(seg) twolist := air.NewVerTwoDataList(scratch, 2) plist := capn.PointerList(twolist) d0 := air.NewVerTwoData(scratch) d0.SetVal(27) d0.SetDuo(26) d1 := air.NewVerTwoData(scratch) d1.SetVal(42) d1.SetDuo(41) plist.Set(0, capn.Object(d0)) plist.Set(1, capn.Object(d1)) holder.SetMylist(twolist) ShowSeg(" before serializing out, segment scratch is:", scratch) ShowSeg(" before serializing out, segment seg is:", seg) // serialize out buf := bytes.Buffer{} seg.WriteTo(&buf) segbytes := buf.Bytes() // and read-back in using smaller expectations reseg, _, err := capn.ReadFromMemoryZeroCopy(segbytes) if err != nil { panic(err) } ShowSeg(" after re-reading segbytes, segment reseg is:", reseg) fmt.Printf("segbytes decoded by capnp as HoldsVerEmptyList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerEmptyList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerOneDataList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerOneDataList"))) fmt.Printf("segbytes decoded by capnp as HoldsVerTwoDataList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerTwoDataList"))) reHolder := air.ReadRootHoldsVerEmptyList(reseg) elist := reHolder.Mylist() lene := elist.Len() cv.So(lene, cv.ShouldEqual, 2) reHolder1 := air.ReadRootHoldsVerOneDataList(reseg) onelist := reHolder1.Mylist() lenone := onelist.Len() cv.So(lenone, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := onelist.At(i) val := ele.Val() cv.So(val, cv.ShouldEqual, twolist.At(i).Val()) } reHolder2 := air.ReadRootHoldsVerTwoDataList(reseg) twolist2 := reHolder2.Mylist() lentwo2 := twolist2.Len() cv.So(lentwo2, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := twolist2.At(i) val := ele.Val() duo := ele.Duo() cv.So(val, cv.ShouldEqual, twolist.At(i).Val()) cv.So(duo, cv.ShouldEqual, twolist.At(i).Duo()) } }) }) }
func TestV1DataVersioningEmptyToBigger(t *testing.T) { //expOneSet := CapnpEncode("(mylist = [(val = 27),(val = 42)])", "HoldsVerOneDataList") //expOneZeroed := CapnpEncode("(mylist = [(val = 0),(val = 0)])", "HoldsVerOneDataList") //expOneEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerOneDataList") expEmpty := CapnpEncode("(mylist = [(),()])", "HoldsVerEmptyList") cv.Convey("Given a struct with 0 data/0 ptr fields, and a newer version of the struct with 1 data fields", t, func() { cv.Convey("then reading from serialized form the small list into the bigger (one or two data values) list should work, getting default value 0 for val/duo.", func() { seg := capn.NewBuffer(nil) scratch := capn.NewBuffer(nil) emptyholder := air.NewRootHoldsVerEmptyList(seg) elist := air.NewVerEmptyList(scratch, 2) emptyholder.SetMylist(elist) actEmpty := ShowSeg(" after NewRootHoldsVerEmptyList(seg) and SetMylist(elist), segment seg is:", seg) actEmptyCap := string(CapnpDecode(actEmpty, "HoldsVerEmptyList")) expEmptyCap := string(CapnpDecode(expEmpty, "HoldsVerEmptyList")) cv.So(actEmptyCap, cv.ShouldResemble, expEmptyCap) fmt.Printf("\n actEmpty is \n") ShowBytes(actEmpty, 10) fmt.Printf("actEmpty decoded by capnp: '%s'\n", string(CapnpDecode(actEmpty, "HoldsVerEmptyList"))) cv.So(actEmpty, cv.ShouldResemble, expEmpty) // seg is set, now read into bigger list buf := bytes.Buffer{} seg.WriteTo(&buf) segbytes := buf.Bytes() reseg, _, err := capn.ReadFromMemoryZeroCopy(segbytes) if err != nil { panic(err) } ShowSeg(" after re-reading segbytes, segment reseg is:", reseg) fmt.Printf("segbytes decoded by capnp as HoldsVerOneDataList: '%s'\n", string(CapnpDecode(segbytes, "HoldsVerOneDataList"))) reHolder := air.ReadRootHoldsVerOneDataList(reseg) onelist := reHolder.Mylist() lenone := onelist.Len() cv.So(lenone, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := onelist.At(i) val := ele.Val() cv.So(val, cv.ShouldEqual, 0) } reHolder2 := air.ReadRootHoldsVerTwoDataList(reseg) twolist := reHolder2.Mylist() lentwo := twolist.Len() cv.So(lentwo, cv.ShouldEqual, 2) for i := 0; i < 2; i++ { ele := twolist.At(i) val := ele.Val() cv.So(val, cv.ShouldEqual, 0) duo := ele.Duo() cv.So(duo, cv.ShouldEqual, 0) } }) }) }