// SPDX-License-Identifier: LGPL-3.0-or-later #include #include #include #include #include #include "util.h" TEST_CASE("Transform Mirror") { // elementary operations REQUIRE(transform(TRANSFORM_MIRROR_X, 10, 20) == std::make_pair(10, -20)); REQUIRE(transform(TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(-10, 20)); // composite operations REQUIRE(transform(TRANSFORM_MIRROR_X | TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(-10, -20)); } TEST_CASE("Transform Rotate") { REQUIRE(transform(TRANSFORM_ROTATE_CW, 10, 20) == std::make_pair(-20, 10)); // 4th quadrant REQUIRE(transform(TRANSFORM_ROTATE_CW, -20, 10) == std::make_pair(-10, -20)); // 3rd quadrant REQUIRE(transform(TRANSFORM_ROTATE_CW, -10, -20) == std::make_pair(20, -10)); // 2nd quadrant REQUIRE(transform(TRANSFORM_ROTATE_CW, 20, -10) == std::make_pair(10, 20)); // 1st quadrant REQUIRE(transform(TRANSFORM_ROTATE_CCW, 20, -10) == std::make_pair(-10, -20)); // 1nd quadrant REQUIRE(transform(TRANSFORM_ROTATE_CCW, -10, -20) == std::make_pair(-20, 10)); // 2rd quadrant REQUIRE(transform(TRANSFORM_ROTATE_CCW, -20, 10) == std::make_pair(10, 20)); // 3th quadrant REQUIRE(transform(TRANSFORM_ROTATE_CCW, 10, 20) == std::make_pair(20, -10)); // 4st quadrant } TEST_CASE("Transform Rotate + Mirror") { REQUIRE(transform(TRANSFORM_ROTATE_CW | TRANSFORM_MIRROR_X, 10, 20) == std::make_pair(-20, -10)); REQUIRE(transform(TRANSFORM_ROTATE_CW | TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(20, 10)); REQUIRE( transform(TRANSFORM_ROTATE_CW | TRANSFORM_MIRROR_X | TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(20, -10)); REQUIRE(transform(TRANSFORM_ROTATE_CCW | TRANSFORM_MIRROR_X, 10, 20) == std::make_pair(20, 10)); REQUIRE(transform(TRANSFORM_ROTATE_CCW | TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(-20, -10)); REQUIRE( transform(TRANSFORM_ROTATE_CCW | TRANSFORM_MIRROR_X | TRANSFORM_MIRROR_Y, 10, 20) == std::make_pair(-20, 10)); } TEST_CASE("Transform = Inverse Transform ○ Transform") { int x = GENERATE(take(10, random(-100, 100))); int y = GENERATE(take(10, random(-100, 100))); // this iterates over all possible transformations, // even bogus ones (like rotating cw and ccw) for (Transformation transformation = 0; transformation < 0b10000; transformation++) { int xt, yt; std::tie(xt, yt) = transform(transformation, x, y); int xti, yti; std::tie(xti, yti) = transform_inv(transformation, xt, yt); REQUIRE(x == xti); REQUIRE(y == yti); } }