forked from soundcloud/roshi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cursor_test.go
108 lines (93 loc) · 2.15 KB
/
cursor_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package common
import (
"bytes"
"math"
"reflect"
"testing"
"time"
)
func TestCursorSerialization(t *testing.T) {
for _, cursor := range []Cursor{
Cursor{Score: 0.0, Member: " "},
Cursor{Score: 1.1, Member: `%20`},
Cursor{Score: 123.456, Member: "abc"},
Cursor{Score: 0.00001, Member: "foo\x00bar"}, // catch missing enc.Close()
} {
var (
s = cursor.String()
got = Cursor{}
)
if err := got.Parse(s); err != nil {
t.Errorf("%#+v: serialized to %q, parse failed: %s", cursor, s, err)
continue
}
if !reflect.DeepEqual(cursor, got) {
t.Errorf("%#+v: serialized to %q, parsed back to %#+v", cursor, s, got)
continue
}
t.Logf("%#+v: %q", cursor, s)
}
}
func TestCursorSafety(t *testing.T) {
var (
scores = []float64{
0.0,
1.23,
float64(time.Now().UnixNano()) / 1e9,
math.MaxFloat64,
math.SmallestNonzeroFloat64,
}
members = [][]byte{
[]byte{0},
[]byte{0, 0, 0},
[]byte{1, 2, 3},
[]byte{12, 34, 56, 78, 90},
[]byte{255},
[]byte{255, 0, 0, 0},
[]byte{255, 0, 128, 0, 64, 0, 32, 0, 16, 0, 8, 0, 4, 0, 2, 0},
}
)
for _, score := range scores {
for _, member := range members {
in := Cursor{Score: score, Member: string(member)}
serialized := in.String()
var out Cursor
if err := out.Parse(serialized); err != nil {
t.Errorf("score %f member %v: when parsing: %s", score, member, err)
continue
}
if !reflect.DeepEqual(in, out) {
t.Errorf("score %f member %v: after parsing, want %+v, have %+v", score, member, in, out)
continue
}
}
}
}
func TestIssue37(t *testing.T) {
c := Cursor{}
if err := c.Parse("4743834931740803072A"); err != nil {
t.Fatal(err)
}
if want, have := "", c.Member; want != have {
t.Errorf("want %q, have %q", want, have)
}
}
func BenchmarkCursorString(b *testing.B) {
var cursor = Cursor{Score: 1.23, Member: "abcdefg"}
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = cursor.String()
}
b.ReportAllocs()
}
func BenchmarkCursorEncode(b *testing.B) {
var (
cursor = Cursor{Score: 1.23, Member: "abcdefg"}
dst = &bytes.Buffer{}
)
b.ResetTimer()
for i := 0; i < b.N; i++ {
cursor.Encode(dst)
}
b.ReportAllocs()
}