aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/test_redisplay.c17
-rw-r--r--test/test_show_hide.c6
-rw-r--r--test/test_update.c124
-rw-r--r--test/test_utils.h4
4 files changed, 137 insertions, 14 deletions
diff --git a/test/test_redisplay.c b/test/test_redisplay.c
index 4470053..6ec5bb8 100644
--- a/test/test_redisplay.c
+++ b/test/test_redisplay.c
@@ -31,6 +31,12 @@
#include <stddef.h>
#include <stdint.h>
+#ifdef __APPLE__
+static const double timeout = 1 / 60.0;
+#else
+static const double timeout = -1.0;
+#endif
+
typedef enum {
START,
EXPOSED,
@@ -85,13 +91,6 @@ onEvent(PuglView* view, const PuglEvent* event)
return PUGL_SUCCESS;
}
-static void
-tick(PuglWorld* world)
-{
- assert(!puglPollEvents(world, -1));
- assert(!puglDispatchEvents(world));
-}
-
int
main(int argc, char** argv)
{
@@ -111,7 +110,7 @@ main(int argc, char** argv)
assert(!puglCreateWindow(app.view, "Pugl Test"));
assert(!puglShowWindow(app.view));
while (app.state != EXPOSED) {
- tick(app.world);
+ assert(!puglUpdate(app.world, timeout));
}
// Send a custom event to trigger a redisplay in the event loop
@@ -121,7 +120,7 @@ main(int argc, char** argv)
// Loop until an expose happens in the same iteration as the redisplay
app.state = SHOULD_REDISPLAY;
while (app.state != REDISPLAYED) {
- tick(app.world);
+ assert(!puglUpdate(app.world, timeout));
assert(app.state != POSTED_REDISPLAY);
}
diff --git a/test/test_show_hide.c b/test/test_show_hide.c
index b942f45..ed5ede7 100644
--- a/test/test_show_hide.c
+++ b/test/test_show_hide.c
@@ -95,12 +95,10 @@ 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));
+ assert(!puglUpdate(world, 1 / 30.0));
#else
- assert(!puglPollEvents(world, -1));
+ assert(!puglUpdate(world, -1));
#endif
-
- assert(!puglDispatchEvents(world));
}
int
diff --git a/test/test_update.c b/test/test_update.c
new file mode 100644
index 0000000..bbda94a
--- /dev/null
+++ b/test/test_update.c
@@ -0,0 +1,124 @@
+/*
+ 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 that redisplays posted in the event handler are dispatched at the end
+ of the same event loop iteration.
+*/
+
+#undef NDEBUG
+
+#include "test_utils.h"
+
+#include "pugl/pugl.h"
+#include "pugl/pugl_stub.h"
+
+#include <assert.h>
+#include <stdbool.h>
+#include <stddef.h>
+
+#ifdef __APPLE__
+static const double timeout = 1 / 60.0;
+#else
+static const double timeout = -1.0;
+#endif
+
+typedef enum {
+ START,
+ EXPOSED1,
+ UPDATED,
+ EXPOSED2,
+} 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_EXPOSE:
+ switch (test->state) {
+ case START:
+ test->state = EXPOSED1;
+ break;
+ case UPDATED:
+ test->state = EXPOSED2;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case PUGL_UPDATE:
+ if (test->state == EXPOSED1) {
+ puglPostRedisplay(view);
+ test->state = UPDATED;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return PUGL_SUCCESS;
+}
+
+int
+main(int argc, char** argv)
+{
+ PuglTest app = {puglParseTestOptions(&argc, &argv),
+ puglNewWorld(PUGL_PROGRAM, 0),
+ NULL,
+ START};
+
+ // Set up view
+ app.view = puglNewView(app.world);
+ puglSetClassName(app.world, "Pugl Test");
+ puglSetBackend(app.view, puglStubBackend());
+ puglSetHandle(app.view, &app);
+ puglSetEventFunc(app.view, onEvent);
+
+ // Create and show window
+ assert(!puglCreateWindow(app.view, "Pugl Test"));
+ assert(!puglShowWindow(app.view));
+
+ // Tick until an expose happens
+ while (app.state <= EXPOSED1) {
+ assert(!puglUpdate(app.world, timeout));
+ assert(app.state != UPDATED);
+ }
+
+ // Tick once and ensure the update and the expose it posted both happened
+ assert(!puglUpdate(app.world, 0.0));
+ assert(app.state == EXPOSED2);
+
+ // Tear down
+ puglFreeView(app.view);
+ puglFreeWorld(app.world);
+
+ return 0;
+}
diff --git a/test/test_utils.h b/test/test_utils.h
index 7dc6e6e..3e62714 100644
--- a/test/test_utils.h
+++ b/test/test_utils.h
@@ -1,5 +1,5 @@
/*
- Copyright 2012-2019 David Robillard <http://drobilla.net>
+ Copyright 2012-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
@@ -140,6 +140,8 @@ printEvent(const PuglEvent* event, const char* prefix, const bool verbose)
return fprintf(stderr, "%sMap\n", prefix);
case PUGL_UNMAP:
return fprintf(stderr, "%sUnmap\n", prefix);
+ case PUGL_UPDATE:
+ return fprintf(stderr, "%sUpdate\n", prefix);
case PUGL_CONFIGURE:
return PRINT("%sConfigure " PFMT " " PFMT "\n",
prefix,