1 package test
2
3 import (
4 "encoding/json"
5 "github.com/json-iterator/go"
6 "testing"
7 "unicode/utf8"
8 )
9
10 func init() {
11 marshalCases = append(marshalCases,
12 `>`,
13 `"数字山谷"`,
14 "he\u2029\u2028he",
15 )
16 for i := 0; i < utf8.RuneSelf; i++ {
17 marshalCases = append(marshalCases, string([]byte{byte(i)}))
18 }
19 }
20
21 func Test_read_string(t *testing.T) {
22 badInputs := []string{
23 ``,
24 `"`,
25 `"\"`,
26 `"\\\"`,
27 "\"\n\"",
28 `"\U0001f64f"`,
29 `"\uD83D\u00"`,
30 }
31 for i := 0; i < 32; i++ {
32
33 badInputs = append(badInputs, string([]byte{'"', byte(i), '"'}))
34 }
35
36 for _, input := range badInputs {
37 testReadString(t, input, "", true, "json.Unmarshal", json.Unmarshal)
38 testReadString(t, input, "", true, "jsoniter.Unmarshal", jsoniter.Unmarshal)
39 testReadString(t, input, "", true, "jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal)
40 }
41
42 goodInputs := []struct {
43 input string
44 expectValue string
45 }{
46 {`""`, ""},
47 {`"a"`, "a"},
48 {`null`, ""},
49 {`"Iñtërnâtiônàlizætiøn,💝🐹🌇⛔"`, "Iñtërnâtiônàlizætiøn,💝🐹🌇⛔"},
50 {`"\uD83D"`, string([]byte{239, 191, 189})},
51 {`"\uD83D\\"`, string([]byte{239, 191, 189, '\\'})},
52 {`"\uD83D\ub000"`, string([]byte{239, 191, 189, 235, 128, 128})},
53 {`"\uD83D\ude04"`, "😄"},
54 {`"\uDEADBEEF"`, string([]byte{239, 191, 189, 66, 69, 69, 70})},
55 {`"hel\"lo"`, `hel"lo`},
56 {`"hel\\\/lo"`, `hel\/lo`},
57 {`"hel\\blo"`, `hel\blo`},
58 {`"hel\\\blo"`, "hel\\\blo"},
59 {`"hel\\nlo"`, `hel\nlo`},
60 {`"hel\\\nlo"`, "hel\\\nlo"},
61 {`"hel\\tlo"`, `hel\tlo`},
62 {`"hel\\flo"`, `hel\flo`},
63 {`"hel\\\flo"`, "hel\\\flo"},
64 {`"hel\\\rlo"`, "hel\\\rlo"},
65 {`"hel\\\tlo"`, "hel\\\tlo"},
66 {`"\u4e2d\u6587"`, "中文"},
67 {`"\ud83d\udc4a"`, "\xf0\x9f\x91\x8a"},
68 }
69
70 for _, tc := range goodInputs {
71 testReadString(t, tc.input, tc.expectValue, false, "json.Unmarshal", json.Unmarshal)
72 testReadString(t, tc.input, tc.expectValue, false, "jsoniter.Unmarshal", jsoniter.Unmarshal)
73 testReadString(t, tc.input, tc.expectValue, false, "jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal)
74 }
75 }
76
77 func testReadString(t *testing.T, input string, expectValue string, expectError bool, marshalerName string, marshaler func([]byte, interface{}) error) {
78 var value string
79 err := marshaler([]byte(input), &value)
80 if expectError != (err != nil) {
81 t.Errorf("%q: %s: expected error %v, got %v", input, marshalerName, expectError, err)
82 return
83 }
84 if value != expectValue {
85 t.Errorf("%q: %s: expected %q, got %q", input, marshalerName, expectValue, value)
86 return
87 }
88 }
89
View as plain text