1 // Boost.Units - A C++ library for zero-overhead dimensional analysis and
2 // unit/quantity manipulation and conversion
4 // Copyright (C) 2003-2008 Matthias Christian Schabel
5 // Copyright (C) 2008 Steven Watanabe
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)
14 \brief test_conversion.cpp
17 Test conversion between quantities.
24 #include <boost/units/quantity.hpp>
25 #include <boost/units/systems/si.hpp>
26 #include <boost/units/systems/cgs.hpp>
30 #define BOOST_TEST_MAIN
32 #include <boost/test/unit_test.hpp>
34 #define BOOST_UNITS_CHECK_CLOSE(a, b) BOOST_CHECK_CLOSE_FRACTION(a, b, .0000001)
36 namespace bu
= boost::units
;
38 typedef bu::si::length si_length
;
39 typedef bu::si::time si_time
;
40 typedef bu::si::mass si_mass
;
41 typedef bu::si::area si_area
;
43 typedef bu::cgs::length cgs_length
;
44 typedef bu::cgs::time cgs_time
;
45 typedef bu::cgs::mass cgs_mass
;
46 typedef bu::cgs::area cgs_area
;
48 typedef bu::multiply_typeof_helper
<si_length
, cgs_length
>::type mixed_length
;
49 typedef bu::multiply_typeof_helper
<si_time
, cgs_time
>::type mixed_time
;
51 typedef bu::divide_typeof_helper
<bu::multiply_typeof_helper
<si_mass
,cgs_area
>::type
, mixed_time
>::type mixed_energy_1
;
52 typedef bu::divide_typeof_helper
<bu::multiply_typeof_helper
<cgs_mass
,mixed_length
>::type
,
53 bu::multiply_typeof_helper
<cgs_time
,cgs_time
>::type
>::type mixed_energy_2
;
55 BOOST_AUTO_TEST_CASE(test_conversion
) {
56 BOOST_CHECK_EQUAL(1, 1);
57 bu::quantity
<mixed_length
> a1(2.0 * mixed_length());
58 bu::quantity
<si_area
> a2(a1
);
60 BOOST_UNITS_CHECK_CLOSE(a2
.value(), .02);
62 bu::quantity
<mixed_length
> a3(a2
);
64 BOOST_UNITS_CHECK_CLOSE(a3
.value(), 2.0);
66 bu::quantity
<mixed_energy_1
> e1(2.0 * mixed_energy_1());
67 bu::quantity
<mixed_energy_2
> e2(e1
);
69 BOOST_UNITS_CHECK_CLOSE(e2
.value(), 20.0);
71 bu::quantity
<bu::si::energy
> e3(e1
);
72 BOOST_UNITS_CHECK_CLOSE(e3
.value(), .0002);
73 bu::quantity
<mixed_energy_2
> e4(e3
);
74 BOOST_UNITS_CHECK_CLOSE(e4
.value(), 20.0);
76 bu::quantity
<bu::cgs::force
> F0
= 20 * bu::cgs::dyne
;
77 BOOST_UNITS_CHECK_CLOSE(F0
.value(), 20.0);
79 bu::quantity
<bu::si::force
> F3(F0
);
80 BOOST_UNITS_CHECK_CLOSE(F3
.value(), 2.0e-4);
82 bu::quantity
<bu::si::force
> F5(20 * bu::cgs::dyne
);
83 BOOST_UNITS_CHECK_CLOSE(F5
.value(), 2.0e-4);
86 BOOST_CHECK_EQUAL(boost::units::conversion_factor(si_length(), si_length()), 1.0);
89 BOOST_AUTO_TEST_CASE(test_dimensionless_conversions
) {
90 typedef bu::divide_typeof_helper
<bu::cgs::force
, bu::si::force
>::type mixed_dimensionless
;
92 bu::quantity
<bu::si::dimensionless
> dimensionless_test1(1.0*bu::cgs::dyne
/bu::si::newton
);
93 BOOST_CHECK(dimensionless_test1
== 1e-5);
95 typedef bu::multiply_typeof_helper
<bu::si::length
, bu::cgs::length
>::type m_cm
;
96 typedef bu::divide_typeof_helper
<m_cm
, m_cm
>::type heterogeneous_dimensionless
;
97 bu::quantity
<heterogeneous_dimensionless
> dimensionless_test2(1.0*bu::cgs::dyne
/bu::si::newton
);
98 BOOST_CHECK(dimensionless_test2
.value() == 1e-5);
99 bu::quantity
<bu::divide_typeof_helper
<bu::cgs::force
, bu::si::force
>::type
> dimensionless_test3(dimensionless_test2
);
100 BOOST_UNITS_CHECK_CLOSE(dimensionless_test3
.value(), 1.0);
102 BOOST_UNITS_CHECK_CLOSE(boost::units::conversion_factor(mixed_dimensionless(), heterogeneous_dimensionless()), 1e-5);
103 BOOST_UNITS_CHECK_CLOSE(boost::units::conversion_factor(heterogeneous_dimensionless(), mixed_dimensionless()), 1e5
);
107 bu::quantity
<bu::divide_typeof_helper
<bu::si::length
, bu::cgs::length
>::type
> dimensionless_test4(2.0 * bu::si::meters
/ bu::cgs::centimeters
);
108 bu::quantity
<bu::divide_typeof_helper
<bu::cgs::mass
, bu::si::mass
>::type
> dimensionless_test5(dimensionless_test4
);
109 BOOST_UNITS_CHECK_CLOSE(dimensionless_test5
.value(), 2e5
);