partial_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. // NOTE: This test is different than most of the other JSON roundtrip tests.
  2. package test
  3. import (
  4. "bytes"
  5. "encoding/json"
  6. "fmt"
  7. "strings"
  8. "testing"
  9. "github.com/davecgh/go-spew/spew"
  10. fuzz "github.com/google/gofuzz"
  11. jsoniter "github.com/json-iterator/go"
  12. )
  13. func Test_PartialUnmarshal(t *testing.T) {
  14. fz := fuzz.New().MaxDepth(10).NilChance(0.3)
  15. for i := 0; i < 100; i++ {
  16. var before typeForTest1
  17. fz.Fuzz(&before)
  18. jbStd, err := json.Marshal(before)
  19. if err != nil {
  20. t.Fatalf("failed to marshal with stdlib: %v", err)
  21. }
  22. if len(strings.TrimSpace(string(jbStd))) == 0 {
  23. t.Fatal("stdlib marshal produced empty result and no error")
  24. }
  25. jbIter, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(before)
  26. if err != nil {
  27. t.Fatalf("failed to marshal with jsoniter: %v", err)
  28. }
  29. if len(strings.TrimSpace(string(jbIter))) == 0 {
  30. t.Fatal("jsoniter marshal produced empty result and no error")
  31. }
  32. if string(jbStd) != string(jbIter) {
  33. t.Fatalf("marshal expected:\n %s\ngot:\n %s\nobj:\n %s",
  34. indent(jbStd, " "), indent(jbIter, " "), dump(before))
  35. }
  36. var afterStd typeForTest2
  37. err = json.Unmarshal(jbIter, &afterStd)
  38. if err != nil {
  39. t.Fatalf("failed to unmarshal with stdlib: %v\nvia:\n %s",
  40. err, indent(jbIter, " "))
  41. }
  42. var afterIter typeForTest2
  43. err = jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(jbIter, &afterIter)
  44. if err != nil {
  45. t.Fatalf("failed to unmarshal with jsoniter: %v\nvia:\n %s",
  46. err, indent(jbIter, " "))
  47. }
  48. if fingerprint(afterStd) != fingerprint(afterIter) {
  49. t.Fatalf("unmarshal expected:\n %s\ngot:\n %s\nvia:\n %s",
  50. dump(afterStd), dump(afterIter), indent(jbIter, " "))
  51. }
  52. }
  53. }
  54. const indentStr = "> "
  55. func fingerprint(obj interface{}) string {
  56. c := spew.ConfigState{
  57. SortKeys: true,
  58. SpewKeys: true,
  59. }
  60. return c.Sprintf("%v", obj)
  61. }
  62. func dump(obj interface{}) string {
  63. cfg := spew.ConfigState{
  64. Indent: indentStr,
  65. }
  66. return cfg.Sdump(obj)
  67. }
  68. func indent(src []byte, prefix string) string {
  69. var buf bytes.Buffer
  70. err := json.Indent(&buf, src, prefix, indentStr)
  71. if err != nil {
  72. return fmt.Sprintf("!!! %v", err)
  73. }
  74. return buf.String()
  75. }