#include #include #include #include import mean_field; import test_helpers; namespace { template concept Addable = requires(const Left left, const Right right) { left + right; }; template concept EqualityComparable = requires(const Left left, const Right right) { { left == right } -> std::convertible_to; }; } // namespace TEST_CASE( "Physical Quantity Values Are Strong Scalar Types", tags::dimensional_quantities ) { using namespace mean_field; STATIC_CHECK(dimensions::PhysicalQuantityType); STATIC_CHECK(dimensions::PhysicalQuantityType); STATIC_CHECK(dimensions::PhysicalQuantityType); STATIC_CHECK(dimensions::ThermodynamicQuantityType); STATIC_CHECK(dimensions::ThermodynamicQuantityType); STATIC_CHECK(dimensions::ThermodynamicQuantityType); STATIC_CHECK_FALSE(dimensions::ThermodynamicQuantityType); STATIC_CHECK(dimensions::QuantityValueType); STATIC_CHECK(dimensions::QuantityValueType); STATIC_CHECK(std::same_as, dimensions::quantity::Mass>); STATIC_CHECK( std::same_as, dimensions::quantity::AngularMomentum> ); STATIC_CHECK(std::constructible_from); STATIC_CHECK_FALSE(std::convertible_to); STATIC_CHECK_FALSE(std::constructible_from); STATIC_CHECK_FALSE(Addable); STATIC_CHECK_FALSE(EqualityComparable); constexpr dimensions::MassValue mass{2.0}; constexpr dimensions::MassValue correction{0.5}; STATIC_CHECK((mass + correction).value() == 2.5); STATIC_CHECK((mass - correction).value() == 1.5); STATIC_CHECK((3.0 * mass).value() == 6.0); STATIC_CHECK((mass / 4.0).value() == 0.5); STATIC_CHECK(mass > correction); } TEST_CASE( "Dimensions Partition Provides A Broad Stellar Physics Catalog", tags::dimensional_quantities ) { using namespace mean_field::dimensions; STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(QuantityValueType); STATIC_CHECK(quantity::Mass::identifier == std::string_view{"mass"}); STATIC_CHECK(quantity::AngularMomentum::identifier == std::string_view{"angular_momentum"}); STATIC_CHECK(quantity::SpecificEnthalpy::identifier == std::string_view{"specific_enthalpy"}); } TEST_CASE( "EOS Quantity Names Are Exact Transitional Aliases Of Dimensions Types", tags::dimensional_quantities ) { using namespace mean_field; STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(std::same_as); STATIC_CHECK(eos::ThermodynamicQuantityType); STATIC_CHECK(eos::QuantityValueType); }