1 // Copyright 2010 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 // Tests of simple examples.
21 var examples = []example{
25 {`{"":2}`, "{\n\t\"\": 2\n}"},
27 {`[1,2,3]`, "[\n\t1,\n\t2,\n\t3\n]"},
28 {`{"x":1}`, "{\n\t\"x\": 1\n}"},
32 var ex1 = `[true,false,null,"x",1,1.5,0,-5e+2]`
45 func TestCompact(t *testing.T) {
47 for _, tt := range examples {
49 if err := Compact(&buf, []byte(tt.compact)); err != nil {
50 t.Errorf("Compact(%#q): %v", tt.compact, err)
51 } else if s := buf.String(); s != tt.compact {
52 t.Errorf("Compact(%#q) = %#q, want original", tt.compact, s)
56 if err := Compact(&buf, []byte(tt.indent)); err != nil {
57 t.Errorf("Compact(%#q): %v", tt.indent, err)
59 } else if s := buf.String(); s != tt.compact {
60 t.Errorf("Compact(%#q) = %#q, want %#q", tt.indent, s, tt.compact)
65 func TestIndent(t *testing.T) {
67 for _, tt := range examples {
69 if err := Indent(&buf, []byte(tt.indent), "", "\t"); err != nil {
70 t.Errorf("Indent(%#q): %v", tt.indent, err)
71 } else if s := buf.String(); s != tt.indent {
72 t.Errorf("Indent(%#q) = %#q, want original", tt.indent, s)
76 if err := Indent(&buf, []byte(tt.compact), "", "\t"); err != nil {
77 t.Errorf("Indent(%#q): %v", tt.compact, err)
79 } else if s := buf.String(); s != tt.indent {
80 t.Errorf("Indent(%#q) = %#q, want %#q", tt.compact, s, tt.indent)
85 // Tests of a large random structure.
87 func TestCompactBig(t *testing.T) {
90 if err := Compact(&buf, jsonBig); err != nil {
91 t.Fatalf("Compact: %v", err)
94 if bytes.Compare(b, jsonBig) != 0 {
95 t.Error("Compact(jsonBig) != jsonBig")
101 func TestIndentBig(t *testing.T) {
104 if err := Indent(&buf, jsonBig, "", "\t"); err != nil {
105 t.Fatalf("Indent1: %v", err)
108 if len(b) == len(jsonBig) {
109 // jsonBig is compact (no unnecessary spaces);
110 // indenting should make it bigger
111 t.Fatalf("Indent(jsonBig) did not get bigger")
114 // should be idempotent
115 var buf1 bytes.Buffer
116 if err := Indent(&buf1, b, "", "\t"); err != nil {
117 t.Fatalf("Indent2: %v", err)
120 if bytes.Compare(b1, b) != 0 {
121 t.Error("Indent(Indent(jsonBig)) != Indent(jsonBig)")
126 // should get back to original
128 if err := Compact(&buf1, b); err != nil {
129 t.Fatalf("Compact: %v", err)
132 if bytes.Compare(b1, jsonBig) != 0 {
133 t.Error("Compact(Indent(jsonBig)) != jsonBig")
139 func TestNextValueBig(t *testing.T) {
142 item, rest, err := nextValue(jsonBig, &scan)
144 t.Fatalf("nextValue: %s", err)
146 if len(item) != len(jsonBig) || &item[0] != &jsonBig[0] {
147 t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
150 t.Errorf("invalid rest: %d", len(rest))
153 item, rest, err = nextValue(append(jsonBig, []byte("HELLO WORLD")...), &scan)
155 t.Fatalf("nextValue extra: %s", err)
157 if len(item) != len(jsonBig) {
158 t.Errorf("invalid item: %d %d", len(item), len(jsonBig))
160 if string(rest) != "HELLO WORLD" {
161 t.Errorf("invalid rest: %d", len(rest))
165 func BenchmarkSkipValue(b *testing.B) {
168 for i := 0; i < b.N; i++ {
169 nextValue(jsonBig, &scan)
171 b.SetBytes(int64(len(jsonBig)))
174 func diff(t *testing.T, a, b []byte) {
176 if i >= len(a) || i >= len(b) || a[i] != b[i] {
181 t.Errorf("diverge at %d: «%s» vs «%s»", i, trim(a[j:]), trim(b[j:]))
187 func trim(b []byte) []byte {
194 // Generate a random JSON object.
208 if len(jsonBig) != n {
209 b, err := Marshal(genValue(n))
217 func genValue(n int) interface{} {
219 switch rand.Intn(2) {
226 switch rand.Intn(3) {
228 return rand.Intn(2) == 0
230 return rand.NormFloat64()
237 func genString(stddev float64) string {
238 n := int(math.Fabs(rand.NormFloat64()*stddev + stddev/2))
241 f := math.Fabs(rand.NormFloat64()*64 + 32)
250 func genArray(n int) []interface{} {
251 f := int(math.Fabs(rand.NormFloat64()) * math.Fmin(10, float64(n/2)))
255 x := make([]interface{}, int(f))
257 x[i] = genValue(((i+1)*n)/f - (i*n)/f)
262 func genMap(n int) map[string]interface{} {
263 f := int(math.Fabs(rand.NormFloat64()) * math.Fmin(10, float64(n/2)))
270 x := make(map[string]interface{})
271 for i := 0; i < f; i++ {
272 x[genString(10)] = genValue(((i+1)*n)/f - (i*n)/f)