aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-03-09 21:49:55 +0100
committerDavid Robillard <d@drobilla.net>2020-03-09 21:49:55 +0100
commit2fb85397366c58accbb77e5a7bd898877facc44d (patch)
tree28e5cc07a2d5c9b27404d063db0652937488067f
parenta7cb0cb1506792d6893556bc976822e254a89106 (diff)
downloadpugl-2fb85397366c58accbb77e5a7bd898877facc44d.tar.gz
pugl-2fb85397366c58accbb77e5a7bd898877facc44d.tar.bz2
pugl-2fb85397366c58accbb77e5a7bd898877facc44d.zip
Add test for basic view creation, exposure, and destruction
-rw-r--r--test/test_show_hide.c149
-rw-r--r--wscript20
2 files changed, 168 insertions, 1 deletions
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 <http://drobilla.net>
+
+ 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 <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+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):