| package test |
| |
| import ( |
| "encoding/json" |
| "github.com/json-iterator/go" |
| "testing" |
| "unicode/utf8" |
| ) |
| |
| func init() { |
| marshalCases = append(marshalCases, |
| `>`, |
| `"数字山谷"`, |
| "he\u2029\u2028he", |
| ) |
| for i := 0; i < utf8.RuneSelf; i++ { |
| marshalCases = append(marshalCases, string([]byte{byte(i)})) |
| } |
| } |
| |
| func Test_read_string(t *testing.T) { |
| badInputs := []string{ |
| ``, |
| `"`, |
| `"\"`, |
| `"\\\"`, |
| "\"\n\"", |
| `"\U0001f64f"`, |
| `"\uD83D\u00"`, |
| } |
| for i := 0; i < 32; i++ { |
| // control characters are invalid |
| badInputs = append(badInputs, string([]byte{'"', byte(i), '"'})) |
| } |
| |
| for _, input := range badInputs { |
| testReadString(t, input, "", true, "json.Unmarshal", json.Unmarshal) |
| testReadString(t, input, "", true, "jsoniter.Unmarshal", jsoniter.Unmarshal) |
| testReadString(t, input, "", true, "jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal) |
| } |
| |
| goodInputs := []struct { |
| input string |
| expectValue string |
| }{ |
| {`""`, ""}, |
| {`"a"`, "a"}, |
| {`null`, ""}, |
| {`"Iñtërnâtiônàlizætiøn,💝🐹🌇⛔"`, "Iñtërnâtiônàlizætiøn,💝🐹🌇⛔"}, |
| {`"\uD83D"`, string([]byte{239, 191, 189})}, |
| {`"\uD83D\\"`, string([]byte{239, 191, 189, '\\'})}, |
| {`"\uD83D\ub000"`, string([]byte{239, 191, 189, 235, 128, 128})}, |
| {`"\uD83D\ude04"`, "😄"}, |
| {`"\uDEADBEEF"`, string([]byte{239, 191, 189, 66, 69, 69, 70})}, |
| {`"hel\"lo"`, `hel"lo`}, |
| {`"hel\\\/lo"`, `hel\/lo`}, |
| {`"hel\\blo"`, `hel\blo`}, |
| {`"hel\\\blo"`, "hel\\\blo"}, |
| {`"hel\\nlo"`, `hel\nlo`}, |
| {`"hel\\\nlo"`, "hel\\\nlo"}, |
| {`"hel\\tlo"`, `hel\tlo`}, |
| {`"hel\\flo"`, `hel\flo`}, |
| {`"hel\\\flo"`, "hel\\\flo"}, |
| {`"hel\\\rlo"`, "hel\\\rlo"}, |
| {`"hel\\\tlo"`, "hel\\\tlo"}, |
| {`"\u4e2d\u6587"`, "中文"}, |
| {`"\ud83d\udc4a"`, "\xf0\x9f\x91\x8a"}, |
| } |
| |
| for _, tc := range goodInputs { |
| testReadString(t, tc.input, tc.expectValue, false, "json.Unmarshal", json.Unmarshal) |
| testReadString(t, tc.input, tc.expectValue, false, "jsoniter.Unmarshal", jsoniter.Unmarshal) |
| testReadString(t, tc.input, tc.expectValue, false, "jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal", jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal) |
| } |
| } |
| |
| func testReadString(t *testing.T, input string, expectValue string, expectError bool, marshalerName string, marshaler func([]byte, interface{}) error) { |
| var value string |
| err := marshaler([]byte(input), &value) |
| if expectError != (err != nil) { |
| t.Errorf("%q: %s: expected error %v, got %v", input, marshalerName, expectError, err) |
| return |
| } |
| if value != expectValue { |
| t.Errorf("%q: %s: expected %q, got %q", input, marshalerName, expectValue, value) |
| return |
| } |
| } |