github.com/chrislusf/greenpack@v3.7.1-0.20170911073826-ad5bd10b7c47+incompatible/cmd/addzid/old_bambam_tests/save_test.go (about) 1 package main 2 3 import ( 4 "testing" 5 6 cv "github.com/glycerine/goconvey/convey" 7 ) 8 9 func Test006Save1(t *testing.T) { 10 11 cv.Convey("Given a parsable golang source file", t, func() { 12 cv.Convey("then structs with public fields get a Save() method to serialize them, and a Load() method to restore them.", func() { 13 14 exEmbed := ` 15 type RWTest struct { 16 Hello []string 17 } 18 ` 19 cv.So(ExtractString2String(exEmbed), ShouldMatchModuloWhiteSpace, ` 20 struct RWTestCapn { 21 hello @0: List(Text); 22 } 23 24 func (s *RWTest) Save(w io.Writer) error { 25 seg := capn.NewBuffer(nil) 26 RWTestGoToCapn(seg, s) 27 _, err := seg.WriteTo(w) 28 return err 29 } 30 31 func (s *RWTest) Load(r io.Reader) error { 32 capMsg, err := capn.ReadFromStream(r, nil) 33 if err != nil { 34 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 35 return err 36 } 37 z := ReadRootRWTestCapn(capMsg) 38 RWTestCapnToGo(z, s) 39 return nil 40 } 41 42 func RWTestCapnToGo(src RWTestCapn, dest *RWTest) *RWTest { 43 if dest == nil { 44 dest = &RWTest{} 45 } 46 dest.Hello = src.Hello().ToArray() 47 48 return dest 49 } 50 51 func RWTestGoToCapn(seg *capn.Segment, src *RWTest) RWTestCapn { 52 dest := AutoNewRWTestCapn(seg) 53 54 mylist1 := seg.NewTextList(len(src.Hello)) 55 for i := range src.Hello { 56 mylist1.Set(i, string(src.Hello[i])) 57 } 58 dest.SetHello(mylist1) 59 60 return dest 61 } 62 63 func SliceStringToTextList(seg *capn.Segment, m []string) capn.TextList { 64 lst := seg.NewTextList(len(m)) 65 for i := range m { 66 lst.Set(i, string(m[i])) 67 } 68 return lst 69 } 70 71 72 73 func TextListToSliceString(p capn.TextList) []string { 74 v := make([]string, p.Len()) 75 for i := range v { 76 v[i] = string(p.At(i)) 77 } 78 return v 79 } 80 81 `) 82 83 }) 84 85 }) 86 } 87 88 func Test007Save2(t *testing.T) { 89 90 cv.Convey("Given a parsable golang source file", t, func() { 91 cv.Convey("then structs with public fields get a save() method to serialize them, and a load() method to restore them.", func() { 92 93 exEmbed := ` 94 type RWTest struct { 95 Hello []string 96 World []int 97 } 98 ` 99 cv.So(ExtractString2String(exEmbed), ShouldMatchModuloWhiteSpace, ` 100 struct RWTestCapn { 101 hello @0: List(Text); 102 world @1: List(Int64); 103 } 104 105 func (s *RWTest) Save(w io.Writer) error { 106 seg := capn.NewBuffer(nil) 107 RWTestGoToCapn(seg, s) 108 _, err := seg.WriteTo(w) 109 return err 110 } 111 112 func (s *RWTest) Load(r io.Reader) error { 113 capMsg, err := capn.ReadFromStream(r, nil) 114 if err != nil { 115 //panic(fmt.Errorf("capn.ReadFromStream error: %s", err)) 116 return err 117 } 118 z := ReadRootRWTestCapn(capMsg) 119 RWTestCapnToGo(z, s) 120 return nil 121 } 122 123 124 func RWTestCapnToGo(src RWTestCapn, dest *RWTest) *RWTest { 125 if dest == nil { 126 dest = &RWTest{} 127 } 128 dest.Hello = src.Hello().ToArray() 129 130 var n int 131 132 // World 133 n = src.World().Len() 134 dest.World = make([]int, n) 135 for i := 0; i < n; i++ { 136 dest.World[i] = int(src.World().At(i)) 137 } 138 139 140 return dest 141 } 142 143 func RWTestGoToCapn(seg *capn.Segment, src *RWTest) RWTestCapn { 144 dest := AutoNewRWTestCapn(seg) 145 146 mylist1 := seg.NewTextList(len(src.Hello)) 147 for i := range src.Hello { 148 mylist1.Set(i, string(src.Hello[i])) 149 } 150 dest.SetHello(mylist1) 151 152 mylist2 := seg.NewInt64List(len(src.World)) 153 for i:= range src.World { 154 mylist2.Set(i, int64(src.World[i])) 155 } 156 dest.SetWorld(mylist2) 157 158 return dest 159 } 160 161 162 163 func SliceIntToInt64List(seg *capn.Segment, m []int) capn.Int64List { 164 lst := seg.NewInt64List(len(m)) 165 for i := range m { 166 lst.Set(i, int64(m[i])) 167 } 168 return lst 169 } 170 171 172 173 func Int64ListToSliceInt(p capn.Int64List) []int { 174 v := make([]int, p.Len()) 175 for i := range v { 176 v[i] = int(p.At(i)) 177 } 178 return v 179 } 180 181 182 183 func SliceStringToTextList(seg *capn.Segment, m []string) capn.TextList { 184 lst := seg.NewTextList(len(m)) 185 for i := range m { 186 lst.Set(i, string(m[i])) 187 } 188 return lst 189 } 190 191 192 193 func TextListToSliceString(p capn.TextList) []string { 194 v := make([]string, p.Len()) 195 for i := range v { 196 v[i] = string(p.At(i)) 197 } 198 return v 199 } 200 201 `) 202 203 }) 204 205 }) 206 }