| package jsoniter |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| "testing" |
| |
| "github.com/stretchr/testify/require" |
| ) |
| |
| func Test_true(t *testing.T) { |
| should := require.New(t) |
| iter := ParseString(ConfigDefault, `true`) |
| should.True(iter.ReadBool()) |
| iter = ParseString(ConfigDefault, `true`) |
| should.Equal(true, iter.Read()) |
| } |
| |
| func Test_false(t *testing.T) { |
| should := require.New(t) |
| iter := ParseString(ConfigDefault, `false`) |
| should.False(iter.ReadBool()) |
| } |
| |
| func Test_write_true_false(t *testing.T) { |
| should := require.New(t) |
| buf := &bytes.Buffer{} |
| stream := NewStream(ConfigDefault, buf, 4096) |
| stream.WriteTrue() |
| stream.WriteFalse() |
| stream.WriteBool(false) |
| stream.Flush() |
| should.Nil(stream.Error) |
| should.Equal("truefalsefalse", buf.String()) |
| } |
| |
| func Test_write_val_bool(t *testing.T) { |
| should := require.New(t) |
| buf := &bytes.Buffer{} |
| stream := NewStream(ConfigDefault, buf, 4096) |
| stream.WriteVal(true) |
| should.Equal(stream.Buffered(), 4) |
| stream.Flush() |
| should.Equal(stream.Buffered(), 0) |
| should.Nil(stream.Error) |
| should.Equal("true", buf.String()) |
| } |
| |
| func Test_encode_string_bool(t *testing.T) { |
| type TestObject struct { |
| Field bool `json:",omitempty,string"` |
| } |
| should := require.New(t) |
| output, err := json.Marshal(TestObject{true}) |
| should.Nil(err) |
| should.Equal(`{"Field":"true"}`, string(output)) |
| output, err = Marshal(TestObject{true}) |
| should.Nil(err) |
| should.Equal(`{"Field":"true"}`, string(output)) |
| } |
| |
| func Test_decode_string_bool(t *testing.T) { |
| type TestObject struct { |
| Field bool `json:",omitempty,string"` |
| } |
| should := require.New(t) |
| obj := TestObject{} |
| err := json.Unmarshal([]byte(`{"Field":"true"}`), &obj) |
| should.Nil(err) |
| should.True(obj.Field) |
| |
| obj = TestObject{} |
| err = json.Unmarshal([]byte(`{"Field":true}`), &obj) |
| should.NotNil(err) |
| |
| obj = TestObject{} |
| err = Unmarshal([]byte(`{"Field":"true"}`), &obj) |
| should.Nil(err) |
| should.True(obj.Field) |
| |
| obj = TestObject{} |
| err = Unmarshal([]byte(`{"Field":true}`), &obj) |
| should.NotNil(err) |
| } |
| |
| func Test_bool_can_be_null(t *testing.T) { |
| type TestData struct { |
| Field bool `json:"field"` |
| } |
| should := require.New(t) |
| |
| obj := TestData{} |
| data1 := []byte(`{"field": true}`) |
| err := Unmarshal(data1, &obj) |
| should.NoError(err) |
| should.Equal(true, obj.Field) |
| |
| data2 := []byte(`{"field": null}`) |
| err = Unmarshal(data2, &obj) |
| should.NoError(err) |
| // Same behavior as stdlib, not touching the existing value. |
| should.Equal(true, obj.Field) |
| |
| // Checking stdlib behavior as well |
| obj2 := TestData{} |
| err = json.Unmarshal(data1, &obj2) |
| should.NoError(err) |
| should.Equal(true, obj2.Field) |
| |
| err = json.Unmarshal(data2, &obj2) |
| should.NoError(err) |
| should.Equal(true, obj2.Field) |
| } |