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 }