diff --git a/test/unit_test/runtime/linear_algebra_test.cpp b/test/unit_test/runtime/linear_algebra_test.cpp index b9bd1a54..ff642e77 100644 --- a/test/unit_test/runtime/linear_algebra_test.cpp +++ b/test/unit_test/runtime/linear_algebra_test.cpp @@ -56,11 +56,19 @@ namespace { using namespace mp_units; using namespace mp_units::si::unit_symbols; -template -[[nodiscard]] auto get_magnitude(const vector& v) +template Q> + requires(Q::quantity_spec.character == quantity_character::vector) && (QS.character == quantity_character::scalar) +[[nodiscard]] QuantityOf auto get_magnitude(const Q& q) { - using namespace std; - return hypot(v(0), v(1), v(2)); + const auto& v = q.numerical_value_ref_in(q.unit); + return hypot(v(0) * QS[q.unit], v(1) * QS[q.unit], v(2) * QS[q.unit]); +} + +template T> + requires(T::quantity_spec.character == quantity_character::vector) && (QS.character == quantity_character::scalar) +[[nodiscard]] QuantityOf auto get_magnitude(const vector& v) +{ + return hypot(QS(v(0)), QS(v(1)), QS(v(2))); } template @@ -100,8 +108,7 @@ TEST_CASE("vector quantity", "[la]") SECTION("to scalar magnitude") { const auto v = vector{2, 3, 6} * isq::velocity[km / h]; - const auto speed = - get_magnitude(v.numerical_value_ref_in(km / h)) * isq::speed[v.unit]; // TODO can we do better here? + const auto speed = get_magnitude(v); CHECK(speed.numerical_value_ref_in(km / h) == 7); } @@ -308,8 +315,7 @@ TEST_CASE("vector of quantities", "[la]") SECTION("to scalar magnitude") { const vector> v = {2 * (km / h), 3 * (km / h), 6 * (km / h)}; - const auto speed = - get_magnitude(v).numerical_value_ref_in(km / h) * isq::speed[v(0).unit]; // TODO can we do better here? + const auto speed = get_magnitude(v); CHECK(speed.numerical_value_ref_in(km / h) == 7); }