// Copyright (c) FIRST and other WPILib contributors. // Open Source Software; you can modify and/or share it under the terms of // the WPILib BSD license file in the root directory of this project. #include #include #include #include #include "gtest/gtest.h" #include "units/acceleration.h" #include "units/angle.h" #include "units/angular_acceleration.h" #include "units/angular_velocity.h" #include "units/area.h" #include "units/capacitance.h" #include "units/charge.h" #include "units/concentration.h" #include "units/conductance.h" #include "units/constants.h" #include "units/current.h" #include "units/data.h" #include "units/data_transfer_rate.h" #include "units/density.h" #include "units/dimensionless.h" #include "units/energy.h" #include "units/force.h" #include "units/frequency.h" #include "units/illuminance.h" #include "units/impedance.h" #include "units/inductance.h" #include "units/length.h" #include "units/luminous_flux.h" #include "units/luminous_intensity.h" #include "units/magnetic_field_strength.h" #include "units/magnetic_flux.h" #include "units/mass.h" #include "units/math.h" #include "units/power.h" #include "units/pressure.h" #include "units/radiation.h" #include "units/solid_angle.h" #include "units/substance.h" #include "units/temperature.h" #include "units/time.h" #include "units/torque.h" #include "units/velocity.h" #include "units/voltage.h" #include "units/volume.h" using namespace units::acceleration; using namespace units::angle; using namespace units::angular_acceleration; using namespace units::angular_velocity; using namespace units::area; using namespace units::capacitance; using namespace units::charge; using namespace units::concentration; using namespace units::conductance; using namespace units::data; using namespace units::data_transfer_rate; using namespace units::density; using namespace units::dimensionless; using namespace units::energy; using namespace units::frequency; using namespace units::illuminance; using namespace units::impedance; using namespace units::inductance; using namespace units::length; using namespace units::luminous_flux; using namespace units::luminous_intensity; using namespace units::magnetic_field_strength; using namespace units::magnetic_flux; using namespace units::mass; using namespace units::math; using namespace units::power; using namespace units::pressure; using namespace units::radiation; using namespace units::solid_angle; using namespace units::temperature; using namespace units::time; using namespace units::torque; using namespace units::velocity; using namespace units::voltage; using namespace units::volume; using namespace units; #if !defined(_MSC_VER) || _MSC_VER > 1800 using namespace units::literals; #endif namespace { class TypeTraits : public ::testing::Test { protected: TypeTraits() = default; ~TypeTraits() override = default; void SetUp() override {} void TearDown() override {} }; class UnitManipulators : public ::testing::Test { protected: UnitManipulators() = default; ~UnitManipulators() override = default; void SetUp() override {} void TearDown() override {} }; class UnitContainer : public ::testing::Test { protected: UnitContainer() = default; ~UnitContainer() override = default; void SetUp() override {} void TearDown() override {} }; class UnitConversion : public ::testing::Test { protected: UnitConversion() = default; ~UnitConversion() override = default; void SetUp() override {} void TearDown() override {} }; class UnitMath : public ::testing::Test { protected: UnitMath() = default; ~UnitMath() override = default; void SetUp() override {} void TearDown() override {} }; class CompileTimeArithmetic : public ::testing::Test { protected: CompileTimeArithmetic() = default; ~CompileTimeArithmetic() override = default; void SetUp() override {} void TearDown() override {} }; class Constexpr : public ::testing::Test { protected: Constexpr() = default; ~Constexpr() override = default; void SetUp() override {} void TearDown() override {} }; class CaseStudies : public ::testing::Test { protected: CaseStudies() = default; ~CaseStudies() override = default; void SetUp() override {} void TearDown() override {} struct RightTriangle { using a = unit_value_t; using b = unit_value_t; using c = unit_value_sqrt< unit_value_add, unit_value_power>>; }; }; } // namespace TEST_F(TypeTraits, isRatio) { EXPECT_TRUE(traits::is_ratio>::value); EXPECT_FALSE(traits::is_ratio::value); } TEST_F(TypeTraits, ratio_sqrt) { using rt2 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(2 / static_cast(1)) - rt2::num / static_cast(rt2::den)), 5e-9); using rt4 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(4 / static_cast(1)) - rt4::num / static_cast(rt4::den)), 5e-9); using rt10 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(10 / static_cast(1)) - rt10::num / static_cast(rt10::den)), 5e-9); using rt30 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(30 / static_cast(1)) - rt30::num / static_cast(rt30::den)), 5e-9); using rt61 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(61 / static_cast(1)) - rt61::num / static_cast(rt61::den)), 5e-9); using rt100 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(100 / static_cast(1)) - rt100::num / static_cast(rt100::den)), 5e-9); using rt1000 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(1000 / static_cast(1)) - rt1000::num / static_cast(rt1000::den)), 5e-9); using rt10000 = ratio_sqrt>; EXPECT_LT(std::abs(std::sqrt(10000 / static_cast(1)) - rt10000::num / static_cast(rt10000::den)), 5e-9); } TEST_F(TypeTraits, is_unit) { EXPECT_FALSE(traits::is_unit>::value); EXPECT_FALSE(traits::is_unit::value); EXPECT_TRUE(traits::is_unit::value); EXPECT_TRUE(traits::is_unit::value); EXPECT_TRUE(traits::is_unit::value); EXPECT_FALSE(traits::is_unit::value); } TEST_F(TypeTraits, is_unit_t) { EXPECT_FALSE(traits::is_unit_t>::value); EXPECT_FALSE(traits::is_unit_t::value); EXPECT_FALSE(traits::is_unit_t::value); EXPECT_FALSE(traits::is_unit_t::value); EXPECT_FALSE(traits::is_unit_t::value); EXPECT_TRUE(traits::is_unit_t::value); } TEST_F(TypeTraits, unit_traits) { EXPECT_TRUE( (std::is_same::conversion_ratio>::value)); EXPECT_FALSE( (std::is_same::conversion_ratio>::value)); } TEST_F(TypeTraits, unit_t_traits) { EXPECT_TRUE( (std::is_same::underlying_type>::value)); EXPECT_TRUE( (std::is_same::underlying_type>::value)); EXPECT_TRUE( (std::is_same::value_type>::value)); EXPECT_TRUE( (std::is_same::value_type>::value)); } TEST_F(TypeTraits, all_true) { EXPECT_TRUE(all_true::type::value); EXPECT_TRUE((all_true::type::value)); EXPECT_TRUE((all_true::type::value)); EXPECT_FALSE(all_true::type::value); EXPECT_FALSE((all_true::type::value)); EXPECT_FALSE((all_true::type::value)); EXPECT_FALSE((all_true::type::value)); } TEST_F(TypeTraits, is_convertible_unit) { EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_TRUE((traits::is_convertible_unit::value)); EXPECT_FALSE((traits::is_convertible_unit::value)); EXPECT_FALSE((traits::is_convertible_unit::value)); EXPECT_FALSE((traits::is_convertible_unit::value)); } TEST_F(TypeTraits, inverse) { double test; using htz = inverse; bool shouldBeTrue = std::is_same::value; EXPECT_TRUE(shouldBeTrue); test = convert, inverse>(1.0); EXPECT_NEAR(5.0 / 9.0, test, 5.0e-5); test = convert, inverse>(6.0); EXPECT_NEAR(10.0 / 3.0, test, 5.0e-5); } TEST_F(TypeTraits, base_unit_of) { using base = traits::base_unit_of; bool shouldBeTrue = std::is_same::value; EXPECT_TRUE(shouldBeTrue); } TEST_F(TypeTraits, has_linear_scale) { EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_TRUE((traits::has_linear_scale::value)); EXPECT_FALSE((traits::has_linear_scale::value)); EXPECT_FALSE((traits::has_linear_scale::value)); } TEST_F(TypeTraits, has_decibel_scale) { EXPECT_FALSE((traits::has_decibel_scale::value)); EXPECT_FALSE((traits::has_decibel_scale::value)); EXPECT_FALSE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_TRUE((traits::has_decibel_scale::value)); EXPECT_FALSE((traits::has_decibel_scale::value)); EXPECT_FALSE((traits::has_decibel_scale::value)); } TEST_F(TypeTraits, is_same_scale) { EXPECT_TRUE((traits::is_same_scale::value)); EXPECT_TRUE((traits::is_same_scale::value)); EXPECT_FALSE((traits::is_same_scale::value)); } TEST_F(TypeTraits, is_dimensionless_unit) { EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_TRUE((traits::is_dimensionless_unit::value)); EXPECT_FALSE((traits::is_dimensionless_unit::value)); EXPECT_FALSE((traits::is_dimensionless_unit::value)); EXPECT_FALSE((traits::is_dimensionless_unit::value)); } TEST_F(TypeTraits, is_length_unit) { EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_FALSE((traits::is_length_unit::value)); EXPECT_FALSE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_FALSE((traits::is_length_unit::value)); EXPECT_TRUE((traits::is_length_unit::value)); EXPECT_FALSE((traits::is_length_unit::value)); } TEST_F(TypeTraits, is_mass_unit) { EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_FALSE((traits::is_mass_unit::value)); EXPECT_FALSE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_FALSE((traits::is_mass_unit::value)); EXPECT_TRUE((traits::is_mass_unit::value)); EXPECT_FALSE((traits::is_mass_unit::value)); } TEST_F(TypeTraits, is_time_unit) { EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_FALSE((traits::is_time_unit::value)); EXPECT_FALSE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_FALSE((traits::is_time_unit::value)); EXPECT_TRUE((traits::is_time_unit::value)); EXPECT_FALSE((traits::is_time_unit::value)); } TEST_F(TypeTraits, is_angle_unit) { EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_FALSE((traits::is_angle_unit::value)); EXPECT_FALSE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_FALSE((traits::is_angle_unit::value)); EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_FALSE((traits::is_angle_unit::value)); } TEST_F(TypeTraits, is_current_unit) { EXPECT_TRUE((traits::is_current_unit::value)); EXPECT_FALSE((traits::is_current_unit::value)); EXPECT_FALSE((traits::is_current_unit::value)); EXPECT_TRUE((traits::is_current_unit::value)); EXPECT_TRUE((traits::is_current_unit::value)); EXPECT_TRUE((traits::is_current_unit::value)); EXPECT_FALSE((traits::is_current_unit::value)); EXPECT_TRUE((traits::is_current_unit::value)); EXPECT_FALSE((traits::is_current_unit::value)); } TEST_F(TypeTraits, is_temperature_unit) { EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_FALSE((traits::is_temperature_unit::value)); EXPECT_FALSE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_FALSE((traits::is_temperature_unit::value)); EXPECT_TRUE((traits::is_temperature_unit::value)); EXPECT_FALSE((traits::is_temperature_unit::value)); } TEST_F(TypeTraits, is_substance_unit) { EXPECT_TRUE((traits::is_substance_unit::value)); EXPECT_FALSE((traits::is_substance_unit::value)); EXPECT_FALSE((traits::is_substance_unit::value)); EXPECT_TRUE((traits::is_substance_unit::value)); EXPECT_TRUE((traits::is_substance_unit::value)); EXPECT_TRUE((traits::is_substance_unit::value)); EXPECT_FALSE((traits::is_substance_unit::value)); EXPECT_TRUE( (traits::is_substance_unit::value)); EXPECT_FALSE((traits::is_substance_unit::value)); } TEST_F(TypeTraits, is_luminous_intensity_unit) { EXPECT_TRUE((traits::is_luminous_intensity_unit::value)); EXPECT_FALSE( (traits::is_luminous_intensity_unit::value)); EXPECT_FALSE((traits::is_luminous_intensity_unit::value)); EXPECT_TRUE((traits::is_luminous_intensity_unit::value)); EXPECT_TRUE((traits::is_luminous_intensity_unit::value)); EXPECT_TRUE((traits::is_luminous_intensity_unit::value)); EXPECT_FALSE((traits::is_luminous_intensity_unit::value)); EXPECT_TRUE( (traits::is_luminous_intensity_unit::value)); EXPECT_FALSE((traits::is_luminous_intensity_unit::value)); } TEST_F(TypeTraits, is_solid_angle_unit) { EXPECT_TRUE((traits::is_solid_angle_unit::value)); EXPECT_TRUE((traits::is_solid_angle_unit::value)); EXPECT_FALSE((traits::is_solid_angle_unit::value)); EXPECT_FALSE((traits::is_solid_angle_unit::value)); EXPECT_TRUE((traits::is_solid_angle_unit::value)); EXPECT_TRUE((traits::is_solid_angle_unit::value)); EXPECT_TRUE((traits::is_solid_angle_unit::value)); EXPECT_FALSE((traits::is_solid_angle_unit::value)); EXPECT_TRUE( (traits::is_solid_angle_unit::value)); EXPECT_FALSE( (traits::is_solid_angle_unit::value)); } TEST_F(TypeTraits, is_frequency_unit) { EXPECT_TRUE((traits::is_frequency_unit::value)); EXPECT_FALSE((traits::is_frequency_unit::value)); EXPECT_FALSE((traits::is_frequency_unit::value)); EXPECT_TRUE((traits::is_frequency_unit::value)); EXPECT_TRUE((traits::is_frequency_unit::value)); EXPECT_TRUE((traits::is_frequency_unit::value)); EXPECT_FALSE((traits::is_frequency_unit::value)); EXPECT_TRUE((traits::is_frequency_unit::value)); EXPECT_FALSE((traits::is_frequency_unit::value)); } TEST_F(TypeTraits, is_velocity_unit) { EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_FALSE((traits::is_velocity_unit::value)); EXPECT_FALSE((traits::is_velocity_unit::value)); EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_TRUE((traits::is_velocity_unit::value)); EXPECT_FALSE((traits::is_velocity_unit::value)); EXPECT_TRUE( (traits::is_velocity_unit::value)); EXPECT_FALSE((traits::is_velocity_unit::value)); } TEST_F(TypeTraits, is_acceleration_unit) { EXPECT_TRUE((traits::is_acceleration_unit::value)); EXPECT_TRUE( (traits::is_acceleration_unit::value)); EXPECT_FALSE((traits::is_acceleration_unit::value)); EXPECT_FALSE((traits::is_acceleration_unit::value)); EXPECT_TRUE( (traits::is_acceleration_unit::value)); EXPECT_TRUE( (traits::is_acceleration_unit::value)); EXPECT_TRUE(( traits::is_acceleration_unit::value)); EXPECT_TRUE((traits::is_acceleration_unit::value)); EXPECT_FALSE((traits::is_acceleration_unit::value)); EXPECT_TRUE( (traits::is_acceleration_unit::value)); EXPECT_FALSE( (traits::is_acceleration_unit::value)); } TEST_F(TypeTraits, is_force_unit) { EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_FALSE((traits::is_force_unit::value)); EXPECT_FALSE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_FALSE((traits::is_force_unit::value)); EXPECT_TRUE((traits::is_force_unit::value)); EXPECT_FALSE((traits::is_force_unit::value)); } TEST_F(TypeTraits, is_pressure_unit) { EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_FALSE((traits::is_pressure_unit::value)); EXPECT_FALSE((traits::is_pressure_unit::value)); EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_TRUE((traits::is_pressure_unit::value)); EXPECT_FALSE((traits::is_pressure_unit::value)); EXPECT_TRUE( (traits::is_pressure_unit::value)); EXPECT_FALSE((traits::is_pressure_unit::value)); } TEST_F(TypeTraits, is_charge_unit) { EXPECT_TRUE((traits::is_charge_unit::value)); EXPECT_FALSE((traits::is_charge_unit::value)); EXPECT_FALSE((traits::is_charge_unit::value)); EXPECT_TRUE((traits::is_charge_unit::value)); EXPECT_TRUE((traits::is_charge_unit::value)); EXPECT_TRUE((traits::is_charge_unit::value)); EXPECT_FALSE((traits::is_charge_unit::value)); EXPECT_TRUE((traits::is_charge_unit::value)); EXPECT_FALSE((traits::is_charge_unit::value)); } TEST_F(TypeTraits, is_energy_unit) { EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_FALSE((traits::is_energy_unit::value)); EXPECT_FALSE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_FALSE((traits::is_energy_unit::value)); EXPECT_TRUE((traits::is_energy_unit::value)); EXPECT_FALSE((traits::is_energy_unit::value)); } TEST_F(TypeTraits, is_power_unit) { EXPECT_TRUE((traits::is_power_unit::value)); EXPECT_FALSE((traits::is_power_unit::value)); EXPECT_FALSE((traits::is_power_unit::value)); EXPECT_TRUE((traits::is_power_unit::value)); EXPECT_TRUE((traits::is_power_unit::value)); EXPECT_TRUE((traits::is_power_unit::value)); EXPECT_FALSE((traits::is_power_unit::value)); EXPECT_TRUE((traits::is_power_unit::value)); EXPECT_FALSE((traits::is_power_unit::value)); } TEST_F(TypeTraits, is_voltage_unit) { EXPECT_TRUE((traits::is_voltage_unit::value)); EXPECT_FALSE((traits::is_voltage_unit::value)); EXPECT_FALSE((traits::is_voltage_unit::value)); EXPECT_TRUE((traits::is_voltage_unit::value)); EXPECT_TRUE((traits::is_voltage_unit::value)); EXPECT_TRUE((traits::is_voltage_unit::value)); EXPECT_FALSE((traits::is_voltage_unit::value)); EXPECT_TRUE((traits::is_voltage_unit::value)); EXPECT_FALSE((traits::is_voltage_unit::value)); } TEST_F(TypeTraits, is_capacitance_unit) { EXPECT_TRUE((traits::is_capacitance_unit::value)); EXPECT_FALSE((traits::is_capacitance_unit::value)); EXPECT_FALSE((traits::is_capacitance_unit::value)); EXPECT_TRUE((traits::is_capacitance_unit::value)); EXPECT_TRUE((traits::is_capacitance_unit::value)); EXPECT_TRUE((traits::is_capacitance_unit::value)); EXPECT_FALSE((traits::is_capacitance_unit::value)); EXPECT_TRUE( (traits::is_capacitance_unit::value)); EXPECT_FALSE((traits::is_capacitance_unit::value)); } TEST_F(TypeTraits, is_impedance_unit) { EXPECT_TRUE((traits::is_impedance_unit::value)); EXPECT_FALSE((traits::is_impedance_unit::value)); EXPECT_FALSE((traits::is_impedance_unit::value)); EXPECT_TRUE((traits::is_impedance_unit::value)); EXPECT_TRUE((traits::is_impedance_unit::value)); EXPECT_TRUE((traits::is_impedance_unit::value)); EXPECT_FALSE((traits::is_impedance_unit::value)); EXPECT_TRUE((traits::is_impedance_unit::value)); EXPECT_FALSE((traits::is_impedance_unit::value)); } TEST_F(TypeTraits, is_conductance_unit) { EXPECT_TRUE((traits::is_conductance_unit::value)); EXPECT_FALSE((traits::is_conductance_unit::value)); EXPECT_FALSE((traits::is_conductance_unit::value)); EXPECT_TRUE((traits::is_conductance_unit::value)); EXPECT_TRUE((traits::is_conductance_unit::value)); EXPECT_TRUE((traits::is_conductance_unit::value)); EXPECT_FALSE((traits::is_conductance_unit::value)); EXPECT_TRUE( (traits::is_conductance_unit::value)); EXPECT_FALSE((traits::is_conductance_unit::value)); } TEST_F(TypeTraits, is_magnetic_flux_unit) { EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_FALSE((traits::is_magnetic_flux_unit::value)); EXPECT_FALSE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_FALSE((traits::is_magnetic_flux_unit::value)); EXPECT_TRUE((traits::is_magnetic_flux_unit::value)); EXPECT_FALSE((traits::is_magnetic_flux_unit::value)); } TEST_F(TypeTraits, is_magnetic_field_strength_unit) { EXPECT_TRUE((traits::is_magnetic_field_strength_unit< units::magnetic_field_strength::tesla>::value)); EXPECT_TRUE((traits::is_magnetic_field_strength_unit::value)); EXPECT_FALSE((traits::is_magnetic_field_strength_unit::value)); EXPECT_FALSE((traits::is_magnetic_field_strength_unit::value)); EXPECT_TRUE((traits::is_magnetic_field_strength_unit::value)); EXPECT_TRUE((traits::is_magnetic_field_strength_unit::value)); EXPECT_TRUE((traits::is_magnetic_field_strength_unit::value)); EXPECT_TRUE((traits::is_magnetic_field_strength_unit::value)); EXPECT_FALSE((traits::is_magnetic_field_strength_unit::value)); EXPECT_TRUE( (traits::is_magnetic_field_strength_unit::value)); EXPECT_FALSE( (traits::is_magnetic_field_strength_unit::value)); } TEST_F(TypeTraits, is_inductance_unit) { EXPECT_TRUE((traits::is_inductance_unit::value)); EXPECT_FALSE((traits::is_inductance_unit::value)); EXPECT_FALSE((traits::is_inductance_unit::value)); EXPECT_TRUE((traits::is_inductance_unit::value)); EXPECT_TRUE((traits::is_inductance_unit::value)); EXPECT_TRUE((traits::is_inductance_unit::value)); EXPECT_FALSE((traits::is_inductance_unit::value)); EXPECT_TRUE( (traits::is_inductance_unit::value)); EXPECT_FALSE((traits::is_inductance_unit::value)); } TEST_F(TypeTraits, is_luminous_flux_unit) { EXPECT_TRUE((traits::is_luminous_flux_unit::value)); EXPECT_FALSE((traits::is_luminous_flux_unit::value)); EXPECT_FALSE((traits::is_luminous_flux_unit::value)); EXPECT_TRUE((traits::is_luminous_flux_unit::value)); EXPECT_TRUE((traits::is_luminous_flux_unit::value)); EXPECT_TRUE((traits::is_luminous_flux_unit::value)); EXPECT_FALSE((traits::is_luminous_flux_unit::value)); EXPECT_TRUE( (traits::is_luminous_flux_unit::value)); EXPECT_FALSE((traits::is_luminous_flux_unit::value)); } TEST_F(TypeTraits, is_illuminance_unit) { EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_FALSE((traits::is_illuminance_unit::value)); EXPECT_FALSE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_FALSE((traits::is_illuminance_unit::value)); EXPECT_TRUE((traits::is_illuminance_unit::value)); EXPECT_FALSE((traits::is_illuminance_unit::value)); } TEST_F(TypeTraits, is_radioactivity_unit) { EXPECT_TRUE((traits::is_radioactivity_unit::value)); EXPECT_FALSE((traits::is_radioactivity_unit::value)); EXPECT_FALSE((traits::is_radioactivity_unit::value)); EXPECT_TRUE((traits::is_radioactivity_unit::value)); EXPECT_TRUE((traits::is_radioactivity_unit::value)); EXPECT_TRUE((traits::is_radioactivity_unit::value)); EXPECT_FALSE((traits::is_radioactivity_unit::value)); EXPECT_TRUE((traits::is_radioactivity_unit::value)); EXPECT_FALSE((traits::is_radioactivity_unit::value)); } TEST_F(TypeTraits, is_torque_unit) { EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_FALSE((traits::is_torque_unit::value)); EXPECT_FALSE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_FALSE((traits::is_torque_unit::value)); EXPECT_TRUE((traits::is_torque_unit::value)); EXPECT_FALSE((traits::is_torque_unit::value)); } TEST_F(TypeTraits, is_area_unit) { EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_FALSE((traits::is_area_unit::value)); EXPECT_FALSE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_FALSE((traits::is_area_unit::value)); EXPECT_TRUE((traits::is_area_unit::value)); EXPECT_FALSE((traits::is_area_unit::value)); } TEST_F(TypeTraits, is_volume_unit) { EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_FALSE((traits::is_volume_unit::value)); EXPECT_FALSE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_FALSE((traits::is_volume_unit::value)); EXPECT_TRUE((traits::is_volume_unit::value)); EXPECT_FALSE((traits::is_volume_unit::value)); } TEST_F(TypeTraits, is_density_unit) { EXPECT_TRUE((traits::is_density_unit::value)); EXPECT_TRUE((traits::is_density_unit::value)); EXPECT_FALSE((traits::is_density_unit::value)); EXPECT_FALSE((traits::is_density_unit::value)); EXPECT_TRUE((traits::is_density_unit::value)); EXPECT_TRUE( (traits::is_density_unit::value)); EXPECT_TRUE( (traits::is_density_unit::value)); EXPECT_TRUE((traits::is_density_unit::value)); EXPECT_FALSE((traits::is_density_unit::value)); EXPECT_TRUE((traits::is_density_unit::value)); EXPECT_FALSE( (traits::is_density_unit::value)); } TEST_F(TypeTraits, is_data_unit) { EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_FALSE((traits::is_data_unit::value)); EXPECT_FALSE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_FALSE((traits::is_data_unit::value)); EXPECT_TRUE((traits::is_data_unit::value)); EXPECT_FALSE((traits::is_data_unit::value)); } TEST_F(TypeTraits, is_data_transfer_rate_unit) { EXPECT_TRUE((traits::is_data_transfer_rate_unit::value)); EXPECT_TRUE((traits::is_data_transfer_rate_unit::value)); EXPECT_FALSE((traits::is_data_transfer_rate_unit::value)); EXPECT_FALSE((traits::is_data_transfer_rate_unit::value)); EXPECT_TRUE( (traits::is_data_transfer_rate_unit::value)); EXPECT_TRUE(( traits::is_data_transfer_rate_unit::value)); EXPECT_TRUE((traits::is_data_transfer_rate_unit< const gigabytes_per_second_t&>::value)); EXPECT_TRUE( (traits::is_data_transfer_rate_unit::value)); EXPECT_FALSE((traits::is_data_transfer_rate_unit::value)); EXPECT_TRUE( (traits::is_data_transfer_rate_unit::value)); EXPECT_FALSE( (traits::is_data_transfer_rate_unit::value)); } TEST_F(UnitManipulators, squared) { double test; test = convert, square_feet>(0.092903); EXPECT_NEAR(0.99999956944, test, 5.0e-12); using scalar_2 = squared; // this is actually nonsensical, and should // also result in a scalar. bool isSame = std::is_same::type, typename std::decay>::type>::value; EXPECT_TRUE(isSame); } TEST_F(UnitManipulators, cubed) { double test; test = convert, cubic_feet>(0.0283168); EXPECT_NEAR(0.999998354619, test, 5.0e-13); } TEST_F(UnitManipulators, square_root) { double test; test = convert, meter>(1.0); EXPECT_TRUE((traits::is_convertible_unit< typename std::decay>::type, kilometer>::value)); EXPECT_NEAR(1000.0, test, 5.0e-13); } TEST_F(UnitManipulators, compound_unit) { using acceleration1 = unit, category::acceleration_unit>; using acceleration2 = compound_unit, inverse>; using acceleration3 = unit, base_unit, std::ratio<0>, std::ratio<-2>>>; using acceleration4 = compound_unit>>; using acceleration5 = compound_unit>>; bool areSame12 = std::is_same::value; bool areSame23 = std::is_same::value; bool areSame34 = std::is_same::value; bool areSame45 = std::is_same::value; EXPECT_TRUE(areSame12); EXPECT_TRUE(areSame23); EXPECT_TRUE(areSame34); EXPECT_TRUE(areSame45); // test that thing with translations still compile using arbitrary1 = compound_unit>; using arbitrary2 = compound_unit; using arbitrary3 = compound_unit; EXPECT_TRUE((std::is_same::value)); } TEST_F(UnitManipulators, dimensionalAnalysis) { // these look like 'compound units', but the dimensional analysis can be // REALLY handy if the unit types aren't know (i.e. they themselves are // template parameters), as you can get the resulting unit of the operation. using velocity = units::detail::unit_divide; bool shouldBeTrue = std::is_same::value; EXPECT_TRUE(shouldBeTrue); using acceleration1 = unit, category::acceleration_unit>; using acceleration2 = units::detail::unit_divide< meters, units::detail::unit_multiply>; shouldBeTrue = std::is_same::value; EXPECT_TRUE(shouldBeTrue); } #ifdef _MSC_VER #if (_MSC_VER >= 1900) TEST_F(UnitContainer, trivial) { EXPECT_TRUE((std::is_trivial::value)); EXPECT_TRUE((std::is_trivially_assignable::value)); EXPECT_TRUE((std::is_trivially_constructible::value)); EXPECT_TRUE((std::is_trivially_copy_assignable::value)); EXPECT_TRUE((std::is_trivially_copy_constructible::value)); EXPECT_TRUE((std::is_trivially_copyable::value)); EXPECT_TRUE((std::is_trivially_default_constructible::value)); EXPECT_TRUE((std::is_trivially_destructible::value)); EXPECT_TRUE((std::is_trivially_move_assignable::value)); EXPECT_TRUE((std::is_trivially_move_constructible::value)); EXPECT_TRUE((std::is_trivial::value)); EXPECT_TRUE((std::is_trivially_assignable::value)); EXPECT_TRUE((std::is_trivially_constructible::value)); EXPECT_TRUE((std::is_trivially_copy_assignable::value)); EXPECT_TRUE((std::is_trivially_copy_constructible::value)); EXPECT_TRUE((std::is_trivially_copyable::value)); EXPECT_TRUE((std::is_trivially_default_constructible::value)); EXPECT_TRUE((std::is_trivially_destructible::value)); EXPECT_TRUE((std::is_trivially_move_assignable::value)); EXPECT_TRUE((std::is_trivially_move_constructible::value)); } #endif #endif TEST_F(UnitContainer, has_value_member) { EXPECT_TRUE((traits::has_value_member, double>::value)); EXPECT_FALSE((traits::has_value_member::value)); } TEST_F(UnitContainer, make_unit) { auto dist = units::make_unit(5); EXPECT_EQ(meter_t(5), dist); } TEST_F(UnitContainer, unitTypeAddition) { // units meter_t a_m(1.0), c_m; foot_t b_ft(3.28084); double d = convert(b_ft()); EXPECT_NEAR(1.0, d, 5.0e-5); c_m = a_m + b_ft; EXPECT_NEAR(2.0, c_m(), 5.0e-5); c_m = b_ft + meter_t(3); EXPECT_NEAR(4.0, c_m(), 5.0e-5); auto e_ft = b_ft + meter_t(3); EXPECT_NEAR(13.12336, e_ft(), 5.0e-6); // scalar scalar_t sresult = scalar_t(1.0) + scalar_t(1.0); EXPECT_NEAR(2.0, sresult, 5.0e-6); sresult = scalar_t(1.0) + 1.0; EXPECT_NEAR(2.0, sresult, 5.0e-6); sresult = 1.0 + scalar_t(1.0); EXPECT_NEAR(2.0, sresult, 5.0e-6); d = scalar_t(1.0) + scalar_t(1.0); EXPECT_NEAR(2.0, d, 5.0e-6); d = scalar_t(1.0) + 1.0; EXPECT_NEAR(2.0, d, 5.0e-6); d = 1.0 + scalar_t(1.0); EXPECT_NEAR(2.0, d, 5.0e-6); } TEST_F(UnitContainer, unitTypeUnaryAddition) { meter_t a_m(1.0); EXPECT_EQ(++a_m, meter_t(2)); EXPECT_EQ(a_m++, meter_t(2)); EXPECT_EQ(a_m, meter_t(3)); EXPECT_EQ(+a_m, meter_t(3)); EXPECT_EQ(a_m, meter_t(3)); dBW_t b_dBW(1.0); EXPECT_EQ(++b_dBW, dBW_t(2)); EXPECT_EQ(b_dBW++, dBW_t(2)); EXPECT_EQ(b_dBW, dBW_t(3)); EXPECT_EQ(+b_dBW, dBW_t(3)); EXPECT_EQ(b_dBW, dBW_t(3)); } TEST_F(UnitContainer, unitTypeSubtraction) { meter_t a_m(1.0), c_m; foot_t b_ft(3.28084); c_m = a_m - b_ft; EXPECT_NEAR(0.0, c_m(), 5.0e-5); c_m = b_ft - meter_t(1); EXPECT_NEAR(0.0, c_m(), 5.0e-5); auto e_ft = b_ft - meter_t(1); EXPECT_NEAR(0.0, e_ft(), 5.0e-6); scalar_t sresult = scalar_t(1.0) - scalar_t(1.0); EXPECT_NEAR(0.0, sresult, 5.0e-6); sresult = scalar_t(1.0) - 1.0; EXPECT_NEAR(0.0, sresult, 5.0e-6); sresult = 1.0 - scalar_t(1.0); EXPECT_NEAR(0.0, sresult, 5.0e-6); double d = scalar_t(1.0) - scalar_t(1.0); EXPECT_NEAR(0.0, d, 5.0e-6); d = scalar_t(1.0) - 1.0; EXPECT_NEAR(0.0, d, 5.0e-6); d = 1.0 - scalar_t(1.0); EXPECT_NEAR(0.0, d, 5.0e-6); } TEST_F(UnitContainer, unitTypeUnarySubtraction) { meter_t a_m(4.0); EXPECT_EQ(--a_m, meter_t(3)); EXPECT_EQ(a_m--, meter_t(3)); EXPECT_EQ(a_m, meter_t(2)); EXPECT_EQ(-a_m, meter_t(-2)); EXPECT_EQ(a_m, meter_t(2)); dBW_t b_dBW(4.0); EXPECT_EQ(--b_dBW, dBW_t(3)); EXPECT_EQ(b_dBW--, dBW_t(3)); EXPECT_EQ(b_dBW, dBW_t(2)); EXPECT_EQ(-b_dBW, dBW_t(-2)); EXPECT_EQ(b_dBW, dBW_t(2)); } TEST_F(UnitContainer, unitTypeMultiplication) { meter_t a_m(1.0), b_m(2.0); foot_t a_ft(3.28084); auto c_m2 = a_m * b_m; EXPECT_NEAR(2.0, c_m2(), 5.0e-5); c_m2 = b_m * meter_t(2); EXPECT_NEAR(4.0, c_m2(), 5.0e-5); c_m2 = b_m * a_ft; EXPECT_NEAR(2.0, c_m2(), 5.0e-5); auto c_m = b_m * 2.0; EXPECT_NEAR(4.0, c_m(), 5.0e-5); c_m = 2.0 * b_m; EXPECT_NEAR(4.0, c_m(), 5.0e-5); double convert = scalar_t(3.14); EXPECT_NEAR(3.14, convert, 5.0e-5); scalar_t sresult = scalar_t(5.0) * scalar_t(4.0); EXPECT_NEAR(20.0, sresult(), 5.0e-5); sresult = scalar_t(5.0) * 4.0; EXPECT_NEAR(20.0, sresult(), 5.0e-5); sresult = 4.0 * scalar_t(5.0); EXPECT_NEAR(20.0, sresult(), 5.0e-5); double result = scalar_t(5.0) * scalar_t(4.0); EXPECT_NEAR(20.0, result, 5.0e-5); result = scalar_t(5.0) * 4.0; EXPECT_NEAR(20.0, result, 5.0e-5); result = 4.0 * scalar_t(5.0); EXPECT_NEAR(20.0, result, 5.0e-5); } TEST_F(UnitContainer, unitTypeMixedUnitMultiplication) { meter_t a_m(1.0); foot_t b_ft(3.28084); unit_t> i_m(2.0); // resultant unit is square of leftmost unit auto c_m2 = a_m * b_ft; EXPECT_NEAR(1.0, c_m2(), 5.0e-5); auto c_ft2 = b_ft * a_m; EXPECT_NEAR(10.7639111056, c_ft2(), 5.0e-7); // you can get whatever (compatible) type you want if you ask explicitly square_meter_t d_m2 = b_ft * a_m; EXPECT_NEAR(1.0, d_m2(), 5.0e-5); // a unit times a sclar ends up with the same units. meter_t e_m = a_m * scalar_t(3.0); EXPECT_NEAR(3.0, e_m(), 5.0e-5); e_m = scalar_t(4.0) * a_m; EXPECT_NEAR(4.0, e_m(), 5.0e-5); // unit times its inverse results in a scalar scalar_t s = a_m * i_m; EXPECT_NEAR(2.0, s, 5.0e-5); c_m2 = b_ft * meter_t(2); EXPECT_NEAR(2.0, c_m2(), 5.0e-5); auto e_ft2 = b_ft * meter_t(3); EXPECT_NEAR(32.2917333168, e_ft2(), 5.0e-6); auto mps = meter_t(10.0) * unit_t>(1.0); EXPECT_EQ(mps, meters_per_second_t(10)); } TEST_F(UnitContainer, unitTypeScalarMultiplication) { meter_t a_m(1.0); auto result_m = scalar_t(3.0) * a_m; EXPECT_NEAR(3.0, result_m(), 5.0e-5); result_m = a_m * scalar_t(4.0); EXPECT_NEAR(4.0, result_m(), 5.0e-5); result_m = 3.0 * a_m; EXPECT_NEAR(3.0, result_m(), 5.0e-5); result_m = a_m * 4.0; EXPECT_NEAR(4.0, result_m(), 5.0e-5); bool isSame = std::is_same::value; EXPECT_TRUE(isSame); } TEST_F(UnitContainer, unitTypeDivision) { meter_t a_m(1.0), b_m(2.0); foot_t a_ft(3.28084); second_t a_sec(10.0); bool isSame; auto c = a_m / a_ft; EXPECT_NEAR(1.0, c, 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); c = a_m / b_m; EXPECT_NEAR(0.5, c, 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); c = a_ft / a_m; EXPECT_NEAR(1.0, c, 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); c = scalar_t(1.0) / 2.0; EXPECT_NEAR(0.5, c, 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); c = 1.0 / scalar_t(2.0); EXPECT_NEAR(0.5, c, 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); double d = scalar_t(1.0) / 2.0; EXPECT_NEAR(0.5, d, 5.0e-5); auto e = a_m / a_sec; EXPECT_NEAR(0.1, e(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto f = a_m / 8.0; EXPECT_NEAR(0.125, f(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto g = 4.0 / b_m; EXPECT_NEAR(2.0, g(), 5.0e-5); isSame = std::is_same>>::value; EXPECT_TRUE(isSame); auto mph = mile_t(60.0) / hour_t(1.0); meters_per_second_t mps = mph; EXPECT_NEAR(26.8224, mps(), 5.0e-5); } TEST_F(UnitContainer, compoundAssignmentAddition) { // units meter_t a(0.0); a += meter_t(1.0); EXPECT_EQ(meter_t(1.0), a); a += foot_t(meter_t(1)); EXPECT_EQ(meter_t(2.0), a); // scalars scalar_t b(0); b += scalar_t(1.0); EXPECT_EQ(scalar_t(1.0), b); b += 1; EXPECT_EQ(scalar_t(2.0), b); } TEST_F(UnitContainer, compoundAssignmentSubtraction) { // units meter_t a(2.0); a -= meter_t(1.0); EXPECT_EQ(meter_t(1.0), a); a -= foot_t(meter_t(1)); EXPECT_EQ(meter_t(0.0), a); // scalars scalar_t b(2); b -= scalar_t(1.0); EXPECT_EQ(scalar_t(1.0), b); b -= 1; EXPECT_EQ(scalar_t(0), b); } TEST_F(UnitContainer, compoundAssignmentMultiplication) { // units meter_t a(2.0); a *= scalar_t(2.0); EXPECT_EQ(meter_t(4.0), a); a *= 2.0; EXPECT_EQ(meter_t(8.0), a); // scalars scalar_t b(2); b *= scalar_t(2.0); EXPECT_EQ(scalar_t(4.0), b); b *= 2; EXPECT_EQ(scalar_t(8.0), b); } TEST_F(UnitContainer, compoundAssignmentDivision) { // units meter_t a(8.0); a /= scalar_t(2.0); EXPECT_EQ(meter_t(4.0), a); a /= 2.0; EXPECT_EQ(meter_t(2.0), a); // scalars scalar_t b(8); b /= scalar_t(2.0); EXPECT_EQ(scalar_t(4.0), b); b /= 2; EXPECT_EQ(scalar_t(2.0), b); } TEST_F(UnitContainer, scalarTypeImplicitConversion) { double test = scalar_t(3.0); EXPECT_DOUBLE_EQ(3.0, test); scalar_t testS = 3.0; EXPECT_DOUBLE_EQ(3.0, testS); scalar_t test3(ppm_t(10)); EXPECT_DOUBLE_EQ(0.00001, test3); scalar_t test4; test4 = ppm_t(1); EXPECT_DOUBLE_EQ(0.000001, test4); } TEST_F(UnitContainer, valueMethod) { double test = meter_t(3.0).to(); EXPECT_DOUBLE_EQ(3.0, test); auto test2 = meter_t(4.0).value(); EXPECT_DOUBLE_EQ(4.0, test2); EXPECT_TRUE((std::is_same::value)); } TEST_F(UnitContainer, convertMethod) { double test = meter_t(3.0).convert().to(); EXPECT_NEAR(9.84252, test, 5.0e-6); } #ifndef UNIT_LIB_DISABLE_IOSTREAM TEST_F(UnitContainer, cout) { testing::internal::CaptureStdout(); std::cout << degree_t(349.87); std::string output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("349.87 deg", output.c_str()); testing::internal::CaptureStdout(); std::cout << meter_t(1.0); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("1 m", output.c_str()); testing::internal::CaptureStdout(); std::cout << dB_t(31.0); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("31 dB", output.c_str()); testing::internal::CaptureStdout(); std::cout << volt_t(21.79); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("21.79 V", output.c_str()); testing::internal::CaptureStdout(); std::cout << dBW_t(12.0); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("12 dBW", output.c_str()); testing::internal::CaptureStdout(); std::cout << dBm_t(120.0); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("120 dBm", output.c_str()); testing::internal::CaptureStdout(); std::cout << miles_per_hour_t(72.1); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("72.1 mph", output.c_str()); // undefined unit testing::internal::CaptureStdout(); std::cout << units::math::cpow<4>(meter_t(2)); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("16 m^4", output.c_str()); testing::internal::CaptureStdout(); std::cout << units::math::cpow<3>(foot_t(2)); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("8 cu_ft", output.c_str()); testing::internal::CaptureStdout(); std::cout << std::setprecision(9) << units::math::cpow<4>(foot_t(2)); output = testing::internal::GetCapturedStdout(); EXPECT_STREQ("0.138095597 m^4", output.c_str()); // constants testing::internal::CaptureStdout(); std::cout << std::setprecision(8) << constants::k_B; output = testing::internal::GetCapturedStdout(); #if defined(_MSC_VER) && (_MSC_VER <= 1800) EXPECT_STREQ("1.3806485e-023 m^2 kg s^-2 K^-1", output.c_str()); #else EXPECT_STREQ("1.3806485e-23 m^2 kg s^-2 K^-1", output.c_str()); #endif testing::internal::CaptureStdout(); std::cout << std::setprecision(9) << constants::mu_B; output = testing::internal::GetCapturedStdout(); #if defined(_MSC_VER) && (_MSC_VER <= 1800) EXPECT_STREQ("9.27400999e-024 m^2 A", output.c_str()); #else EXPECT_STREQ("9.27400999e-24 m^2 A", output.c_str()); #endif testing::internal::CaptureStdout(); std::cout << std::setprecision(7) << constants::sigma; output = testing::internal::GetCapturedStdout(); #if defined(_MSC_VER) && (_MSC_VER <= 1800) EXPECT_STREQ("5.670367e-008 kg s^-3 K^-4", output.c_str()); #else EXPECT_STREQ("5.670367e-08 kg s^-3 K^-4", output.c_str()); #endif } TEST_F(UnitContainer, to_string) { foot_t a(3.5); EXPECT_STREQ("3.5 ft", units::length::to_string(a).c_str()); meter_t b(8); EXPECT_STREQ("8 m", units::length::to_string(b).c_str()); } TEST_F(UnitContainer, DISABLED_to_string_locale) { struct lconv* lc; // German locale #if defined(_MSC_VER) setlocale(LC_ALL, "de-DE"); #else EXPECT_STREQ("de_DE.utf8", setlocale(LC_ALL, "de_DE.utf8")); #endif lc = localeconv(); char point_de = *lc->decimal_point; EXPECT_EQ(point_de, ','); kilometer_t de = 2_km; EXPECT_STREQ("2 km", units::length::to_string(de).c_str()); de = 2.5_km; EXPECT_STREQ("2,5 km", units::length::to_string(de).c_str()); // US locale #if defined(_MSC_VER) setlocale(LC_ALL, "en-US"); #else EXPECT_STREQ("en_US.utf8", setlocale(LC_ALL, "en_US.utf8")); #endif lc = localeconv(); char point_us = *lc->decimal_point; EXPECT_EQ(point_us, '.'); mile_t us = 2_mi; EXPECT_STREQ("2 mi", units::length::to_string(us).c_str()); us = 2.5_mi; EXPECT_STREQ("2.5 mi", units::length::to_string(us).c_str()); } TEST_F(UnitContainer, nameAndAbbreviation) { foot_t a(3.5); EXPECT_STREQ("ft", units::abbreviation(a)); EXPECT_STREQ("ft", a.abbreviation()); EXPECT_STREQ("foot", a.name()); meter_t b(8); EXPECT_STREQ("m", units::abbreviation(b)); EXPECT_STREQ("m", b.abbreviation()); EXPECT_STREQ("meter", b.name()); } #endif TEST_F(UnitContainer, negative) { meter_t a(5.3); meter_t b(-5.3); EXPECT_NEAR(a.to(), -b.to(), 5.0e-320); EXPECT_NEAR(b.to(), -a.to(), 5.0e-320); dB_t c(2.87); dB_t d(-2.87); EXPECT_NEAR(c.to(), -d.to(), 5.0e-320); EXPECT_NEAR(d.to(), -c.to(), 5.0e-320); ppm_t e = -1 * ppm_t(10); EXPECT_EQ(e, -ppm_t(10)); EXPECT_NEAR(-0.00001, e, 5.0e-10); } TEST_F(UnitContainer, concentration) { ppb_t a(ppm_t(1)); EXPECT_EQ(ppb_t(1000), a); EXPECT_EQ(0.000001, a); EXPECT_EQ(0.000001, a.to()); scalar_t b(ppm_t(1)); EXPECT_EQ(0.000001, b); scalar_t c = ppb_t(1); EXPECT_EQ(0.000000001, c); } TEST_F(UnitContainer, dBConversion) { dBW_t a_dbw(23.1); watt_t a_w = a_dbw; dBm_t a_dbm = a_dbw; EXPECT_NEAR(204.173794, a_w(), 5.0e-7); EXPECT_NEAR(53.1, a_dbm(), 5.0e-7); milliwatt_t b_mw(100000.0); watt_t b_w = b_mw; dBm_t b_dbm = b_mw; dBW_t b_dbw = b_mw; EXPECT_NEAR(100.0, b_w(), 5.0e-7); EXPECT_NEAR(50.0, b_dbm(), 5.0e-7); EXPECT_NEAR(20.0, b_dbw(), 5.0e-7); } TEST_F(UnitContainer, dBAddition) { bool isSame; auto result_dbw = dBW_t(10.0) + dB_t(30.0); EXPECT_NEAR(40.0, result_dbw(), 5.0e-5); result_dbw = dB_t(12.0) + dBW_t(30.0); EXPECT_NEAR(42.0, result_dbw(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto result_dbm = dB_t(30.0) + dBm_t(20.0); EXPECT_NEAR(50.0, result_dbm(), 5.0e-5); // adding dBW to dBW is something you probably shouldn't do, but let's see if // it works... auto result_dBW2 = dBW_t(10.0) + dBm_t(40.0); EXPECT_NEAR(20.0, result_dBW2(), 5.0e-5); isSame = std::is_same, double, decibel_scale>>::value; EXPECT_TRUE(isSame); } TEST_F(UnitContainer, dBSubtraction) { bool isSame; auto result_dbw = dBW_t(10.0) - dB_t(30.0); EXPECT_NEAR(-20.0, result_dbw(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto result_dbm = dBm_t(100.0) - dB_t(30.0); EXPECT_NEAR(70.0, result_dbm(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto result_db = dBW_t(100.0) - dBW_t(80.0); EXPECT_NEAR(20.0, result_db(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); result_db = dB_t(100.0) - dB_t(80.0); EXPECT_NEAR(20.0, result_db(), 5.0e-5); isSame = std::is_same::value; EXPECT_TRUE(isSame); } TEST_F(UnitContainer, unit_cast) { meter_t test1(5.7); hectare_t test2(16); double dResult1 = 5.7; double dResult2 = 16; int iResult2 = 16; EXPECT_EQ(dResult1, unit_cast(test1)); EXPECT_EQ(dResult2, unit_cast(test2)); EXPECT_EQ(iResult2, unit_cast(test2)); EXPECT_TRUE( (std::is_same(test1))>::value)); EXPECT_TRUE((std::is_same(test2))>::value)); } // literal syntax is only supported in GCC 4.7+ and MSVC2015+ #if !defined(_MSC_VER) || _MSC_VER > 1800 TEST_F(UnitContainer, literals) { // basic functionality testing EXPECT_TRUE((std::is_same::value)); EXPECT_TRUE(meter_t(16.2) == 16.2_m); EXPECT_TRUE(meter_t(16) == 16_m); EXPECT_TRUE((std::is_same::value)); EXPECT_TRUE(foot_t(11.2) == 11.2_ft); EXPECT_TRUE(foot_t(11) == 11_ft); // auto using literal syntax auto x = 10.0_m; EXPECT_TRUE((std::is_same::value)); EXPECT_TRUE(meter_t(10) == x); // conversion using literal syntax foot_t y = 0.3048_m; EXPECT_TRUE(1_ft == y); // Pythagorean theorem meter_t a = 3_m; meter_t b = 4_m; meter_t c = sqrt(pow<2>(a) + pow<2>(b)); EXPECT_TRUE(c == 5_m); } #endif TEST_F(UnitConversion, length) { double test; test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.01); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.3048); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1609.344); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.0254); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1852.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(149597870700.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(9460730472580800.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(3.08567758e16); EXPECT_NEAR(1.0, test, 5.0e7); test = convert(6.3); EXPECT_NEAR(6.3, test, 5.0e-5); test = convert(6.0); EXPECT_NEAR(72.0, test, 5.0e-5); test = convert(6.0); EXPECT_NEAR(0.5, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(3.28084, test, 5.0e-5); test = convert(6.3); EXPECT_NEAR(5.47455, test, 5.0e-6); test = convert(11.0); EXPECT_NEAR(17702.8, test, 5.0e-2); test = convert(1.0); EXPECT_NEAR(0.0497097, test, 5.0e-7); } TEST_F(UnitConversion, mass) { double test; test = convert(1.0e-3); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1.0e-9); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1.0e-6); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(0.453592); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1016.05); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(907.185); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(0.0283495); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(0.0002); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(14.593903, test, 5.0e-7); test = convert(6.3); EXPECT_NEAR(14288.2, test, 5.0e-2); } TEST_F(UnitConversion, time) { double result = 0; double daysPerYear = 365; double hoursPerDay = 24; double minsPerHour = 60; double secsPerMin = 60; double daysPerWeek = 7; result = 2 * daysPerYear * hoursPerDay * minsPerHour * secsPerMin * (1 / minsPerHour) * (1 / secsPerMin) * (1 / hoursPerDay) * (1 / daysPerWeek); EXPECT_NEAR(104.286, result, 5.0e-4); year_t twoYears(2.0); week_t twoYearsInWeeks = twoYears; EXPECT_NEAR(week_t(104.286).to(), twoYearsInWeeks.to(), 5.0e-4); double test; test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1.0e-9); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1.0e-6); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(1.0e-3); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(60.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(3600.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(86400.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(604800.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(3.154e7); EXPECT_NEAR(1.0, test, 5.0e3); test = convert(2.0); EXPECT_NEAR(104.2857142857143, test, 5.0e-14); test = convert(4.0); EXPECT_NEAR(240.0, test, 5.0e-14); test = convert(1.0); EXPECT_NEAR(365.25, test, 5.0e-14); test = convert(1.0); EXPECT_NEAR(365.2425, test, 5.0e-14); } TEST_F(UnitConversion, angle) { angle::degree_t quarterCircleDeg(90.0); angle::radian_t quarterCircleRad = quarterCircleDeg; EXPECT_NEAR(angle::radian_t(constants::detail::PI_VAL / 2.0).to(), quarterCircleRad.to(), 5.0e-12); double test; test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-20); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-4); test = convert(0.0174533); EXPECT_NEAR(1.0, test, 5.0e-7); test = convert(0.000290888); EXPECT_NEAR(0.99999928265913, test, 5.0e-8); test = convert(4.8481e-6); EXPECT_NEAR(0.999992407, test, 5.0e-10); test = convert(6.28319); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(0.015708); EXPECT_NEAR(1.0, test, 5.0e-6); test = convert(2.1); EXPECT_NEAR(2.1, test, 5.0e-6); test = convert(2.1); EXPECT_NEAR(0.000648148, test, 5.0e-6); test = convert(constants::detail::PI_VAL); EXPECT_NEAR(180.0, test, 5.0e-6); test = convert(90.0); EXPECT_NEAR(constants::detail::PI_VAL / 2, test, 5.0e-6); } TEST_F(UnitConversion, current) { double test; test = convert(2.1); EXPECT_NEAR(2100.0, test, 5.0e-6); } TEST_F(UnitConversion, temperature) { // temp conversion are weird/hard since they involve translations AND scaling. double test; test = convert(72.0); EXPECT_NEAR(72.0, test, 5.0e-5); test = convert(72.0); EXPECT_NEAR(72.0, test, 5.0e-5); test = convert(300.0); EXPECT_NEAR(80.33, test, 5.0e-5); test = convert(451.0); EXPECT_NEAR(505.928, test, 5.0e-4); test = convert(300.0); EXPECT_NEAR(26.85, test, 5.0e-3); test = convert(451.0); EXPECT_NEAR(724.15, test, 5.0e-3); test = convert(72.0); EXPECT_NEAR(22.2222, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(212.0, test, 5.0e-5); test = convert(32.0); EXPECT_NEAR(0.0, test, 5.0e-5); test = convert(0.0); EXPECT_NEAR(32.0, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(55.5556, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(180.0, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(559.67, test, 5.0e-5); test = convert(72.0); EXPECT_NEAR(-387.67, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(398.0, test, 5.0e-1); test = convert(80.0); EXPECT_NEAR(100.0, test, 5.0e-5); test = convert(212.0); EXPECT_NEAR(169.6, test, 5.0e-2); test = convert(80.0); EXPECT_NEAR(212.0, test, 5.0e-5); test = convert(37.0); EXPECT_NEAR(2.222, test, 5.0e-3); } TEST_F(UnitConversion, luminous_intensity) { double test; test = convert(72.0); EXPECT_NEAR(72000.0, test, 5.0e-5); test = convert(376.0); EXPECT_NEAR(0.376, test, 5.0e-5); } TEST_F(UnitConversion, solid_angle) { double test; bool same; same = std::is_same, traits::base_unit_of>::value; EXPECT_TRUE(same); test = convert(72.0); EXPECT_NEAR(72.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(3282.8, test, 5.0e-2); test = convert(8.0); EXPECT_NEAR(0.636619772367582, test, 5.0e-14); test = convert(3282.8); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(72.0); EXPECT_NEAR(72.0, test, 5.0e-5); test = convert(3282.8); EXPECT_NEAR(1.0 / (4 * constants::detail::PI_VAL), test, 5.0e-5); test = convert(1.0 / (4 * constants::detail::PI_VAL)); EXPECT_NEAR(1.0, test, 5.0e-14); test = convert(1.0 / (4 * constants::detail::PI_VAL)); EXPECT_NEAR(3282.8, test, 5.0e-2); test = convert(72.0); EXPECT_NEAR(72.0, test, 5.0e-5); } TEST_F(UnitConversion, frequency) { double test; test = convert(63000.0); EXPECT_NEAR(63.0, test, 5.0e-5); test = convert(6.3); EXPECT_NEAR(6.3, test, 5.0e-5); test = convert(5.0); EXPECT_NEAR(5000.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.0e6, test, 5.0e-5); } TEST_F(UnitConversion, velocity) { double test; bool same; same = std::is_same, category::velocity_unit>>::value; EXPECT_TRUE(same); same = traits::is_convertible_unit::value; EXPECT_TRUE(same); test = convert(1250.0); EXPECT_NEAR(2796.17, test, 5.0e-3); test = convert(2796.17); EXPECT_NEAR(3068.181418, test, 5.0e-7); test = convert(600.0); EXPECT_NEAR(690.468, test, 5.0e-4); test = convert(120.0); EXPECT_NEAR(176.0, test, 5.0e-5); test = convert(10.0); EXPECT_NEAR(3.048, test, 5.0e-5); } TEST_F(UnitConversion, angular_velocity) { double test; bool same; same = std::is_same, category::angular_velocity_unit>>::value; EXPECT_TRUE(same); same = traits::is_convertible_unit::value; EXPECT_TRUE(same); test = convert(1.0); EXPECT_NEAR(6.504e15, test, 1.0e12); test = convert(1.0); EXPECT_NEAR(0.0174533, test, 5.0e-8); test = convert(1.0); EXPECT_NEAR(0.10471975512, test, 5.0e-13); test = convert(1.0); EXPECT_NEAR(1.537e-16, test, 5.0e-20); } TEST_F(UnitConversion, acceleration) { double test; test = convert(1.0); EXPECT_NEAR(9.80665, test, 5.0e-10); } TEST_F(UnitConversion, force) { double test; test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(6.3); EXPECT_NEAR(1.4163, test, 5.0e-5); test = convert(5.0); EXPECT_NEAR(500000.0, test, 5.0e-5); test = convert(2.1); EXPECT_NEAR(15.1893, test, 5.0e-5); test = convert(173.0); EXPECT_NEAR(17.6411, test, 5.0e-5); test = convert(21.879); EXPECT_NEAR(0.308451933, test, 5.0e-10); } TEST_F(UnitConversion, area) { double test; test = convert(6.3); EXPECT_NEAR(15.5676, test, 5.0e-5); test = convert(10.0); EXPECT_NEAR(25.8999, test, 5.0e-5); test = convert(4.0); EXPECT_NEAR(0.00258064, test, 5.0e-9); test = convert(5.0); EXPECT_NEAR(217800.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(10.7639, test, 5.0e-5); } TEST_F(UnitConversion, pressure) { double test; test = convert(1.0); EXPECT_NEAR(0.00750062, test, 5.0e-5); test = convert(2.2); EXPECT_NEAR(31.9083, test, 5.0e-5); test = convert(4.0); EXPECT_NEAR(4.053, test, 5.0e-5); test = convert(800.0); EXPECT_NEAR(106657.89474, test, 5.0e-5); test = convert(38.0); EXPECT_NEAR(2.58575, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(6894.76, test, 5.0e-3); test = convert(0.25); EXPECT_NEAR(2.5e-6, test, 5.0e-5); test = convert(9.0); EXPECT_NEAR(0.0118421, test, 5.0e-8); test = convert(12.0); EXPECT_NEAR(9000.74, test, 5.0e-3); test = convert(1.0); EXPECT_NEAR(14.6959, test, 5.0e-5); } TEST_F(UnitConversion, charge) { double test; test = convert(4.0); EXPECT_NEAR(0.00111111, test, 5.0e-9); test = convert(1.0); EXPECT_NEAR(3600.0, test, 5.0e-6); } TEST_F(UnitConversion, energy) { double test; test = convert(8000.000464); EXPECT_NEAR(1912.046, test, 5.0e-4); test = convert(12.0); EXPECT_NEAR(1.266e+9, test, 5.0e5); test = convert(100.0); EXPECT_NEAR(27777.778, test, 5.0e-4); test = convert(56.0); EXPECT_NEAR(0.234304, test, 5.0e-7); test = convert(56.0); EXPECT_NEAR(0.000530904, test, 5.0e-5); test = convert(18.56399995447); EXPECT_NEAR(19.5860568, test, 5.0e-5); test = convert(18.56399995447); EXPECT_NEAR(57.28776190423856, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(239006.0, test, 5.0e-1); test = convert(2.0); EXPECT_NEAR(0.00232444, test, 5.0e-9); test = convert(0.1); EXPECT_NEAR(2521.04, test, 5.0e-3); test = convert(67.0); EXPECT_NEAR(0.2412, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(29.3071, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(0.396567, test, 5.0e-5); } TEST_F(UnitConversion, power) { double test; test = convert>, watts>( 550.0); EXPECT_NEAR(745.7, test, 5.0e-2); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-4); test = convert(200000.0); EXPECT_NEAR(0.2, test, 5.0e-4); test = convert(100.0); EXPECT_NEAR(74570.0, test, 5.0e-1); test = convert(5.0); EXPECT_NEAR(0.0037284994, test, 5.0e-7); test = convert(232.0); EXPECT_NEAR(311.117, test, 5.0e-4); test = convert(1001.0); EXPECT_NEAR(0.001342363, test, 5.0e-9); } TEST_F(UnitConversion, voltage) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(299.792458); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(299.792458, test, 5.0e-5); test = convert(0.1); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.01); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, capacitance) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, impedance) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, conductance) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, magnetic_flux) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(100000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(10.0); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, magnetic_field_strength) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(10000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(100000.0); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, inductance) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, luminous_flux) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, illuminance) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.092903); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1550.0031000062); EXPECT_NEAR(1.0, test, 5.0e-13); test = convert(0.0001); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, radiation) { double test; test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(10.0); EXPECT_NEAR(10000.0, test, 5.0e-5); test = convert(1000000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(0.000000001); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(37.0e9); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1000000.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(100.0); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, torque) { double test; test = convert(1.0); EXPECT_NEAR(1.355817948, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(0.112984829, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(4.214011009e-2, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(9.80665, test, 5.0e-5); test = convert(86.79616930855788); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(2.681170713); EXPECT_NEAR(1.0, test, 5.0e-5); } TEST_F(UnitConversion, volume) { double test; test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.0e-9, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.0e9, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(0.001, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.0e-6, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.6387e-5, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(0.0283168, test, 5.0e-8); test = convert(1.0); EXPECT_NEAR(0.764555, test, 5.0e-7); test = convert(1.0); EXPECT_NEAR(4.168e+9, test, 5.0e5); test = convert(1.0); EXPECT_NEAR(0.00378541, test, 5.0e-8); test = convert(1.0); EXPECT_NEAR(0.000946353, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(0.000473176, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(0.00024, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(2.9574e-5, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(0.158987294928, test, 5.0e-13); test = convert(1.0); EXPECT_NEAR(0.0352391, test, 5.0e-8); test = convert(1.0); EXPECT_NEAR(3.62456, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(6.11644, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(1.4787e-5, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(4.9289e-6, test, 5.0e-11); test = convert(1.0); EXPECT_NEAR(616.11519921875e-9, test, 5.0e-20); test = convert(1.0); EXPECT_NEAR(308.057599609375e-9, test, 5.0e-20); test = convert(1.0); EXPECT_NEAR(82.14869322916e-9, test, 5.0e-9); test = convert(1.0); EXPECT_NEAR(0.00075708236, test, 5.0e-12); test = convert(1.0); EXPECT_NEAR(3.69669e-6, test, 5.0e-12); test = convert(1.0); EXPECT_NEAR(0.000118294, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(0.00880977, test, 5.0e-9); test = convert(9.4591978); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(4.43603e-5, test, 5.0e-11); test = convert(1.0); EXPECT_NEAR(0.07047814033376, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(29.5735, test, 5.0e-5); } TEST_F(UnitConversion, density) { double test; test = convert(1.0); EXPECT_NEAR(1.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1000.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1000.0, test, 5.0e-5); test = convert(1.0); EXPECT_NEAR(1.001153961, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(1.729994044e3, test, 5.0e-7); test = convert(1.0); EXPECT_NEAR(7.489151707, test, 5.0e-10); test = convert(1.0); EXPECT_NEAR(16.01846337, test, 5.0e-9); test = convert(1.0); EXPECT_NEAR(2.767990471e4, test, 5.0e-6); test = convert(1.0); EXPECT_NEAR(119.8264273, test, 5.0e-8); test = convert(1.0); EXPECT_NEAR(515.3788184, test, 5.0e-6); } TEST_F(UnitConversion, concentration) { double test; test = ppm_t(1.0); EXPECT_NEAR(1.0e-6, test, 5.0e-12); test = ppb_t(1.0); EXPECT_NEAR(1.0e-9, test, 5.0e-12); test = ppt_t(1.0); EXPECT_NEAR(1.0e-12, test, 5.0e-12); test = percent_t(18.0); EXPECT_NEAR(0.18, test, 5.0e-12); } TEST_F(UnitConversion, data) { EXPECT_EQ(8, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(93750000, (convert(12))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); // Source: https://en.wikipedia.org/wiki/Binary_prefix EXPECT_NEAR(percent_t(2.4), kibibyte_t(1) / kilobyte_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(4.9), mebibyte_t(1) / megabyte_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(7.4), gibibyte_t(1) / gigabyte_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(10.0), tebibyte_t(1) / terabyte_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(12.6), pebibyte_t(1) / petabyte_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(15.3), exbibyte_t(1) / exabyte_t(1) - 1, 0.005); } TEST_F(UnitConversion, data_transfer_rate) { EXPECT_EQ(8, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(93750000, (convert(12))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1000, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); EXPECT_EQ(1024, (convert(1))); // Source: https://en.wikipedia.org/wiki/Binary_prefix EXPECT_NEAR(percent_t(2.4), kibibytes_per_second_t(1) / kilobytes_per_second_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(4.9), mebibytes_per_second_t(1) / megabytes_per_second_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(7.4), gibibytes_per_second_t(1) / gigabytes_per_second_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(10.0), tebibytes_per_second_t(1) / terabytes_per_second_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(12.6), pebibytes_per_second_t(1) / petabytes_per_second_t(1) - 1, 0.005); EXPECT_NEAR(percent_t(15.3), exbibytes_per_second_t(1) / exabytes_per_second_t(1) - 1, 0.005); } TEST_F(UnitConversion, pi) { EXPECT_TRUE( units::traits::is_dimensionless_unit::value); EXPECT_TRUE(units::traits::is_dimensionless_unit::value); // implicit conversion/arithmetic EXPECT_NEAR(3.14159, constants::pi, 5.0e-6); EXPECT_NEAR(6.28318531, (2 * constants::pi), 5.0e-9); EXPECT_NEAR(6.28318531, (constants::pi + constants::pi), 5.0e-9); EXPECT_NEAR(0.0, (constants::pi - constants::pi), 5.0e-9); EXPECT_NEAR(31.00627668, units::math::cpow<3>(constants::pi), 5.0e-10); EXPECT_NEAR(0.0322515344, (1.0 / units::math::cpow<3>(constants::pi)), 5.0e-11); EXPECT_TRUE(constants::detail::PI_VAL == constants::pi); EXPECT_TRUE(1.0 != constants::pi); EXPECT_TRUE(4.0 > constants::pi); EXPECT_TRUE(3.0 < constants::pi); EXPECT_TRUE(constants::pi > 3.0); EXPECT_TRUE(constants::pi < 4.0); // explicit conversion EXPECT_NEAR(3.14159, constants::pi.to(), 5.0e-6); // auto multiplication EXPECT_TRUE( (std::is_same::value)); EXPECT_TRUE( (std::is_same::value)); EXPECT_NEAR(constants::detail::PI_VAL, (constants::pi * meter_t(1)).to(), 5.0e-10); EXPECT_NEAR(constants::detail::PI_VAL, (meter_t(1) * constants::pi).to(), 5.0e-10); // explicit multiplication meter_t a = constants::pi * meter_t(1); meter_t b = meter_t(1) * constants::pi; EXPECT_NEAR(constants::detail::PI_VAL, a.to(), 5.0e-10); EXPECT_NEAR(constants::detail::PI_VAL, b.to(), 5.0e-10); // auto division EXPECT_TRUE( (std::is_same::value)); EXPECT_TRUE( (std::is_same::value)); EXPECT_NEAR(constants::detail::PI_VAL, (constants::pi / second_t(1)).to(), 5.0e-10); EXPECT_NEAR(1.0 / constants::detail::PI_VAL, (second_t(1) / constants::pi).to(), 5.0e-10); // explicit hertz_t c = constants::pi / second_t(1); second_t d = second_t(1) / constants::pi; EXPECT_NEAR(constants::detail::PI_VAL, c.to(), 5.0e-10); EXPECT_NEAR(1.0 / constants::detail::PI_VAL, d.to(), 5.0e-10); } TEST_F(UnitConversion, constants) { // Source: NIST "2014 CODATA recommended values" EXPECT_NEAR(299792458, constants::c(), 5.0e-9); EXPECT_NEAR(6.67408e-11, constants::G(), 5.0e-17); EXPECT_NEAR(6.626070040e-34, constants::h(), 5.0e-44); EXPECT_NEAR(1.2566370614e-6, constants::mu0(), 5.0e-17); EXPECT_NEAR(8.854187817e-12, constants::epsilon0(), 5.0e-21); EXPECT_NEAR(376.73031346177, constants::Z0(), 5.0e-12); EXPECT_NEAR(8987551787.3681764, constants::k_e(), 5.0e-6); EXPECT_NEAR(1.6021766208e-19, constants::e(), 5.0e-29); EXPECT_NEAR(9.10938356e-31, constants::m_e(), 5.0e-40); EXPECT_NEAR(1.672621898e-27, constants::m_p(), 5.0e-37); EXPECT_NEAR(9.274009994e-24, constants::mu_B(), 5.0e-32); EXPECT_NEAR(6.022140857e23, constants::N_A(), 5.0e14); EXPECT_NEAR(8.3144598, constants::R(), 5.0e-8); EXPECT_NEAR(1.38064852e-23, constants::k_B(), 5.0e-31); EXPECT_NEAR(96485.33289, constants::F(), 5.0e-5); EXPECT_NEAR(5.670367e-8, constants::sigma(), 5.0e-14); } TEST_F(UnitConversion, std_chrono) { nanosecond_t a = std::chrono::nanoseconds(10); EXPECT_EQ(nanosecond_t(10), a); microsecond_t b = std::chrono::microseconds(10); EXPECT_EQ(microsecond_t(10), b); millisecond_t c = std::chrono::milliseconds(10); EXPECT_EQ(millisecond_t(10), c); second_t d = std::chrono::seconds(1); EXPECT_EQ(second_t(1), d); minute_t e = std::chrono::minutes(120); EXPECT_EQ(minute_t(120), e); hour_t f = std::chrono::hours(2); EXPECT_EQ(hour_t(2), f); std::chrono::nanoseconds g = nanosecond_t(100); EXPECT_EQ(std::chrono::duration_cast(g).count(), 100); std::chrono::nanoseconds h = microsecond_t(2); EXPECT_EQ(std::chrono::duration_cast(h).count(), 2000); std::chrono::nanoseconds i = millisecond_t(1); EXPECT_EQ(std::chrono::duration_cast(i).count(), 1000000); std::chrono::nanoseconds j = second_t(1); EXPECT_EQ(std::chrono::duration_cast(j).count(), 1000000000); std::chrono::nanoseconds k = minute_t(1); EXPECT_EQ(std::chrono::duration_cast(k).count(), 60000000000); std::chrono::nanoseconds l = hour_t(1); EXPECT_EQ(std::chrono::duration_cast(l).count(), 3600000000000); } TEST_F(UnitConversion, squaredTemperature) { using squared_celsius = units::compound_unit>; using squared_celsius_t = units::unit_t; const squared_celsius_t right(100); const celsius_t rootRight = units::math::sqrt(right); EXPECT_EQ(celsius_t(10), rootRight); } TEST_F(UnitMath, min) { meter_t a(1); foot_t c(1); EXPECT_EQ(c, math::min(a, c)); } TEST_F(UnitMath, max) { meter_t a(1); foot_t c(1); EXPECT_EQ(a, math::max(a, c)); } TEST_F(UnitMath, cos) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(-0.41614683654), cos(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(-0.70710678118), cos(angle::degree_t(135)), 5.0e-11); } TEST_F(UnitMath, sin) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(0.90929742682), sin(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(0.70710678118), sin(angle::degree_t(135)), 5.0e-11); } TEST_F(UnitMath, tan) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(-2.18503986326), tan(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(-1.0), tan(angle::degree_t(135)), 5.0e-11); } TEST_F(UnitMath, acos) { EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(2).to(), acos(scalar_t(-0.41614683654)).to(), 5.0e-11); EXPECT_NEAR( angle::degree_t(135).to(), angle::degree_t(acos(scalar_t(-0.70710678118654752440084436210485))) .to(), 5.0e-12); } TEST_F(UnitMath, asin) { EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(1.14159265).to(), asin(scalar_t(0.90929742682)).to(), 5.0e-9); EXPECT_NEAR( angle::degree_t(45).to(), angle::degree_t(asin(scalar_t(0.70710678118654752440084436210485))) .to(), 5.0e-12); } TEST_F(UnitMath, atan) { EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(-1.14159265).to(), atan(scalar_t(-2.18503986326)).to(), 5.0e-9); EXPECT_NEAR(angle::degree_t(-45).to(), angle::degree_t(atan(scalar_t(-1.0))).to(), 5.0e-12); } TEST_F(UnitMath, atan2) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(constants::detail::PI_VAL / 4).to(), atan2(scalar_t(2), scalar_t(2)).to(), 5.0e-12); EXPECT_NEAR( angle::degree_t(45).to(), angle::degree_t(atan2(scalar_t(2), scalar_t(2))).to(), 5.0e-12); EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(constants::detail::PI_VAL / 6).to(), atan2(scalar_t(1), scalar_t(std::sqrt(3))).to(), 5.0e-12); EXPECT_NEAR(angle::degree_t(30).to(), angle::degree_t(atan2(scalar_t(1), scalar_t(std::sqrt(3)))) .to(), 5.0e-12); } TEST_F(UnitMath, cosh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(3.76219569108), cosh(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(5.32275215), cosh(angle::degree_t(135)), 5.0e-9); } TEST_F(UnitMath, sinh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(3.62686040785), sinh(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(5.22797192), sinh(angle::degree_t(135)), 5.0e-9); } TEST_F(UnitMath, tanh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(scalar_t(0.96402758007), tanh(angle::radian_t(2)), 5.0e-11); EXPECT_NEAR(scalar_t(0.98219338), tanh(angle::degree_t(135)), 5.0e-11); } TEST_F(UnitMath, acosh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(1.316957896924817).to(), acosh(scalar_t(2.0)).to(), 5.0e-11); EXPECT_NEAR(angle::degree_t(75.456129290216893).to(), angle::degree_t(acosh(scalar_t(2.0))).to(), 5.0e-12); } TEST_F(UnitMath, asinh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(1.443635475178810).to(), asinh(scalar_t(2)).to(), 5.0e-9); EXPECT_NEAR(angle::degree_t(82.714219883108939).to(), angle::degree_t(asinh(scalar_t(2))).to(), 5.0e-12); } TEST_F(UnitMath, atanh) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(0.549306144334055).to(), atanh(scalar_t(0.5)).to(), 5.0e-9); EXPECT_NEAR(angle::degree_t(31.472923730945389).to(), angle::degree_t(atanh(scalar_t(0.5))).to(), 5.0e-12); } TEST_F(UnitMath, exp) { double val = 10.0; EXPECT_EQ(std::exp(val), exp(scalar_t(val))); } TEST_F(UnitMath, log) { double val = 100.0; EXPECT_EQ(std::log(val), log(scalar_t(val))); } TEST_F(UnitMath, log10) { double val = 100.0; EXPECT_EQ(std::log10(val), log10(scalar_t(val))); } TEST_F(UnitMath, modf) { double val = 100.0; double modfr1; scalar_t modfr2; EXPECT_EQ(std::modf(val, &modfr1), modf(scalar_t(val), &modfr2)); EXPECT_EQ(modfr1, modfr2); } TEST_F(UnitMath, exp2) { double val = 10.0; EXPECT_EQ(std::exp2(val), exp2(scalar_t(val))); } TEST_F(UnitMath, expm1) { double val = 10.0; EXPECT_EQ(std::expm1(val), expm1(scalar_t(val))); } TEST_F(UnitMath, log1p) { double val = 10.0; EXPECT_EQ(std::log1p(val), log1p(scalar_t(val))); } TEST_F(UnitMath, log2) { double val = 10.0; EXPECT_EQ(std::log2(val), log2(scalar_t(val))); } TEST_F(UnitMath, pow) { bool isSame; meter_t value(10.0); auto sq = pow<2>(value); EXPECT_NEAR(100.0, sq(), 5.0e-2); isSame = std::is_same::value; EXPECT_TRUE(isSame); auto cube = pow<3>(value); EXPECT_NEAR(1000.0, cube(), 5.0e-2); isSame = std::is_same>>::value; EXPECT_TRUE(isSame); auto fourth = pow<4>(value); EXPECT_NEAR(10000.0, fourth(), 5.0e-2); isSame = std::is_same< decltype(fourth), unit_t, squared>>>::value; EXPECT_TRUE(isSame); } TEST_F(UnitMath, sqrt) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(meter_t(2.0).to(), sqrt(square_meter_t(4.0)).to(), 5.0e-9); EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(angle::radian_t(4.0).to(), sqrt(steradian_t(16.0)).to(), 5.0e-9); EXPECT_TRUE((std::is_convertible::type, typename std::decay::type>::value)); // for rational conversion (i.e. no integral root) let's check a bunch of // different ways this could go wrong foot_t resultFt = sqrt(square_foot_t(10.0)); EXPECT_NEAR(foot_t(3.16227766017).to(), sqrt(square_foot_t(10.0)).to(), 5.0e-9); EXPECT_NEAR(foot_t(3.16227766017).to(), resultFt.to(), 5.0e-9); EXPECT_EQ(resultFt, sqrt(square_foot_t(10.0))); } TEST_F(UnitMath, hypot) { EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(meter_t(5.0).to(), (hypot(meter_t(3.0), meter_t(4.0))).to(), 5.0e-9); EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(foot_t(5.0).to(), (hypot(foot_t(3.0), meter_t(1.2192))).to(), 5.0e-9); } TEST_F(UnitMath, ceil) { double val = 101.1; EXPECT_EQ(std::ceil(val), ceil(meter_t(val)).to()); EXPECT_TRUE((std::is_same::type, typename std::decay::type>::value)); } TEST_F(UnitMath, floor) { double val = 101.1; EXPECT_EQ(std::floor(val), floor(scalar_t(val))); } TEST_F(UnitMath, fmod) { EXPECT_EQ(std::fmod(100.0, 101.2), fmod(meter_t(100.0), meter_t(101.2)).to()); } TEST_F(UnitMath, trunc) { double val = 101.1; EXPECT_EQ(std::trunc(val), trunc(scalar_t(val))); } TEST_F(UnitMath, round) { double val = 101.1; EXPECT_EQ(std::round(val), round(scalar_t(val))); } TEST_F(UnitMath, copysign) { double sign = -1; meter_t val(5.0); EXPECT_EQ(meter_t(-5.0), copysign(val, sign)); EXPECT_EQ(meter_t(-5.0), copysign(val, angle::radian_t(sign))); } TEST_F(UnitMath, fdim) { EXPECT_EQ(meter_t(0.0), fdim(meter_t(8.0), meter_t(10.0))); EXPECT_EQ(meter_t(2.0), fdim(meter_t(10.0), meter_t(8.0))); EXPECT_NEAR(meter_t(9.3904).to(), fdim(meter_t(10.0), foot_t(2.0)).to(), 5.0e-320); // not sure why they aren't comparing exactly equal, // but clearly they are. } TEST_F(UnitMath, fmin) { EXPECT_EQ(meter_t(8.0), fmin(meter_t(8.0), meter_t(10.0))); EXPECT_EQ(meter_t(8.0), fmin(meter_t(10.0), meter_t(8.0))); EXPECT_EQ(foot_t(2.0), fmin(meter_t(10.0), foot_t(2.0))); } TEST_F(UnitMath, fmax) { EXPECT_EQ(meter_t(10.0), fmax(meter_t(8.0), meter_t(10.0))); EXPECT_EQ(meter_t(10.0), fmax(meter_t(10.0), meter_t(8.0))); EXPECT_EQ(meter_t(10.0), fmax(meter_t(10.0), foot_t(2.0))); } TEST_F(UnitMath, fabs) { EXPECT_EQ(meter_t(10.0), fabs(meter_t(-10.0))); EXPECT_EQ(meter_t(10.0), fabs(meter_t(10.0))); } TEST_F(UnitMath, abs) { EXPECT_EQ(meter_t(10.0), abs(meter_t(-10.0))); EXPECT_EQ(meter_t(10.0), abs(meter_t(10.0))); } // Constexpr #if !defined(_MSC_VER) || _MSC_VER > 1800 TEST_F(Constexpr, construction) { constexpr meter_t result0(0); constexpr auto result1 = make_unit(1); constexpr auto result2 = meter_t(2); EXPECT_EQ(meter_t(0), result0); EXPECT_EQ(meter_t(1), result1); EXPECT_EQ(meter_t(2), result2); EXPECT_TRUE(noexcept(result0)); EXPECT_TRUE(noexcept(result1)); EXPECT_TRUE(noexcept(result2)); } TEST_F(Constexpr, constants) { EXPECT_TRUE(noexcept(constants::c())); EXPECT_TRUE(noexcept(constants::G())); EXPECT_TRUE(noexcept(constants::h())); EXPECT_TRUE(noexcept(constants::mu0())); EXPECT_TRUE(noexcept(constants::epsilon0())); EXPECT_TRUE(noexcept(constants::Z0())); EXPECT_TRUE(noexcept(constants::k_e())); EXPECT_TRUE(noexcept(constants::e())); EXPECT_TRUE(noexcept(constants::m_e())); EXPECT_TRUE(noexcept(constants::m_p())); EXPECT_TRUE(noexcept(constants::mu_B())); EXPECT_TRUE(noexcept(constants::N_A())); EXPECT_TRUE(noexcept(constants::R())); EXPECT_TRUE(noexcept(constants::k_B())); EXPECT_TRUE(noexcept(constants::F())); EXPECT_TRUE(noexcept(constants::sigma())); } TEST_F(Constexpr, arithmetic) { constexpr auto result0(1_m + 1_m); constexpr auto result1(1_m - 1_m); constexpr auto result2(1_m * 1_m); constexpr auto result3(1_m / 1_m); constexpr auto result4(meter_t(1) + meter_t(1)); constexpr auto result5(meter_t(1) - meter_t(1)); constexpr auto result6(meter_t(1) * meter_t(1)); constexpr auto result7(meter_t(1) / meter_t(1)); constexpr auto result8(units::math::cpow<2>(meter_t(2))); constexpr auto result9 = units::math::cpow<3>(2_m); constexpr auto result10 = 2_m * 2_m; EXPECT_TRUE(noexcept(result0)); EXPECT_TRUE(noexcept(result1)); EXPECT_TRUE(noexcept(result2)); EXPECT_TRUE(noexcept(result3)); EXPECT_TRUE(noexcept(result4)); EXPECT_TRUE(noexcept(result5)); EXPECT_TRUE(noexcept(result6)); EXPECT_TRUE(noexcept(result7)); EXPECT_TRUE(noexcept(result8)); EXPECT_TRUE(noexcept(result9)); EXPECT_TRUE(noexcept(result10)); EXPECT_EQ(8_cu_m, result9); EXPECT_EQ(4_sq_m, result10); } TEST_F(Constexpr, realtional) { constexpr bool equalityTrue = (1_m == 1_m); constexpr bool equalityFalse = (1_m == 2_m); constexpr bool lessThanTrue = (1_m < 2_m); constexpr bool lessThanFalse = (1_m < 1_m); constexpr bool lessThanEqualTrue1 = (1_m <= 1_m); constexpr bool lessThanEqualTrue2 = (1_m <= 2_m); constexpr bool lessThanEqualFalse = (1_m < 0_m); constexpr bool greaterThanTrue = (2_m > 1_m); constexpr bool greaterThanFalse = (2_m > 2_m); constexpr bool greaterThanEqualTrue1 = (2_m >= 1_m); constexpr bool greaterThanEqualTrue2 = (2_m >= 2_m); constexpr bool greaterThanEqualFalse = (2_m > 3_m); EXPECT_TRUE(equalityTrue); EXPECT_TRUE(lessThanTrue); EXPECT_TRUE(lessThanEqualTrue1); EXPECT_TRUE(lessThanEqualTrue2); EXPECT_TRUE(greaterThanTrue); EXPECT_TRUE(greaterThanEqualTrue1); EXPECT_TRUE(greaterThanEqualTrue2); EXPECT_FALSE(equalityFalse); EXPECT_FALSE(lessThanFalse); EXPECT_FALSE(lessThanEqualFalse); EXPECT_FALSE(greaterThanFalse); EXPECT_FALSE(greaterThanEqualFalse); } TEST_F(Constexpr, stdArray) { constexpr std::array arr = {0_m, 1_m, 2_m, 3_m, 4_m}; constexpr bool equal = (arr[3] == 3_m); EXPECT_TRUE(equal); } #endif TEST_F(CompileTimeArithmetic, unit_value_t) { typedef unit_value_t mRatio; EXPECT_EQ(meter_t(1.5), mRatio::value()); } TEST_F(CompileTimeArithmetic, is_unit_value_t) { using mRatio = unit_value_t; EXPECT_TRUE((traits::is_unit_value_t::value)); EXPECT_FALSE((traits::is_unit_value_t::value)); EXPECT_FALSE((traits::is_unit_value_t::value)); EXPECT_TRUE((traits::is_unit_value_t::value)); EXPECT_FALSE((traits::is_unit_value_t::value)); EXPECT_FALSE((traits::is_unit_value_t::value)); } TEST_F(CompileTimeArithmetic, is_unit_value_t_category) { using mRatio = unit_value_t; EXPECT_TRUE( (traits::is_unit_value_t_category::value)); EXPECT_FALSE( (traits::is_unit_value_t_category::value)); EXPECT_FALSE(( traits::is_unit_value_t_category::value)); EXPECT_FALSE( (traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_add) { using mRatio = unit_value_t; using sum = unit_value_add; EXPECT_EQ(meter_t(3.0), sum::value()); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using ftRatio = unit_value_t; using sumf = unit_value_add; EXPECT_TRUE(( std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(5.92125984, sumf::value().to(), 5.0e-8); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using cRatio = unit_value_t; using fRatio = unit_value_t; using sumc = unit_value_add; EXPECT_TRUE(( std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(2.11111111111, sumc::value().to(), 5.0e-8); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using rRatio = unit_value_t; using dRatio = unit_value_t; using sumr = unit_value_add; EXPECT_TRUE(( std::is_same::type, typename std::decay::type>::value)); EXPECT_NEAR(1.05235988, sumr::value().to(), 5.0e-8); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_subtract) { using mRatio = unit_value_t; using diff = unit_value_subtract; EXPECT_EQ(meter_t(0), diff::value()); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using ftRatio = unit_value_t; using difff = unit_value_subtract; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(-3.92125984, difff::value().to(), 5.0e-8); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using cRatio = unit_value_t; using fRatio = unit_value_t; using diffc = unit_value_subtract; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(-0.11111111111, diffc::value().to(), 5.0e-8); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using rRatio = unit_value_t; using dRatio = unit_value_t; using diffr = unit_value_subtract; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(0.947640122, diffr::value().to(), 5.0e-8); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_multiply) { using mRatio = unit_value_t; using ftRatio = unit_value_t; // 2 meter using product = unit_value_multiply; EXPECT_EQ(square_meter_t(4), product::value()); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using productM = unit_value_multiply; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(4.0, productM::value().to(), 5.0e-7); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using productF = unit_value_multiply; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(43.0556444224, productF::value().to(), 5.0e-6); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using productF2 = unit_value_multiply; EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(43.0556444224, productF2::value().to(), 5.0e-8); EXPECT_TRUE(( traits::is_unit_value_t_category::value)); using nRatio = unit_value_t; using productN = unit_value_multiply; EXPECT_FALSE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_TRUE((std::is_convertible< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(32.8084, productN::value().to(), 5.0e-8); EXPECT_NEAR(10.0, (productN::value().convert().to()), 5.0e-7); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using r1Ratio = unit_value_t; using r2Ratio = unit_value_t; using productR = unit_value_multiply; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(2.42, productR::value().to(), 5.0e-8); EXPECT_NEAR(7944.39137, (productR::value().convert().to()), 5.0e-6); EXPECT_TRUE((traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_divide) { using mRatio = unit_value_t; using ftRatio = unit_value_t; // 2 meter using product = unit_value_divide; EXPECT_EQ(scalar_t(1), product::value()); EXPECT_TRUE(( traits::is_unit_value_t_category::value)); using productM = unit_value_divide; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(1, productM::value().to(), 5.0e-7); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using productF = unit_value_divide; EXPECT_TRUE((std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(1.0, productF::value().to(), 5.0e-6); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using productF2 = unit_value_divide; EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(1.0, productF2::value().to(), 5.0e-8); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using sRatio = unit_value_t; using productMS = unit_value_divide; EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(0.2, productMS::value().to(), 5.0e-8); EXPECT_TRUE((traits::is_unit_value_t_category::value)); using rRatio = unit_value_t; using productRS = unit_value_divide; EXPECT_TRUE( (std::is_same< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(2, productRS::value().to(), 5.0e-8); EXPECT_NEAR(114.592, (productRS::value().convert().to()), 5.0e-4); EXPECT_TRUE((traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_power) { using mRatio = unit_value_t; using sq = unit_value_power; EXPECT_TRUE((std::is_convertible< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(4, sq::value().to(), 5.0e-8); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using rRatio = unit_value_t; using sqr = unit_value_power; EXPECT_TRUE((std::is_convertible< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(3.24, sqr::value().to(), 5.0e-8); EXPECT_NEAR(10636.292574038049895092690529904, (sqr::value().convert().to()), 5.0e-10); EXPECT_TRUE((traits::is_unit_value_t_category::value)); } TEST_F(CompileTimeArithmetic, unit_value_sqrt) { using mRatio = unit_value_t; using root = unit_value_sqrt; EXPECT_TRUE((std::is_convertible< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(3.16227766017, root::value().to(), 5.0e-9); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using hRatio = unit_value_t; using rooth = unit_value_sqrt; EXPECT_TRUE((std::is_convertible< typename std::decay::type, typename std::decay::type>::value)); EXPECT_NEAR(2.69920623253, rooth::value().to(), 5.0e-8); EXPECT_NEAR(269.920623, rooth::value().convert().to(), 5.0e-6); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); using rRatio = unit_value_t; using rootr = unit_value_sqrt; EXPECT_TRUE((traits::is_angle_unit::value)); EXPECT_NEAR(1.3416407865, rootr::value().to(), 5.0e-8); EXPECT_NEAR(76.870352574, rootr::value().convert().to(), 5.0e-6); EXPECT_TRUE( (traits::is_unit_value_t_category::value)); } TEST_F(CaseStudies, radarRangeEquation) { watt_t P_t; // transmit power scalar_t G; // gain meter_t lambda; // wavelength square_meter_t sigma; // radar cross section meter_t R; // range kelvin_t T_s; // system noise temp hertz_t B_n; // bandwidth scalar_t L; // loss P_t = megawatt_t(1.4); G = dB_t(33.0); lambda = constants::c / megahertz_t(2800); sigma = square_meter_t(1.0); R = meter_t(111000.0); T_s = kelvin_t(950.0); B_n = megahertz_t(1.67); L = dB_t(8.0); scalar_t SNR = (P_t * math::pow<2>(G) * math::pow<2>(lambda) * sigma) / (math::pow<3>(4 * constants::pi) * math::pow<4>(R) * constants::k_B * T_s * B_n * L); EXPECT_NEAR(1.535, SNR(), 5.0e-4); } TEST_F(CaseStudies, pythagoreanTheorum) { EXPECT_EQ(meter_t(3), RightTriangle::a::value()); EXPECT_EQ(meter_t(4), RightTriangle::b::value()); EXPECT_EQ(meter_t(5), RightTriangle::c::value()); EXPECT_TRUE(pow<2>(RightTriangle::a::value()) + pow<2>(RightTriangle::b::value()) == pow<2>(RightTriangle::c::value())); }