// Not sure where to begin with gtest?
//
// What can I test with gtest?
//
// googletest/googletest/docs/primer.md

#include "render.h"
#include "terminal.h"
#include "utils.h"
#include "wordplay.h"
#include "gtest/gtest.h"
#include <errno.h>
#include <fcntl.h>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

#define GTEST_COUT std::cerr << "[          ] [ INFO ]"

struct console_details console;
std::string username = "Pseudonym";
std::string fullname = "Joe User";

int harry_level(void) { return 4; }
int randint(int x) { return 1; }
int randrange(int x, int y) { return x; }
int random_activate(int x) { return 1; }
char *repr(const char *) {
  static char text[] = "tada!";
  return text;
}
bool replace(std::string &str, const std::string &from, const std::string &to) {
  size_t start_pos = str.find(from);
  if (start_pos == std::string::npos)
    return false;
  str.replace(start_pos, from.length(), to);
  return true;
}
const char *logrepr(const char *) {
  static char text[] = "repr!";
  return text;
}

namespace {

class MangleFixture : public ::testing::Test {
public:
  time_t start;
  int fd;
  const char *filename = "mangle.testing";

protected:
  virtual void SetUp() {
    console_init(&console);
    start = time(NULL);
    // creat : File is WRITE ONLY.
    fd = creat(filename, S_IRUSR | S_IWUSR);
  }
  virtual void TearDown() {
    if (fd > 0)
      close(fd);
    unlink(filename);
  }
};

TEST_F(MangleFixture, TestMangle) {
  std::string data("The bear is sticky");
  // This tests the tangler code
  mangle(fd, data);

  int lfd = open(filename, O_RDONLY);
  char buffer[100];
  int len = read(lfd, buffer, sizeof(buffer));
  if (len == -1) {
    ASSERT_EQ(errno, 0);
  }
  buffer[len] = 0;
  close(lfd);

  GTEST_COUT << "buffer:" << buffer << std::endl;
  ASSERT_STREQ(
      buffer,
      "T \bh \be \b  \bb \be \ba \br \b  \bi \bs \b  \bs \bt \bi \bc \bk \by \b");
}

/*
TEST_F(RenderFixture, ColorTest) {
  ASSERT_GT(fd, 0);
  std::string colors("^C01One^C02Two^C03Three^C04Four");
  render(fd, colors);

  int lfd = open(filename, O_RDONLY);
  char buffer[100];
  int len = read(lfd, buffer, sizeof(buffer));
  if (len == -1) {
    ASSERT_EQ(errno, 0);
  }
  buffer[len] = 0;
  close(lfd);

  GTEST_COUT << "buffer:" << buffer << std::endl;

  ASSERT_EQ(len, 43);
  ASSERT_STREQ(buffer,
               "\x1B[0;34mOne\x1B[0;32mTwo\x1B[0;36mThree\x1B[0;31mFour");
  struct console_details cons;
  console_init(&cons);
  int color_list[4] = {4, 2, 6, 1};
  int color = 0;
  for (int x = 0; x < len; ++x) {
    termchar tc;

    tc = console_char(&cons, buffer[x]);
    if (tc.ansi == COLOR) {
      GTEST_COUT << "Console color:" << cons.fgcolor << std::endl;
      ASSERT_EQ(cons.fgcolor, color_list[color]);
      color++;
    }
  }
  ASSERT_EQ(color, 4);
}

TEST_F(RenderFixture, ColorEffectTest) {
  std::string colors("^S1^R1\x1b[1;33;44mMEOW!\x1b[0m");
  render(fd, colors);

  int lfd = open(filename, O_RDONLY);
  char buffer[100];
  int len = read(lfd, buffer, sizeof(buffer));
  if (len == -1) {
    ASSERT_EQ(errno, 0);
  }
  buffer[len] = 0;
  close(lfd);

  ASSERT_EQ(strstr(buffer, "\x1b[1;33;44m"), buffer);
  GTEST_COUT << "buffer:" << buffer << std::endl;

  ASSERT_EQ(len, 29);
  ASSERT_STREQ(buffer, "\x1b[1;33;44mM \bE \bO \bW \b! \b\x1b[0m");
}
*/

} // namespace