-
Notifications
You must be signed in to change notification settings - Fork 8
/
jp_test.go
109 lines (101 loc) · 2.98 KB
/
jp_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
109
// Copyright 2013-2014 Paul Hammond.
// This software is licensed under the MIT license, see LICENSE.txt for details.
package jp
import (
"bytes"
"fmt"
"os"
"strings"
"testing"
)
var compact = `{"foo":"Iñtërnâtiônàlizætiøn","empty":{},"sub":{"ñ":"\u00F1","n˜":"n\u0303","array":[1,2,3],"array":[]}}`
var pretty = `{
"foo": "Iñtërnâtiônàlizætiøn",
"empty": { },
"sub": {
"ñ": "\u00F1",
"n˜": "n\u0303",
"array": [
1,
2,
3
],
"array": [ ]
}
}
`
var pretty16 = strings.ReplaceAll(`\033[0;32m{
\033[0m"\033[1mfoo\033[0m"\033[0;32m: \033[0m"\033[1mIñtërnâtiônàlizætiøn\033[0m"\033[0;32m,
\033[0m"\033[1mempty\033[0m"\033[0;32m: \033[0;32m{ }\033[0;32m,
\033[0m"\033[1msub\033[0m"\033[0;32m: \033[0;32m{
\033[0m"\033[1mñ\033[0m"\033[0;32m: \033[0m"\033[1m\u00F1\033[0m"\033[0;32m,
\033[0m"\033[1mn˜\033[0m"\033[0;32m: \033[0m"\033[1mn\u0303\033[0m"\033[0;32m,
\033[0m"\033[1marray\033[0m"\033[0;32m: \033[0;32m[
\033[1;33m1\033[0;32m,
\033[1;33m2\033[0;32m,
\033[1;33m3\033[0;32m
]\033[0;32m,
\033[0m"\033[1marray\033[0m"\033[0;32m: \033[0;32m[ ]\033[0;32m
}\033[0;32m
}\033[0m
`, `\033`, "\033")
var extraspaces = `{
"foo": "Iñtërnâtiônàlizætiøn" , "empty" : { }
,"sub": {"ñ" : "\u00F1" ,"n˜":"n\u0303","array" : [ 1, 2, 3 ]
,"array":[
] }
}
`
func TestExpand(t *testing.T) {
tests := []struct {
in string
out string
format string
}{
{compact, pretty, "pretty"},
{compact, pretty16, "pretty16"},
{extraspaces, pretty, "pretty"},
{pretty, pretty, "pretty"},
{compact, compact, "compact"},
// this checks for an edge case in strings
{`{"slash\\" : "foo" }`, `{"slash\\":"foo"}`, "compact"},
{`{"" : "foo" }`, `{"":"foo"}`, "compact"},
// check invalid spaces between elements are preserved
{`{"foo":[1 2, 3]}`, `{"foo":[1 2,3]}`, "compact"},
{`{"foo":[1 true, 3]}`, `{"foo":[1 true,3]}`, "compact"},
{`{"foo":[true false, 3]}`, `{"foo":[true false,3]}`, "compact"},
{`{"foo":[true false]}`, `{"foo":[true false]}`, "compact"},
{`{"foo":[true {}]}`, `{"foo":[true{}]}`, "compact"},
}
for _, test := range tests {
r := strings.NewReader(test.in)
w := &bytes.Buffer{}
err := Expand(r, w, test.format)
if err != nil {
t.Fatalf("unexpected error %v", err)
}
if w.String() != test.out {
t.Errorf("unexpected JSON, got\n%s\nexpected\n%s", escape(w.String()), escape(test.out))
}
}
}
func escape(str string) string {
return strings.ReplaceAll(str, "\033", "\\033")
}
// This benchmark isn't run by default. To run it, create "bench.json", then:
// go test -c .
// ./jp.test -test.bench="Expand" -test.cpuprofile cpu.out -test.benchtime=5 2> tmp.out
// go tool pprof jp.test cpu.out
func BenchmarkExpand(b *testing.B) {
b.StopTimer()
var r, _ = os.Open("./bench.json")
var w = os.Stderr
b.StartTimer()
var err error
for i := 0; i < b.N; i++ {
err = Expand(r, w, "pretty")
}
b.StopTimer()
fmt.Println(err)
b.StartTimer()
}