#include "test.h"
#include "lsm/str_internal.h"

void test_cmp() {
  lsm_str s1, s2, s3;
  lsm_str_overwrite_copy(&s1, "some_string");
  lsm_str_overwrite_copy(&s2, "some");
  lsm_str_overwrite_copy(&s3, "some_string_extra");

  TEST_CHECK(lsm_str_cmp(&s1, 0, &s2, 0) == 4);
  TEST_CHECK(lsm_str_cmp(&s1, 0, &s2, 1) == 0);
  TEST_CHECK(lsm_str_cmp(&s1, 1, &s2, 1) == 3);
  TEST_CHECK(lsm_str_cmp(&s1, 1, &s2, 0) == 0);

  TEST_CHECK(lsm_str_cmp(&s1, 0, &s3, 0) == lsm_str_len(&s1));
}

void test_eq() {
  lsm_str s1, s2;
  lsm_str_overwrite_copy(&s1, "longerthan8");
  lsm_str_overwrite_copy(&s2, "longerthan8");

  TEST_CHECK(lsm_str_eq(&s1, &s2));

  lsm_str_overwrite_copy(&s1, "longerthan8");
  lsm_str_overwrite_copy(&s2, "lmaolongerthan8");

  TEST_CHECK(!lsm_str_eq(&s1, &s2));

  lsm_str_overwrite_copy(&s1, "short");
  lsm_str_overwrite_copy(&s2, "short");

  TEST_CHECK(lsm_str_eq(&s1, &s2));

  lsm_str_overwrite_copy(&s1, "short");
  lsm_str_overwrite_copy(&s1, "shorte");

  TEST_CHECK(!lsm_str_eq(&s1, &s2));

  lsm_str_overwrite_copy(&s1, "longerthan8");
  lsm_str_overwrite_copy(&s2, "short");

  TEST_CHECK(!lsm_str_eq(&s1, &s2));
}

void test_substr() {
  lsm_str s1, s2, s3;
  lsm_str_overwrite_copy(&s1, "some_string");
  lsm_str_overwrite_copy(&s3, "string");
  lsm_str_substr(&s2, &s1, 5, lsm_str_len(&s1));

  TEST_CHECK(lsm_str_eq(&s2, &s3));

  lsm_str_zero(&s2);
  lsm_str_substr(&s2, &s1, 25, lsm_str_len(&s1));

  TEST_CHECK(lsm_str_len(&s2) == 0);
}

void test_truncate() {
  lsm_str s1, s2, s3;
  lsm_str_overwrite_copy(&s1, "some_longer_string_thing");
  lsm_str_overwrite_copy(&s2, "some_longer_string");
  lsm_str_overwrite_copy(&s3, "some");

  lsm_str_truncate(&s1, 18);
  TEST_CHECK(lsm_str_eq(&s1, &s2));

  lsm_str_truncate(&s1, 4);
  TEST_CHECK(lsm_str_eq(&s1, &s3));
}

void test_init_copy() {
  char orig[] = "some_string";
  lsm_str *s;
  lsm_str_init_copy(&s, orig);

  TEST_CHECK(s->data.ptr != orig);
  TEST_CHECK(strcmp(s->data.ptr, orig) == 0);

  lsm_str_free(s);
}

TEST_LIST = {
  { "str init_copy", test_init_copy },
  { "str cmp", test_cmp },
  { "str eq", test_eq },
  { "str substr", test_substr },
  { "str truncate", test_truncate },
  { NULL, NULL }
};