github.com/chrislusf/greenpack@v3.7.1-0.20170911073826-ad5bd10b7c47+incompatible/cmd/addzid/old_bambam_tests/nested_test.go (about)

     1  package main
     2  
     3  import (
     4  	"testing"
     5  
     6  	cv "github.com/glycerine/goconvey/convey"
     7  )
     8  
     9  func TestNestedStructs016(t *testing.T) {
    10  
    11  	cv.Convey("Given go structs that contain structs \n"+
    12  		"         then these should marshal and unmarshal their inner struct members", t, func() {
    13  
    14  		ex0 := `
    15  type Inner struct {
    16   C int
    17  }
    18  type Outer struct {
    19    A int
    20    B Inner
    21  }
    22  `
    23  		cv.So(ExtractString2String(ex0), ShouldMatchModuloWhiteSpace, `
    24  struct InnerCapn {
    25    c  @0:   Int64;
    26  }
    27  
    28  struct OuterCapn {
    29    a  @0:   Int64; b  @1:   InnerCapn;
    30  }
    31  
    32    func (s *Inner) Save(w io.Writer) error {
    33      	seg := capn.NewBuffer(nil)
    34      	InnerGoToCapn(seg, s)
    35        _, err := seg.WriteTo(w)
    36        return err
    37    }
    38  
    39  
    40  
    41    func (s *Inner) Load(r io.Reader) error {
    42      	capMsg, err := capn.ReadFromStream(r, nil)
    43      	if err != nil {
    44      		//panic(fmt.Errorf("capn.ReadFromStream error: %s", err))
    45            return err
    46      	}
    47      	z := ReadRootInnerCapn(capMsg)
    48          InnerCapnToGo(z, s)
    49       return nil
    50    }
    51  
    52  
    53  
    54    func InnerCapnToGo(src InnerCapn, dest *Inner) *Inner {
    55      if dest == nil {
    56        dest = &Inner{}
    57      }
    58      dest.C = int(src.C())
    59  
    60      return dest
    61    }
    62  
    63  
    64  
    65    func InnerGoToCapn(seg *capn.Segment, src *Inner) InnerCapn {
    66      dest := AutoNewInnerCapn(seg)
    67      dest.SetC(int64(src.C))
    68  
    69      return dest
    70    }
    71  
    72  
    73  
    74    func (s *Outer) Save(w io.Writer) error {
    75      	seg := capn.NewBuffer(nil)
    76      	OuterGoToCapn(seg, s)
    77        _, err := seg.WriteTo(w)
    78        return err
    79    }
    80  
    81  
    82  
    83    func (s *Outer) Load(r io.Reader) error {
    84      	capMsg, err := capn.ReadFromStream(r, nil)
    85      	if err != nil {
    86      		//panic(fmt.Errorf("capn.ReadFromStream error: %s", err))
    87            return err
    88      	}
    89      	z := ReadRootOuterCapn(capMsg)
    90          OuterCapnToGo(z, s)
    91       return nil
    92    }
    93  
    94  
    95  
    96    func OuterCapnToGo(src OuterCapn, dest *Outer) *Outer {
    97      if dest == nil {
    98        dest = &Outer{}
    99      }
   100      dest.A = int(src.A())
   101      dest.B = *InnerCapnToGo(src.B(), nil)
   102  
   103      return dest
   104    }
   105  
   106  
   107  
   108    func OuterGoToCapn(seg *capn.Segment, src *Outer) OuterCapn {
   109      dest := AutoNewOuterCapn(seg)
   110      dest.SetA(int64(src.A))
   111      dest.SetB(InnerGoToCapn(seg, &src.B))
   112  
   113      return dest
   114    }
   115  `)
   116  	})
   117  }