From 4411b8ea6dd2bce87e2bb9e2cbc748b48d89d989 Mon Sep 17 00:00:00 2001 From: Mateusz Pusz Date: Wed, 28 Sep 2022 12:49:28 +0200 Subject: [PATCH] test: `dimension` unit tests added --- test/unit_test/static/dimension_test.cpp | 136 +++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 test/unit_test/static/dimension_test.cpp diff --git a/test/unit_test/static/dimension_test.cpp b/test/unit_test/static/dimension_test.cpp new file mode 100644 index 00000000..c2d3a62d --- /dev/null +++ b/test/unit_test/static/dimension_test.cpp @@ -0,0 +1,136 @@ +// The MIT License (MIT) +// +// Copyright (c) 2018 Mateusz Pusz +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +using namespace units; + +namespace { + +template +inline constexpr bool is_of_type = std::is_same_v, T>; + +using one_dim_ = struct one_dim; + +// clang-format off +inline constexpr struct length_dim_ : base_dimension<"L"> {} length_dim; +inline constexpr struct time_dim_ : base_dimension<"T"> {} time_dim; + +inline constexpr struct frequency_dim_ : decltype(1 / time_dim) {} frequency_dim; +inline constexpr struct area_dim_ : decltype(length_dim * length_dim) {} area_dim; +inline constexpr struct volume_dim_ : decltype(area_dim * length_dim) {} volume_dim; +inline constexpr struct speed_dim_ : decltype(length_dim / time_dim) {} speed_dim; +inline constexpr struct acceleration_dim_ : decltype(speed_dim / time_dim) {} acceleration_dim; +// clang-format on + +} // namespace + +// concepts verification +static_assert(BaseDimension); +static_assert(!BaseDimension); +static_assert(!DerivedDimension); +static_assert(DerivedDimension); +static_assert(Dimension); +static_assert(Dimension); + +static_assert(DerivedDimension); +static_assert(DerivedDimension); // one_dim +static_assert(BaseDimension); // length_dim + +// derived dimension expression template syntax verification +static_assert(is_of_type<1 / time_dim, derived_dimension>>); +static_assert(is_of_type<1 / (1 / time_dim), time_dim_>); + +static_assert(is_of_type); +static_assert(is_of_type); +static_assert(is_of_type>>); +static_assert(is_of_type<1 / time_dim * one_dim, derived_dimension>>); + +static_assert(is_of_type>); +static_assert(is_of_type>>); + +static_assert( + is_of_type, time_dim_>>); +static_assert( + is_of_type, time_dim_>>); + +static_assert( + is_of_type, time_dim_>>); +static_assert( + is_of_type, time_dim_>>); + +static_assert(is_of_type<1 / time_dim * length_dim, derived_dimension>>); +static_assert(is_of_type<1 / time_dim * time_dim, one_dim_>); + +static_assert(is_of_type); +static_assert(is_of_type<1 / time_dim / one_dim, derived_dimension>>); + +static_assert(is_of_type); +static_assert(is_of_type<1 / time_dim * (1 / time_dim), derived_dimension>>>); +static_assert(is_of_type<1 / (time_dim * time_dim), derived_dimension>>>); +static_assert(is_of_type<1 / (1 / (time_dim * time_dim)), derived_dimension>>); + +static_assert( + is_of_type>>>); +static_assert(is_of_type, per>>>); +static_assert(is_of_type); + +static_assert(is_of_type); +static_assert(is_of_type>>); +static_assert( + is_of_type>>>); +static_assert(is_of_type<1 / (speed_dim * speed_dim) * length_dim, + derived_dimension, per>>); + +// comparisons of equivalent dimensions +static_assert(length_dim / length_dim == one_dim); + +static_assert(1 / time_dim == frequency_dim); +static_assert(1 / frequency_dim == time_dim); +static_assert(frequency_dim * time_dim == one_dim); + +static_assert(length_dim * length_dim == area_dim); +static_assert(length_dim * length_dim != volume_dim); +static_assert(area_dim / length_dim == length_dim); + +static_assert(length_dim * length_dim * length_dim == volume_dim); +static_assert(area_dim * length_dim == volume_dim); +static_assert(volume_dim / length_dim == area_dim); +static_assert(volume_dim / length_dim / length_dim == length_dim); +static_assert(area_dim * area_dim / length_dim == volume_dim); +static_assert(area_dim * (area_dim / length_dim) == volume_dim); +static_assert(volume_dim / (length_dim * length_dim) == length_dim); + +static_assert(length_dim / time_dim == speed_dim); +static_assert(length_dim * time_dim != speed_dim); +static_assert(length_dim / time_dim / time_dim != speed_dim); +static_assert(length_dim / speed_dim == time_dim); +static_assert(speed_dim * time_dim == length_dim); + +static_assert(length_dim / time_dim / time_dim == acceleration_dim); +static_assert(length_dim / (time_dim * time_dim) == acceleration_dim); +static_assert(speed_dim / time_dim == acceleration_dim); +static_assert(speed_dim / acceleration_dim == time_dim); +static_assert(acceleration_dim * time_dim == speed_dim); +static_assert(acceleration_dim * (time_dim * time_dim) == length_dim); +static_assert(acceleration_dim / speed_dim == frequency_dim);