From 54bbd1e59317a6e9658eb8098657078cc8e81979 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sun, 14 Aug 2022 20:52:06 -0600 Subject: wip: Reduce test differences [ci-skip] - Handle UTF-16 surrogate pairs - Handle cycles in values - Handle cycles in types - Better errors - Handle case-folding of struct field names - Allow []byteTypeWithMethods - Fix struct field-order - Fix handling of interfaces storing pointers - Enforce a maximum decode depth - Validate struct tags --- compat/json/borrowed_decode_test.go | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) (limited to 'compat/json/borrowed_decode_test.go') diff --git a/compat/json/borrowed_decode_test.go b/compat/json/borrowed_decode_test.go index 306f85e..4b84718 100644 --- a/compat/json/borrowed_decode_test.go +++ b/compat/json/borrowed_decode_test.go @@ -455,8 +455,8 @@ var unmarshalTests = []unmarshalTest{ {in: `{"X": "foo", "Y"}`, err: &SyntaxError{"invalid character '}' after object key", 17}}, {in: `[1, 2, 3+]`, err: &SyntaxError{"invalid character '+' after array element", 9}}, {in: `{"X":12x}`, err: &SyntaxError{"invalid character 'x' after object key:value pair", 8}, useNumber: true}, - {in: `[2, 3`, err: &SyntaxError{Err: "unexpected end of JSON input", Offset: 5}}, // MODIFIED - {in: `{"F3": -}`, ptr: new(V), out: V{F3: Number("-")}, err: &SyntaxError{Err: "invalid character '}' in numeric literal", Offset: 9}}, // MODIFIED + {in: `[2, 3`, err: &SyntaxError{msg: "unexpected end of JSON input", Offset: 5}}, + {in: `{"F3": -}`, ptr: new(V), out: V{F3: Number("-")}, err: &SyntaxError{msg: "invalid character '}' in numeric literal", Offset: 9}}, // raw value errors {in: "\x01 42", err: &SyntaxError{"invalid character '\\x01' looking for beginning of value", 1}}, @@ -957,7 +957,7 @@ var unmarshalTests = []unmarshalTest{ in: `invalid`, ptr: new(Number), err: &SyntaxError{ - Err: "invalid character 'i' looking for beginning of value", // MODIFIED + msg: "invalid character 'i' looking for beginning of value", Offset: 1, }, }, @@ -1040,7 +1040,6 @@ func TestMarshalNumberZeroVal(t *testing.T) { } func TestMarshalEmbeds(t *testing.T) { - t.Skip() // TODO top := &Top{ Level0: 1, Embed0: Embed0{ @@ -1089,17 +1088,16 @@ func equalError(a, b error) bool { if b == nil { return a == nil } - return true // a.Error() == b.Error() // MODIFIED + return a.Error() == b.Error() } func TestUnmarshal(t *testing.T) { - t.Skip() // TODO for i, tt := range unmarshalTests { scan := lowmemjson.ReEncoder{Out: io.Discard} // MODIFIED in := []byte(tt.in) - if _, err := scan.Write(in); err != nil { + if err := checkValid(in, &scan); err != nil { if !equalError(err, tt.err) { - t.Errorf("#%d: checkValid: %#v\n\n%s", i, err, tt.in) + t.Errorf("#%d: checkValid: %#v", i, err) continue } } @@ -1142,11 +1140,11 @@ func TestUnmarshal(t *testing.T) { continue } if !reflect.DeepEqual(v.Elem().Interface(), tt.out) { - t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v\n\n%s", i, v.Elem().Interface(), tt.out, tt.in) + t.Errorf("#%d: mismatch\nhave: %#+v\nwant: %#+v", i, v.Elem().Interface(), tt.out) data, _ := Marshal(v.Elem().Interface()) - println(string(data)) + t.Log(string(data)) // MODIFIED data, _ = Marshal(tt.out) - println(string(data)) + t.Log(string(data)) // MODIFIED continue } @@ -1311,7 +1309,7 @@ func TestErrorMessageFromMisusedString(t *testing.T) { var s WrongString err := NewDecoder(r).Decode(&s) got := fmt.Sprintf("%v", err) - if err == nil { // if got != tt.err { // MODIFIED + if got != tt.err { t.Errorf("%d. got err = %q, want %q", n, got, tt.err) } } @@ -1742,7 +1740,6 @@ var interfaceSetTests = []struct { } func TestInterfaceSet(t *testing.T) { - t.Skip() // TODO for _, tt := range interfaceSetTests { b := struct{ X any }{tt.pre} blob := `{"X":` + tt.json + `}` @@ -2015,7 +2012,7 @@ var decodeTypeErrorTests = []struct { func TestUnmarshalTypeError(t *testing.T) { for _, item := range decodeTypeErrorTests { err := Unmarshal([]byte(item.src), item.dest) - if err == nil { // if _, ok := err.(*UnmarshalTypeError); !ok { // MODIFIED + if _, ok := err.(*UnmarshalTypeError); !ok { t.Errorf("expected type error for Unmarshal(%q, type %T): got %T", item.src, item.dest, err) } @@ -2037,7 +2034,7 @@ func TestUnmarshalSyntax(t *testing.T) { var x any for _, src := range unmarshalSyntaxTests { err := Unmarshal([]byte(src), &x) - if err == nil { // _, ok := err.(*SyntaxError); !ok { // MODIFIED + if _, ok := err.(*SyntaxError); !ok { t.Errorf("expected syntax error for Unmarshal(%q): got %T", src, err) } } @@ -2202,9 +2199,9 @@ func TestInvalidUnmarshalText(t *testing.T) { t.Errorf("Unmarshal expecting error, got nil") continue } - // if got := err.Error(); got != tt.want { // MODIFIED - // t.Errorf("Unmarshal = %q; want %q", got, tt.want) // MODIFIED - // } // MODIFIED + if got := err.Error(); got != tt.want { + t.Errorf("Unmarshal = %q; want %q", got, tt.want) + } } } @@ -2243,7 +2240,6 @@ func TestInvalidStringOption(t *testing.T) { // (Issue 28145) If the embedded struct is given an explicit name and has // exported methods, don't cause a panic trying to get its value. func TestUnmarshalEmbeddedUnexported(t *testing.T) { - t.Skip() // TODO type ( embed1 struct{ Q int } embed2 struct{ Q int } @@ -2365,7 +2361,6 @@ func TestUnmarshalEmbeddedUnexported(t *testing.T) { } func TestUnmarshalErrorAfterMultipleJSON(t *testing.T) { - t.Skip() // TODO tests := []struct { in string err error @@ -2417,7 +2412,6 @@ func TestUnmarshalPanic(t *testing.T) { // The decoder used to hang if decoding into an interface pointing to its own address. // See golang.org/issues/31740. func TestUnmarshalRecursivePointer(t *testing.T) { - t.Skip() // TODO var v any v = &v data := []byte(`{"a": "b"}`) @@ -2493,7 +2487,6 @@ func TestUnmarshalRescanLiteralMangledUnquote(t *testing.T) { } func TestUnmarshalMaxDepth(t *testing.T) { - t.Skip() // TODO testcases := []struct { name string data string -- cgit v1.2.3-2-g168b