73 lines
2.8 KiB
C++
73 lines
2.8 KiB
C++
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
#include <algorithm>
|
|
#include <catch2/catch_test_macros.hpp>
|
|
#include <catch2/generators/catch_generators.hpp>
|
|
#include <catch2/generators/catch_generators_adapters.hpp>
|
|
#include <catch2/generators/catch_generators_random.hpp>
|
|
|
|
#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);
|
|
}
|
|
}
|