1// Boost.Units - A C++ library for zero-overhead dimensional analysis and
2// unit/quantity manipulation and conversion
3//
4// Copyright (C) 2003-2008 Matthias Christian Schabel
5// Copyright (C) 2007-2008 Steven Watanabe
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/**
12\file
13
14\brief test_scaled_conversion.cpp
15
16\details
17Test unit scaling
18
19Output:
20@verbatim
21@endverbatim
22**/
23
24#include <boost/units/systems/si/prefixes.hpp>
25#include <boost/units/systems/si/time.hpp>
26#include <boost/units/quantity.hpp>
27#include <boost/units/io.hpp>
28
29#include <sstream>
30
31#include "test_close.hpp"
32
33namespace bu = boost::units;
34namespace si = boost::units::si;
35
36void test_scaled_to_plain() {
37 BOOST_CONSTEXPR_OR_CONST bu::quantity<si::time> s1 = 12.5 * si::seconds;
38 BOOST_CONSTEXPR_OR_CONST bu::quantity<si::time> s2(si::nano * s1);
39 BOOST_UNITS_TEST_CLOSE(1e-9 * s1.value(), s2.value(), 0.000000001);
40}
41
42void test_plain_to_scaled() {
43 BOOST_CONSTEXPR_OR_CONST bu::quantity<si::time> s1 = 12.5 * si::seconds;
44 typedef bu::multiply_typeof_helper<si::nano_type, si::time>::type time_unit;
45 BOOST_CONSTEXPR_OR_CONST bu::quantity<time_unit> s2(s1);
46 BOOST_UNITS_TEST_CLOSE(1e9 * s1.value(), s2.value(), 0.000000001);
47}
48
49void test_scaled_to_scaled() {
50 typedef bu::multiply_typeof_helper<si::mega_type, si::time>::type mega_time_unit;
51 typedef bu::multiply_typeof_helper<si::micro_type, si::time>::type micro_time_unit;
52 BOOST_CONSTEXPR_OR_CONST bu::quantity<mega_time_unit> s1(12.5 * si::seconds);
53 BOOST_CONSTEXPR_OR_CONST bu::quantity<micro_time_unit> s2(s1);
54 BOOST_UNITS_TEST_CLOSE(1e12 * s1.value(), s2.value(), 0.000000001);
55}
56
57void test_conversion_factor() {
58 BOOST_UNITS_TEST_CLOSE(conversion_factor(si::nano*si::seconds, si::seconds), 1e-9, 0.000000001);
59 BOOST_UNITS_TEST_CLOSE(conversion_factor(si::seconds, si::nano*si::seconds), 1e9, 0.000000001);
60 BOOST_UNITS_TEST_CLOSE(conversion_factor(si::mega*si::seconds, si::micro*si::seconds), 1e12, 0.000000001);
61}
62
63void test_output() {
64 std::stringstream stream;
65 stream << si::nano * 12.5 * si::seconds;
66 BOOST_TEST_EQ(stream.str(), "12.5 ns");
67}
68
69void test_output_name() {
70 std::stringstream stream;
71 stream << bu::name_format << si::nano * 12.5 * si::seconds;
72 BOOST_TEST_EQ(stream.str(), "12.5 nanosecond");
73}
74
75int main()
76{
77 test_scaled_to_plain();
78 test_plain_to_scaled();
79 test_scaled_to_scaled();
80 test_conversion_factor();
81 test_output();
82 test_output_name();
83 return boost::report_errors();
84}
85

source code of boost/libs/units/test/test_scaled_unit.cpp