@@ -1049,4 +1049,158 @@ TEST(MSGPACK_CHRONO, system_clock_impl_now)
10491049 EXPECT_EQ (val1, val3);
10501050}
10511051
1052+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_zero)
1053+ {
1054+ std::stringstream ss;
1055+ timespec val1{ 0 , 0 };
1056+
1057+ msgpack::pack (ss, val1);
1058+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xd6 ));
1059+
1060+ msgpack::object_handle oh;
1061+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1062+ timespec val2 = oh.get ().as <timespec>();
1063+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1064+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1065+ }
1066+
1067+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_zero)
1068+ {
1069+ msgpack::zone z;
1070+ timespec val1{ 0 , 0 };
1071+ msgpack::object obj (val1, z);
1072+ timespec val2 = obj.as <timespec>();
1073+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1074+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1075+ }
1076+
1077+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_32bit_sec)
1078+ {
1079+ std::stringstream ss;
1080+ timespec val1{ 0xffffffffUL , 0 };
1081+
1082+ msgpack::pack (ss, val1);
1083+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xd6 ));
1084+
1085+ msgpack::object_handle oh;
1086+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1087+ timespec val2 = oh.get ().as <timespec>();
1088+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1089+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1090+ }
1091+
1092+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_32bit_sec)
1093+ {
1094+ msgpack::zone z;
1095+ timespec val1{ 0xffffffffUL , 0 };
1096+ msgpack::object obj (val1, z);
1097+ timespec val2 = obj.as <timespec>();
1098+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1099+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1100+ }
1101+
1102+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_max_nano)
1103+ {
1104+ std::stringstream ss;
1105+ timespec val1{ 0 , 999999999 };
1106+
1107+ msgpack::pack (ss, val1);
1108+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xd7 ));
1109+ msgpack::object_handle oh;
1110+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1111+ timespec val2 = oh.get ().as <timespec>();
1112+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1113+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1114+ }
1115+
1116+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_max_nano)
1117+ {
1118+ msgpack::zone z;
1119+ timespec val1{ 0 , 999999999 };
1120+ msgpack::object obj (val1, z);
1121+ timespec val2 = obj.as <timespec>();
1122+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1123+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1124+ }
1125+
1126+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_34bit_sec_max_nano)
1127+ {
1128+ if (sizeof (decltype (std::declval<timespec>().tv_sec )) <= 4 ) return ;
1129+ std::stringstream ss;
1130+ timespec val1{ static_cast <decltype (std::declval<timespec>().tv_sec )>(0x3ffffffffULL ), 999999999 };
1131+
1132+ msgpack::pack (ss, val1);
1133+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xd7 ));
1134+
1135+ msgpack::object_handle oh;
1136+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1137+ timespec val2 = oh.get ().as <timespec>();
1138+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1139+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1140+ }
1141+
1142+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_34bit_sec_max_nano)
1143+ {
1144+ if (sizeof (decltype (std::declval<timespec>().tv_sec )) <= 4 ) return ;
1145+ msgpack::zone z;
1146+ timespec val1{ static_cast <decltype (std::declval<timespec>().tv_sec )>(0x3ffffffffULL ), 999999999 };
1147+ msgpack::object obj (val1, z);
1148+ timespec val2 = obj.as <timespec>();
1149+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1150+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1151+ }
1152+
1153+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_35bit_sec_max_nano)
1154+ {
1155+ if (sizeof (decltype (std::declval<timespec>().tv_sec )) <= 4 ) return ;
1156+ std::stringstream ss;
1157+ timespec val1{ static_cast <decltype (std::declval<timespec>().tv_sec )>(0x7ffffffffULL ), 999999999 };
1158+
1159+ msgpack::pack (ss, val1);
1160+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xc7 ));
1161+
1162+ msgpack::object_handle oh;
1163+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1164+ timespec val2 = oh.get ().as <timespec>();
1165+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1166+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1167+ }
1168+
1169+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_35bit_sec_max_nano)
1170+ {
1171+ if (sizeof (decltype (std::declval<timespec>().tv_sec )) <= 4 ) return ;
1172+ msgpack::zone z;
1173+ timespec val1{ static_cast <decltype (std::declval<timespec>().tv_sec )>(0x7ffffffffULL ), 999999999 };
1174+ msgpack::object obj (val1, z);
1175+ timespec val2 = obj.as <timespec>();
1176+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1177+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1178+ }
1179+
1180+ TEST (MSGPACK_TIMESPEC, timespec_pack_convert_64bit_sec_max_nano)
1181+ {
1182+ std::stringstream ss;
1183+ timespec val1{ std::numeric_limits<decltype (std::declval<timespec>().tv_sec )>::max (), 999999999 };
1184+
1185+ msgpack::pack (ss, val1);
1186+ EXPECT_EQ (ss.str ().data ()[0 ], static_cast <char >(0xc7 ));
1187+
1188+ msgpack::object_handle oh;
1189+ msgpack::unpack (oh, ss.str ().data (), ss.str ().size ());
1190+ timespec val2 = oh.get ().as <timespec>();
1191+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1192+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1193+ }
1194+
1195+ TEST (MSGPACK_TIMESPEC, timespec_object_with_zone_64bit_sec_max_nano)
1196+ {
1197+ msgpack::zone z;
1198+ timespec val1{ std::numeric_limits<decltype (std::declval<timespec>().tv_sec )>::max (), 999999999 };
1199+ msgpack::object obj (val1, z);
1200+ timespec val2 = obj.as <timespec>();
1201+ EXPECT_EQ (val1.tv_sec , val2.tv_sec );
1202+ EXPECT_EQ (val1.tv_nsec , val2.tv_nsec );
1203+ }
1204+
1205+
10521206#endif // !defined(MSGPACK_USE_CPP03)
0 commit comments