-
Notifications
You must be signed in to change notification settings - Fork 1
/
compact_test.go
88 lines (80 loc) · 2.35 KB
/
compact_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
package chkjson
import (
"bytes"
"encoding/json"
"testing"
"unsafe"
)
func TestCompact(t *testing.T) {
for i := 0; i < 5; i++ {
buf := genBig()
orig := make([]byte, len(buf))
copy(orig, buf)
// Ensure that compacting already compact JSON does not change
// anything.
addr := uintptr(unsafe.Pointer(&buf[0]))
var is bool
got, is := AppendCompact(buf[:0], buf)
if !is {
t.Error("AppendCompact on known good json is invalid")
}
if uintptr(unsafe.Pointer(&got[0])) != addr {
t.Error("AppendCompact on compact buf to itself changed addresses")
}
if len(got) != len(orig) {
t.Errorf("AppendCompact len %v != exp %v", len(got), len(orig))
}
if !bytes.Equal(got, orig) {
t.Error("AppendCompact changed contents of compact json")
}
// Ensure that Compact to itself changes nothing.
cpy := make([]byte, len(got))
copy(cpy, got)
cpy, ok := Compact(cpy)
if !ok {
t.Error("Compact of known good json is invalid")
} else if !bytes.Equal(cpy, got) {
t.Error("Compact of AppendCompact result != AppendCompact result")
}
// Indent that and ensure we end up back with our original.
indentBuf := new(bytes.Buffer)
json.Indent(indentBuf, buf, "", " \t ")
buf = []byte(indentBuf.String())
// We copy the checks above but compare lengths/contents
// against the original known-good compact slice.
addr = uintptr(unsafe.Pointer(&buf[0]))
got, is = AppendCompact(buf[:0], buf)
if !is {
t.Error("AppendCompact on indented good json is invalid")
}
if uintptr(unsafe.Pointer(&buf[0])) != addr {
t.Error("AppendCompact on large buf to itself changed addresses")
}
if len(got) != len(orig) {
t.Errorf("AppendConcat len %v != exp %v", len(got), len(orig))
}
if !bytes.Equal(orig, got) {
t.Error("AppendConcat of indented json changed original compact")
}
}
}
func BenchmarkCompact(b *testing.B) {
orig := []byte(`{"foo": 1, "bar": [{"fi\uabcdrst": 1, "se\\cond": 2, "last": 9999}, {}]}`)
a := make([]byte, 0, len(orig))
for i := 0; i < b.N; i++ {
AppendCompact(a[:0], orig)
}
}
func BenchmarkCompactInplace(b *testing.B) {
orig := []byte(`{"foo":1,"bar":[{"fi\uabcdrst":1,"se\\cond":2,"last":9999},{}]}`)
b.Run("baseline", func(b *testing.B) {
for i := 0; i < b.N; i++ {
AppendCompact(orig[:0], orig)
}
})
b.Run("direct", func(b *testing.B) {
for i := 0; i < b.N; i++ {
Compact(orig)
}
})
}