#include "test_cpath.h"
#include "cpath.h"
#include "tester.h"
#include <string.h>
#include <stdio.h>
#include <stdbool.h>

#define MAIN_BUF_SIZE 4096
#define TMP_BUF_SIZE  1024

TestFuncResult test_cpath_join_path(void) {
  char expected[MAIN_BUF_SIZE] = {0};
  char out[MAIN_BUF_SIZE]      = {0};
  char tmp[TMP_BUF_SIZE]      = {0};

  snprintf(expected, MAIN_BUF_SIZE, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
  snprintf(tmp, 2, "%c", PATH_SEP);
  wapp_cpath_join_path(out, tmp, "home", "abdelrahman", "Documents");

  bool result = strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  snprintf(expected, MAIN_BUF_SIZE, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
  wapp_cpath_join_path(out, "home", "abdelrahman", "Documents");

  result = result && strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  memset(tmp, 0, strlen(tmp));
  snprintf(expected, MAIN_BUF_SIZE, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
  snprintf(tmp, TMP_BUF_SIZE, "%chome", PATH_SEP);
  wapp_cpath_join_path(out, tmp, "abdelrahman", "Documents");

  result = result && strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  memset(tmp, 0, strlen(tmp));
  snprintf(expected, MAIN_BUF_SIZE, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
  snprintf(tmp, TMP_BUF_SIZE, "home%c", PATH_SEP);
  wapp_cpath_join_path(out, tmp, "abdelrahman", "Documents");

  result = result && strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  memset(tmp, 0, strlen(tmp));
  snprintf(expected, MAIN_BUF_SIZE, "%chome", PATH_SEP);
  snprintf(tmp, TMP_BUF_SIZE, "%chome", PATH_SEP);
  wapp_cpath_join_path(out, tmp, "");

  result = result && strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  snprintf(expected, 1, "");
  wapp_cpath_join_path(out, "", "");

  result = result && strcmp(out, expected) == 0;
  if (!result) {
    goto TEST_JOIN_PATH_EXIT;
  }

  memset(out, 0, strlen(out));
  snprintf(expected, MAIN_BUF_SIZE, "home");
  wapp_cpath_join_path(out, "", "home");

  result = result && strcmp(out, expected) == 0;

TEST_JOIN_PATH_EXIT:
  return wapp_tester_result(result);
}

TestFuncResult test_cpath_dirname(void) {
  char dst[MAIN_BUF_SIZE]      = {0};
  char expected[MAIN_BUF_SIZE] = {0};
  char tmp[TMP_BUF_SIZE]      = {0};

  snprintf(tmp, 2, "%c", PATH_SEP);
  wapp_cpath_dirname(dst, tmp);
  bool result = strcmp(dst, tmp) == 0;
  if (!result) {
    goto TEST_DIRNAME_EXIT;
  }

  memset(dst, 0, strlen(dst));
  wapp_cpath_dirname(dst, "home");
  result = strcmp(dst, ".") == 0;
  if (!result) {
    goto TEST_DIRNAME_EXIT;
  }

  memset(dst, 0, strlen(dst));
  wapp_cpath_dirname(dst, "");
  result = strcmp(dst, ".") == 0;
  if (!result) {
    goto TEST_DIRNAME_EXIT;
  }

  memset(dst, 0, strlen(dst));
  snprintf(tmp, TMP_BUF_SIZE, "%chome%ctest", PATH_SEP, PATH_SEP);
  snprintf(expected, MAIN_BUF_SIZE, "%chome", PATH_SEP);
  wapp_cpath_dirname(dst, tmp);
  result = strcmp(dst, expected) == 0;
  if (!result) {
    goto TEST_DIRNAME_EXIT;
  }

  memset(dst, 0, strlen(dst));
  memset(tmp, 0, strlen(tmp));
  memset(expected, 0, strlen(expected));
  snprintf(tmp, TMP_BUF_SIZE, "%chome%ctest%c", PATH_SEP, PATH_SEP, PATH_SEP);
  snprintf(expected, MAIN_BUF_SIZE, "%chome", PATH_SEP);
  wapp_cpath_dirname(dst, tmp);
  result = strcmp(dst, expected) == 0;

TEST_DIRNAME_EXIT:
  return wapp_tester_result(result);
}

TestFuncResult test_cpath_dirup(void) {
  char dst[MAIN_BUF_SIZE]      = {0};
  char expected[MAIN_BUF_SIZE] = {0};
  char tmp[TMP_BUF_SIZE]      = {0};

  snprintf(tmp, 2, "%c", PATH_SEP);
  wapp_cpath_dirup(dst, 3, tmp);
  bool result = strcmp(dst, tmp) == 0;
  if (!result) {
    goto TEST_DIRUP_EXIT;
  }

  memset(dst, 0, strlen(dst));
  memset(tmp, 0, strlen(tmp));
  snprintf(tmp, TMP_BUF_SIZE, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
  snprintf(expected, MAIN_BUF_SIZE, "%c", PATH_SEP);
  wapp_cpath_dirup(dst, 3, tmp);
  result = strcmp(dst, expected) == 0;
  if (!result) {
    goto TEST_DIRUP_EXIT;
  }

  memset(dst, 0, strlen(dst));
  memset(tmp, 0, strlen(tmp));
  snprintf(tmp, TMP_BUF_SIZE, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
  wapp_cpath_dirup(dst, 3, tmp);
  result = strcmp(dst, ".") == 0;
  if (!result) {
    goto TEST_DIRUP_EXIT;
  }

  memset(dst, 0, strlen(dst));
  memset(tmp, 0, strlen(tmp));
  memset(expected, 0, strlen(expected));
  snprintf(tmp, TMP_BUF_SIZE, "%chome%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP, PATH_SEP);
  snprintf(expected, MAIN_BUF_SIZE, "%chome", PATH_SEP);
  wapp_cpath_dirup(dst, 2, tmp);
  result = strcmp(dst, expected) == 0;
  if (!result) {
    goto TEST_DIRUP_EXIT;
  }

  memset(dst, 0, strlen(dst));
  memset(tmp, 0, strlen(tmp));
  snprintf(tmp, TMP_BUF_SIZE, "home%cabdelrahman%cDocuments", PATH_SEP, PATH_SEP);
  wapp_cpath_dirup(dst, 2, tmp);
  result = strcmp(dst, "home") == 0;

TEST_DIRUP_EXIT:
  return wapp_tester_result(result);
}