1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include "../../src/platform/wayland/clipboard.c"
#include <assert.h>
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;
}
|