@@ -189,6 +189,49 @@ BOOST_AUTO_TEST_CASE(simple_buffer_float)
189189 }
190190}
191191
192+ BOOST_AUTO_TEST_CASE (simple_buffer_pack_fix_float)
193+ {
194+ vector<float > v;
195+ v.push_back (0.0 );
196+ v.push_back (-0.0 );
197+ v.push_back (1.0 );
198+ v.push_back (-1.0 );
199+ v.push_back (numeric_limits<float >::min ());
200+ v.push_back (numeric_limits<float >::max ());
201+ v.push_back (nanf (" tag" ));
202+ if (numeric_limits<float >::has_infinity) {
203+ v.push_back (numeric_limits<float >::infinity ());
204+ v.push_back (-numeric_limits<float >::infinity ());
205+ }
206+ if (numeric_limits<float >::has_quiet_NaN) {
207+ v.push_back (numeric_limits<float >::quiet_NaN ());
208+ }
209+ if (numeric_limits<float >::has_signaling_NaN) {
210+ v.push_back (numeric_limits<float >::signaling_NaN ());
211+ }
212+
213+ for (unsigned int i = 0 ; i < kLoop ; i++) {
214+ v.push_back (static_cast <float >(msgpack_rand ()));
215+ v.push_back (static_cast <float >(-msgpack_rand ()));
216+ }
217+ for (unsigned int i = 0 ; i < v.size () ; i++) {
218+ msgpack::sbuffer sbuf;
219+ msgpack::packer<msgpack::sbuffer> packer (sbuf);
220+ float val1 = v[i];
221+ packer.pack_fix_float (val1);
222+ msgpack::object_handle oh =
223+ msgpack::unpack (sbuf.data (), sbuf.size ());
224+ float val2 = oh.get ().as <float >();
225+
226+ if (std::isnan (val1))
227+ BOOST_CHECK (std::isnan (val2));
228+ else if (std::isinf (val1))
229+ BOOST_CHECK (std::isinf (val2));
230+ else
231+ BOOST_CHECK (fabs (val2 - val1) <= kEPS );
232+ }
233+ }
234+
192235#endif // !defined(_MSC_VER) || _MSC_VER >=1800
193236
194237namespace {
@@ -275,6 +318,53 @@ BOOST_AUTO_TEST_CASE(simple_buffer_double)
275318 }
276319}
277320
321+ BOOST_AUTO_TEST_CASE (simple_buffer_pack_fix_double)
322+ {
323+ vector<double > v;
324+ v.push_back (0.0 );
325+ v.push_back (-0.0 );
326+ v.push_back (1.0 );
327+ v.push_back (-1.0 );
328+ v.push_back (numeric_limits<double >::min ());
329+ v.push_back (numeric_limits<double >::max ());
330+ v.push_back (nanf (" tag" ));
331+ if (numeric_limits<double >::has_infinity) {
332+ v.push_back (numeric_limits<double >::infinity ());
333+ v.push_back (-numeric_limits<double >::infinity ());
334+ }
335+ if (numeric_limits<double >::has_quiet_NaN) {
336+ v.push_back (numeric_limits<double >::quiet_NaN ());
337+ }
338+ if (numeric_limits<double >::has_signaling_NaN) {
339+ v.push_back (numeric_limits<double >::signaling_NaN ());
340+ }
341+ for (unsigned int i = 0 ; i < kLoop ; i++) {
342+ v.push_back (msgpack_rand ());
343+ v.push_back (-msgpack_rand ());
344+ }
345+
346+ for (unsigned int i = 0 ; i < kLoop ; i++) {
347+ v.push_back (msgpack_rand ());
348+ v.push_back (-msgpack_rand ());
349+ }
350+ for (unsigned int i = 0 ; i < v.size () ; i++) {
351+ msgpack::sbuffer sbuf;
352+ msgpack::packer<msgpack::sbuffer> packer (sbuf);
353+ double val1 = v[i];
354+ packer.pack_fix_double (val1);
355+ msgpack::object_handle oh =
356+ msgpack::unpack (sbuf.data (), sbuf.size ());
357+ double val2 = oh.get ().as <double >();
358+
359+ if (std::isnan (val1))
360+ BOOST_CHECK (std::isnan (val2));
361+ else if (std::isinf (val1))
362+ BOOST_CHECK (std::isinf (val2));
363+ else
364+ BOOST_CHECK (fabs (val2 - val1) <= kEPS );
365+ }
366+ }
367+
278368#endif // !defined(_MSC_VER) || _MSC_VER >=1800
279369
280370BOOST_AUTO_TEST_CASE (simple_buffer_nil)
0 commit comments