summaryrefslogtreecommitdiff
path: root/t/10term-write.c
blob: 7662496b05f1b9864ddcb02511d37ec8f5cd2e5d (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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "tickit.h"
#include "taplib.h"

#include <string.h>
#include <unistd.h>

bool output_eof = false;

void output(TickitTerm *tt, const char *bytes, size_t len, void *user)
{
  char *buffer = user;

  if(bytes)
    strncat(buffer, bytes, len);
  else
    output_eof = true;
}

int main(int argc, char *argv[])
{
  char   buffer[1024] = { 0 };
  size_t len;

  /* Output via filehandle */
  {
    int    fd[2];
    /* We'll need a real filehandle we can write/read.
     * pipe() can make us one */
    pipe(fd);

    TickitTerm *tt = tickit_term_new_for_termtype("xterm");

    ok(!!tt, "tickit_term_new_for_termtype");

    tickit_term_set_output_fd(tt, fd[1]);

    is_int(tickit_term_get_output_fd(tt), fd[1], "tickit_term_get_output_fd");

    /* Already it should have written its DECSLRM probe string */
    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_str_escape(buffer,
        "\e[?69h\e[?69$p\e[?25$p\e[?12$p\eP$q q\e\\"
          "\e[38;5;255m\e[38:2:0:1:2m\eP$qm\e\\\e[m"
          "\e[G\e[K",
        "buffer after initialisation contains DECSLRM and cursor status probes");

    tickit_term_print(tt, "Hello world!");

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_int(len, 12, "read() length after tickit_term_print");
    is_str_escape(buffer, "Hello world!", "buffer after tickit_term_print");

    tickit_term_printn(tt, "another string here", 7);

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_int(len, 7, "read() length after tickit_term_printn");
    is_str_escape(buffer, "another", "buffer after tickit_term_printn");

    tickit_term_printf(tt, "%s %s!", "More", "messages");

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_int(len, 14, "read() length after tickit_term_printf");
    is_str_escape(buffer, "More messages!", "buffer after tickit_term_printf");

    tickit_term_goto(tt, 2, 5);

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_str_escape(buffer, "\e[3;6H", "buffer after tickit_term_goto line+col");

    tickit_term_goto(tt, 4, -1);

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_str_escape(buffer, "\e[5d", "buffer after tickit_term_goto line");

    tickit_term_goto(tt, -1, 10);

    len = read(fd[0], buffer, sizeof buffer);
    buffer[len] = 0;

    is_str_escape(buffer, "\e[11G", "buffer after tickit_term_goto col");

    tickit_term_unref(tt);
  }

  /* Output by function */
  {
    TickitTerm *tt = tickit_term_new_for_termtype("xterm");

    buffer[0] = 0;
    tickit_term_set_output_func(tt, output, buffer);

    /* Ignore startup string */
    buffer[0] = 0;

    tickit_term_print(tt, "Hello, world");

    is_str(buffer, "Hello, world", "buffer after print using output func");

    tickit_term_unref(tt);

    ok(1, "tickit_term_unref");

    ok(output_eof, "output func receives EOF indication after tickit_term_unref");
  }

  return exit_status();
}