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  }