type_test.go 2.5 KB

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