--- /dev/null
+#include <assert.h>
+#include <stdio.h>
+#include <string.h>
+#include <libds/util/box.h>
+
+static void
+test_box_transform(void)
+{
+ const int width = 800, height = 600;
+ struct ds_box src = { 10, 20, 300, 400 };
+ struct ds_box transform90 = { 180, 10, 400, 300 },
+ transform180 = { 490, 180, 300, 400 },
+ transform270 = { 20, 490, 400, 300 },
+ transform_flipped = { 490, 20, 300, 400 },
+ transform_flipped90 = { 20, 10, 400, 300 },
+ transform_flipped180 = { 10, 180, 300, 400 },
+ transform_flipped270 = { 180, 490, 400, 300 };
+ struct ds_box result;
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_NORMAL, width, height);
+ assert(memcmp(&result, &src, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_90, width, height);
+ assert(memcmp(&result, &transform90, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_180, width, height);
+ assert(memcmp(&result, &transform180, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_270, width, height);
+ assert(memcmp(&result, &transform270, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED, width, height);
+ assert(memcmp(&result, &transform_flipped, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_90, width, height);
+ assert(memcmp(&result, &transform_flipped90, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_180, width, height);
+ assert(memcmp(&result, &transform_flipped180, sizeof(struct ds_box)) == 0);
+
+ ds_box_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_270, width, height);
+ assert(memcmp(&result, &transform_flipped270, sizeof(struct ds_box)) == 0);
+}
+
+static void
+test_fbox_transform(void)
+{
+ const int width = 800, height = 600;
+ struct ds_fbox src = { 10.0, 20.0, 300.0, 400.0 };
+ struct ds_fbox transform90 = { 180.0, 10.0, 400.0, 300.0 },
+ transform180 = { 490.0, 180.0, 300.0, 400.0 },
+ transform270 = { 20.0, 490.0, 400.0, 300.0 },
+ transform_flipped = { 490.0, 20.0, 300.0, 400.0 },
+ transform_flipped90 = { 20.0, 10.0, 400.0, 300.0 },
+ transform_flipped180 = { 10.0, 180.0, 300.0, 400.0 },
+ transform_flipped270 = { 180.0, 490.0, 400.0, 300.0 };
+ struct ds_fbox result;
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_NORMAL, width, height);
+ assert(memcmp(&result, &src, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_90, width, height);
+ assert(memcmp(&result, &transform90, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_180, width, height);
+ assert(memcmp(&result, &transform180, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_270, width, height);
+ assert(memcmp(&result, &transform270, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED, width, height);
+ assert(memcmp(&result, &transform_flipped, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_90, width, height);
+ assert(memcmp(&result, &transform_flipped90, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_180, width, height);
+ assert(memcmp(&result, &transform_flipped180, sizeof(struct ds_box)) == 0);
+
+ ds_fbox_transform(&result, &src, WL_OUTPUT_TRANSFORM_FLIPPED_270, width, height);
+ assert(memcmp(&result, &transform_flipped270, sizeof(struct ds_box)) == 0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ test_box_transform();
+ test_fbox_transform();
+
+ return 0;
+}