diff --git a/encode.go b/encode.go index fb1fc283..14c2c38f 100644 --- a/encode.go +++ b/encode.go @@ -201,7 +201,7 @@ func (e *Encoder) Encode(v interface{}) error { if vv != nil { e.buffer = encBool(e.buffer, *vv) } else { - e.buffer = encBool(e.buffer, false) + e.buffer = EncNull(e.buffer) } case reflect.Int32: if t == _typeOfRune { @@ -219,7 +219,12 @@ func (e *Encoder) Encode(v interface{}) error { reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: // resolve base type vVal := reflect.ValueOf(v) - if reflect.Ptr == vVal.Kind() && !vVal.IsNil() { + if reflect.Ptr == vVal.Kind() { + if vVal.IsNil() { + e.buffer = EncNull(e.buffer) + return nil + } + return e.Encode(vVal.Elem().Interface()) } default: diff --git a/int.go b/int.go index 1c5fd7b3..3000ce4d 100644 --- a/int.go +++ b/int.go @@ -112,7 +112,7 @@ func (d *Decoder) decInt32(flag int32) (int32, error) { func (e *Encoder) encTypeInt32(b []byte, p interface{}) ([]byte, error) { value := reflect.ValueOf(p) - if PackPtr(value).IsNil() { + if value.Kind() == reflect.Ptr && value.IsNil() || PackPtr(value).IsNil() { return EncNull(b), nil } value = UnpackPtrValue(value) diff --git a/null_test.go b/null_test.go index 2e0bab88..5bb430ec 100644 --- a/null_test.go +++ b/null_test.go @@ -34,6 +34,78 @@ func TestNull(t *testing.T) { testDecodeFramework(t, "replyNull", nil) } -func TestNulEncode(t *testing.T) { +func TestNullEncode(t *testing.T) { testJavaDecode(t, "argNull", nil) } + +func TestNullIntPtr(t *testing.T) { + e := NewEncoder() + var null *int = nil + e.Encode(null) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("N"), e.buffer, t) +} + +func TestNullBoolPtr(t *testing.T) { + e := NewEncoder() + var null *bool = nil + e.Encode(null) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("N"), e.buffer, t) +} + +func TestNullInt32Ptr(t *testing.T) { + e := NewEncoder() + var null *int32 = nil + e.Encode(null) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("N"), e.buffer, t) +} + +func TestNullSlice(t *testing.T) { + e := NewEncoder() + var null []int32 = nil + e.Encode(null) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("N"), e.buffer, t) +} + +func TestNullMap(t *testing.T) { + e := NewEncoder() + var null map[bool]int32 = nil + e.Encode(null) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("N"), e.buffer, t) +} + +type NullFieldStruct struct { + Int *int + Bool *bool + Int32 *int32 + Slice []int32 + Map map[bool]int32 +} + +func (*NullFieldStruct) JavaClassName() string { + return "NullFieldStruct" +} + +func TestNullFieldStruct(t *testing.T) { + e := NewEncoder() + req := &NullFieldStruct{} + e.Encode(req) + if e.Buffer() == nil { + t.Fail() + } + assertEqual([]byte("NNNNN"), e.buffer[len(e.buffer)-5:], t) +} diff --git a/object_test.go b/object_test.go index a47bd1bd..5fdb9014 100644 --- a/object_test.go +++ b/object_test.go @@ -681,11 +681,7 @@ func TestBasePointer(t *testing.T) { base = BasePointer{ A: nil, } - expectedF := false - expectedBase := BasePointer{ - A: &expectedF, - } - doTestBasePointer(t, &base, &expectedBase) + doTestBasePointer(t, &base, &base) } func doTestBasePointer(t *testing.T, base *BasePointer, expected *BasePointer) {