package jsoniter

import (
	"bytes"
	"encoding/json"
	"github.com/json-iterator/go/require"
	"testing"
)

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.Flush()
	should.Nil(stream.Error)
	should.Equal("truefalse", 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)
	stream.Flush()
	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)
}