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 ++++++++++++++++++++++++++++++++++++++++++++++++++ wscript | 20 ++++++- 2 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 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; +} diff --git a/wscript b/wscript index 8a6b158..109ae3e 100644 --- a/wscript +++ b/wscript @@ -37,6 +37,9 @@ def options(ctx): 'log': 'print GL information to console', 'grab-focus': 'work around keyboard issues by grabbing focus'}) + ctx.get_option_group('Test options').add_option( + '--gui-tests', action='store_true', help='Run GUI tests') + def configure(conf): conf.load('compiler_c', cache=True) @@ -174,6 +177,9 @@ def _build_pc_file(bld, name, desc, target, libname, deps={}, requires=[]): LIBS=' '.join(link_flags)) +tests = ['show_hide'] + + def build(bld): # C Headers includedir = '${INCLUDEDIR}/pugl-%s/pugl' % PUGL_MAJOR_VERSION @@ -334,12 +340,24 @@ def build(bld): platform, 'cairo', uselib=['M', 'CAIRO']) + for test in tests: + bld(features = 'c cprogram', + source = 'test/test_%s.c' % test, + target = 'test/test_%s' % test, + install_path = '', + use = ['pugl_%s_static' % platform, + 'pugl_%s_stub_static' % platform], + uselib = deps[platform]['uselib'] + ['CAIRO']) + if bld.env.DOCS: autowaf.build_dox(bld, 'PUGL', PUGL_VERSION, top, out) def test(tst): - pass + if tst.options.gui_tests: + with tst.group('gui') as check: + for test in tests: + check(['test/test_%s' % test]) def lint(ctx): -- cgit v1.2.1