// 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 "units/ratio.h" namespace { using namespace units; template inline constexpr bool same = R1::num == R2::num && R1::den == R2::den && R1::exp == R2::exp; static_assert(same, ratio<1, 2>>); // basic exponents tests // note use of ::type is required because template params are changed while stamping out template static_assert(std::is_same_v::type, ratio<1, 20, 1>::type>); static_assert(std::is_same_v::type, ratio<10, 2, -1>::type>); static_assert(std::is_same_v::type, ratio<20'000, 50, -1>::type>); static_assert(std::is_same_v, ratio<3, 8>>, ratio<3, 8>>); static_assert(std::is_same_v, ratio<1>>, ratio<3, 8>>); static_assert(std::is_same_v, ratio<1, 8>>, ratio<1, 2>>); static_assert(std::is_same_v, ratio<1, 2>>, ratio<2>>); static_assert(std::is_same_v, ratio<2>>, ratio<1, 4>>); static_assert(std::is_same_v, ratio<8>>, ratio<4>>); // multiply with exponents static_assert(std::is_same_v, ratio<2, 1, 4>>, ratio<1, 4, 6>>); static_assert(std::is_same_v, ratio<8, 1, 3>>, ratio<4, 1, -1>>); static_assert(std::is_same_v, ratio<2>>, ratio<2>>); static_assert(std::is_same_v, ratio<8>>, ratio<1, 4>>); static_assert(std::is_same_v, ratio<2>>, ratio<1, 16>>); static_assert(std::is_same_v, ratio<3>>, ratio<2>>); // divide with exponents static_assert(std::is_same_v, ratio<2, 1, -8>>, ratio<1, 16, 2>>); static_assert(std::is_same_v, ratio<3>>, ratio<2, 1, 4>>); static_assert(std::is_same_v, 0>, ratio<1>>); static_assert(std::is_same_v, 1>, ratio<2>>); static_assert(std::is_same_v, 2>, ratio<4>>); static_assert(std::is_same_v, 3>, ratio<8>>); static_assert(std::is_same_v, 0>, ratio<1>>); static_assert(std::is_same_v, 1>, ratio<1, 2>>); static_assert(std::is_same_v, 2>, ratio<1, 4>>); static_assert(std::is_same_v, 3>, ratio<1, 8>>); // pow with exponents static_assert(std::is_same_v, 2>, ratio<1, 4, 6>>); static_assert(std::is_same_v, 3>, ratio<1, 8, -18>>); static_assert(std::is_same_v>, ratio<3>>); static_assert(std::is_same_v>, ratio<2>>); static_assert(std::is_same_v>, ratio<1>>); static_assert(std::is_same_v>, ratio<0>>); static_assert(std::is_same_v>, ratio<1, 2>>); // // sqrt with exponents: TODO not working yet. Also not sure the non exponent version is accurate. // static_assert(std::is_same_v>, ratio<3, 1, 1>>); // static_assert(std::is_same_v>, ratio<2>>); // common_ratio // note use of ::type is required because template params are changed while stamping out template static_assert(std::is_same_v::type, ratio<1000>>, ratio<1>::type>); static_assert(std::is_same_v, ratio<1>>::type, ratio<1>::type>); static_assert(std::is_same_v, ratio<1, 1000>>::type, ratio<1, 1000>::type>); static_assert(std::is_same_v, ratio<1>>::type, ratio<1, 1000>::type>); static_assert(std::is_same_v, ratio<10, 1>>::type, ratio<10, 1>::type>); static_assert(std::is_same_v, ratio<1, 10>>::type, ratio<1, 10>::type>); // common ratio with exponents static_assert(std::is_same_v, ratio<1, 1, 3>>::type, ratio<1>::type>); static_assert(std::is_same_v, ratio<1, 1, -3>>::type, ratio<1, 1, -3>::type>); } // namespace