diff --git a/src/tests/boxes-tests.c b/src/tests/boxes-tests.c index b2904a286..12419dc4b 100644 --- a/src/tests/boxes-tests.c +++ b/src/tests/boxes-tests.c @@ -90,132 +90,9 @@ new_monitor_edge (int x, int y, int width, int height, int side_type) return temporary; } -static void -test_init_rect (void) -{ - MtkRectangle rect; - rect = MTK_RECTANGLE_INIT (1, 2, 3, 4); - g_assert_cmpint (rect.x, ==, 1); - g_assert_cmpint (rect.y, ==, 2); - g_assert_cmpint (rect.width, ==, 3); - g_assert_cmpint (rect.height, ==, 4); -} -static void -test_area (void) -{ - MtkRectangle temp; - int i; - for (i = 0; i < NUM_RANDOM_RUNS; i++) - { - get_random_rect (&temp); - g_assert (mtk_rectangle_area (&temp) == temp.width * temp.height); - } - temp = MTK_RECTANGLE_INIT (0, 0, 5, 7); - g_assert (mtk_rectangle_area (&temp) == 35); -} - -static void -test_intersect (void) -{ - MtkRectangle a = {100, 200, 50, 40}; - MtkRectangle b = { 0, 50, 110, 152}; - MtkRectangle c = { 0, 0, 10, 10}; - MtkRectangle d = {100, 100, 50, 50}; - MtkRectangle b_intersect_d = {100, 100, 10, 50}; - MtkRectangle temp; - MtkRectangle temp2; - - mtk_rectangle_intersect (&a, &b, &temp); - temp2 = MTK_RECTANGLE_INIT (100, 200, 10, 2); - g_assert (mtk_rectangle_equal (&temp, &temp2)); - g_assert (mtk_rectangle_area (&temp) == 20); - - mtk_rectangle_intersect (&a, &c, &temp); - g_assert (mtk_rectangle_area (&temp) == 0); - - mtk_rectangle_intersect (&a, &d, &temp); - g_assert (mtk_rectangle_area (&temp) == 0); - - mtk_rectangle_intersect (&b, &d, &b); - g_assert (mtk_rectangle_equal (&b, &b_intersect_d)); -} - -static void -test_equal (void) -{ - MtkRectangle a = {10, 12, 4, 18}; - MtkRectangle b = a; - MtkRectangle c = {10, 12, 4, 19}; - MtkRectangle d = {10, 12, 7, 18}; - MtkRectangle e = {10, 62, 4, 18}; - MtkRectangle f = {27, 12, 4, 18}; - - g_assert ( mtk_rectangle_equal (&a, &b)); - g_assert (!mtk_rectangle_equal (&a, &c)); - g_assert (!mtk_rectangle_equal (&a, &d)); - g_assert (!mtk_rectangle_equal (&a, &e)); - g_assert (!mtk_rectangle_equal (&a, &f)); -} - -static void -test_overlap_funcs (void) -{ - MtkRectangle temp1, temp2; - int i; - for (i = 0; i < NUM_RANDOM_RUNS; i++) - { - get_random_rect (&temp1); - get_random_rect (&temp2); - g_assert (mtk_rectangle_overlap (&temp1, &temp2) == - (mtk_rectangle_horiz_overlap (&temp1, &temp2) && - mtk_rectangle_vert_overlap (&temp1, &temp2))); - } - - temp1 = MTK_RECTANGLE_INIT ( 0, 0, 10, 10); - temp2 = MTK_RECTANGLE_INIT (20, 0, 10, 5); - g_assert (!mtk_rectangle_overlap (&temp1, &temp2)); - g_assert (!mtk_rectangle_horiz_overlap (&temp1, &temp2)); - g_assert (mtk_rectangle_vert_overlap (&temp1, &temp2)); -} - -static void -test_basic_fitting (void) -{ - MtkRectangle temp1, temp2, temp3; - int i; - /* Four cases: - * case temp1 fits temp2 temp1 could fit temp2 - * 1 Y Y - * 2 N Y - * 3 Y N - * 4 N N - * Of the four cases, case 3 is impossible. An alternate way of looking - * at this table is that either the middle column must be no, or the last - * column must be yes. So we test that. Also, we can repeat the test - * reversing temp1 and temp2. - */ - for (i = 0; i < NUM_RANDOM_RUNS; i++) - { - get_random_rect (&temp1); - get_random_rect (&temp2); - g_assert (mtk_rectangle_contains_rect (&temp1, &temp2) == FALSE || - mtk_rectangle_could_fit_rect (&temp1, &temp2) == TRUE); - g_assert (mtk_rectangle_contains_rect (&temp2, &temp1) == FALSE || - mtk_rectangle_could_fit_rect (&temp2, &temp1) == TRUE); - } - - temp1 = MTK_RECTANGLE_INIT ( 0, 0, 10, 10); - temp2 = MTK_RECTANGLE_INIT ( 5, 5, 5, 5); - temp3 = MTK_RECTANGLE_INIT ( 8, 2, 3, 7); - g_assert ( mtk_rectangle_contains_rect (&temp1, &temp2)); - g_assert (!mtk_rectangle_contains_rect (&temp2, &temp1)); - g_assert (!mtk_rectangle_contains_rect (&temp1, &temp3)); - g_assert ( mtk_rectangle_could_fit_rect (&temp1, &temp3)); - g_assert (!mtk_rectangle_could_fit_rect (&temp3, &temp2)); -} static void free_strut_list (GSList *struts) @@ -1363,13 +1240,6 @@ init_boxes_tests (void) { init_random_ness (); - g_test_add_func ("/util/boxes/init", test_init_rect); - g_test_add_func ("/util/boxes/area", test_area); - g_test_add_func ("/util/boxes/intersect", test_intersect); - g_test_add_func ("/util/boxes/equal", test_equal); - g_test_add_func ("/util/boxes/overlap", test_overlap_funcs); - g_test_add_func ("/util/boxes/basic-fitting", test_basic_fitting); - g_test_add_func ("/util/boxes/regions-ok", test_regions_okay); g_test_add_func ("/util/boxes/regions-fitting", test_region_fitting); diff --git a/src/tests/meson.build b/src/tests/meson.build index 61fc02129..c7d1e7725 100644 --- a/src/tests/meson.build +++ b/src/tests/meson.build @@ -224,6 +224,8 @@ wayland_test_utils = [ test_cases = [] privileged_test_cases = [] +subdir('mtk') + test_cases += [ { 'name': 'unit', diff --git a/src/tests/mtk/meson.build b/src/tests/mtk/meson.build new file mode 100644 index 000000000..c4ac13507 --- /dev/null +++ b/src/tests/mtk/meson.build @@ -0,0 +1,9 @@ +test_cases += [ + { + 'name': 'mtk-rectangle', + 'suite': 'unit', + 'sources': [ + 'mtk/rectangle-tests.c', + ], + }, +] diff --git a/src/tests/mtk/rectangle-tests.c b/src/tests/mtk/rectangle-tests.c new file mode 100644 index 000000000..e430de890 --- /dev/null +++ b/src/tests/mtk/rectangle-tests.c @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2005 Elijah Newren + * Copyright (C) 2023 Bilal Elmoussaoui + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + +#include "config.h" +#include "mtk/mtk.h" + +#include +#include +#include +#include + +#include + +#define NUM_RANDOM_RUNS 10000 + +static void +init_random_ness (void) +{ + srand (time (NULL)); +} + +static void +get_random_rect (MtkRectangle *rect) +{ + rect->x = rand () % 1600; + rect->y = rand () % 1200; + rect->width = rand () % 1600 + 1; + rect->height = rand () % 1200 + 1; +} + +static void +test_init_rect (void) +{ + MtkRectangle rect; + + rect = MTK_RECTANGLE_INIT (1, 2, 3, 4); + g_assert_cmpint (rect.x, ==, 1); + g_assert_cmpint (rect.y, ==, 2); + g_assert_cmpint (rect.width, ==, 3); + g_assert_cmpint (rect.height, ==, 4); +} + +static void +test_area (void) +{ + MtkRectangle temp; + int i; + for (i = 0; i < NUM_RANDOM_RUNS; i++) + { + get_random_rect (&temp); + g_assert (mtk_rectangle_area (&temp) == temp.width * temp.height); + } + + temp = MTK_RECTANGLE_INIT (0, 0, 5, 7); + g_assert (mtk_rectangle_area (&temp) == 35); +} + +static void +test_intersect (void) +{ + MtkRectangle a = {100, 200, 50, 40}; + MtkRectangle b = { 0, 50, 110, 152}; + MtkRectangle c = { 0, 0, 10, 10}; + MtkRectangle d = {100, 100, 50, 50}; + MtkRectangle b_intersect_d = {100, 100, 10, 50}; + MtkRectangle temp; + MtkRectangle temp2; + + mtk_rectangle_intersect (&a, &b, &temp); + temp2 = MTK_RECTANGLE_INIT (100, 200, 10, 2); + g_assert (mtk_rectangle_equal (&temp, &temp2)); + g_assert (mtk_rectangle_area (&temp) == 20); + + mtk_rectangle_intersect (&a, &c, &temp); + g_assert (mtk_rectangle_area (&temp) == 0); + + mtk_rectangle_intersect (&a, &d, &temp); + g_assert (mtk_rectangle_area (&temp) == 0); + + mtk_rectangle_intersect (&b, &d, &b); + g_assert (mtk_rectangle_equal (&b, &b_intersect_d)); +} + +static void +test_equal (void) +{ + MtkRectangle a = {10, 12, 4, 18}; + MtkRectangle b = a; + MtkRectangle c = {10, 12, 4, 19}; + MtkRectangle d = {10, 12, 7, 18}; + MtkRectangle e = {10, 62, 4, 18}; + MtkRectangle f = {27, 12, 4, 18}; + + g_assert ( mtk_rectangle_equal (&a, &b)); + g_assert (!mtk_rectangle_equal (&a, &c)); + g_assert (!mtk_rectangle_equal (&a, &d)); + g_assert (!mtk_rectangle_equal (&a, &e)); + g_assert (!mtk_rectangle_equal (&a, &f)); +} + +static void +test_overlap_funcs (void) +{ + MtkRectangle temp1, temp2; + int i; + for (i = 0; i < NUM_RANDOM_RUNS; i++) + { + get_random_rect (&temp1); + get_random_rect (&temp2); + g_assert (mtk_rectangle_overlap (&temp1, &temp2) == + (mtk_rectangle_horiz_overlap (&temp1, &temp2) && + mtk_rectangle_vert_overlap (&temp1, &temp2))); + } + + temp1 = MTK_RECTANGLE_INIT ( 0, 0, 10, 10); + temp2 = MTK_RECTANGLE_INIT (20, 0, 10, 5); + g_assert (!mtk_rectangle_overlap (&temp1, &temp2)); + g_assert (!mtk_rectangle_horiz_overlap (&temp1, &temp2)); + g_assert (mtk_rectangle_vert_overlap (&temp1, &temp2)); +} + +static void +test_basic_fitting (void) +{ + MtkRectangle temp1, temp2, temp3; + int i; + /* Four cases: + * case temp1 fits temp2 temp1 could fit temp2 + * 1 Y Y + * 2 N Y + * 3 Y N + * 4 N N + * Of the four cases, case 3 is impossible. An alternate way of looking + * at this table is that either the middle column must be no, or the last + * column must be yes. So we test that. Also, we can repeat the test + * reversing temp1 and temp2. + */ + for (i = 0; i < NUM_RANDOM_RUNS; i++) + { + get_random_rect (&temp1); + get_random_rect (&temp2); + g_assert (mtk_rectangle_contains_rect (&temp1, &temp2) == FALSE || + mtk_rectangle_could_fit_rect (&temp1, &temp2) == TRUE); + g_assert (mtk_rectangle_contains_rect (&temp2, &temp1) == FALSE || + mtk_rectangle_could_fit_rect (&temp2, &temp1) == TRUE); + } + + temp1 = MTK_RECTANGLE_INIT ( 0, 0, 10, 10); + temp2 = MTK_RECTANGLE_INIT ( 5, 5, 5, 5); + temp3 = MTK_RECTANGLE_INIT ( 8, 2, 3, 7); + g_assert ( mtk_rectangle_contains_rect (&temp1, &temp2)); + g_assert (!mtk_rectangle_contains_rect (&temp2, &temp1)); + g_assert (!mtk_rectangle_contains_rect (&temp1, &temp3)); + g_assert ( mtk_rectangle_could_fit_rect (&temp1, &temp3)); + g_assert (!mtk_rectangle_could_fit_rect (&temp3, &temp2)); +} + +int +main (int argc, + char **argv) +{ + init_random_ness (); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/mtk/rectangle/init", test_init_rect); + g_test_add_func ("/mtk/rectangle/area", test_area); + g_test_add_func ("/mtk/rectangle/intersect", test_intersect); + g_test_add_func ("/mtk/rectangle/equal", test_equal); + g_test_add_func ("/mtk/rectangle/overlap", test_overlap_funcs); + g_test_add_func ("/mtk/rectangle/basic-fitting", test_basic_fitting); + + return g_test_run (); +}