#define _POSIX_C_SOURCE 200809L #include #include #include #include #define main swmctl_program_main #include "swmctl.c" #undef main static void expect_invalid_color(const char *value) { pid_t child = fork(); int status; assert(child >= 0); if (!child) { int nullfd = open("/dev/null", O_WRONLY); assert(nullfd >= 0); assert(dup2(nullfd, STDERR_FILENO) >= 0); close(nullfd); parse_color(value); _exit(EXIT_SUCCESS); } assert(waitpid(child, &status, 0) == child); assert(WIFEXITED(status)); assert(WEXITSTATUS(status) == EXIT_FAILURE); } /* Verify active-window updates and single-line title output. */ static void test_active_window_events(void) { event_window_t first = { .title = "one", .active = true, .ready = true }; event_window_t second = { .title = "two", .ready = true }; char output[128] = { 0 }; FILE *capture = tmpfile(); int saved; assert(capture && fflush(stdout) == 0); saved = dup(STDOUT_FILENO); assert(saved >= 0 && dup2(fileno(capture), STDOUT_FILENO) >= 0); wl_list_init(&event_windows); wl_list_insert(event_windows.prev, &first.link); wl_list_insert(event_windows.prev, &second.link); publish_active_window(); publish_active_window(); second.title = "renamed"; publish_active_window(); first.title = "one\nchanged"; first.ready = false; publish_active_window(); first.ready = true; publish_active_window(); first.active = false; second.active = true; publish_active_window(); second.active = false; publish_active_window(); assert(dup2(saved, STDOUT_FILENO) >= 0); close(saved); rewind(capture); assert(fread(output, 1, sizeof(output) - 1, capture) > 0); assert(!strcmp(output, "one\none changed\nrenamed\n\n")); fclose(capture); } int main(void) { char escaped[64] = {}; FILE *stream = tmpfile(); assert(stream); print_window_field(stream, "title\x1b[2J"); rewind(stream); assert(fread(escaped, 1, sizeof(escaped) - 1, stream) > 0); assert(!strcmp(escaped, "title\\x1b[2J")); assert(fclose(stream) == 0); assert(parse_color("#012345") == 0x012345ff); assert(parse_color("#01234567") == 0x01234567); expect_invalid_color("# 12345"); expect_invalid_color("#+12345"); test_active_window_events(); return EXIT_SUCCESS; }