@@ -1028,6 +1028,73 @@ func TestDecodeFloat32FromFloat64(t *testing.T) {
10281028 require .Error (t , msgpack .Unmarshal (b , & f ))
10291029}
10301030
1031+ func TestDecodeInt64FromFloat64 (t * testing.T ) {
1032+ // Issue #2: float64-encoded values (e.g. from JSON) should decode into int64/uint64.
1033+
1034+ t .Run ("happy path" , func (t * testing.T ) {
1035+ // float64 -> int64
1036+ b , err := msgpack .Marshal (float64 (10 ))
1037+ require .NoError (t , err )
1038+ var i int64
1039+ require .NoError (t , msgpack .Unmarshal (b , & i ))
1040+ require .Equal (t , int64 (10 ), i )
1041+
1042+ // float64 -> uint64
1043+ var u uint64
1044+ require .NoError (t , msgpack .Unmarshal (b , & u ))
1045+ require .Equal (t , uint64 (10 ), u )
1046+
1047+ // float32 -> int64
1048+ b , err = msgpack .Marshal (float32 (42 ))
1049+ require .NoError (t , err )
1050+ require .NoError (t , msgpack .Unmarshal (b , & i ))
1051+ require .Equal (t , int64 (42 ), i )
1052+
1053+ // negative float64 -> int64
1054+ b , err = msgpack .Marshal (float64 (- 7 ))
1055+ require .NoError (t , err )
1056+ require .NoError (t , msgpack .Unmarshal (b , & i ))
1057+ require .Equal (t , int64 (- 7 ), i )
1058+
1059+ // zero
1060+ b , err = msgpack .Marshal (float64 (0 ))
1061+ require .NoError (t , err )
1062+ require .NoError (t , msgpack .Unmarshal (b , & i ))
1063+ require .Equal (t , int64 (0 ), i )
1064+ })
1065+
1066+ t .Run ("errors" , func (t * testing.T ) {
1067+ // NaN -> int64
1068+ b , err := msgpack .Marshal (math .NaN ())
1069+ require .NoError (t , err )
1070+ var i int64
1071+ require .Error (t , msgpack .Unmarshal (b , & i ))
1072+
1073+ // NaN -> uint64
1074+ var u uint64
1075+ require .Error (t , msgpack .Unmarshal (b , & u ))
1076+
1077+ // +Inf -> int64
1078+ b , _ = msgpack .Marshal (math .Inf (1 ))
1079+ require .Error (t , msgpack .Unmarshal (b , & i ))
1080+
1081+ // -Inf -> uint64
1082+ b , _ = msgpack .Marshal (math .Inf (- 1 ))
1083+ require .Error (t , msgpack .Unmarshal (b , & u ))
1084+
1085+ // fractional -> int64
1086+ b , _ = msgpack .Marshal (3.14 )
1087+ require .Error (t , msgpack .Unmarshal (b , & i ))
1088+
1089+ // fractional -> uint64
1090+ require .Error (t , msgpack .Unmarshal (b , & u ))
1091+
1092+ // negative float -> uint64
1093+ b , _ = msgpack .Marshal (float64 (- 1 ))
1094+ require .Error (t , msgpack .Unmarshal (b , & u ))
1095+ })
1096+ }
1097+
10311098func TestFloat32 (t * testing.T ) {
10321099 tests := []struct {
10331100 in float32
0 commit comments