github.com/glycerine/zebrapack@v4.1.1-0.20181107023619-e955d028f9bf+incompatible/cmd/addzid/old_bambam_tests/ptr_test.go (about) 1 package main 2 3 import ( 4 "testing" 5 6 cv "github.com/glycerine/goconvey/convey" 7 ) 8 9 func TestPointerInStruct(t *testing.T) { 10 11 cv.Convey("Given a struct that contains a pointer to a struct", t, func() { 12 cv.Convey("then the pointer element should be de-pointerized", func() { 13 14 ex0 := ` 15 type big struct {} 16 type s1 struct { 17 MyBig *big 18 }` 19 cv.So(ExtractString2String(ex0), ShouldStartWithModuloWhiteSpace, `struct BigCapn { } struct S1Capn { myBig @0: BigCapn; } `) 20 21 }) 22 }) 23 } 24 25 func TestPointerInSliceInStruct(t *testing.T) { 26 27 cv.Convey("Given a struct that contains a slice of pointers", t, func() { 28 cv.Convey("then the translation routines should still work", func() { 29 30 in0 := ` 31 type Big struct { 32 A int 33 } 34 type s1 struct { 35 Ptrs []*Big 36 } 37 ` 38 39 expect0 := ` 40 struct BigCapn { a @0: Int64; } 41 struct S1Capn { ptrs @0: List(BigCapn); } 42 43 func (s *Big) Save(w io.Writer) error { 44 seg := capn.NewBuffer(nil) 45 BigGoToCapn(seg, s) 46 _, err := seg.WriteTo(w) 47 return err 48 } 49 50 func (s *Big) Load(r io.Reader) error { 51 capMsg, err := capn.ReadFromStream(r, nil) 52 if err != nil { 53 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 54 return err 55 } 56 z := ReadRootBigCapn(capMsg) 57 BigCapnToGo(z, s) 58 return nil 59 } 60 61 func BigCapnToGo(src BigCapn, dest *Big) *Big { 62 if dest == nil { 63 dest = &Big{} 64 } 65 dest.A = int(src.A()) 66 67 return dest 68 } 69 70 func BigGoToCapn(seg *capn.Segment, src *Big) BigCapn { 71 dest := AutoNewBigCapn(seg) 72 dest.SetA(int64(src.A)) 73 74 return dest 75 } 76 77 78 func (s *s1) Save(w io.Writer) error { 79 seg := capn.NewBuffer(nil) 80 s1GoToCapn(seg, s) 81 _, err := seg.WriteTo(w) 82 return err 83 } 84 85 86 87 func (s *s1) Load(r io.Reader) error { 88 capMsg, err := capn.ReadFromStream(r, nil) 89 if err != nil { 90 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 91 return err 92 } 93 z := ReadRootS1Capn(capMsg) 94 S1CapnToGo(z, s) 95 return nil 96 } 97 98 func S1CapnToGo(src S1Capn, dest *s1) *s1 { 99 if dest == nil { 100 dest = &s1{} 101 } 102 103 var n int 104 105 // Ptrs 106 n = src.Ptrs().Len() 107 dest.Ptrs = make([]*Big, n) 108 for i := 0; i < n; i++ { 109 dest.Ptrs[i] = BigCapnToGo(src.Ptrs().At(i), nil) 110 } 111 112 return dest 113 } 114 115 func s1GoToCapn(seg *capn.Segment, src *s1) S1Capn { 116 dest := AutoNewS1Capn(seg) 117 118 // Ptrs -> BigCapn (go slice to capn list) 119 if len(src.Ptrs) > 0 { 120 typedList := NewBigCapnList(seg, len(src.Ptrs)) 121 plist := capn.PointerList(typedList) 122 i := 0 123 for _, ele := range src.Ptrs { 124 plist.Set(i, capn.Object(BigGoToCapn(seg, ele))) 125 i++ 126 } 127 dest.SetPtrs(typedList) 128 } 129 130 return dest 131 } 132 ` 133 cv.So(ExtractString2String(in0), ShouldStartWithModuloWhiteSpace, expect0) 134 }) 135 }) 136 } 137 138 func TestPointerAndStraightInSliceInStruct(t *testing.T) { 139 140 cv.Convey("Given a struct that contains a slice of pointers and a slice of struct", t, func() { 141 cv.Convey("then the translation routines should still work", func() { 142 143 in0 := ` 144 type Big struct { 145 A int 146 B string 147 C []string 148 } 149 type s1 struct { 150 Ptrs []*Big 151 Straight []Big 152 } 153 ` 154 expect0 := ` 155 struct BigCapn { a @0: Int64; b @1: Text; c @2: List(Text); } 156 struct S1Capn { ptrs @0: List(BigCapn); straight @1: List(BigCapn); } 157 158 159 func (s *Big) Save(w io.Writer) error { 160 seg := capn.NewBuffer(nil) 161 BigGoToCapn(seg, s) 162 _, err := seg.WriteTo(w) 163 return err 164 } 165 166 167 168 func (s *Big) Load(r io.Reader) error { 169 capMsg, err := capn.ReadFromStream(r, nil) 170 if err != nil { 171 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 172 return err 173 } 174 z := ReadRootBigCapn(capMsg) 175 BigCapnToGo(z, s) 176 return nil 177 } 178 179 func BigCapnToGo(src BigCapn, dest *Big) *Big { 180 if dest == nil { 181 dest = &Big{} 182 } 183 dest.A = int(src.A()) 184 dest.B = src.B() 185 dest.C = src.C().ToArray() 186 187 return dest 188 } 189 190 func BigGoToCapn(seg *capn.Segment, src *Big) BigCapn { 191 dest := AutoNewBigCapn(seg) 192 dest.SetA(int64(src.A)) 193 dest.SetB(src.B) 194 195 mylist1 := seg.NewTextList(len(src.C)) 196 for i := range src.C { 197 mylist1.Set(i, string(src.C[i])) 198 } 199 dest.SetC(mylist1) 200 201 return dest 202 } 203 204 205 func (s *s1) Save(w io.Writer) error { 206 seg := capn.NewBuffer(nil) 207 s1GoToCapn(seg, s) 208 _, err := seg.WriteTo(w) 209 return err 210 } 211 212 213 214 func (s *s1) Load(r io.Reader) error { 215 capMsg, err := capn.ReadFromStream(r, nil) 216 if err != nil { 217 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 218 return err 219 } 220 z := ReadRootS1Capn(capMsg) 221 S1CapnToGo(z, s) 222 return nil 223 } 224 225 func S1CapnToGo(src S1Capn, dest *s1) *s1 { 226 if dest == nil { 227 dest = &s1{} 228 } 229 230 var n int 231 232 // Ptrs 233 n = src.Ptrs().Len() 234 dest.Ptrs = make([]*Big, n) 235 for i := 0; i < n; i++ { 236 dest.Ptrs[i] = BigCapnToGo(src.Ptrs().At(i), nil) 237 } 238 239 // Straight 240 n = src.Straight().Len() 241 dest.Straight = make([]Big, n) 242 for i := 0; i < n; i++ { 243 dest.Straight[i] = *BigCapnToGo(src.Straight().At(i), nil) 244 } 245 246 return dest 247 } 248 249 func s1GoToCapn(seg *capn.Segment, src *s1) S1Capn { 250 dest := AutoNewS1Capn(seg) 251 252 // Ptrs -> BigCapn (go slice to capn list) 253 if len(src.Ptrs) > 0 { 254 typedList := NewBigCapnList(seg, len(src.Ptrs)) 255 plist := capn.PointerList(typedList) 256 i := 0 257 for _, ele := range src.Ptrs { 258 plist.Set(i, capn.Object(BigGoToCapn(seg, ele))) 259 i++ 260 } 261 dest.SetPtrs(typedList) 262 } 263 264 // Straight -> BigCapn (go slice to capn list) 265 if len(src.Straight) > 0 { 266 typedList := NewBigCapnList(seg, len(src.Straight)) 267 plist := capn.PointerList(typedList) 268 i := 0 269 for _, ele := range src.Straight { 270 plist.Set(i, capn.Object(BigGoToCapn(seg, &ele))) 271 i++ 272 } 273 dest.SetStraight(typedList) 274 } 275 276 return dest 277 } 278 ` 279 cv.So(ExtractString2String(in0), ShouldStartWithModuloWhiteSpace, expect0) 280 }) 281 }) 282 }