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  }