@@ -264,7 +264,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float)
264264 BOOST_CHECK (val2.is_double ());
265265 BOOST_CHECK (fabs (12.34 - val2.as_double ()) <= kEPS );
266266 BOOST_CHECK_NO_THROW (boost::get<double >(val2));
267- BOOST_CHECK (fabs (val2 .as_double () - val2.as_double ()) <= kEPS );
267+ BOOST_CHECK (fabs (val1 .as_double () - val2.as_double ()) <= kEPS );
268268}
269269
270270BOOST_AUTO_TEST_CASE (object_variant_float)
@@ -277,7 +277,8 @@ BOOST_AUTO_TEST_CASE(object_variant_float)
277277 BOOST_CHECK (val2.is_double ());
278278 BOOST_CHECK (fabs (12.34 - val2.as_double ()) <= kEPS );
279279 BOOST_CHECK_NO_THROW (boost::get<double >(val2));
280- BOOST_CHECK (fabs (val2.as_double () - val2.as_double ()) <= kEPS );
280+ BOOST_CHECK (fabs (val1.as_double () - val2.as_double ()) <= kEPS );
281+ BOOST_CHECK (val1 == val2);
281282}
282283
283284BOOST_AUTO_TEST_CASE (object_with_zone_variant_float)
@@ -291,7 +292,116 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_float)
291292 BOOST_CHECK (val2.is_double ());
292293 BOOST_CHECK (fabs (12.34 - val2.as_double ()) <= kEPS );
293294 BOOST_CHECK_NO_THROW (boost::get<double >(val2));
294- BOOST_CHECK (fabs (val2.as_double () - val2.as_double ()) <= kEPS );
295+ BOOST_CHECK (fabs (val1.as_double () - val2.as_double ()) <= kEPS );
296+ BOOST_CHECK (val1 == val2);
297+ }
298+
299+ BOOST_AUTO_TEST_CASE (pack_convert_variant_float_zero_atdp_positive)
300+ {
301+ std::stringstream ss;
302+ msgpack::type::variant val1 = 12.0 ;
303+ BOOST_CHECK (val1.is_uint64_t ());
304+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), 12 );
305+ BOOST_CHECK (fabs (12.0 - val1.as_double ()) <= kEPS );
306+
307+ msgpack::pack (ss, val1);
308+
309+ std::string const & str = ss.str ();
310+ msgpack::object_handle oh =
311+ msgpack::unpack (str.data (), str.size ());
312+ msgpack::type::variant val2 = oh.get ().as <msgpack::type::variant>();
313+ BOOST_CHECK (val2.is_uint64_t ());
314+ BOOST_CHECK_EQUAL (val2.as_uint64_t (), 12 );
315+ BOOST_CHECK_NO_THROW (boost::get<uint64_t >(val2));
316+ BOOST_CHECK (fabs (12.0 - val2.as_double ()) <= kEPS );
317+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), val2.as_uint64_t ());
318+ }
319+
320+ BOOST_AUTO_TEST_CASE (object_variant_float_zero_atdp_positive)
321+ {
322+ msgpack::type::variant val1 = 12.0 ;
323+ BOOST_CHECK (val1.is_uint64_t ());
324+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), 12 );
325+ BOOST_CHECK (fabs (12.0 - val1.as_double ()) <= kEPS );
326+ msgpack::object obj (val1);
327+ msgpack::type::variant val2 = obj.as <msgpack::type::variant>();
328+ BOOST_CHECK (val2.is_uint64_t ());
329+ BOOST_CHECK_EQUAL (val2.as_uint64_t (), 12 );
330+ BOOST_CHECK_NO_THROW (boost::get<uint64_t >(val2));
331+ BOOST_CHECK (fabs (12.0 - val2.as_double ()) <= kEPS );
332+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), val2.as_uint64_t ());
333+ BOOST_CHECK (val1 == val2);
334+ }
335+
336+ BOOST_AUTO_TEST_CASE (object_with_zone_variant_float_zero_atdp_positive)
337+ {
338+ msgpack::zone z;
339+ msgpack::type::variant val1 = 12.0 ;
340+ BOOST_CHECK (val1.is_uint64_t ());
341+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), 12 );
342+ BOOST_CHECK (fabs (12.0 - val1.as_double ()) <= kEPS );
343+ msgpack::object obj (val1, z);
344+ msgpack::type::variant val2 = obj.as <msgpack::type::variant>();
345+ BOOST_CHECK (val2.is_uint64_t ());
346+ BOOST_CHECK_EQUAL (val2.as_uint64_t (), 12 );
347+ BOOST_CHECK_NO_THROW (boost::get<uint64_t >(val2));
348+ BOOST_CHECK_EQUAL (val1.as_uint64_t (), val2.as_uint64_t ());
349+ BOOST_CHECK (fabs (12.0 - val2.as_double ()) <= kEPS );
350+ BOOST_CHECK (val1 == val2);
351+ }
352+
353+ BOOST_AUTO_TEST_CASE (pack_convert_variant_float_zero_atdp_negative)
354+ {
355+ std::stringstream ss;
356+ msgpack::type::variant val1 = -12.0 ;
357+ BOOST_CHECK (val1.is_int64_t ());
358+ BOOST_CHECK_EQUAL (val1.as_int64_t (), -12 );
359+ BOOST_CHECK (fabs (-12.0 - val1.as_double ()) <= kEPS );
360+
361+ msgpack::pack (ss, val1);
362+
363+ std::string const & str = ss.str ();
364+ msgpack::object_handle oh =
365+ msgpack::unpack (str.data (), str.size ());
366+ msgpack::type::variant val2 = oh.get ().as <msgpack::type::variant>();
367+ BOOST_CHECK (val2.is_int64_t ());
368+ BOOST_CHECK_EQUAL (val2.as_int64_t (), -12 );
369+ BOOST_CHECK_NO_THROW (boost::get<int64_t >(val2));
370+ BOOST_CHECK (fabs (-12.0 - val2.as_double ()) <= kEPS );
371+ BOOST_CHECK_EQUAL (val1.as_int64_t (), val2.as_int64_t ());
372+ }
373+
374+ BOOST_AUTO_TEST_CASE (object_variant_float_zero_atdp_negative)
375+ {
376+ msgpack::type::variant val1 = -12.0 ;
377+ BOOST_CHECK (val1.is_int64_t ());
378+ BOOST_CHECK_EQUAL (val1.as_int64_t (), -12 );
379+ BOOST_CHECK (fabs (-12.0 - val1.as_double ()) <= kEPS );
380+ msgpack::object obj (val1);
381+ msgpack::type::variant val2 = obj.as <msgpack::type::variant>();
382+ BOOST_CHECK (val2.is_int64_t ());
383+ BOOST_CHECK_EQUAL (val2.as_int64_t (), -12 );
384+ BOOST_CHECK_NO_THROW (boost::get<int64_t >(val2));
385+ BOOST_CHECK (fabs (-12.0 - val2.as_double ()) <= kEPS );
386+ BOOST_CHECK_EQUAL (val1.as_int64_t (), val2.as_int64_t ());
387+ BOOST_CHECK (val1 == val2);
388+ }
389+
390+ BOOST_AUTO_TEST_CASE (object_with_zone_variant_float_zero_atdp_negative)
391+ {
392+ msgpack::zone z;
393+ msgpack::type::variant val1 = -12.0 ;
394+ BOOST_CHECK (val1.is_int64_t ());
395+ BOOST_CHECK_EQUAL (val1.as_int64_t (), -12 );
396+ BOOST_CHECK (fabs (-12.0 - val1.as_double ()) <= kEPS );
397+ msgpack::object obj (val1, z);
398+ msgpack::type::variant val2 = obj.as <msgpack::type::variant>();
399+ BOOST_CHECK (val2.is_int64_t ());
400+ BOOST_CHECK_EQUAL (val2.as_int64_t (), -12 );
401+ BOOST_CHECK_NO_THROW (boost::get<int64_t >(val2));
402+ BOOST_CHECK (fabs (-12.0 - val2.as_double ()) <= kEPS );
403+ BOOST_CHECK_EQUAL (val1.as_int64_t (), val2.as_int64_t ());
404+ BOOST_CHECK (val1 == val2);
295405}
296406
297407// str
0 commit comments