aboutsummaryrefslogtreecommitdiff
path: root/tests/test_str_print_banner.c
blob: 4520e178e7d053ed1acc3d68756fc2dc2346cbfe (plain) (blame)
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
#include "spm.h"
#include "framework.h"

const char *testFmt = "case %zu: '%s' is length %zu, expected %zu\n";
const char *testFmtChars = "case %zu: '%s' got '%c' (pos: %zu), expected '%c'\n";

int main(int argc, char *argv[]) {
    char *tty_path = NULL;
    if ((tty_path = ttyname(STDOUT_FILENO)) == NULL) {
        perror("tty check");
        return 0;
    }

    const int max_banner = 'z';
    char buf[BUFSIZ] = {0,};
    char *buffer = buf;
    int stdout_save = 0;

    fflush(stdout);
    for (size_t i = 'A', letters = 'A'; i <= (size_t)max_banner; i++, letters++) {
        char letter[] = {letters, '\0'};
        size_t buffer_len = 0;

        // Redirect stdout
        stdout_save = dup(STDOUT_FILENO);
        freopen("/dev/null", "w", stdout);
        setvbuf(stdout, buffer, _IOLBF, sizeof(buf));

        // Do test
        print_banner(letter, i);
        fflush(stdout);

        strip(buffer);
        buffer_len = strlen(buffer);

        myassert(buffer_len == i, testFmt, i, buffer, buffer_len, i);
        for (size_t j = 0; j < buffer_len; j++) {
            myassert(buffer[j] == (int)letters, testFmtChars, i, buffer, j, buffer[j], (int)letters, buffer[j]);
        }

        // Restore stdout
        dup2(stdout_save, STDOUT_FILENO);
        setvbuf(stdout, NULL, _IONBF, 0);
    }
}