// Copyright (C) 2023 Luke Shumaker // // SPDX-License-Identifier: GPL-2.0-or-later package json import ( "bytes" "testing" "github.com/stretchr/testify/assert" ) func TestCompatHTMLEscape(t *testing.T) { t.Parallel() type testcase struct { In string Out string } testcases := map[string]testcase{ "invalid": {In: `x`, Out: `x`}, } for tcName, tc := range testcases { tc := tc t.Run(tcName, func(t *testing.T) { t.Parallel() t.Logf("in=%q", tc.In) var dst bytes.Buffer HTMLEscape(&dst, []byte(tc.In)) assert.Equal(t, tc.Out, dst.String()) }) } } func TestCompatValid(t *testing.T) { t.Parallel() type testcase struct { In string Exp bool } testcases := map[string]testcase{ "empty": {In: ``, Exp: false}, "num": {In: `1`, Exp: true}, "trunc": {In: `{`, Exp: false}, "object": {In: `{}`, Exp: true}, "non-utf8": {In: "\"\x85\xcd\"", Exp: false}, // https://github.com/golang/go/issues/58517 } for tcName, tc := range testcases { tc := tc t.Run(tcName, func(t *testing.T) { t.Parallel() t.Logf("in=%q", tc.In) act := Valid([]byte(tc.In)) assert.Equal(t, tc.Exp, act) }) } } func TestCompatCompact(t *testing.T) { t.Parallel() type testcase struct { In string Out string Err string } testcases := map[string]testcase{ "trunc": {In: `{`, Out: ``, Err: `unexpected end of JSON input`}, "object": {In: `{}`, Out: `{}`}, "non-utf8": {In: "\"\x85\xcd\"", Out: "\"\x85\xcd\""}, "float": {In: `1.200e003`, Out: `1.200e003`}, } for tcName, tc := range testcases { tc := tc t.Run(tcName, func(t *testing.T) { t.Parallel() t.Logf("in=%q", tc.In) var out bytes.Buffer err := Compact(&out, []byte(tc.In)) assert.Equal(t, tc.Out, out.String()) if tc.Err == "" { assert.NoError(t, err) } else { assert.EqualError(t, err, tc.Err) } }) } } func TestCompatIndent(t *testing.T) { t.Parallel() type testcase struct { In string Out string Err string } testcases := map[string]testcase{ "trunc": {In: `{`, Out: ``, Err: `unexpected end of JSON input`}, "object": {In: `{}`, Out: `{}`}, "non-utf8": {In: "\"\x85\xcd\"", Out: "\"\x85\xcd\""}, "float": {In: `1.200e003`, Out: `1.200e003`}, "tailws0": {In: `0`, Out: `0`}, "tailws1": {In: `0 `, Out: `0 `}, "tailws2": {In: `0 `, Out: `0 `}, "tailws3": {In: "0\n", Out: "0\n"}, "headws1": {In: ` 0`, Out: `0`}, "objws1": {In: `{"a" : 1}`, Out: "{\n>.\"a\": 1\n>}"}, "objws2": {In: "{\"a\"\n:\n1}", Out: "{\n>.\"a\": 1\n>}"}, } for tcName, tc := range testcases { tc := tc t.Run(tcName, func(t *testing.T) { t.Parallel() t.Logf("in=%q", tc.In) var out bytes.Buffer err := Indent(&out, []byte(tc.In), ">", ".") assert.Equal(t, tc.Out, out.String()) if tc.Err == "" { assert.NoError(t, err) } else { assert.EqualError(t, err, tc.Err) } }) } } func TestCompatMarshal(t *testing.T) { t.Parallel() type testcase struct { In any Out string Err string } testcases := map[string]testcase{ "non-utf8": {In: "\x85\xcd", Out: "\"\\ufffd\\ufffd\""}, "urc": {In: "\ufffd", Out: "\"\ufffd\""}, "float": {In: 1.2e3, Out: `1200`}, } for tcName, tc := range testcases { tc := tc t.Run(tcName, func(t *testing.T) { t.Parallel() out, err := Marshal(tc.In) assert.Equal(t, tc.Out, string(out)) if tc.Err == "" { assert.NoError(t, err) } else { assert.EqualError(t, err, tc.Err) } }) } }