github.com/edte/erpc@v0.0.0-20220929143252-16c191e26766/codec/jce/decoer_encoder_test.go (about)

     1  package jce
     2  
     3  import (
     4  	"bytes"
     5  	"math"
     6  	"math/rand"
     7  	"reflect"
     8  	"testing"
     9  
    10  	"github.com/smartystreets/assertions"
    11  )
    12  
    13  func TestHead(t *testing.T) {
    14  	data := bytes.NewBuffer(make([]byte, 0))
    15  
    16  	b := NewEncoder(data)
    17  	if err := b.WriteHead(BYTE, 245); err != nil {
    18  		t.Error(err)
    19  	}
    20  	if err := b.Flush(); err != nil {
    21  		t.Error(err)
    22  	}
    23  
    24  	d := NewDecoder(data)
    25  	ty, tag, err := d.readHead()
    26  	if err != nil {
    27  		t.Error(err)
    28  	}
    29  	if ty != BYTE && tag != 245 {
    30  		t.Error(err)
    31  	}
    32  }
    33  
    34  func TestInt8(t *testing.T) {
    35  	data := bytes.NewBuffer(make([]byte, 0))
    36  	var tmp int8
    37  
    38  	for tag := 0; tag < 250; tag++ {
    39  		for i := math.MinInt8; i <= math.MaxInt8; i++ {
    40  			// [step 1] 编码
    41  			b := NewEncoder(data)
    42  			if err := b.WriteInt8(int8(i), byte(tag)); err != nil {
    43  				t.Error(err)
    44  			}
    45  			if err := b.Flush(); err != nil {
    46  				t.Error(err)
    47  			}
    48  
    49  			// [step 2] 解码
    50  			d := NewDecoder(data)
    51  			if err := d.ReadInt8(&tmp, byte(tag), true); err != nil {
    52  				t.Error(err)
    53  			}
    54  
    55  			if tmp != int8(i) {
    56  				t.Error("no eq.")
    57  			}
    58  		}
    59  	}
    60  }
    61  
    62  func TestInt16(t *testing.T) {
    63  	data := bytes.NewBuffer(make([]byte, 0))
    64  	var tmp int16
    65  
    66  	for tag := 0; tag < 250; tag += 10 {
    67  		for i := math.MinInt16; i <= math.MaxInt16; i++ {
    68  			// [step 1] 编码
    69  			b := NewEncoder(data)
    70  			if err := b.WriteInt16(int16(i), byte(tag)); err != nil {
    71  				t.Error(err)
    72  			}
    73  			if err := b.Flush(); err != nil {
    74  				t.Error(err)
    75  			}
    76  
    77  			// [step 2] 解码
    78  			d := NewDecoder(data)
    79  			if err := d.ReadInt16(&tmp, byte(tag), true); err != nil {
    80  				t.Error(err)
    81  			}
    82  
    83  			if tmp != int16(i) {
    84  				t.Error("no eq.")
    85  			}
    86  
    87  		}
    88  	}
    89  }
    90  
    91  func TestInt16_2(t *testing.T) {
    92  	data := bytes.NewBuffer(make([]byte, 0))
    93  	b := NewEncoder(data)
    94  	if err := b.WriteInt16(int16(-1), byte(0)); err != nil {
    95  		t.Error(err)
    96  	}
    97  	if err := b.Flush(); err != nil {
    98  		t.Error(err)
    99  	}
   100  
   101  	var tmp int16
   102  	d := NewDecoder(data)
   103  	if err := d.ReadInt16(&tmp, byte(0), true); err != nil {
   104  		t.Error(err)
   105  	}
   106  	if tmp != int16(-1) {
   107  		t.Error("no eq.", tmp)
   108  	}
   109  }
   110  
   111  func TestInt32(t *testing.T) {
   112  	data := bytes.NewBuffer(make([]byte, 0))
   113  	b := NewEncoder(data)
   114  	if err := b.WriteInt32(int32(-1), byte(10)); err != nil {
   115  		t.Error(err)
   116  	}
   117  
   118  	if err := b.Flush(); err != nil {
   119  		t.Error(err)
   120  	}
   121  
   122  	var tmp int32
   123  	d := NewDecoder(data)
   124  	if err := d.ReadInt32(&tmp, byte(10), true); err != nil {
   125  		t.Error(err)
   126  	}
   127  	if tmp != -1 {
   128  		t.Error("no eq.")
   129  	}
   130  }
   131  
   132  func TestInt32_2(t *testing.T) {
   133  	data := bytes.NewBuffer(make([]byte, 0))
   134  	b := NewEncoder(data)
   135  	if err := b.WriteInt32(math.MinInt32, byte(10)); err != nil {
   136  		t.Error(err)
   137  	}
   138  
   139  	if err := b.Flush(); err != nil {
   140  		t.Error(err)
   141  	}
   142  
   143  	var tmp int32
   144  	d := NewDecoder(data)
   145  	if err := d.ReadInt32(&tmp, byte(10), true); err != nil {
   146  		t.Error(err)
   147  	}
   148  	if tmp != math.MinInt32 {
   149  		t.Error("no eq.")
   150  	}
   151  }
   152  
   153  func TestInt64(t *testing.T) {
   154  	data := bytes.NewBuffer(make([]byte, 0))
   155  	b := NewEncoder(data)
   156  	if err := b.WriteInt64(math.MinInt64, byte(10)); err != nil {
   157  		t.Error(err)
   158  	}
   159  	if err := b.Flush(); err != nil {
   160  		t.Error(err)
   161  	}
   162  
   163  	var tmp int64
   164  	d := NewDecoder(data)
   165  	if err := d.ReadInt64(&tmp, byte(10), true); err != nil {
   166  		t.Error(err)
   167  	}
   168  	if tmp != math.MinInt64 {
   169  		t.Error("no eq.")
   170  	}
   171  }
   172  
   173  // test uint8
   174  func TestUint8(t *testing.T) {
   175  	data := bytes.NewBuffer(make([]byte, 0))
   176  	var tmp uint8
   177  
   178  	for tag := 0; tag < 250; tag++ {
   179  		for i := 0; i <= math.MaxUint8; i++ {
   180  			// [step 1] 编码
   181  			b := NewEncoder(data)
   182  			if err := b.WriteUint8(uint8(i), byte(tag)); err != nil {
   183  				t.Error(err)
   184  			}
   185  			if err := b.Flush(); err != nil {
   186  				t.Error(err)
   187  			}
   188  
   189  			// [step 2] 解码
   190  			d := NewDecoder(data)
   191  			if err := d.ReadUint8(&tmp, byte(tag), true); err != nil {
   192  				t.Error(err)
   193  			}
   194  
   195  			if tmp != uint8(i) {
   196  				t.Error("no eq.")
   197  			}
   198  		}
   199  	}
   200  }
   201  
   202  func TestUint16(t *testing.T) {
   203  	data := bytes.NewBuffer(make([]byte, 0))
   204  	var tmp uint16
   205  
   206  	for tag := 0; tag < 250; tag += 10 {
   207  		for i := 0; i < math.MaxUint16; i++ {
   208  			// [step 1] 编码
   209  			b := NewEncoder(data)
   210  			if err := b.WriteUint16(uint16(i), byte(tag)); err != nil {
   211  				t.Error(err)
   212  			}
   213  			if err := b.Flush(); err != nil {
   214  				t.Error(err)
   215  			}
   216  
   217  			// [step 2] 解码
   218  			d := NewDecoder(data)
   219  			if err := d.ReadUint16(&tmp, byte(tag), true); err != nil {
   220  				t.Error(err)
   221  			}
   222  
   223  			if tmp != uint16(i) {
   224  				t.Error("no eq.")
   225  			}
   226  		}
   227  	}
   228  }
   229  
   230  func TestUint32(t *testing.T) {
   231  	// [step 1] 编码
   232  	data := bytes.NewBuffer(make([]byte, 0))
   233  	b := NewEncoder(data)
   234  	err := b.WriteUint32(uint32(0xffffffff), byte(10))
   235  	if err != nil {
   236  		t.Error(err)
   237  	}
   238  	if err := b.Flush(); err != nil {
   239  		t.Error(err)
   240  	}
   241  
   242  	// [step 2] 解码
   243  	var tmp uint32
   244  	d := NewDecoder(data)
   245  	err = d.ReadUint32(&tmp, byte(10), true)
   246  	if err != nil {
   247  		t.Error(err)
   248  	}
   249  	if tmp != 0xffffffff {
   250  		t.Error("no eq.")
   251  	}
   252  }
   253  
   254  func TestUint64(t *testing.T) {
   255  	// [step 1] 编码
   256  	data := bytes.NewBuffer(make([]byte, 0))
   257  	b := NewEncoder(data)
   258  	err := b.WriteUint64(uint64(0xffffffffffffffff), byte(10))
   259  	if err != nil {
   260  		t.Error(err)
   261  	}
   262  	if err := b.Flush(); err != nil {
   263  		t.Error(err)
   264  	}
   265  
   266  	// [step 2] 解码
   267  	var tmp uint64
   268  	d := NewDecoder(data)
   269  	err = d.ReadUint64(&tmp, byte(10), true)
   270  	if err != nil {
   271  		t.Error(err)
   272  	}
   273  	if tmp != 0xffffffffffffffff {
   274  		t.Error("no eq.")
   275  	}
   276  }
   277  
   278  func TestFloat32(t *testing.T) {
   279  	got := float32(0)
   280  	data := bytes.NewBuffer(make([]byte, 0))
   281  
   282  	for i := 0; i < 500; i++ {
   283  		b := NewEncoder(data)
   284  		want := rand.Float32()
   285  
   286  		if err := b.WriteFloat32(want, 3); err != nil {
   287  			t.Errorf("Test Write_float32 failed. err:%s\n", err)
   288  		}
   289  		if err := b.Flush(); err != nil {
   290  			t.Error(err)
   291  		}
   292  
   293  		d := NewDecoder(data)
   294  		if err := d.ReadFloat32(&got, 3, true); err != nil {
   295  			t.Errorf("Test Read_float32 failed. err:%s\n", err)
   296  		}
   297  
   298  		if want != got {
   299  			t.Errorf("Test Write_float32 failed. want:%v, got:%v\n", want, got)
   300  		}
   301  	}
   302  }
   303  
   304  func TestFloat64(t *testing.T) {
   305  	got := float64(0)
   306  	data := bytes.NewBuffer(make([]byte, 0))
   307  
   308  	for i := 0; i < 1; i++ {
   309  		data.Reset()
   310  
   311  		b := NewEncoder(data)
   312  		want := rand.Float64()
   313  
   314  		if err := b.WriteFloat64(want, 3); err != nil {
   315  			t.Errorf("Test Write_float64 failed. err:%s\n", err)
   316  		}
   317  
   318  		if err := b.Flush(); err != nil {
   319  			t.Error(err)
   320  		}
   321  
   322  		d := NewDecoder(data)
   323  
   324  		if err := d.ReadFloat64(&got, 3, true); err != nil {
   325  			t.Errorf("Test Read_float64 failed. err:%s\n", err)
   326  		}
   327  
   328  		if want != got {
   329  			t.Errorf("Test Write_float64 failed. want:%v, got:%v\n", want, got)
   330  		}
   331  	}
   332  }
   333  
   334  // 检测 float64 转换失真问题,所以不能优化为 float32
   335  func TestFloat64toFloat32(t *testing.T) {
   336  	a := float64(0.6046602879796196)
   337  	assertions.ShouldBeTrue(a <= math.MaxFloat32)
   338  	assertions.ShouldEqual(float32(a), 0.6046603)
   339  	assertions.ShouldEqual(float64(float32(a)), 0.6046602725982666)
   340  }
   341  
   342  func TestBool(t *testing.T) {
   343  	var got bool
   344  	wants := []bool{true, false}
   345  	data := bytes.NewBuffer(make([]byte, 0))
   346  
   347  	for _, want := range wants {
   348  		data.Reset()
   349  		b := NewEncoder(data)
   350  		if err := b.WriteBool(want, 10); err != nil {
   351  			t.Errorf("Test Write_bool failed. err:%s\n", err)
   352  		}
   353  
   354  		if err := b.Flush(); err != nil {
   355  			t.Error(err)
   356  		}
   357  
   358  		d := NewDecoder(data)
   359  
   360  		if err := d.ReadBool(&got, 10, true); err != nil {
   361  			t.Errorf("Test Read_bool failed. err:%s\n", err)
   362  		}
   363  
   364  		if got != want {
   365  			t.Errorf("Test Write_bool failed, want:%v, got:%v\n", want, got)
   366  		}
   367  	}
   368  }
   369  
   370  func TestString(t *testing.T) {
   371  	const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
   372  	m := make(map[int]string, 0)
   373  
   374  	f := func(n int) string {
   375  		b := make([]byte, n)
   376  		for i := range b {
   377  			b[i] = letters[rand.Intn(len(letters))]
   378  		}
   379  		return string(b)
   380  	}
   381  
   382  	data := bytes.NewBuffer(make([]byte, 0))
   383  	b := NewEncoder(data)
   384  
   385  	begin := 0
   386  	end := 9999
   387  
   388  	for i := begin; i < end; i++ {
   389  		tmp := f(i)
   390  		m[i] = tmp
   391  
   392  		if err := b.WriteString(tmp, byte(i)); err != nil {
   393  			t.Error(err)
   394  		}
   395  	}
   396  
   397  	if err := b.Flush(); err != nil {
   398  		t.Error(err)
   399  	}
   400  
   401  	d := NewDecoder(data)
   402  
   403  	var got string
   404  
   405  	for i := begin; i < end; i++ {
   406  		// fmt.Println(i)
   407  
   408  		if err := d.ReadString(&got, byte(i), true); err != nil {
   409  			t.Error(err)
   410  			// return
   411  			// panic(err)
   412  		}
   413  
   414  		if got != m[i] {
   415  			t.Errorf("want: %s, got: %s", m[i], got)
   416  			// return
   417  			// panic(fmt.Sprintf("want: %s, got: %s", m[i], got))
   418  		}
   419  	}
   420  }
   421  
   422  func TestSliceUint8(t *testing.T) {
   423  	var want = []uint8{1, 2, 3, 4, 5}
   424  	var got []uint8
   425  
   426  	data := bytes.NewBuffer(make([]byte, 0))
   427  	b := NewEncoder(data)
   428  	if err := b.WriteSliceUint8(want, byte(len(want))); err != nil {
   429  		t.Errorf("Test Write_slice_uint8 failed. err:%s\n", err)
   430  	}
   431  
   432  	if err := b.Flush(); err != nil {
   433  		t.Error(err)
   434  	}
   435  
   436  	d := NewDecoder(data)
   437  	if err := d.ReadSliceUint8(&got, byte(len(want)), true); err != nil {
   438  		t.Errorf("Test Read_slice_uint8 failed. err:%s\n", err)
   439  	}
   440  
   441  	if !reflect.DeepEqual(want, got) {
   442  		t.Errorf("Test Write_slice_uint8 failed. want:%v, got:%v\n", want, got)
   443  	}
   444  }
   445  
   446  func TestSliceInt8(t *testing.T) {
   447  	var want = []int8{1, 2, 3, 4, 5}
   448  	var got []int8
   449  
   450  	data := bytes.NewBuffer(make([]byte, 0))
   451  	b := NewEncoder(data)
   452  	if err := b.WriteSliceInt8(want, 0); err != nil {
   453  		t.Errorf("Test Write_slice_int8 failed. err:%s\n", err)
   454  	}
   455  
   456  	if err := b.Flush(); err != nil {
   457  		t.Error(err)
   458  	}
   459  
   460  	d := NewDecoder(data)
   461  
   462  	if err := d.ReadSliceInt8(&got, 0, true); err != nil {
   463  		t.Errorf("Test Read_slice_int8 failed. err:%s\n", err)
   464  	}
   465  
   466  	if !reflect.DeepEqual(want, got) {
   467  		t.Errorf("Test Write_slice_int8 failed. want:%v, got:%v\n", want, got)
   468  	}
   469  }
   470  
   471  func TestLength(t *testing.T) {
   472  
   473  }
   474  
   475  // BenchmarkUint32 benchmarks the write and read the uint32 type.
   476  func BenchmarkUint32(t *testing.B) {
   477  	data := bytes.NewBuffer(make([]byte, 0))
   478  	b := NewEncoder(data)
   479  
   480  	for i := 0; i < 200; i++ {
   481  		err := b.WriteUint32(uint32(0xffffffff), byte(i))
   482  		if err != nil {
   483  			t.Error(err)
   484  		}
   485  	}
   486  
   487  	if err := b.Flush(); err != nil {
   488  		t.Error(err)
   489  	}
   490  
   491  	d := NewDecoder(data)
   492  
   493  	for i := 0; i < 200; i++ {
   494  		var data uint32
   495  		err := d.ReadUint32(&data, byte(i), true)
   496  		if err != nil {
   497  			t.Error(err)
   498  		}
   499  		if data != 0xffffffff {
   500  			t.Error("no eq.")
   501  		}
   502  	}
   503  }
   504  
   505  // BenchmarkString benchmark the read and write the string.
   506  func BenchmarkString(t *testing.B) {
   507  	data := bytes.NewBuffer(make([]byte, 0))
   508  	b := NewEncoder(data)
   509  
   510  	for i := 0; i < 200; i++ {
   511  		err := b.WriteString("hahahahahahahahahahahahahahahahahahahaha", byte(i))
   512  		if err != nil {
   513  			t.Error(err)
   514  		}
   515  	}
   516  
   517  	if err := b.Flush(); err != nil {
   518  		t.Error(err)
   519  	}
   520  
   521  	d := NewDecoder(data)
   522  
   523  	for i := 0; i < 200; i++ {
   524  		var data string
   525  		err := d.ReadString(&data, byte(i), true)
   526  		if err != nil {
   527  			t.Error(err)
   528  		}
   529  		if data != "hahahahahahahahahahahahahahahahahahahaha" {
   530  			t.Error("no eq.")
   531  		}
   532  	}
   533  }