#include "test_shell_commander.h"
#include "wapp.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

TestFuncResult test_commander_cmd_success(void) {
  Str8List cmd = {0};
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("hello world"));

  CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
  bool succeeded   = result.exited && result.exit_code == EXIT_SUCCESS &&
                     result.error == SHELL_ERR_NO_ERROR;

  return wapp_tester_result(succeeded);
}

TestFuncResult test_commander_cmd_failure(void) {
  Str8List cmd = {0};
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("grep"));

  CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_DISCARD, NULL, &cmd);
  bool failed      = result.exited && result.exit_code != EXIT_SUCCESS &&
                     result.error == SHELL_ERR_NO_ERROR;

  return wapp_tester_result(failed);
}

TestFuncResult test_commander_cmd_out_buf_success(void) {
  Str8 buf          = wapp_str8_buf(64);
  Str8 expected     = wapp_str8_buf(64);
  char msg[]        = "hello world";
  wapp_str8_copy_cstr_capped(&expected, msg);

  Str8List cmd = {0};
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));

  CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
  bool succeeded   = result.exited && result.exit_code == EXIT_SUCCESS &&
                     result.error == SHELL_ERR_NO_ERROR && wapp_str8_equal_to_count(&buf, &expected, strlen(msg));

  return wapp_tester_result(succeeded);
}

TestFuncResult test_commander_cmd_out_buf_failure(void) {
  Str8 buf         = wapp_str8_buf(4);
  Str8 expected    = wapp_str8_buf(64);
  char msg[]       = "hello world";
  wapp_str8_copy_cstr_capped(&expected, msg);

  Str8List cmd = {0};
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr("echo"));
  wapp_str8_list_push_back(&cmd, &wapp_str8_node_from_cstr(msg));

  CMDResult result = wapp_shell_commander_execute(SHELL_OUTPUT_CAPTURE, &buf, &cmd);
  bool failed      = !result.exited && result.exit_code != EXIT_SUCCESS &&
                     result.error == SHELL_ERR_OUT_BUF_FULL && !wapp_str8_equal(&buf, &expected);

  return wapp_tester_result(failed);
}