// vim:fileencoding=utf-8:foldmethod=marker

#include "tester.h"
#include "../../common/aliases/aliases.h"
#include "../../os/shell/termcolour/termcolour.h"
#include "../../base/strings/str8/str8.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

wapp_intern void handle_test_result(TestFuncResult result);

void run_tests(TestFunc *func1, ...) {
  printf("\n");

  handle_test_result(func1());

  va_list args;
  va_start(args, func1);

  TestFunc *func = va_arg(args, TestFunc *);

  while (func) {
    TestFuncResult result = func();
    handle_test_result(result);

    func = va_arg(args, TestFunc *);
  }

  va_end(args);

  printf("\n");
}

wapp_intern void handle_test_result(TestFuncResult result) {
  TerminalColour colour;
  Str8 result_text = wapp_str8_buf(64);

  if (result.passed) {
    colour = WAPP_TERM_COLOUR_FG_BR_GREEN;
    wapp_str8_copy_cstr_capped(&result_text, "PASSED");
  } else {
    colour = WAPP_TERM_COLOUR_FG_BR_RED;
    wapp_str8_copy_cstr_capped(&result_text, "FAILED");
  }

  printf("[");
  wapp_shell_termcolour_print_text(&result_text, colour);
  wapp_shell_termcolour_clear_colour();
  printf("] " WAPP_STR8_SPEC "\n", wapp_str8_varg(result.name));

  if (!result.passed) {
    exit(EXIT_FAILURE);
  }
}
