#include #include #include #include "Base/UnitsApi.h" #include using Base::ParserError; using Base::Quantity; using Base::Unit; using Base::UnitsMismatchError; TEST(BaseQuantity, TestValid) { const Quantity q1 {1.0, Unit::Length}; Quantity q2 {1.0, Unit::Area}; q2.setInvalid(); EXPECT_EQ(q1.isValid(), true); EXPECT_EQ(q2.isValid(), false); } TEST(BaseQuantity, TestParse) { const Quantity q1 = Quantity::parse("1,234 kg"); constexpr auto val {1.2340}; EXPECT_EQ(q1, Quantity(val, Unit::Mass)); EXPECT_THROW(auto rew [[maybe_unused]] = Quantity::parse("1,234,500.12 kg"), ParserError); } TEST(BaseQuantity, TestNoDim) { const Quantity q1 {}; EXPECT_EQ(q1.pow(2), Quantity {0}); EXPECT_EQ(q1.isDimensionless(), true); } TEST(BaseQuantity, TestPowEQ1) { const Quantity q1 {2, Unit::Area}; const auto expect = Quantity {2, Unit::Area}; EXPECT_EQ(q1.pow(1), expect); } TEST(BaseQuantity, TestPowEQ0) { const Quantity q1 {2, Unit::Area}; EXPECT_EQ(q1.pow(0), Quantity {1}); } TEST(BaseQuantity, TestPowGT1) { constexpr auto v2 {2}; constexpr auto v4 {4}; const Quantity q1 {v2, Unit::Length}; EXPECT_EQ(q1.pow(v2), Quantity(v4, Unit::Area)); } TEST(BaseQuantity, TestPowLT1) { constexpr auto v8 {8}; constexpr auto v2 {2}; constexpr auto v3 {3.0}; const Quantity q1 {v8, Unit::Volume}; EXPECT_EQ(q1.pow(1.0 / v3), Quantity(v2, Unit::Length)); } TEST(BaseQuantity, TestPow3DIV2) { constexpr auto v2 {2.0}; constexpr auto v3 {3.0}; constexpr auto v8 {8}; const Quantity unit {v8, Unit::Volume}; EXPECT_THROW(unit.pow(v3 / v2), UnitsMismatchError); } TEST(BaseQuantity, TestString) { constexpr auto v2 {2}; const Quantity q1 {v2, "kg*m/s^2"}; EXPECT_EQ(q1.getUnit(), Unit::Force); const Quantity q2 {v2, "kg*m^2/s^2"}; EXPECT_EQ(q2.getUnit(), Unit::Work); } TEST(BaseQuantity, TestCopy) { const Quantity q1 {1.0, Unit::Length}; EXPECT_EQ(Quantity {q1}, q1); } TEST(BaseQuantity, TestEqual) { const Quantity q1 {1.0, Unit::Force}; const Quantity q2 {1.0, "kg*mm/s^2"}; EXPECT_EQ(q1 == q1, true); EXPECT_EQ(q1 == q2, true); } TEST(BaseQuantity, TestNotEqual) { constexpr auto v2 {2.0}; const Quantity q1 {1.0, Unit::Force}; const Quantity q2 {v2, "kg*m/s^2"}; const Quantity q3 {1.0, Unit::Work}; EXPECT_EQ(q1 != q2, true); EXPECT_EQ(q1 != q3, true); } TEST(BaseQuantity, TestLessOrGreater) { constexpr auto v2 {2.0}; Quantity q1 {1.0, Unit::Force}; Quantity q2 {v2, "kg*m/s^2"}; Quantity q3 {v2, Unit::Work}; EXPECT_EQ(q1 < q2, true); EXPECT_EQ(q1 > q2, false); EXPECT_EQ(q1 <= q1, true); EXPECT_EQ(q1 >= q1, true); EXPECT_THROW(auto res [[maybe_unused]] = (q1 < q3), UnitsMismatchError); EXPECT_THROW(auto res [[maybe_unused]] = (q1 > q3), UnitsMismatchError); EXPECT_THROW(auto res [[maybe_unused]] = (q1 <= q3), UnitsMismatchError); EXPECT_THROW(auto res [[maybe_unused]] = (q1 >= q3), UnitsMismatchError); } TEST(BaseQuantity, TestAdd) { Quantity q1 {1.0, Unit::Length}; Quantity q2 {1.0, Unit::Area}; EXPECT_THROW(q1 + q2, UnitsMismatchError); EXPECT_THROW(q1 += q2, UnitsMismatchError); EXPECT_EQ(q1 + q1, Quantity(2, Unit::Length)); EXPECT_EQ(q1 += q1, Quantity(2, Unit::Length)); } TEST(BaseQuantity, TestSub) { Quantity q1 {1.0, Unit::Length}; Quantity q2 {1.0, Unit::Area}; EXPECT_THROW(q1 - q2, UnitsMismatchError); EXPECT_THROW(q1 -= q2, UnitsMismatchError); EXPECT_EQ(q1 - q1, Quantity(0, Unit::Length)); EXPECT_EQ(q1 -= q1, Quantity(0, Unit::Length)); } TEST(BaseQuantity, TestNeg) { const Quantity q1 {1.0, Unit::Length}; EXPECT_EQ(-q1, Quantity(-1.0, Unit::Length)); } TEST(BaseQuantity, TestMult) { const Quantity q1 {1.0, Unit::Length}; const Quantity q2 {1.0, Unit::Area}; EXPECT_EQ(q1 * q2, Quantity(1.0, Unit::Volume)); EXPECT_EQ(q1 * 2.0, Quantity(2.0, Unit::Length)); } TEST(BaseQuantity, TestDiv) { const Quantity q1 {1.0, Unit::Length}; const Quantity q2 {1.0, Unit::Area}; EXPECT_EQ(q1 / q2, Quantity(1.0, Unit::InverseLength)); EXPECT_EQ(q1 / 2.0, Quantity(0.5, Unit::Length)); } TEST(BaseQuantity, TestPow) { constexpr auto v2 {2.0}; constexpr auto v4 {4}; Quantity q1 {v2, Unit::Length}; Quantity q2 {v2, Unit::Area}; Quantity q3 {0.0}; EXPECT_EQ(q1.pow(q3), Quantity {1}); EXPECT_EQ(q1.pow(v2), Quantity(v4, Unit::Area)); EXPECT_THROW(q1.pow(q2), UnitsMismatchError); } class BaseQuantityLoc: public ::testing::Test { protected: void SetUp() override { QLocale loc(QLocale::C); QLocale::setDefault(loc); } void TearDown() override {} }; TEST_F(BaseQuantityLoc, psi_parse_spaced) { const auto qParsed = Quantity::parse("1 psi"); EXPECT_EQ(qParsed.getValue(), 6.8947572931683609); } TEST_F(BaseQuantityLoc, psi_parse_no_space) { const auto qParsed = Quantity::parse("1psi"); EXPECT_EQ(qParsed.getValue(), 6.8947572931683609); } TEST_F(BaseQuantityLoc, psi_parse_user_str) { Base::UnitsApi::setSchema("Internal"); auto qParsed = Quantity::parse("1 psi"); auto format = qParsed.getFormat(); format.setPrecision(2); qParsed.setFormat(format); EXPECT_EQ(qParsed.getUserString(), "6894.76 Pa"); } TEST_F(BaseQuantityLoc, psi_parse_safe_user_str) { Base::UnitsApi::setSchema("Internal"); auto qParsed = Quantity::parse("1 psi"); auto format = qParsed.getFormat(); format.setPrecision(2); qParsed.setFormat(format); EXPECT_EQ(qParsed.getSafeUserString(), "6894.76 Pa"); } TEST_F(BaseQuantityLoc, psi_parse_unit_type) { const auto qParsed = Quantity::parse("1 psi"); EXPECT_EQ(qParsed.getUnit().getTypeString(), "Pressure"); } TEST_F(BaseQuantityLoc, psi_to_Pa) { const auto result = Quantity::parse("1 psi").getValueAs(Quantity::Pascal); const auto expect = 6894.7572931683608; EXPECT_EQ(result, expect); } TEST_F(BaseQuantityLoc, psi_to_KPa) { const auto result = Quantity::parse("1 psi").getValueAs(Quantity::KiloPascal); const auto expect = 6.8947572931683609; EXPECT_EQ(result, expect); } TEST_F(BaseQuantityLoc, psi_to_MPa) { const auto result = Quantity::parse("1 psi").getValueAs(Quantity::MegaPascal); const auto expect = 0.0068947572931683607; EXPECT_EQ(result, expect); } TEST_F(BaseQuantityLoc, voltage_unit) { const auto qq = Quantity::parse("1e20 V"); EXPECT_EQ(qq.getUnit(), Unit::ElectricPotential); } TEST_F(BaseQuantityLoc, voltage_val) { const auto qq = Quantity::parse("1e20 V"); EXPECT_EQ(qq.getValue(), 1e+26); } TEST_F(BaseQuantityLoc, voltage_val_smaller) { const auto qq = Quantity::parse("1e3 V"); EXPECT_EQ(qq.getValue(), 1e+9); }