aboutsummaryrefslogtreecommitdiffstats
path: root/common/hexutil/json_test.go
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2017-02-23 00:59:59 +0800
committerFelix Lange <fjl@twurst.com>2017-03-02 21:05:46 +0800
commitd304da380382245190f33878363696cd151201a9 (patch)
treeae1791944e79a9ea741fb447a6346309e4b016c7 /common/hexutil/json_test.go
parent357d00cdb1625e4a715e0b3928ef7bd3656a8d95 (diff)
downloadgo-tangerine-d304da380382245190f33878363696cd151201a9.tar
go-tangerine-d304da380382245190f33878363696cd151201a9.tar.gz
go-tangerine-d304da380382245190f33878363696cd151201a9.tar.bz2
go-tangerine-d304da380382245190f33878363696cd151201a9.tar.lz
go-tangerine-d304da380382245190f33878363696cd151201a9.tar.xz
go-tangerine-d304da380382245190f33878363696cd151201a9.tar.zst
go-tangerine-d304da380382245190f33878363696cd151201a9.zip
common/hexutil: implement TextMarshaler, TextUnmarshaler
This commit makes the wrapper types more generally applicable. encoding.TextMarshaler is supported by most codec implementations (e.g. for yaml). The tests now ensure that package json actually recognizes the custom marshaler implementation irrespective of how it is implemented. The Uint type has new tests, too. These are tricky because uint size depends on the CPU word size. Turns out that there was one incorrect case where decoding returned ErrUint64Range instead of ErrUintRange.
Diffstat (limited to 'common/hexutil/json_test.go')
-rw-r--r--common/hexutil/json_test.go91
1 files changed, 82 insertions, 9 deletions
diff --git a/common/hexutil/json_test.go b/common/hexutil/json_test.go
index c7fde0adb..af7f44915 100644
--- a/common/hexutil/json_test.go
+++ b/common/hexutil/json_test.go
@@ -19,6 +19,8 @@ package hexutil
import (
"bytes"
"encoding/hex"
+ "encoding/json"
+ "errors"
"math/big"
"testing"
)
@@ -55,9 +57,11 @@ func referenceBytes(s string) []byte {
return b
}
+var errJSONEOF = errors.New("unexpected end of JSON input")
+
var unmarshalBytesTests = []unmarshalTest{
// invalid encoding
- {input: "", wantErr: errNonString},
+ {input: "", wantErr: errJSONEOF},
{input: "null", wantErr: errNonString},
{input: "10", wantErr: errNonString},
{input: `"0"`, wantErr: ErrMissingPrefix},
@@ -80,7 +84,7 @@ var unmarshalBytesTests = []unmarshalTest{
func TestUnmarshalBytes(t *testing.T) {
for _, test := range unmarshalBytesTests {
var v Bytes
- err := v.UnmarshalJSON([]byte(test.input))
+ err := json.Unmarshal([]byte(test.input), &v)
if !checkError(t, test.input, err, test.wantErr) {
continue
}
@@ -104,7 +108,7 @@ func BenchmarkUnmarshalBytes(b *testing.B) {
func TestMarshalBytes(t *testing.T) {
for _, test := range encodeBytesTests {
in := test.input.([]byte)
- out, err := Bytes(in).MarshalJSON()
+ out, err := json.Marshal(Bytes(in))
if err != nil {
t.Errorf("%x: %v", in, err)
continue
@@ -122,7 +126,7 @@ func TestMarshalBytes(t *testing.T) {
var unmarshalBigTests = []unmarshalTest{
// invalid encoding
- {input: "", wantErr: errNonString},
+ {input: "", wantErr: errJSONEOF},
{input: "null", wantErr: errNonString},
{input: "10", wantErr: errNonString},
{input: `"0"`, wantErr: ErrMissingPrefix},
@@ -161,7 +165,7 @@ var unmarshalBigTests = []unmarshalTest{
func TestUnmarshalBig(t *testing.T) {
for _, test := range unmarshalBigTests {
var v Big
- err := v.UnmarshalJSON([]byte(test.input))
+ err := json.Unmarshal([]byte(test.input), &v)
if !checkError(t, test.input, err, test.wantErr) {
continue
}
@@ -185,7 +189,7 @@ func BenchmarkUnmarshalBig(b *testing.B) {
func TestMarshalBig(t *testing.T) {
for _, test := range encodeBigTests {
in := test.input.(*big.Int)
- out, err := (*Big)(in).MarshalJSON()
+ out, err := json.Marshal((*Big)(in))
if err != nil {
t.Errorf("%d: %v", in, err)
continue
@@ -203,7 +207,7 @@ func TestMarshalBig(t *testing.T) {
var unmarshalUint64Tests = []unmarshalTest{
// invalid encoding
- {input: "", wantErr: errNonString},
+ {input: "", wantErr: errJSONEOF},
{input: "null", wantErr: errNonString},
{input: "10", wantErr: errNonString},
{input: `"0"`, wantErr: ErrMissingPrefix},
@@ -227,7 +231,7 @@ var unmarshalUint64Tests = []unmarshalTest{
func TestUnmarshalUint64(t *testing.T) {
for _, test := range unmarshalUint64Tests {
var v Uint64
- err := v.UnmarshalJSON([]byte(test.input))
+ err := json.Unmarshal([]byte(test.input), &v)
if !checkError(t, test.input, err, test.wantErr) {
continue
}
@@ -249,7 +253,7 @@ func BenchmarkUnmarshalUint64(b *testing.B) {
func TestMarshalUint64(t *testing.T) {
for _, test := range encodeUint64Tests {
in := test.input.(uint64)
- out, err := Uint64(in).MarshalJSON()
+ out, err := json.Marshal(Uint64(in))
if err != nil {
t.Errorf("%d: %v", in, err)
continue
@@ -264,3 +268,72 @@ func TestMarshalUint64(t *testing.T) {
}
}
}
+
+func TestMarshalUint(t *testing.T) {
+ for _, test := range encodeUintTests {
+ in := test.input.(uint)
+ out, err := json.Marshal(Uint(in))
+ if err != nil {
+ t.Errorf("%d: %v", in, err)
+ continue
+ }
+ if want := `"` + test.want + `"`; string(out) != want {
+ t.Errorf("%d: MarshalJSON output mismatch: got %q, want %q", in, out, want)
+ continue
+ }
+ if out := (Uint)(in).String(); out != test.want {
+ t.Errorf("%x: String mismatch: got %q, want %q", in, out, test.want)
+ continue
+ }
+ }
+}
+
+var (
+ // These are variables (not constants) to avoid constant overflow
+ // checks in the compiler on 32bit platforms.
+ maxUint33bits = uint64(^uint32(0)) + 1
+ maxUint64bits = ^uint64(0)
+)
+
+var unmarshalUintTests = []unmarshalTest{
+ // invalid encoding
+ {input: "", wantErr: errJSONEOF},
+ {input: "null", wantErr: errNonString},
+ {input: "10", wantErr: errNonString},
+ {input: `"0"`, wantErr: ErrMissingPrefix},
+ {input: `"0x"`, wantErr: ErrEmptyNumber},
+ {input: `"0x01"`, wantErr: ErrLeadingZero},
+ {input: `"0x100000000"`, want: uint(maxUint33bits), wantErr32bit: ErrUintRange},
+ {input: `"0xfffffffffffffffff"`, wantErr: ErrUintRange},
+ {input: `"0xx"`, wantErr: ErrSyntax},
+ {input: `"0x1zz01"`, wantErr: ErrSyntax},
+
+ // valid encoding
+ {input: `""`, want: uint(0)},
+ {input: `"0x0"`, want: uint(0)},
+ {input: `"0x2"`, want: uint(0x2)},
+ {input: `"0x2F2"`, want: uint(0x2f2)},
+ {input: `"0X2F2"`, want: uint(0x2f2)},
+ {input: `"0x1122aaff"`, want: uint(0x1122aaff)},
+ {input: `"0xbbb"`, want: uint(0xbbb)},
+ {input: `"0xffffffff"`, want: uint(0xffffffff)},
+ {input: `"0xffffffffffffffff"`, want: uint(maxUint64bits), wantErr32bit: ErrUintRange},
+}
+
+func TestUnmarshalUint(t *testing.T) {
+ for _, test := range unmarshalUintTests {
+ var v Uint
+ err := json.Unmarshal([]byte(test.input), &v)
+ if uintBits == 32 && test.wantErr32bit != nil {
+ checkError(t, test.input, err, test.wantErr32bit)
+ continue
+ }
+ if !checkError(t, test.input, err, test.wantErr) {
+ continue
+ }
+ if uint(v) != test.want.(uint) {
+ t.Errorf("input %s: value mismatch: got %d, want %d", test.input, v, test.want)
+ continue
+ }
+ }
+}