From 2fb85397366c58accbb77e5a7bd898877facc44d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 9 Mar 2020 21:49:55 +0100 Subject: Add test for basic view creation, exposure, and destruction --- test/test_show_hide.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 test/test_show_hide.c (limited to 'test/test_show_hide.c') diff --git a/test/test_show_hide.c b/test/test_show_hide.c new file mode 100644 index 0000000..d18ced1 --- /dev/null +++ b/test/test_show_hide.c @@ -0,0 +1,149 @@ +/* + Copyright 2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/* + Tests the basic sanity of view/window create, configure, map, expose, unmap, + and destroy events. +*/ + +#undef NDEBUG + +#include "test_utils.h" + +#include "pugl/pugl.h" +#include "pugl/pugl_stub.h" + +#include +#include +#include + +typedef enum { + START, + CREATED, + CONFIGURED, + MAPPED, + EXPOSED, + UNMAPPED, + DESTROYED, +} State; + +typedef struct { + PuglTestOptions opts; + PuglWorld* world; + PuglView* view; + State state; +} PuglTest; + +static PuglStatus +onEvent(PuglView* view, const PuglEvent* event) +{ + PuglTest* test = (PuglTest*)puglGetHandle(view); + + if (test->opts.verbose) { + printEvent(event, "Event: ", true); + } + + switch (event->type) { + case PUGL_CREATE: + assert(test->state == START); + test->state = CREATED; + break; + case PUGL_CONFIGURE: + if (test->state == CREATED) { + test->state = CONFIGURED; + } + break; + case PUGL_MAP: + assert(test->state == CONFIGURED || test->state == UNMAPPED); + test->state = MAPPED; + break; + case PUGL_EXPOSE: + assert(test->state == MAPPED); + test->state = EXPOSED; + break; + case PUGL_UNMAP: + assert(test->state == EXPOSED); + test->state = UNMAPPED; + break; + case PUGL_DESTROY: + assert(test->state == UNMAPPED); + test->state = DESTROYED; + break; + default: + break; + } + + return PUGL_SUCCESS; +} + +static void +tick(PuglWorld* world) +{ +#ifdef __APPLE__ + // FIXME: Expose events are not events on MacOS, so we can't block + // indefinitely here since it will block forever + assert(!puglPollEvents(world, 1 / 30.0)); +#else + assert(!puglPollEvents(world, -1)); +#endif + + assert(!puglDispatchEvents(world)); +} + +int +main(int argc, char** argv) +{ + PuglTest test = {puglParseTestOptions(&argc, &argv), + puglNewWorld(), + NULL, + START}; + + // Set up view + test.view = puglNewView(test.world); + puglSetClassName(test.world, "Pugl Test"); + puglSetBackend(test.view, puglStubBackend()); + puglSetHandle(test.view, &test); + puglSetEventFunc(test.view, onEvent); + + // Create initially invisible window + assert(!puglCreateWindow(test.view, "Pugl Test")); + assert(!puglGetVisible(test.view)); + while (test.state < CREATED) { + tick(test.world); + } + + // Show and hide window a couple of times + for (unsigned i = 0u; i < 2u; ++i) { + assert(!puglShowWindow(test.view)); + while (test.state != EXPOSED) { + tick(test.world); + } + + assert(puglGetVisible(test.view)); + assert(!puglHideWindow(test.view)); + while (test.state != UNMAPPED) { + tick(test.world); + } + } + + // Tear down + assert(!puglGetVisible(test.view)); + puglFreeView(test.view); + assert(test.state == DESTROYED); + puglFreeWorld(test.world); + + return 0; +} -- cgit v1.2.1