test_output.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. // Boost.Units - A C++ library for zero-overhead dimensional analysis and
  2. // unit/quantity manipulation and conversion
  3. //
  4. // Copyright (C) 2009 Steven Watanabe
  5. // Copyright Paul A. Bristow 2010
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See
  8. // accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. /**
  11. \file test_output.cpp
  12. \brief
  13. Test unit and quantity printing
  14. \details
  15. Tests for output from various units, name, symbol and raw formats, and automatic prefixing in engineering and binary units.
  16. **/
  17. #include <boost/units/quantity.hpp>
  18. #include <boost/units/io.hpp>
  19. #include <boost/units/unit.hpp>
  20. #include <boost/units/scale.hpp>
  21. #include <boost/units/scaled_base_unit.hpp>
  22. #include <boost/units/make_scaled_unit.hpp>
  23. #include <boost/units/base_unit.hpp>
  24. #include <boost/units/make_system.hpp>
  25. #include <boost/units/absolute.hpp>
  26. #include <boost/units/physical_dimensions/length.hpp>
  27. #include <boost/units/physical_dimensions/time.hpp>
  28. #include <boost/units/physical_dimensions/velocity.hpp>
  29. #include <boost/units/physical_dimensions/volume.hpp>
  30. #include <boost/units/physical_dimensions/acceleration.hpp>
  31. #include <boost/units/physical_dimensions/area.hpp>
  32. #include <boost/regex.hpp>
  33. #include <iostream>
  34. #include <sstream>
  35. #include <boost/config.hpp>
  36. #include <limits>
  37. #define BOOST_TEST_MAIN
  38. #include <boost/test/unit_test.hpp>
  39. struct meter_base_unit : boost::units::base_unit<meter_base_unit, boost::units::length_dimension, 1> {
  40. static BOOST_CONSTEXPR const char* name() { return("meter"); }
  41. static BOOST_CONSTEXPR const char* symbol() { return("m"); }
  42. };
  43. struct second_base_unit : boost::units::base_unit<second_base_unit, boost::units::time_dimension, 2> {
  44. static BOOST_CONSTEXPR const char* name() { return("second"); }
  45. static BOOST_CONSTEXPR const char* symbol() { return("s"); }
  46. };
  47. struct byte_base_unit : boost::units::base_unit<byte_base_unit, boost::units::dimensionless_type, 3> {
  48. static BOOST_CONSTEXPR const char* name() { return("byte"); }
  49. static BOOST_CONSTEXPR const char* symbol() { return("b"); }
  50. };
  51. typedef boost::units::make_system<meter_base_unit, second_base_unit>::type my_system;
  52. typedef boost::units::unit<boost::units::length_dimension, my_system> length;
  53. typedef boost::units::unit<boost::units::velocity_dimension, my_system> velocity;
  54. typedef boost::units::make_scaled_unit<length, boost::units::scale<10, boost::units::static_rational<3> > >::type scaled_length;
  55. typedef boost::units::make_scaled_unit<velocity, boost::units::scale<10, boost::units::static_rational<3> > >::type scaled_velocity1;
  56. typedef boost::units::scaled_base_unit<second_base_unit, boost::units::scale<10, boost::units::static_rational<-3> > > millisecond_base_unit;
  57. typedef boost::units::make_system<meter_base_unit, millisecond_base_unit>::type scaled_system;
  58. typedef boost::units::unit<boost::units::time_dimension, scaled_system> scaled_time;
  59. typedef boost::units::unit<boost::units::velocity_dimension, scaled_system> scaled_velocity2;
  60. typedef boost::units::unit<boost::units::area_dimension, my_system> area;
  61. typedef boost::units::make_scaled_unit<area, boost::units::scale<10, boost::units::static_rational<3> > >::type scaled_area;
  62. typedef boost::units::make_scaled_unit<scaled_length, boost::units::scale<2, boost::units::static_rational<10> > >::type double_scaled_length;
  63. typedef boost::units::scaled_base_unit<meter_base_unit, boost::units::scale<100, boost::units::static_rational<1> > > scaled_length_base_unit;
  64. namespace boost {
  65. namespace units {
  66. template<>
  67. struct base_unit_info<scaled_length_base_unit> {
  68. static BOOST_CONSTEXPR const char* symbol() { return("scm"); }
  69. static BOOST_CONSTEXPR const char* name() { return("scaled_meter"); }
  70. };
  71. }
  72. }
  73. typedef boost::units::scaled_base_unit<scaled_length_base_unit, boost::units::scale<10, boost::units::static_rational<3> > > double_scaled_length_base_unit;
  74. typedef double_scaled_length_base_unit::unit_type double_scaled_length2;
  75. typedef boost::units::reduce_unit<boost::units::unit<boost::units::volume_dimension, my_system> >::type custom1;
  76. std::string name_string(const custom1&) { return("custom1"); }
  77. std::string symbol_string(const custom1&) { return("c1"); }
  78. typedef boost::units::reduce_unit<boost::units::unit<boost::units::acceleration_dimension, my_system> >::type custom2;
  79. BOOST_CONSTEXPR const char* name_string(const custom2&) { return("custom2"); }
  80. BOOST_CONSTEXPR const char* symbol_string(const custom2&) { return("c2"); }
  81. typedef boost::units::make_scaled_unit<custom1, boost::units::scale<10, boost::units::static_rational<3> > >::type scaled_custom1;
  82. typedef boost::units::make_scaled_unit<custom2, boost::units::scale<10, boost::units::static_rational<3> > >::type scaled_custom2;
  83. #ifndef BOOST_NO_CWCHAR
  84. #define BOOST_UNITS_TEST_OUTPUT(v, expected) \
  85. { \
  86. std::ostringstream ss; \
  87. ss FORMATTERS << v; \
  88. BOOST_CHECK_EQUAL(ss.str(), expected); \
  89. } \
  90. { \
  91. std::wostringstream ss; \
  92. ss FORMATTERS << v; \
  93. BOOST_CHECK(ss.str() == BOOST_PP_CAT(L, expected)); \
  94. }
  95. #define BOOST_UNITS_TEST_OUTPUT_REGEX(v, expected) \
  96. { \
  97. std::ostringstream ss; \
  98. ss FORMATTERS << v; \
  99. boost::regex r(expected); \
  100. BOOST_CHECK_MESSAGE(boost::regex_match(ss.str(), r), \
  101. ss.str() + " does not match " + expected); \
  102. } \
  103. { \
  104. std::wostringstream ss; \
  105. ss FORMATTERS << v; \
  106. boost::wregex r(BOOST_PP_CAT(L, expected)); \
  107. BOOST_CHECK(boost::regex_match(ss.str(), r)); \
  108. }
  109. #define BOOST_UNITS_TEST_OUTPUT_DISPLAY(v) \
  110. { \
  111. std::ostringstream ss; \
  112. ss FORMATTERS << v; \
  113. std::cout << #v << ": " << ss.str() << std::endl; \
  114. } \
  115. { \
  116. std::wostringstream ss; \
  117. ss FORMATTERS << v; \
  118. std::wcout << #v << ": " << ss.str() << std::endl; \
  119. }
  120. #else
  121. #define BOOST_UNITS_TEST_OUTPUT(v, expected) \
  122. { \
  123. std::ostringstream ss; \
  124. ss FORMATTERS << v; \
  125. BOOST_CHECK_EQUAL(ss.str(), expected); \
  126. }
  127. #define BOOST_UNITS_TEST_OUTPUT_REGEX(v, expected) \
  128. { \
  129. std::ostringstream ss; \
  130. ss FORMATTERS << v; \
  131. boost::regex r(expected); \
  132. BOOST_CHECK_MESSAGE(boost::regex_match(ss.str(), r), \
  133. ss.str() + " does not match " + expected); \
  134. }
  135. #define BOOST_UNITS_TEST_OUTPUT_DISPLAY(v) \
  136. { \
  137. std::ostringstream ss; \
  138. ss FORMATTERS << v; \
  139. std::cout << #v << ": " << ss.str() << std::endl; \
  140. }
  141. #endif
  142. BOOST_AUTO_TEST_CASE(test_output_unit_symbol)
  143. { // base units using default symbol_format (no format specified) and no auto prefixing.
  144. #define FORMATTERS
  145. BOOST_UNITS_TEST_OUTPUT(meter_base_unit::unit_type(), "m");
  146. BOOST_UNITS_TEST_OUTPUT(velocity(), "m s^-1");
  147. BOOST_UNITS_TEST_OUTPUT(scaled_length(), "km");
  148. BOOST_UNITS_TEST_OUTPUT(scaled_velocity1(), "k(m s^-1)");
  149. BOOST_UNITS_TEST_OUTPUT(millisecond_base_unit::unit_type(), "ms");
  150. BOOST_UNITS_TEST_OUTPUT(scaled_time(), "ms");
  151. BOOST_UNITS_TEST_OUTPUT(scaled_velocity2(), "m ms^-1");
  152. BOOST_UNITS_TEST_OUTPUT(area(), "m^2");
  153. BOOST_UNITS_TEST_OUTPUT(scaled_area(), "k(m^2)");
  154. BOOST_UNITS_TEST_OUTPUT(double_scaled_length(), "Kikm");
  155. BOOST_UNITS_TEST_OUTPUT(double_scaled_length2(), "kscm");
  156. BOOST_UNITS_TEST_OUTPUT(custom1(), "c1");
  157. BOOST_UNITS_TEST_OUTPUT(custom2(), "c2");
  158. BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "kc1");
  159. BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "kc2");
  160. BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute m");
  161. #undef FORMATTERS
  162. }
  163. BOOST_AUTO_TEST_CASE(test_output_unit_raw)
  164. { // raw format specified
  165. #define FORMATTERS << boost::units::raw_format
  166. BOOST_UNITS_TEST_OUTPUT(meter_base_unit::unit_type(), "m");
  167. BOOST_UNITS_TEST_OUTPUT(velocity(), "m s^-1");
  168. BOOST_UNITS_TEST_OUTPUT(scaled_length(), "km");
  169. BOOST_UNITS_TEST_OUTPUT(scaled_velocity1(), "k(m s^-1)");
  170. BOOST_UNITS_TEST_OUTPUT(millisecond_base_unit::unit_type(), "ms");
  171. BOOST_UNITS_TEST_OUTPUT(scaled_time(), "ms");
  172. BOOST_UNITS_TEST_OUTPUT(scaled_velocity2(), "m ms^-1");
  173. BOOST_UNITS_TEST_OUTPUT(area(), "m^2");
  174. BOOST_UNITS_TEST_OUTPUT(scaled_area(), "k(m^2)");
  175. BOOST_UNITS_TEST_OUTPUT(double_scaled_length(), "Kikm");
  176. BOOST_UNITS_TEST_OUTPUT(double_scaled_length2(), "kscm");
  177. // when using raw format, we ignore the user defined overloads
  178. BOOST_UNITS_TEST_OUTPUT(custom1(), "m^3");
  179. BOOST_UNITS_TEST_OUTPUT(custom2(), "m s^-2");
  180. BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "k(m^3)");
  181. BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "k(m s^-2)");
  182. BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute m");
  183. #undef FORMATTERS
  184. }
  185. BOOST_AUTO_TEST_CASE(test_output_unit_name)
  186. { // name format specified.
  187. #define FORMATTERS << boost::units::name_format
  188. BOOST_UNITS_TEST_OUTPUT(meter_base_unit::unit_type(), "meter");
  189. BOOST_UNITS_TEST_OUTPUT(velocity(), "meter second^-1");
  190. BOOST_UNITS_TEST_OUTPUT(scaled_length(), "kilometer");
  191. BOOST_UNITS_TEST_OUTPUT(scaled_velocity1(), "kilo(meter second^-1)");
  192. BOOST_UNITS_TEST_OUTPUT(millisecond_base_unit::unit_type(), "millisecond");
  193. BOOST_UNITS_TEST_OUTPUT(scaled_time(), "millisecond");
  194. BOOST_UNITS_TEST_OUTPUT(scaled_velocity2(), "meter millisecond^-1");
  195. BOOST_UNITS_TEST_OUTPUT(area(), "meter^2");
  196. BOOST_UNITS_TEST_OUTPUT(scaled_area(), "kilo(meter^2)");
  197. BOOST_UNITS_TEST_OUTPUT(double_scaled_length(), "kibikilometer");
  198. BOOST_UNITS_TEST_OUTPUT(double_scaled_length2(), "kiloscaled_meter");
  199. BOOST_UNITS_TEST_OUTPUT(custom1(), "custom1");
  200. BOOST_UNITS_TEST_OUTPUT(custom2(), "custom2");
  201. BOOST_UNITS_TEST_OUTPUT(scaled_custom1(), "kilocustom1");
  202. BOOST_UNITS_TEST_OUTPUT(scaled_custom2(), "kilocustom2");
  203. BOOST_UNITS_TEST_OUTPUT(boost::units::absolute<meter_base_unit::unit_type>(), "absolute meter");
  204. #undef FORMATTERS
  205. }
  206. BOOST_AUTO_TEST_CASE(test_output_quantity_symbol)
  207. { // quantity symbols using default format.
  208. #define FORMATTERS
  209. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 m");
  210. BOOST_UNITS_TEST_OUTPUT(1.5*velocity(), "1.5 m s^-1");
  211. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_length(), "1.5 km");
  212. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity1(), "1.5 k(m s^-1)");
  213. BOOST_UNITS_TEST_OUTPUT(1.5*millisecond_base_unit::unit_type(), "1.5 ms");
  214. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_time(), "1.5 ms");
  215. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity2(), "1.5 m ms^-1");
  216. BOOST_UNITS_TEST_OUTPUT(1.5*area(), "1.5 m^2");
  217. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_area(), "1.5 k(m^2)");
  218. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length(), "1.5 Kikm");
  219. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length2(), "1.5 kscm");
  220. BOOST_UNITS_TEST_OUTPUT(1.5*custom1(), "1.5 c1");
  221. BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 c2");
  222. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kc1");
  223. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kc2");
  224. BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute m");
  225. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 10) * byte_base_unit::unit_type(), "1024 b");
  226. #undef FORMATTERS
  227. }
  228. BOOST_AUTO_TEST_CASE(test_output_quantity_raw)
  229. { // quantity symbols using raw format.
  230. #define FORMATTERS << boost::units::raw_format
  231. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 m");
  232. BOOST_UNITS_TEST_OUTPUT(1.5*velocity(), "1.5 m s^-1");
  233. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_length(), "1.5 km");
  234. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity1(), "1.5 k(m s^-1)");
  235. BOOST_UNITS_TEST_OUTPUT(1.5*millisecond_base_unit::unit_type(), "1.5 ms");
  236. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_time(), "1.5 ms");
  237. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity2(), "1.5 m ms^-1");
  238. BOOST_UNITS_TEST_OUTPUT(1.5*area(), "1.5 m^2");
  239. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_area(), "1.5 k(m^2)");
  240. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length(), "1.5 Kikm");
  241. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length2(), "1.5 kscm");
  242. // when using raw format, we ignore the user defined overloads
  243. BOOST_UNITS_TEST_OUTPUT(1.5*custom1(), "1.5 m^3");
  244. BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 m s^-2");
  245. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 k(m^3)");
  246. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 k(m s^-2)");
  247. BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute m");
  248. #undef FORMATTERS
  249. }
  250. BOOST_AUTO_TEST_CASE(test_output_quantity_name)
  251. { // // quantity symbols using name format.
  252. #define FORMATTERS << boost::units::name_format
  253. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 meter");
  254. BOOST_UNITS_TEST_OUTPUT(1.5*velocity(), "1.5 meter second^-1");
  255. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_length(), "1.5 kilometer");
  256. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity1(), "1.5 kilo(meter second^-1)");
  257. BOOST_UNITS_TEST_OUTPUT(1.5*millisecond_base_unit::unit_type(), "1.5 millisecond");
  258. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_time(), "1.5 millisecond");
  259. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity2(), "1.5 meter millisecond^-1");
  260. BOOST_UNITS_TEST_OUTPUT(1.5*area(), "1.5 meter^2");
  261. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_area(), "1.5 kilo(meter^2)");
  262. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length(), "1.5 kibikilometer");
  263. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length2(), "1.5 kiloscaled_meter");
  264. BOOST_UNITS_TEST_OUTPUT(1.5*custom1(), "1.5 custom1");
  265. BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 custom2");
  266. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kilocustom1");
  267. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kilocustom2");
  268. BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute meter");
  269. #undef FORMATTERS
  270. }
  271. BOOST_AUTO_TEST_CASE(test_output_autoprefixed_quantity_name)
  272. { // Engineering autoprefix, with name format.
  273. #define FORMATTERS << boost::units::name_format << boost::units::engineering_prefix
  274. // Single base unit like meter.
  275. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 meter");
  276. BOOST_UNITS_TEST_OUTPUT(1500.0*meter_base_unit::unit_type(), "1.5 kilometer");
  277. BOOST_UNITS_TEST_OUTPUT(1.5e7*meter_base_unit::unit_type(), "15 megameter");
  278. BOOST_UNITS_TEST_OUTPUT(1.5e-3*meter_base_unit::unit_type(), "1.5 millimeter");
  279. BOOST_UNITS_TEST_OUTPUT(1.5e-9*meter_base_unit::unit_type(), "1.5 nanometer");
  280. BOOST_UNITS_TEST_OUTPUT(1.5e-8*meter_base_unit::unit_type(), "15 nanometer");
  281. BOOST_UNITS_TEST_OUTPUT(1.5e-10*meter_base_unit::unit_type(), "150 picometer");
  282. BOOST_UNITS_TEST_OUTPUT(0.0000000012345 * meter_base_unit::unit_type(), "1.2345 nanometer");
  283. // Too small or large for a multiple name.
  284. BOOST_UNITS_TEST_OUTPUT_REGEX(9.99999e-25 * meter_base_unit::unit_type(), "9\\.99999e-0?25 meter"); // Just too small for multiple.
  285. BOOST_UNITS_TEST_OUTPUT_REGEX(1e+28 * meter_base_unit::unit_type(), "1e\\+0?28 meter"); // Just too large for multiple.
  286. BOOST_UNITS_TEST_OUTPUT_REGEX(1.5e-25 * meter_base_unit::unit_type(), "1\\.5e-0?25 meter"); // Too small for multiple.
  287. BOOST_UNITS_TEST_OUTPUT_REGEX(1.5e+28 * meter_base_unit::unit_type(), "1\\.5e\\+0?28 meter"); // Too large for multiple.
  288. // Too 'biggest or too smallest'.
  289. BOOST_UNITS_TEST_OUTPUT_REGEX((std::numeric_limits<float>::max)()*meter_base_unit::unit_type(), "3\\.40282e\\+0?38 meter");
  290. BOOST_UNITS_TEST_OUTPUT_REGEX((std::numeric_limits<float>::min)()*meter_base_unit::unit_type(), "1\\.17549e-0?38 meter");
  291. BOOST_UNITS_TEST_OUTPUT((std::numeric_limits<double>::max)()*meter_base_unit::unit_type(), "1.79769e+308 meter");
  292. BOOST_UNITS_TEST_OUTPUT((std::numeric_limits<double>::min)()*meter_base_unit::unit_type(), "2.22507e-308 meter");
  293. // Infinity and NaN
  294. BOOST_UNITS_TEST_OUTPUT_REGEX(std::numeric_limits<float>::infinity()*meter_base_unit::unit_type(), "(1\\.#INF|inf|INF|Inf) meter");
  295. BOOST_UNITS_TEST_OUTPUT_REGEX(-std::numeric_limits<float>::infinity()*meter_base_unit::unit_type(), "-(1\\.#INF|inf|INF|Inf) meter");
  296. BOOST_UNITS_TEST_OUTPUT_REGEX(std::numeric_limits<double>::quiet_NaN()*meter_base_unit::unit_type(), "(1\\.#QNAN|nan|NaNQ|NaN) meter");
  297. BOOST_UNITS_TEST_OUTPUT_REGEX(-std::numeric_limits<double>::quiet_NaN()*meter_base_unit::unit_type(), "-?(1\\.#IND|nan|nan\\(ind\\)|NaNQ|NaN) meter");
  298. BOOST_UNITS_TEST_OUTPUT(1.5*velocity(), "1.5 meter second^-1");
  299. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_length(), "1.5 kilometer");
  300. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity1(), "1.5 kilo(meter second^-1)");
  301. BOOST_UNITS_TEST_OUTPUT(1.5*millisecond_base_unit::unit_type(), "1.5 millisecond");
  302. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_time(), "1.5 millisecond");
  303. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity2(), "1.5 meter millisecond^-1");
  304. BOOST_UNITS_TEST_OUTPUT(1.5*area(), "1.5 meter^2");
  305. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_area(), "1.5 kilo(meter^2)");
  306. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length(), "1.536 megameter"); // 1.5 * 2^10 = 1.5 * 1024 = 1.536
  307. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length2(), "1.5 kiloscaled_meter");
  308. BOOST_UNITS_TEST_OUTPUT(1.5*custom1(), "1.5 custom1");
  309. BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 custom2");
  310. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kilocustom1");
  311. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kilocustom2");
  312. BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute meter");
  313. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 10) * byte_base_unit::unit_type(), "1.024 kilobyte");
  314. BOOST_UNITS_TEST_OUTPUT(1.5, "1.5"); // scalar.
  315. BOOST_UNITS_TEST_OUTPUT(1567., "1567"); // scalars are *not* autoprefixed.
  316. BOOST_UNITS_TEST_OUTPUT(0.00015, "0.00015"); // scalars are *not* autoprefixed.
  317. BOOST_UNITS_TEST_OUTPUT(-1.5, "-1.5"); // scalar.
  318. BOOST_UNITS_TEST_OUTPUT(-1567., "-1567"); // scalars are *not* autoprefixed.
  319. BOOST_UNITS_TEST_OUTPUT(-0.00015, "-0.00015"); // scalars are *not* autoprefixed.
  320. #undef FORMATTERS
  321. }
  322. BOOST_AUTO_TEST_CASE(test_output_autoprefixed_quantity_symbol)
  323. { // Engineering autoprefix, with symbol format.
  324. #define FORMATTERS << boost::units::symbol_format << boost::units::engineering_prefix
  325. // Single base unit like m.
  326. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 m");
  327. BOOST_UNITS_TEST_OUTPUT(1500.0*meter_base_unit::unit_type(), "1.5 km");
  328. BOOST_UNITS_TEST_OUTPUT(1.5e7*meter_base_unit::unit_type(), "15 Mm");
  329. BOOST_UNITS_TEST_OUTPUT(1.5e-3*meter_base_unit::unit_type(), "1.5 mm");
  330. BOOST_UNITS_TEST_OUTPUT(1.5e-9*meter_base_unit::unit_type(), "1.5 nm");
  331. BOOST_UNITS_TEST_OUTPUT(1.5e-8*meter_base_unit::unit_type(), "15 nm");
  332. BOOST_UNITS_TEST_OUTPUT(1.5e-10*meter_base_unit::unit_type(), "150 pm");
  333. // Too small or large for a multiple name.
  334. BOOST_UNITS_TEST_OUTPUT_REGEX(9.99999e-25 * meter_base_unit::unit_type(), "9\\.99999e-0?25 m"); // Just too small for multiple.
  335. BOOST_UNITS_TEST_OUTPUT_REGEX(1e+28 * meter_base_unit::unit_type(), "1e\\+0?28 m"); // Just too large for multiple.
  336. BOOST_UNITS_TEST_OUTPUT_REGEX(1.5e-25 * meter_base_unit::unit_type(), "1\\.5e-0?25 m"); // Too small for multiple.
  337. BOOST_UNITS_TEST_OUTPUT_REGEX(1.5e+28 * meter_base_unit::unit_type(), "1\\.5e\\+0?28 m"); // Too large for multiple.
  338. //
  339. BOOST_UNITS_TEST_OUTPUT_REGEX((std::numeric_limits<float>::max)()*meter_base_unit::unit_type(), "3\\.40282e\\+0?38 m");
  340. BOOST_UNITS_TEST_OUTPUT_REGEX((std::numeric_limits<float>::min)()*meter_base_unit::unit_type(), "1\\.17549e-0?38 m");
  341. BOOST_UNITS_TEST_OUTPUT((std::numeric_limits<double>::max)()*meter_base_unit::unit_type(), "1.79769e+308 m");
  342. BOOST_UNITS_TEST_OUTPUT((std::numeric_limits<double>::min)()*meter_base_unit::unit_type(), "2.22507e-308 m");
  343. BOOST_UNITS_TEST_OUTPUT(1.5*velocity(), "1.5 m s^-1");
  344. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_length(), "1.5 km");
  345. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity1(), "1.5 k(m s^-1)");
  346. BOOST_UNITS_TEST_OUTPUT(1.5*millisecond_base_unit::unit_type(), "1.5 ms");
  347. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_time(), "1.5 ms");
  348. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_velocity2(), "1.5 m ms^-1");
  349. BOOST_UNITS_TEST_OUTPUT(1.5*area(), "1.5 m^2");
  350. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_area(), "1.5 k(m^2)");
  351. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length(), "1.536 Mm"); // 1.5 * 2^10 = 1.5 * 1024 = 1.536
  352. BOOST_UNITS_TEST_OUTPUT(1.5*double_scaled_length2(), "1.5 kscm");
  353. BOOST_UNITS_TEST_OUTPUT(1.5*custom1(), "1.5 c1");
  354. BOOST_UNITS_TEST_OUTPUT(1.5*custom2(), "1.5 c2");
  355. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom1(), "1.5 kc1");
  356. BOOST_UNITS_TEST_OUTPUT(1.5*scaled_custom2(), "1.5 kc2");
  357. BOOST_UNITS_TEST_OUTPUT(1.5*boost::units::absolute<meter_base_unit::unit_type>(), "1.5 absolute m");
  358. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 10) * byte_base_unit::unit_type(), "1.024 kb");
  359. #undef FORMATTERS
  360. }
  361. BOOST_AUTO_TEST_CASE(test_output_auto_binary_prefixed_quantity_symbol)
  362. { // Binary prefix with symbol format.
  363. #define FORMATTERS << boost::units::symbol_format << boost::units::binary_prefix
  364. BOOST_UNITS_TEST_OUTPUT(1024 * byte_base_unit::unit_type(), "1 Kib");
  365. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 20) * byte_base_unit::unit_type(), "1 Mib");
  366. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 30) * byte_base_unit::unit_type(), "1 Gib");
  367. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 40) * byte_base_unit::unit_type(), "1 Tib");
  368. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 50) * byte_base_unit::unit_type(), "1 Pib");
  369. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 60) * byte_base_unit::unit_type(), "1 Eib");
  370. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 70) * byte_base_unit::unit_type(), "1 Zib");
  371. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 80) * byte_base_unit::unit_type(), "1 Yib");
  372. BOOST_UNITS_TEST_OUTPUT(42, "42"); // integer scalar.
  373. BOOST_UNITS_TEST_OUTPUT(-42, "-42"); // integer scalar.
  374. BOOST_UNITS_TEST_OUTPUT(1567, "1567"); // scalars are *not* autoprefixed.
  375. BOOST_UNITS_TEST_OUTPUT(-1567, "-1567"); // scalars are *not* autoprefixed.
  376. #undef FORMATTERS
  377. }
  378. BOOST_AUTO_TEST_CASE(test_output_auto_binary_prefixed_quantity_name)
  379. { // Binary prefix with name format.
  380. // http://physics.nist.gov/cuu/Units/binary.html
  381. // 1998 the International Electrotechnical Commission (IEC) approved
  382. // IEC 60027-2, Second edition, 2000-11, Letter symbols to be used in electrical technology
  383. // - Part 2: Telecommunications and electronics.
  384. // IEC 80000-13:2008, Quantities and units
  385. // - Part 13: Information science and technology
  386. #define FORMATTERS << boost::units::name_format << boost::units::binary_prefix
  387. BOOST_UNITS_TEST_OUTPUT(2048 * byte_base_unit::unit_type(), "2 kibibyte");
  388. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 32) *byte_base_unit::unit_type(), "4 gibibyte");
  389. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 41) *byte_base_unit::unit_type(), "2 tebibyte"); // http://en.wikipedia.org/wiki/Tebibyte
  390. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 50) *byte_base_unit::unit_type(), "1 pebibyte");
  391. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 60) *byte_base_unit::unit_type(), "1 exbibyte");
  392. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 70) *byte_base_unit::unit_type(), "1 zebibyte");
  393. BOOST_UNITS_TEST_OUTPUT(std::pow(2., 80) *byte_base_unit::unit_type(), "1 yobibyte");
  394. BOOST_UNITS_TEST_OUTPUT(2048, "2048"); // scalars are *not* autoprefixed.
  395. BOOST_UNITS_TEST_OUTPUT(-4096, "-4096"); // scalars are *not* autoprefixed.
  396. #undef FORMATTERS
  397. }
  398. // Tests on using more than one format or prefix - only the last specified should be used.
  399. // (This may indicate a programming mistake, but it is ignored).
  400. BOOST_AUTO_TEST_CASE(test_output_quantity_name_duplicate)
  401. { // Ensure that if more than one format specified, only the last is used.
  402. #define FORMATTERS << boost::units::symbol_format << boost::units::name_format
  403. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 meter");
  404. #undef FORMATTERS
  405. }
  406. BOOST_AUTO_TEST_CASE(test_output_quantity_symbol_duplicate)
  407. { // Ensure that if more than one format specified, only the last is used.
  408. #define FORMATTERS << boost::units::name_format << boost::units::symbol_format
  409. BOOST_UNITS_TEST_OUTPUT(1.5*meter_base_unit::unit_type(), "1.5 m");
  410. #undef FORMATTERS
  411. }
  412. BOOST_AUTO_TEST_CASE(test_output_auto_binary_prefixed_quantity_name_duplicate)
  413. { // Ensure that if more than one auto prefix specified, only the last is used.
  414. #define FORMATTERS << boost::units::name_format << boost::units::binary_prefix << boost::units::engineering_prefix
  415. BOOST_UNITS_TEST_OUTPUT(2048 * byte_base_unit::unit_type(), "2.048 kilobyte");
  416. #undef FORMATTERS
  417. }
  418. BOOST_AUTO_TEST_CASE(test_output_auto_binary_prefixed_quantity_symbol_duplicate)
  419. { // Ensure that if more than one auto prefix specified, only the last is used.
  420. #define FORMATTERS << boost::units::symbol_format << boost::units::engineering_prefix << boost::units::binary_prefix
  421. BOOST_UNITS_TEST_OUTPUT(2048 * byte_base_unit::unit_type(), "2 Kib");
  422. #undef FORMATTERS
  423. }
  424. BOOST_AUTO_TEST_CASE(test_output_typename_format)
  425. { // Displays typename formatting result. The test doesn't check the formatting result
  426. // and thus doesn't fail because the formatting result is platform-dependent.
  427. #define FORMATTERS << boost::units::typename_format
  428. BOOST_UNITS_TEST_OUTPUT_DISPLAY(meter_base_unit::unit_type());
  429. BOOST_UNITS_TEST_OUTPUT_DISPLAY(velocity());
  430. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_length());
  431. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_velocity1());
  432. BOOST_UNITS_TEST_OUTPUT_DISPLAY(millisecond_base_unit::unit_type());
  433. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_time());
  434. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_velocity2());
  435. BOOST_UNITS_TEST_OUTPUT_DISPLAY(area());
  436. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_area());
  437. BOOST_UNITS_TEST_OUTPUT_DISPLAY(double_scaled_length());
  438. BOOST_UNITS_TEST_OUTPUT_DISPLAY(double_scaled_length2());
  439. BOOST_UNITS_TEST_OUTPUT_DISPLAY(custom1());
  440. BOOST_UNITS_TEST_OUTPUT_DISPLAY(custom2());
  441. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_custom1());
  442. BOOST_UNITS_TEST_OUTPUT_DISPLAY(scaled_custom2());
  443. BOOST_UNITS_TEST_OUTPUT_DISPLAY(boost::units::absolute<meter_base_unit::unit_type>());
  444. #undef FORMATTERS
  445. }