package jsonvalue import "testing" func TestCanonicalPreservesExactNumbers(t *testing.T) { for _, pair := range [][2]string{ {`{"z":1.0,"a":9007199254740993}`, `{"a":9007199254740993,"z":1}`}, {`[0,-0,100,0.0001000]`, `[0,0,1e2,1e-4]`}, {`{"x":12345678901234567890.1234567890123456789}`, `{"x":123456789012345678901234567890123456789e-19}`}, {`"\ud83d\ude00"`, `"😀"`}, } { got, err := Canonical([]byte(pair[0])) if err != nil || string(got) != pair[1] { t.Fatalf("%s => %s, %v", pair[0], got, err) } } for _, raw := range []string{`{"a":1,"\u0061":2}`, `{"nested":{"x":1,"x":2}}`, `1 2`, `9e308`, `1e309`, `"\ud800"`, `"\udc00"`, `"\ud800\u1234"`, string([]byte{'"', 0xff, '"'})} { if _, err := Canonical([]byte(raw)); err == nil { t.Fatalf("accepted %q", raw) } } } func FuzzCanonical(f *testing.F) { for _, s := range []string{`{"a":1.0}`, `[1,true,null]`, `"\ud83d\ude00"`, `0.0000000000000000001`} { f.Add(s) } f.Fuzz(func(t *testing.T, s string) { b, err := Canonical([]byte(s)) if err != nil { return } again, err := Canonical(b) if err != nil || string(again) != string(b) { t.Fatalf("unstable canonical form %s %v", b, err) } }) }