ints_test.go raw
1 package ints
2
3 import (
4 "math"
5 "strconv"
6 "testing"
7
8 "next.orly.dev/pkg/lol/chk"
9
10 "lukechampine.com/frand"
11 )
12
13 func TestMarshalUnmarshal(t *testing.T) {
14 b := make([]byte, 0, 8)
15 var rem []byte
16 var n *T
17 var err error
18 for _ = range 10000000 {
19 n = New(uint64(frand.Intn(math.MaxInt64)))
20 b = n.Marshal(b)
21 m := New(0)
22 if rem, err = m.Unmarshal(b); chk.E(err) {
23 t.Fatal(err)
24 }
25 if n.N != m.N {
26 t.Fatalf("failed to convert to int64 at %d %s %d", n.N, b, m.N)
27 }
28 if len(rem) > 0 {
29 t.Fatalf("leftover bytes after converting back: '%s'", rem)
30 }
31 b = b[:0]
32 }
33 }
34
35 func BenchmarkByteStringToInt64(bb *testing.B) {
36 b := make([]byte, 0, 19)
37 var i int
38 const nTests = 10000000
39 testInts := make([]*T, nTests)
40 for i = range nTests {
41 testInts[i] = New(frand.Intn(math.MaxInt64))
42 }
43 bb.Run(
44 "Marshal", func(bb *testing.B) {
45 bb.ReportAllocs()
46 for i = 0; i < bb.N; i++ {
47 n := testInts[i%10000]
48 b = n.Marshal(b)
49 b = b[:0]
50 }
51 },
52 )
53 bb.Run(
54 "Itoa", func(bb *testing.B) {
55 bb.ReportAllocs()
56 var s string
57 for i = 0; i < bb.N; i++ {
58 n := testInts[i%10000]
59 s = strconv.Itoa(int(n.N))
60 _ = s
61 }
62 },
63 )
64 bb.Run(
65 "MarshalUnmarshal", func(bb *testing.B) {
66 bb.ReportAllocs()
67 m := New(0)
68 for i = 0; i < bb.N; i++ {
69 n := testInts[i%10000]
70 b = m.Marshal(b)
71 _, _ = n.Unmarshal(b)
72 b = b[:0]
73 }
74 },
75 )
76 bb.Run(
77 "ItoaAtoi", func(bb *testing.B) {
78 bb.ReportAllocs()
79 var s string
80 for i = 0; i < bb.N; i++ {
81 n := testInts[i%10000]
82 s = strconv.Itoa(int(n.N))
83 _, _ = strconv.Atoi(s)
84 }
85 },
86 )
87 }
88