add explicit conversion of null into float NaN
This commit is contained in:
parent
1fd2213fd2
commit
5c3738b9b1
@ -57,8 +57,21 @@ void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val)
|
||||
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::number_float_t*>());
|
||||
break;
|
||||
}
|
||||
|
||||
case value_t::null:
|
||||
{
|
||||
if(std::numeric_limits<ArithmeticType>::has_quiet_NaN)
|
||||
{
|
||||
val = std::numeric_limits<ArithmeticType>::quiet_NaN();
|
||||
break;
|
||||
}
|
||||
else if(std::numeric_limits<ArithmeticType>::has_signaling_NaN)
|
||||
{
|
||||
val = std::numeric_limits<ArithmeticType>::signaling_NaN();
|
||||
break;
|
||||
}
|
||||
// [[fallthrough]];
|
||||
}
|
||||
|
||||
case value_t::object:
|
||||
case value_t::array:
|
||||
case value_t::string:
|
||||
@ -349,8 +362,21 @@ void from_json(const BasicJsonType& j, ArithmeticType& val)
|
||||
val = static_cast<ArithmeticType>(*j.template get_ptr<const typename BasicJsonType::boolean_t*>());
|
||||
break;
|
||||
}
|
||||
|
||||
case value_t::null:
|
||||
{
|
||||
if(std::numeric_limits<ArithmeticType>::has_quiet_NaN)
|
||||
{
|
||||
val = std::numeric_limits<ArithmeticType>::quiet_NaN();
|
||||
break;
|
||||
}
|
||||
else if(std::numeric_limits<ArithmeticType>::has_signaling_NaN)
|
||||
{
|
||||
val = std::numeric_limits<ArithmeticType>::signaling_NaN();
|
||||
break;
|
||||
}
|
||||
// [[fallthrough]];
|
||||
}
|
||||
|
||||
case value_t::object:
|
||||
case value_t::array:
|
||||
case value_t::string:
|
||||
|
||||
@ -1207,10 +1207,31 @@ TEST_CASE("value conversion")
|
||||
CHECK(json(n).m_value.number_float == Approx(j.m_value.number_float));
|
||||
}
|
||||
|
||||
SECTION("exception in case of a non-string type")
|
||||
SECTION("null as NaN")
|
||||
{
|
||||
CHECK_THROWS_AS(json(json::value_t::null).get<json::number_float_t>(),
|
||||
json::type_error&);
|
||||
json jNull(nullptr);
|
||||
SECTION("number_float_t")
|
||||
{
|
||||
auto n = jNull.get<json::number_float_t>();
|
||||
CHECK(std::isnan(n));
|
||||
}
|
||||
|
||||
SECTION("float")
|
||||
{
|
||||
auto n = jNull.get<float>();
|
||||
CHECK(std::isnan(n));
|
||||
}
|
||||
|
||||
SECTION("double")
|
||||
{
|
||||
auto n = jNull.get<double>();
|
||||
CHECK(std::isnan(n));
|
||||
}
|
||||
}
|
||||
SECTION("exception in case of a non-numeric type")
|
||||
{
|
||||
// CHECK_THROWS_AS(json(json::value_t::null).get<json::number_float_t>(),
|
||||
// json::type_error&);
|
||||
CHECK_THROWS_AS(json(json::value_t::object).get<json::number_float_t>(),
|
||||
json::type_error&);
|
||||
CHECK_THROWS_AS(json(json::value_t::array).get<json::number_float_t>(),
|
||||
@ -1220,9 +1241,9 @@ TEST_CASE("value conversion")
|
||||
CHECK_THROWS_AS(json(json::value_t::boolean).get<json::number_float_t>(),
|
||||
json::type_error&);
|
||||
|
||||
CHECK_THROWS_WITH(
|
||||
json(json::value_t::null).get<json::number_float_t>(),
|
||||
"[json.exception.type_error.302] type must be number, but is null");
|
||||
// CHECK_THROWS_WITH(
|
||||
// json(json::value_t::null).get<json::number_float_t>(),
|
||||
// "[json.exception.type_error.302] type must be number, but is null");
|
||||
CHECK_THROWS_WITH(
|
||||
json(json::value_t::object).get<json::number_float_t>(),
|
||||
"[json.exception.type_error.302] type must be number, but is object");
|
||||
|
||||
Loading…
Reference in New Issue
Block a user