From a888c234a3c6d03bd6f8a4c6c04f3ab887b2994f Mon Sep 17 00:00:00 2001 From: Paul Breugnot Date: Sun, 2 Mar 2025 18:09:52 +0100 Subject: [PATCH] :test_tube: Failing create fixed size window test + test structure improvements --- test/CMakeLists.txt | 7 +- test/aswm/{test_aswm.c => aswm.c} | 7 +- test/aswm/create_windows.c | 55 ++++++++ test/aswm/create_windows.h | 25 ++++ .../aswm/create_windows/multiple_resizeable.c | 45 ++++++ test/aswm/create_windows/single_fixed_size.c | 56 ++++++++ test/aswm/create_windows/single_resizeable.c | 35 +++++ test/aswm/test_aswm_create_windows.c | 131 ------------------ test/aswm/test_aswm_create_windows.h | 3 - 9 files changed, 225 insertions(+), 139 deletions(-) rename test/aswm/{test_aswm.c => aswm.c} (71%) create mode 100644 test/aswm/create_windows.c create mode 100644 test/aswm/create_windows.h create mode 100644 test/aswm/create_windows/multiple_resizeable.c create mode 100644 test/aswm/create_windows/single_fixed_size.c create mode 100644 test/aswm/create_windows/single_resizeable.c delete mode 100644 test/aswm/test_aswm_create_windows.c delete mode 100644 test/aswm/test_aswm_create_windows.h diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 623afae..8b41852 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -8,8 +8,11 @@ FetchContent_MakeAvailable(unity) add_compile_definitions(ASWM_TEST_DIR="${CMAKE_CURRENT_SOURCE_DIR}") add_executable(test_aswm test_set_up.c - aswm/test_aswm.c - aswm/test_aswm_create_windows.c + aswm/aswm.c + aswm/create_windows.c + aswm/create_windows/single_resizeable.c + aswm/create_windows/multiple_resizeable.c + aswm/create_windows/single_fixed_size.c ) target_include_directories(test_aswm PUBLIC ${unity_SOURCE_DIR}/src) target_link_libraries(test_aswm libaswm unity) diff --git a/test/aswm/test_aswm.c b/test/aswm/aswm.c similarity index 71% rename from test/aswm/test_aswm.c rename to test/aswm/aswm.c index 91bb28d..7f8fc2b 100644 --- a/test/aswm/test_aswm.c +++ b/test/aswm/aswm.c @@ -2,7 +2,7 @@ #include #include "../test_set_up.h" -#include "test_aswm_create_windows.h" +#include "create_windows.h" void run_aswm(void) { int stat_loc; @@ -17,8 +17,9 @@ int main(void) { set_up_test_logger(); if(check_xephyr_available()) { RUN_TEST(run_aswm); - RUN_TEST(create_single_resizeable_top_level_window); - RUN_TEST(create_multiple_resizeable_top_level_window); + /*RUN_TEST(create_single_resizeable_top_level_window);*/ + /*RUN_TEST(create_multiple_resizeable_top_level_window);*/ + RUN_TEST(create_single_fixed_size_top_level_window); } tear_down_test_logger(); return UNITY_END(); diff --git a/test/aswm/create_windows.c b/test/aswm/create_windows.c new file mode 100644 index 0000000..ef43a90 --- /dev/null +++ b/test/aswm/create_windows.c @@ -0,0 +1,55 @@ +#include "create_windows.h" + +#define MAX_COLOR 65535 + +clock_t USER_DELAY = 1 * CLOCKS_PER_SEC; + +XColor red(float intensity) { + XColor red; + red.red = intensity * MAX_COLOR; + XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &red); + return red; +} + +XColor blue(float intensity) { + XColor blue; + blue.blue = intensity * MAX_COLOR; + XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &blue); + return blue; +} + +int wait_visibility(Display* display, Window window) { + int visibility; + XSelectInput(test_display, window, VisibilityChangeMask); + + clock_t start = clock(); + while((clock() - start) < USER_DELAY) { + XEvent e; + XCheckWindowEvent(test_display, window, VisibilityChangeMask, &e); + visibility = e.xvisibility.state; + } + return visibility; +} + +void wait_array_visibility(Display* display, int N, Window* windows, int* visibilities) { + for(auto i = 0; i < N; i++) + XSelectInput(test_display, windows[i], VisibilityChangeMask); + + clock_t user_time = clock(); + while((clock() - user_time) < USER_DELAY * N) { + for(auto i = 0; i < N; i++) { + XEvent e; + XCheckWindowEvent(test_display, windows[i], VisibilityChangeMask, &e); + visibilities[i] = e.xvisibility.state; + } + } +} + +Window parent(Display* display, Window window) { + Window _root; + Window parent; + Window* _children; + unsigned int _children_count; + XQueryTree(test_display, window, &_root, &parent, &_children, &_children_count); + return parent; +} diff --git a/test/aswm/create_windows.h b/test/aswm/create_windows.h new file mode 100644 index 0000000..694f69d --- /dev/null +++ b/test/aswm/create_windows.h @@ -0,0 +1,25 @@ +#ifndef TEST_ASWM_CREATE_WINDOWS +#define TEST_ASWM_CREATE_WINDOWS + +#include + +#include "aswm/aswm.h" +#include "../test_set_up.h" + +extern clock_t USER_DELAY; + +XColor red(float intensity); +XColor blue(float intensity); + +Window parent(Display* display, Window window); +int wait_visibility(Display* display, Window window); +void wait_array_visibility(Display* display, int N, Window* windows, int* visibilities); + +void create_single_resizeable_top_level_window(void); +void create_multiple_resizeable_top_level_window(void); +void create_single_fixed_size_top_level_window(void); +void create_multiple_fixed_size_top_level_window(void); +void create_single_fixed_size_top_level_window_on_top_of_resizeable_windows(void); +void create_multiple_fixed_size_top_level_window_on_top_of_resizeable_windows(void); + +#endif diff --git a/test/aswm/create_windows/multiple_resizeable.c b/test/aswm/create_windows/multiple_resizeable.c new file mode 100644 index 0000000..b562539 --- /dev/null +++ b/test/aswm/create_windows/multiple_resizeable.c @@ -0,0 +1,45 @@ +#include "../create_windows.h" + +void create_multiple_resizeable_top_level_window(void) { + const int N = 10; + Window windows[N]; + Window children[N]; + + for(auto i = 0; i < N; i++) { + windows[i] = XCreateSimpleWindow(test_display, test_root, + 10 /*x*/, 10 /*y*/, 128 /*w*/, 128 /*h*/, + 0 /*TODO: border width*/, CopyFromParent /*depth*/, blue(((float) i+1)/N).pixel /* background */); + // The top level windows might have children. Those must **not** be + // altered by the Window Manager + children[i] = XCreateSimpleWindow(test_display, windows[i], + 0, 0, 25, 30, + 0, CopyFromParent, red(1).pixel); + XMapWindow(test_display, children[i]); + XMapWindow(test_display, windows[i]); + } + + + int visibility[N]; + wait_array_visibility(test_display, N, windows, visibility); + + for(auto i = 0; i < N; i++) { + // All top level windows must be fully visible + XWindowAttributes attributes; + XGetWindowAttributes(test_display, windows[i], &attributes); + TEST_ASSERT_EQUAL_INT(VisibilityUnobscured, visibility[i]); + TEST_ASSERT_EQUAL_INT(IsViewable, attributes.map_state); + + // Check the children structure is unaltered + TEST_ASSERT_EQUAL(parent(test_display, children[i]), windows[i]); + + XWindowAttributes child_attributes; + XGetWindowAttributes(test_display, children[i], &child_attributes); + + TEST_ASSERT_EQUAL_INT(0, child_attributes.x); + TEST_ASSERT_EQUAL_INT(0, child_attributes.y); + TEST_ASSERT_EQUAL_INT(25, child_attributes.width); + TEST_ASSERT_EQUAL_INT(30, child_attributes.height); + TEST_ASSERT_EQUAL_INT(0, child_attributes.border_width); + TEST_ASSERT_EQUAL_INT(IsViewable, child_attributes.map_state); + } +} diff --git a/test/aswm/create_windows/single_fixed_size.c b/test/aswm/create_windows/single_fixed_size.c new file mode 100644 index 0000000..053e493 --- /dev/null +++ b/test/aswm/create_windows/single_fixed_size.c @@ -0,0 +1,56 @@ +#include "../create_windows.h" + +void create_single_fixed_size_top_level_window(void) { + Window window = XCreateSimpleWindow(test_display, test_root, + 10 /*x*/, 10 /*y*/, 128 /*w*/, 128 /*h*/, + 0 /*TODO: border width*/, CopyFromParent /*depth*/, blue(1).pixel /* background */); + // The top level window might have children. Those must **not** be altered + // by the Window Manager + Window child = XCreateSimpleWindow(test_display, window, + 0, 0, 25, 30, + 0, CopyFromParent, red(1).pixel); + XMapWindow(test_display, child); + + const int fixed_width = 250; + const int fixed_height = 75; + { + XSizeHints* normal_size = XAllocSizeHints(); + normal_size->flags = PMinSize | PMaxSize; + normal_size->min_width = fixed_width; + normal_size->max_width = fixed_width; + normal_size->min_height = fixed_height; + normal_size->max_height = fixed_height; + + XSetWMNormalHints(test_display, window, normal_size); + XFree(normal_size); + } + XMapWindow(test_display, window); + + int visibility = wait_visibility(test_display, window); + + // The top level window if fully visible + XWindowAttributes attributes; + XGetWindowAttributes(test_display, window, &attributes); + TEST_ASSERT_EQUAL_INT(VisibilityUnobscured, visibility); + TEST_ASSERT_EQUAL_INT(IsViewable, attributes.map_state); + + // The top level window has its size preserved + XWindowAttributes window_attributes; + XGetWindowAttributes(test_display, window, &window_attributes); + TEST_ASSERT_EQUAL_INT(fixed_width, window_attributes.width); + TEST_ASSERT_EQUAL_INT(fixed_height, window_attributes.height); + + // Check the child structure is unaltered + TEST_ASSERT_EQUAL(parent(test_display, child), window); + + XWindowAttributes child_attributes; + XGetWindowAttributes(test_display, child, &child_attributes); + + TEST_ASSERT_EQUAL_INT(0, child_attributes.x); + TEST_ASSERT_EQUAL_INT(0, child_attributes.y); + TEST_ASSERT_EQUAL_INT(25, child_attributes.width); + TEST_ASSERT_EQUAL_INT(30, child_attributes.height); + TEST_ASSERT_EQUAL_INT(0, child_attributes.border_width); + TEST_ASSERT_EQUAL_INT(IsViewable, child_attributes.map_state); + +} diff --git a/test/aswm/create_windows/single_resizeable.c b/test/aswm/create_windows/single_resizeable.c new file mode 100644 index 0000000..8544f8a --- /dev/null +++ b/test/aswm/create_windows/single_resizeable.c @@ -0,0 +1,35 @@ +#include "../create_windows.h" + +void create_single_resizeable_top_level_window(void) { + Window window = XCreateSimpleWindow(test_display, test_root, + 10 /*x*/, 10 /*y*/, 128 /*w*/, 128 /*h*/, + 0 /*TODO: border width*/, CopyFromParent /*depth*/, blue(1).pixel /* background */); + // The top level window might have children. Those must **not** be altered + // by the Window Manager + Window child = XCreateSimpleWindow(test_display, window, + 0, 0, 25, 30, + 0, CopyFromParent, red(1).pixel); + XMapWindow(test_display, child); + XMapWindow(test_display, window); + + int visibility = wait_visibility(test_display, window); + + // The top level window if fully visible + XWindowAttributes attributes; + XGetWindowAttributes(test_display, window, &attributes); + TEST_ASSERT_EQUAL_INT(VisibilityUnobscured, visibility); + TEST_ASSERT_EQUAL_INT(IsViewable, attributes.map_state); + + // Check the child structure is unaltered + TEST_ASSERT_EQUAL(parent(test_display, child), window); + + XWindowAttributes child_attributes; + XGetWindowAttributes(test_display, child, &child_attributes); + + TEST_ASSERT_EQUAL_INT(0, child_attributes.x); + TEST_ASSERT_EQUAL_INT(0, child_attributes.y); + TEST_ASSERT_EQUAL_INT(25, child_attributes.width); + TEST_ASSERT_EQUAL_INT(30, child_attributes.height); + TEST_ASSERT_EQUAL_INT(0, child_attributes.border_width); + TEST_ASSERT_EQUAL_INT(IsViewable, child_attributes.map_state); +} diff --git a/test/aswm/test_aswm_create_windows.c b/test/aswm/test_aswm_create_windows.c deleted file mode 100644 index 61df980..0000000 --- a/test/aswm/test_aswm_create_windows.c +++ /dev/null @@ -1,131 +0,0 @@ -#include "test_aswm_create_windows.h" - -#include - -#include "aswm/aswm.h" -#include "../test_set_up.h" - -clock_t USER_DELAY = 1 * CLOCKS_PER_SEC; -#define MAX_COLOR 65535 - -void create_single_resizeable_top_level_window(void) { - XColor blue; - blue.blue = MAX_COLOR; - XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &blue); - - XColor red; - red.red = MAX_COLOR; - XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &red); - - Window window = XCreateSimpleWindow(test_display, test_root, - 10 /*x*/, 10 /*y*/, 128 /*w*/, 128 /*h*/, - 0 /*TODO: border width*/, CopyFromParent /*depth*/, blue.pixel /* background */); - // The top level window might have children. Those must **not** be altered - // by the Window Manager - Window child = XCreateSimpleWindow(test_display, window, - 0, 0, 25, 30, - 0, CopyFromParent, red.pixel); - XSelectInput(test_display, window, VisibilityChangeMask); - XMapWindow(test_display, child); - XMapWindow(test_display, window); - - int visibility; - clock_t start = clock(); - while((clock() - start) < USER_DELAY) { - XEvent e; - XCheckWindowEvent(test_display, window, VisibilityChangeMask, &e); - visibility = e.xvisibility.state; - } - - // The top level window if fully visible - XWindowAttributes attributes; - XGetWindowAttributes(test_display, window, &attributes); - TEST_ASSERT_EQUAL_INT(VisibilityUnobscured, visibility); - TEST_ASSERT_EQUAL_INT(IsViewable, attributes.map_state); - - // Check the child structure is unaltered - Window root; - Window parent; - Window* children; - unsigned int children_count; - XQueryTree(test_display, child, &root, &parent, &children, &children_count); - - TEST_ASSERT_EQUAL(parent, window); - - XWindowAttributes child_attributes; - XGetWindowAttributes(test_display, child, &child_attributes); - - TEST_ASSERT_EQUAL_INT(0, child_attributes.x); - TEST_ASSERT_EQUAL_INT(0, child_attributes.y); - TEST_ASSERT_EQUAL_INT(25, child_attributes.width); - TEST_ASSERT_EQUAL_INT(30, child_attributes.height); - TEST_ASSERT_EQUAL_INT(0, child_attributes.border_width); - TEST_ASSERT_EQUAL_INT(IsViewable, child_attributes.map_state); -} - -void create_multiple_resizeable_top_level_window(void) { - XColor red; - red.red = MAX_COLOR; - XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &red); - - const int N = 10; - Window windows[N]; - Window children[N]; - - for(auto i = 0; i < N; i++) { - XColor blue; - blue.blue = (i+1) * MAX_COLOR / N; - XAllocColor(test_display, XDefaultColormap(test_display, DefaultScreen(test_display)), &blue); - - windows[i] = XCreateSimpleWindow(test_display, test_root, - 10 /*x*/, 10 /*y*/, 128 /*w*/, 128 /*h*/, - 0 /*TODO: border width*/, CopyFromParent /*depth*/, blue.pixel /* background */); - // The top level windows might have children. Those must **not** be - // altered by the Window Manager - children[i] = XCreateSimpleWindow(test_display, windows[i], - 0, 0, 25, 30, - 0, CopyFromParent, red.pixel); - XSelectInput(test_display, windows[i], VisibilityChangeMask); - XMapWindow(test_display, children[i]); - XMapWindow(test_display, windows[i]); - } - - - clock_t user_time = clock(); - int visibility[N]; - while((clock() - user_time) < USER_DELAY * N) { - for(auto i = 0; i < N; i++) { - XEvent e; - XCheckWindowEvent(test_display, windows[i], VisibilityChangeMask, &e); - visibility[i] = e.xvisibility.state; - } - } - - for(auto i = 0; i < N; i++) { - // All top level windows must be fully visible - XWindowAttributes attributes; - XGetWindowAttributes(test_display, windows[i], &attributes); - TEST_ASSERT_EQUAL_INT(VisibilityUnobscured, visibility[i]); - TEST_ASSERT_EQUAL_INT(IsViewable, attributes.map_state); - - // Check the children structure is unaltered - Window _root; - Window parent; - Window* _children; - unsigned int _children_count; - XQueryTree(test_display, children[i], &_root, &parent, &_children, &_children_count); - - TEST_ASSERT_EQUAL(parent, windows[i]); - - XWindowAttributes child_attributes; - XGetWindowAttributes(test_display, children[i], &child_attributes); - - TEST_ASSERT_EQUAL_INT(0, child_attributes.x); - TEST_ASSERT_EQUAL_INT(0, child_attributes.y); - TEST_ASSERT_EQUAL_INT(25, child_attributes.width); - TEST_ASSERT_EQUAL_INT(30, child_attributes.height); - TEST_ASSERT_EQUAL_INT(0, child_attributes.border_width); - TEST_ASSERT_EQUAL_INT(IsViewable, child_attributes.map_state); - } -} - diff --git a/test/aswm/test_aswm_create_windows.h b/test/aswm/test_aswm_create_windows.h deleted file mode 100644 index 9e26ef6..0000000 --- a/test/aswm/test_aswm_create_windows.h +++ /dev/null @@ -1,3 +0,0 @@ - -void create_single_resizeable_top_level_window(void); -void create_multiple_resizeable_top_level_window(void);