You've already forked json-iterator
							
							
				mirror of
				https://github.com/json-iterator/go.git
				synced 2025-10-31 00:07:40 +02:00 
			
		
		
		
	Revert "WIP: Tests to compare against stdlib"
This commit is contained in:
		| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T bool | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T bool | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T byte | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T byte | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T float32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T float32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T float64 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T float64 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int16 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int16 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T int8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T string | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T string | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint16 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint16 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T uint8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]bool | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]byte | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]float32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]float64 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]int32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]int8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]string | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[int32]StringAlias | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[int32]uint8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]bool | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]byte | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]float32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]float64 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]int32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]int8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]string | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[string]StringAlias | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[string]uint8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]bool | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]byte | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]float32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]float64 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]int32 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]int8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]string | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]StringAlias | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,5 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type StringAlias string | ||||
|  | ||||
| type T map[StringAlias]uint8 | ||||
| @@ -1,144 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
|  | ||||
| 	"github.com/davecgh/go-spew/spew" | ||||
| 	fuzz "github.com/google/gofuzz" | ||||
| 	jsoniter "github.com/json-iterator/go" | ||||
| ) | ||||
|  | ||||
| func Test_Roundtrip(t *testing.T) { | ||||
| 	fz := fuzz.New().MaxDepth(10).NilChance(0.3) | ||||
| 	for i := 0; i < 1000; i++ { | ||||
| 		var before T | ||||
| 		fz.Fuzz(&before) | ||||
|  | ||||
| 		jbStd, err := json.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		jbIter, err := jsoniter.Marshal(before) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to marshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if string(jbStd) != string(jbIter) { | ||||
| 			t.Errorf("marshal expected:\n    %s\ngot:\n    %s\nobj:\n    %s", | ||||
| 				indent(jbStd, "    "), indent(jbIter, "    "), dump(before)) | ||||
| 		} | ||||
|  | ||||
| 		var afterStd T | ||||
| 		err = json.Unmarshal(jbIter, &afterStd) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with stdlib: %v", err) | ||||
| 		} | ||||
| 		var afterIter T | ||||
| 		err = jsoniter.Unmarshal(jbIter, &afterIter) | ||||
| 		if err != nil { | ||||
| 			t.Errorf("failed to unmarshal with jsoniter: %v", err) | ||||
| 		} | ||||
| 		if fingerprint(afterStd) != fingerprint(afterIter) { | ||||
| 			t.Errorf("unmarshal expected:\n    %s\ngot:\n    %s\nvia:\n    %s", | ||||
| 				dump(afterStd), dump(afterIter), indent(jbIter, "    ")) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const indentStr = ">  " | ||||
|  | ||||
| func fingerprint(obj interface{}) string { | ||||
| 	c := spew.ConfigState{ | ||||
| 		SortKeys: true, | ||||
| 		SpewKeys: true, | ||||
| 	} | ||||
| 	return c.Sprintf("%v", obj) | ||||
| } | ||||
|  | ||||
| func dump(obj interface{}) string { | ||||
| 	cfg := spew.ConfigState{ | ||||
| 		Indent: indentStr, | ||||
| 	} | ||||
| 	return cfg.Sdump(obj) | ||||
| } | ||||
|  | ||||
| func indent(src []byte, prefix string) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	json.Indent(&buf, src, prefix, indentStr) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := json.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkStandardUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = json.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterMarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var obj T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&obj) | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		jb, err := jsoniter.Marshal(obj) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to marshal:\n input: %s\n  error: %v", dump(obj), err) | ||||
| 		} | ||||
| 		_ = jb | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkJSONIterUnmarshal(t *testing.B) { | ||||
| 	t.ReportAllocs() | ||||
| 	t.ResetTimer() | ||||
|  | ||||
| 	var before T | ||||
| 	fz := fuzz.NewWithSeed(0).MaxDepth(10).NilChance(0.3) | ||||
| 	fz.Fuzz(&before) | ||||
| 	jb, err := json.Marshal(before) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to marshal: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	for i := 0; i < t.N; i++ { | ||||
| 		var after T | ||||
| 		err = jsoniter.Unmarshal(jb, &after) | ||||
| 		if err != nil { | ||||
| 			t.Fatalf("failed to unmarshal:\n  input: %q\n  error: %v", string(jb), err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| package test | ||||
|  | ||||
| type T map[uint8]bool | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user