From 1a5f22f5c85eaad105f27e07cb0eedc6161aeb99 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Tue, 30 May 2023 12:04:32 +0200 Subject: [PATCH] test: concepts test added --- test/unit_test/static/CMakeLists.txt | 2 +- test/unit_test/static/concepts_test.cpp | 465 +++++++++++++++++++----- 2 files changed, 384 insertions(+), 83 deletions(-) diff --git a/test/unit_test/static/CMakeLists.txt b/test/unit_test/static/CMakeLists.txt index 845e72f1..a15104c2 100644 --- a/test/unit_test/static/CMakeLists.txt +++ b/test/unit_test/static/CMakeLists.txt @@ -37,7 +37,7 @@ add_library( angle_test.cpp cgs_test.cpp chrono_test.cpp - # concepts_test.cpp + concepts_test.cpp # custom_rep_test_min_expl.cpp # custom_unit_test.cpp # dimension_op_test.cpp diff --git a/test/unit_test/static/concepts_test.cpp b/test/unit_test/static/concepts_test.cpp index 2e9d66d1..a4045afa 100644 --- a/test/unit_test/static/concepts_test.cpp +++ b/test/unit_test/static/concepts_test.cpp @@ -20,126 +20,427 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. -#include -#include -#include // IWYU pragma: keep -#include -#include // IWYU pragma: keep -#include // IWYU pragma: keep -#include -#include -#include +#include +#include +#include +#include +#include +#include #include #include -#include #include -#include #include -#include + +template +inline constexpr bool mp_units::is_scalar> = true; namespace { -using namespace units; -using namespace units::isq; +using namespace mp_units; -// Prefix - -static_assert(Prefix); -static_assert(!Prefix); +struct dim_speed : decltype(isq::dim_length / isq::dim_time) {}; // BaseDimension - -static_assert(BaseDimension); -static_assert(!BaseDimension); -static_assert(!BaseDimension); +static_assert(detail::BaseDimension); +static_assert(!detail::BaseDimension>); +static_assert(!detail::BaseDimension>); +static_assert(!detail::BaseDimension(isq::dim_length))>>); +static_assert(!detail::BaseDimension>>); +static_assert(!detail::BaseDimension); +static_assert(!detail::BaseDimension>); +static_assert(!detail::BaseDimension); +static_assert(!detail::BaseDimension); // DerivedDimension - -static_assert(DerivedDimension); -static_assert(!DerivedDimension); -static_assert(!DerivedDimension); +static_assert(detail::DerivedDimension>); +static_assert(detail::DerivedDimension>); +static_assert(detail::DerivedDimension(isq::dim_length))>>); +static_assert(detail::DerivedDimension>>); +static_assert(detail::DerivedDimension); +static_assert(detail::DerivedDimension); +static_assert(!detail::DerivedDimension); +static_assert(!detail::DerivedDimension); +static_assert(!detail::DerivedDimension); // Dimension - -static_assert(Dimension); -static_assert(Dimension); -static_assert(!Dimension); +static_assert(Dimension); +static_assert(Dimension>); +static_assert(Dimension>); +static_assert(Dimension(isq::dim_length))>>); +static_assert(Dimension>>); +static_assert(Dimension); +static_assert(Dimension); +static_assert(!Dimension>); +static_assert(!Dimension); static_assert(!Dimension); -static_assert(!Dimension); + +// QuantitySpec +struct speed : decltype(isq::length / isq::time) {}; // this is not recommended + +static_assert(QuantitySpec); +static_assert(QuantitySpec); +static_assert(QuantitySpec); +static_assert(QuantitySpec)>>); +static_assert(QuantitySpec>); +static_assert(QuantitySpec(isq::length))>>); +static_assert(QuantitySpec); +static_assert(!QuantitySpec); +static_assert(!QuantitySpec); +static_assert(!QuantitySpec); + +// NamedQuantitySpec +static_assert(detail::NamedQuantitySpec); +static_assert(detail::NamedQuantitySpec); +static_assert(detail::NamedQuantitySpec); +static_assert(!detail::NamedQuantitySpec)>>); +static_assert(!detail::NamedQuantitySpec>); +static_assert(!detail::NamedQuantitySpec(isq::length))>>); +static_assert(detail::NamedQuantitySpec); +static_assert(!detail::NamedQuantitySpec); +static_assert(!detail::NamedQuantitySpec); +static_assert(!detail::NamedQuantitySpec); + +// BaseQuantitySpec +static_assert(detail::BaseQuantitySpec); +static_assert(detail::BaseQuantitySpec); +static_assert(!detail::BaseQuantitySpec)>>); +static_assert(!detail::BaseQuantitySpec); +static_assert(!detail::BaseQuantitySpec>); +static_assert(!detail::BaseQuantitySpec(isq::length))>>); +static_assert(!detail::BaseQuantitySpec); +static_assert(!detail::BaseQuantitySpec); +static_assert(!detail::BaseQuantitySpec); +static_assert(!detail::BaseQuantitySpec); + +// IntermediateDerivedQuantitySpec +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(!detail::IntermediateDerivedQuantitySpec)>>); +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(detail::IntermediateDerivedQuantitySpec>); +static_assert(detail::IntermediateDerivedQuantitySpec(isq::length))>>); +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(!detail::IntermediateDerivedQuantitySpec); +static_assert(!detail::IntermediateDerivedQuantitySpec); + +// QuantityKindSpec +static_assert(!detail::QuantityKindSpec); +static_assert(!detail::QuantityKindSpec); +static_assert(detail::QuantityKindSpec)>>); +static_assert(!detail::QuantityKindSpec); +static_assert(!detail::QuantityKindSpec>); +static_assert(!detail::QuantityKindSpec(isq::length))>>); +static_assert(!detail::QuantityKindSpec); +static_assert(!detail::QuantityKindSpec); +static_assert(!detail::QuantityKindSpec); +static_assert(!detail::QuantityKindSpec); // Unit +struct metre_per_second : decltype(si::metre / si::second) {}; -static_assert(Unit); -static_assert(Unit); -static_assert(Unit); -static_assert(Unit); -static_assert(!Unit); +static_assert(Unit); +static_assert(Unit); +static_assert(Unit)>>); +static_assert(Unit); +static_assert(Unit>); +static_assert(Unit>); +static_assert(Unit * si::second)>>); +static_assert(Unit)>>); +static_assert(Unit(si::metre))>>); +static_assert(Unit); +static_assert(Unit, struct si::second>>); +static_assert(Unit); +static_assert(Unit>>); +static_assert(Unit); +static_assert(!Unit>); +static_assert(!Unit>); +static_assert(!Unit>); +static_assert(!Unit>); +static_assert(!Unit>); +static_assert(!Unit, si::second>>); +static_assert(!Unit); static_assert(!Unit); static_assert(!Unit); // NamedUnit +static_assert(detail::NamedUnit); +static_assert(detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit)>>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit * si::second)>>); +static_assert(!detail::NamedUnit)>>); +static_assert(!detail::NamedUnit(si::metre))>>); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit, struct si::second>>); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit>>); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit>); +static_assert(!detail::NamedUnit, si::second>>); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit); +static_assert(!detail::NamedUnit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(NamedUnit); -static_assert(!NamedUnit); +// PrefixableUnit +static_assert(PrefixableUnit); +static_assert(PrefixableUnit); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit)>>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit * si::second)>>); +static_assert(!PrefixableUnit)>>); +static_assert(!PrefixableUnit(si::metre))>>); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit, struct si::second>>); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit>>); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit>); +static_assert(!PrefixableUnit, si::second>>); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit); +static_assert(!PrefixableUnit); + +// AssociatedUnit +static_assert(AssociatedUnit); +static_assert(!AssociatedUnit); +static_assert(AssociatedUnit); +static_assert(AssociatedUnit)>>); +static_assert(AssociatedUnit>); +static_assert(AssociatedUnit>); +static_assert(AssociatedUnit * si::second)>>); +static_assert(AssociatedUnit)>>); +static_assert(AssociatedUnit(si::metre))>>); +static_assert(AssociatedUnit); +static_assert(AssociatedUnit, struct si::second>>); +static_assert(AssociatedUnit); +static_assert(AssociatedUnit>>); +static_assert(AssociatedUnit); +static_assert(!AssociatedUnit>); +static_assert(!AssociatedUnit>); +static_assert(!AssociatedUnit>); +static_assert(!AssociatedUnit>); +static_assert(!AssociatedUnit>); +static_assert(!AssociatedUnit, si::second>>); +static_assert(!AssociatedUnit); +static_assert(!AssociatedUnit); +static_assert(!AssociatedUnit); // UnitOf +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(UnitOf); +static_assert(!UnitOf); +static_assert(!UnitOf); +static_assert(!UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); -static_assert(UnitOf); -static_assert(!UnitOf); +// Reference +static_assert(Reference); +static_assert(Reference>); +static_assert(Reference>); +static_assert(Reference>); +static_assert(Reference>); +static_assert(!Reference); +static_assert(!Reference); +static_assert(!Reference)>>); +static_assert(!Reference); +static_assert(!Reference); + +// ReferenceOf +static_assert(ReferenceOf); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); +static_assert(ReferenceOf, isq::length>); +static_assert(!ReferenceOf, isq::radius>); +static_assert(ReferenceOf, isq::length>); +static_assert(ReferenceOf, isq::radius>); +static_assert(ReferenceOf); +static_assert(!ReferenceOf); +static_assert(ReferenceOf, isq::dim_length>); +static_assert(ReferenceOf, isq::dim_length>); // Representation - static_assert(Representation); +static_assert(Representation); static_assert(Representation>); -static_assert(!Representation>); -static_assert(!Representation>>); -static_assert(!Representation); +static_assert(!Representation); +static_assert(!Representation>); +static_assert(!Representation); static_assert(!Representation); +// RepresentationOf +static_assert(RepresentationOf); +static_assert(RepresentationOf); +static_assert(RepresentationOf, quantity_character::scalar>); +static_assert(!RepresentationOf); +static_assert(!RepresentationOf, quantity_character::scalar>); +static_assert(!RepresentationOf); +static_assert(!RepresentationOf); + // Quantity - -static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); +static_assert(Quantity>); static_assert(!Quantity); -static_assert(!Quantity, si::metre>>); - -// QuantityPoint - -static_assert(QuantityPoint, si::metre>>); -static_assert(!QuantityPoint>); -static_assert(!QuantityPoint); - -// QuantityLike - -static_assert(QuantityLike); -static_assert(QuantityLike); -static_assert(!QuantityLike>); -static_assert(!QuantityLike); - -// WrappedQuantity - -static_assert(wrapped_quantity_>>); -static_assert(!wrapped_quantity_, si::length>>); +static_assert(!Quantity>); +static_assert(!Quantity>); // QuantityOf +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::radius>); +static_assert(!QuantityOf, isq::length>); +static_assert(QuantityOf, isq::length>); +static_assert(!QuantityOf, isq::radius>); +static_assert(QuantityOf, isq::length>); +static_assert(QuantityOf, isq::radius>); +static_assert(QuantityOf, isq::dim_length>); +static_assert(!QuantityOf, isq::dim_length>); +static_assert(QuantityOf, isq::dim_length>); +static_assert(QuantityOf, isq::dim_length>); -static_assert(QuantityOf, si::dim_length>); -// TODO it seems `QuantityOf` is a bad name if `si::cgs::length` matches `si::fps::dim_length` -static_assert(QuantityOf, si::dim_length>); -static_assert(QuantityOf, si::dim_length>); -static_assert(QuantityOf, si::fps::dim_length>); -static_assert(!QuantityOf, si::dim_time>); +// QuantityLike +static_assert(QuantityLike); +static_assert(QuantityLike); +static_assert(!QuantityLike>); +static_assert(!QuantityLike>); +static_assert(!QuantityLike); +// QuantityPoint +inline constexpr struct my_origin : absolute_point_origin { + using absolute_point_origin::absolute_point_origin; +} my_origin; + +static_assert(QuantityPoint>); +static_assert(QuantityPoint>); +static_assert(QuantityPoint{}, int>>); +static_assert(QuantityPoint{}, int>>); +static_assert(QuantityPoint>); +static_assert(!QuantityPoint>); +static_assert(!QuantityPoint>); +static_assert(!QuantityPoint); +static_assert(!QuantityPoint); +static_assert(!QuantityPoint>); +static_assert(!QuantityPoint); + +// QuantityPointOf +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(!QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); static_assert( - QuantityPointOf, si::second, int>, dynamic_origin>); -static_assert(QuantityPointOf, si::second, int>, - clock_origin>); -static_assert(!QuantityPointOf, si::second, int>, - clock_origin>); -static_assert(!QuantityPointOf, si::second, int>, - dynamic_origin>); + QuantityPointOf{}, int>, isq::length>); +static_assert( + !QuantityPointOf{}, int>, isq::radius>); +static_assert( + QuantityPointOf{}, int>, isq::length>); +static_assert( + QuantityPointOf{}, int>, isq::radius>); +static_assert(QuantityPointOf, isq::length>); +static_assert(QuantityPointOf, isq::radius>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert(!QuantityPointOf, absolute_point_origin{}>); +static_assert(!QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, my_origin>); +static_assert(QuantityPointOf, absolute_point_origin{}>); +static_assert( + !QuantityPointOf, absolute_point_origin{}>); + +// PointOrigin +static_assert(PointOrigin>); +static_assert(PointOrigin); +static_assert(PointOrigin>); +static_assert(PointOrigin>); +static_assert(PointOrigin{}, int>>); +static_assert(PointOrigin{}, int>>); +static_assert(PointOrigin>); +static_assert(!PointOrigin>); +static_assert(!PointOrigin); +static_assert(!PointOrigin>); +static_assert(!PointOrigin); + +// PointOriginFor +static_assert(PointOriginFor, isq::length>); +static_assert(!PointOriginFor, isq::length>); +static_assert(PointOriginFor, isq::radius>); +static_assert(PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(PointOriginFor); +static_assert(PointOriginFor); +static_assert(!PointOriginFor); +static_assert(PointOriginFor, isq::length>); +static_assert(PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(PointOriginFor, isq::length>); +static_assert(PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert( + PointOriginFor{}, int>, isq::length>); +static_assert( + PointOriginFor{}, int>, isq::radius>); +static_assert( + !PointOriginFor{}, int>, isq::time>); +static_assert( + !PointOriginFor{}, int>, isq::length>); +static_assert( + PointOriginFor{}, int>, isq::radius>); +static_assert( + !PointOriginFor{}, int>, isq::time>); +static_assert(PointOriginFor>{}, int>, + isq::length>); +static_assert(PointOriginFor>{}, int>, + isq::radius>); +static_assert(!PointOriginFor< + quantity_point>{}, int>, isq::time>); +static_assert(!PointOriginFor< + quantity_point>{}, int>, isq::length>); +static_assert(PointOriginFor>{}, int>, + isq::radius>); +static_assert( + !PointOriginFor{}, int>, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(PointOriginFor, isq::radius>); +static_assert(!PointOriginFor, isq::time>); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor); +static_assert(!PointOriginFor, isq::length>); +static_assert(!PointOriginFor); + +// QuantityPointLike +static_assert(QuantityPointLike>); +static_assert(!QuantityPointLike); +static_assert(!QuantityPointLike>); +static_assert(!QuantityPointLike>); +static_assert(!QuantityPointLike); } // namespace