int test_main(int,char *[]) { BOOST_UNITS_CHECK_CLOSE(bu::conversion_factor(base_unit1::unit_type(), base_unit2::unit_type()), 5000); BOOST_UNITS_CHECK_CLOSE(bu::conversion_factor(base_unit2::unit_type(), base_unit3::unit_type()), 0.003); BOOST_UNITS_CHECK_CLOSE(bu::conversion_factor(scaled_base_unit2::unit_type(), base_unit2::unit_type()), 1000); BOOST_UNITS_CHECK_CLOSE(bu::conversion_factor(base_unit4::unit_type()/base_unit5::unit_type(), scaled_base_unit4::unit_type()/base_unit5::unit_type()), 1e-3); return(0); }
int test_main(int,char *[]) { bu::quantity<mixed_length> a1(2.0 * mixed_length()); bu::quantity<si_area> a2(a1); BOOST_CHECK((std::abs(a2.value() - .02) < .0001)); bu::quantity<mixed_length> a3(a2); BOOST_CHECK((std::abs(a3.value() - 2.0) < .0001)); bu::quantity<mixed_energy_1> e1(2.0 * mixed_energy_1()); bu::quantity<mixed_energy_2> e2(e1); BOOST_CHECK((std::abs(e2.value() - 20.0) < .0001)); bu::quantity<bu::si::energy> e3(e1); BOOST_CHECK((std::abs(e3.value() - .0002) < .0001)); bu::quantity<mixed_energy_2> e4(e3); BOOST_CHECK((std::abs(e4.value() - 20.0) < .0001)); bu::quantity<bu::cgs::force> F0 = 20 * bu::cgs::dyne; BOOST_CHECK((std::abs(F0.value() - 20.0) < .0001)); bu::quantity<bu::si::force> F3(F0); BOOST_CHECK((std::abs(F3.value() - 2.0e-4) < .000000001)); bu::quantity<bu::si::force> F5(20 * bu::cgs::dyne); BOOST_CHECK((std::abs(F5.value() - 2.0e-4) < .000000001)); bu::quantity<bu::si::dimensionless> dimensionless_test1(1.0*bu::cgs::dyne/bu::si::newton); BOOST_CHECK(dimensionless_test1 == 1e-5); typedef bu::multiply_typeof_helper<bu::si::length, bu::cgs::length>::type m_cm; typedef bu::divide_typeof_helper<m_cm, m_cm>::type heterogeneous_dimensionless; bu::quantity<heterogeneous_dimensionless> dimensionless_test2(1.0*bu::cgs::dyne/bu::si::newton); BOOST_CHECK(dimensionless_test2.value() == 1e-5); bu::quantity<bu::divide_typeof_helper<bu::cgs::force, bu::si::force>::type> dimensionless_test3(dimensionless_test2); BOOST_UNITS_CHECK_CLOSE(dimensionless_test3.value(), 1.0); //m/cm -> g/kg bu::quantity<bu::divide_typeof_helper<bu::si::length, bu::cgs::length>::type> dimensionless_test4(2.0 * bu::si::meters / bu::cgs::centimeters); bu::quantity<bu::divide_typeof_helper<bu::cgs::mass, bu::si::mass>::type> dimensionless_test5(dimensionless_test4); BOOST_UNITS_CHECK_CLOSE(dimensionless_test5.value(), 2e5); return(0); }
int test_main(int,char *[]) { // default constructor const bu::quantity<bu::dimensionless> E1; BOOST_CHECK(E1.value() == double()); // value_type constructor const bu::quantity<bu::dimensionless> E2(E_); BOOST_CHECK(E2.value() == E_); // copy constructor const bu::quantity<bu::dimensionless> E3(E2); BOOST_CHECK(E3.value() == E_); // operator= const bu::quantity<bu::dimensionless> E4 = E2; BOOST_CHECK(E4.value() == E_); // implicit copy constructor value_type conversion const bu::quantity<bu::dimensionless,float> E5(E2); BOOST_UNITS_CHECK_CLOSE(E5.value(), float(E_)); const bu::quantity<bu::dimensionless,long> E6(E2); BOOST_CHECK(E6.value() == long(E_)); // implicit operator= value_type conversion // narrowing conversion disallowed // const bu::quantity<bu::dimensionless,float> E7 = E2; // BOOST_UNITS_CHECK_CLOSE(E7.value(),float(E_)); // narrowing conversion disallowed // const bu::quantity<bu::dimensionless,long> E8 = E2; // BOOST_CHECK(E8.value() == long(E_)); // const construction bu::quantity<bu::dimensionless> E9(E2); BOOST_CHECK(E9.value() == E_); // // value assignment // E9.value() = 1.5*bu::dimensionless(); // BOOST_CHECK(E9.value() == 1.5); // // // value assignment with implicit conversion // E9.value() = 1.5; // BOOST_CHECK(E9.value() == 1.5); // // // value assignment with implicit value_type conversion // E9.value() = 2*bu::dimensionless(); // BOOST_CHECK(E9.value() == double(2)); // // // value assignment with implicit value_type conversion // E9.value() = 2; // BOOST_CHECK(E9.value() == double(2)); // operator+=(this_type) E9 = 2.0; E9 += E9; BOOST_CHECK(E9.value() == 4.0); // operator-=(this_type) E9 = 2.0; E9 -= E9; BOOST_CHECK(E9.value() == 0.0); // operator*=(value_type) E9 = 2.0; E9 *= 2.0; BOOST_CHECK(E9.value() == 4.0); // operator/=(value_type) E9 = 2.0; E9 /= 2.0; BOOST_CHECK(E9.value() == 1.0); // static construct quantity from value_type const bu::quantity<bu::dimensionless> E(bu::quantity<bu::dimensionless>::from_value(2.5)); BOOST_CHECK(E.value() == 2.5); // implicit conversion to value_type const double V1(E9); BOOST_CHECK(V1 == E9.value()); const double V2 = E9; BOOST_CHECK(V2 == E9.value()); // unit * scalar BOOST_CHECK(bu::dimensionless()*2.0 == bu::quantity<bu::dimensionless>::from_value(2.0)); // unit / scalar BOOST_CHECK(bu::dimensionless()/2.0 == bu::quantity<bu::dimensionless>::from_value(0.5)); // scalar * unit BOOST_CHECK(2.0*bu::dimensionless() == bu::quantity<bu::dimensionless>::from_value(2.0)); // scalar / unit BOOST_CHECK(2.0/bu::dimensionless() == bu::quantity<bu::dimensionless>::from_value(2.0)); // quantity * scalar BOOST_CHECK(E*2.0 == bu::quantity<bu::dimensionless>::from_value(5.0)); // quantity / scalar BOOST_CHECK(E/2.0 == bu::quantity<bu::dimensionless>::from_value(1.25)); // scalar * quantity BOOST_CHECK(2.0*E == bu::quantity<bu::dimensionless>::from_value(5.0)); // scalar / quantity BOOST_CHECK(2.0/E == bu::quantity<bu::dimensionless>::from_value(0.8)); const bu::quantity<bu::dimensionless> D1(1.0), D2(2.0); // unit * quantity BOOST_CHECK(bu::dimensionless()*D1 == D1); // unit / quantity BOOST_CHECK(bu::dimensionless()/D1 == D1); // quantity * unit BOOST_CHECK(D1*bu::dimensionless() == D1); // quantity / unit BOOST_CHECK(D1*bu::dimensionless() == D1); // +quantity BOOST_CHECK(+D1 == 1.0*bu::dimensionless()); // -quantity BOOST_CHECK(-D1 == -1.0*bu::dimensionless()); // quantity + quantity BOOST_CHECK(D2+D1 == 3.0*bu::dimensionless()); // quantity - quantity BOOST_CHECK(D2-D1 == 1.0*bu::dimensionless()); // quantity * quantity BOOST_CHECK(D1*D2 == 2.0*bu::dimensionless()); // quantity / quantity BOOST_CHECK(D2/D1 == 2.0*bu::dimensionless()); // integer power of quantity BOOST_CHECK(2.0*bu::pow<2>(D2) == 2.0*std::pow(2.0,2.0)*bu::dimensionless()); // rational power of quantity BOOST_CHECK((2.0*bu::pow< bu::static_rational<2,3> >(D2) == 2.0*std::pow(2.0,2.0/3.0)*bu::dimensionless())); // integer root of quantity BOOST_CHECK(2.0*bu::root<2>(D2) == 2.0*std::pow(2.0,1.0/2.0)*bu::dimensionless()); // rational root of quantity BOOST_CHECK((2.0*bu::root< bu::static_rational<3,2> >(D2) == 2.0*std::pow(2.0,2.0/3.0)*bu::dimensionless())); const bu::quantity<bu::dimensionless> A1(0.0), A2(0.0), A3(1.0), A4(-1.0); // operator== BOOST_CHECK((A1 == A2) == true); BOOST_CHECK((A1 == A3) == false); // operator!= BOOST_CHECK((A1 != A2) == false); BOOST_CHECK((A1 != A3) == true); // operator< BOOST_CHECK((A1 < A2) == false); BOOST_CHECK((A1 < A3) == true); // operator<= BOOST_CHECK((A1 <= A2) == true); BOOST_CHECK((A1 <= A3) == true); // operator> BOOST_CHECK((A1 > A2) == false); BOOST_CHECK((A1 > A4) == true); // operator>= BOOST_CHECK((A1 >= A2) == true); BOOST_CHECK((A1 >= A4) == true); return 0; }