summaryrefslogtreecommitdiff
path: root/tests/wayland/test_clipboard.c
blob: ff84209406b2f4be164ee51ad1fb594eca214e48 (plain)
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_text(&c, fds[0], false, false, c.text));
        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;
}