#include "../../src/wayland/clipboard.c" #include struct received { int count; size_t len; char text[32]; }; static void receive(const char *text, size_t len, bool uri_list, struct wl_surface *surface, void *ud) { (void)surface; struct received *r = ud; assert(!uri_list && len < sizeof(r->text)); memcpy(r->text, text, len); r->text[len] = '\0'; r->len = len; r->count++; } int main(void) { struct received received = {0}; struct clipboard c = {.loop = yasl_loop_create(), .receive = receive, .ud = &received}; assert(c.loop); const struct { const char *bytes; size_t len; bool valid; } cases[] = { {"é字😀", sizeof("é字😀") - 1, true}, {"", 0, true}, {"\xff", 1, false}, {"\xf0\x9f\x98", 3, false}, /* Incomplete non-BMP character. */ }; for (size_t i = 0; i < sizeof(cases) / sizeof(cases[0]); i++) { received = (struct received){0}; int fds[2]; assert(pipe(fds) == 0); assert(start_transfer(&c, fds[0], false, false)); assert(write(fds[1], cases[i].bytes, cases[i].len) == (ssize_t)cases[i].len); close(fds[1]); for (int steps = 0; c.transfers && steps < 10; steps++) assert(yasl_loop_step(c.loop, 0) >= 0); assert(!c.transfers); assert(received.count == (int)cases[i].valid); if (cases[i].valid) { assert(received.len == cases[i].len); assert(memcmp(received.text, cases[i].bytes, received.len) == 0); } } yasl_loop_destroy(c.loop); return 0; }