#ifdef _MSC_VER
#include <io.h>
#else
#include <unistd.h>
#endif  // _MSC_VER

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <fstream>

#include <marisa/io.h>

#include "assert.h"

namespace {

void TestFilename() {
  TEST_START();

  {
    marisa::Writer writer;
    writer.open("io-test.dat");
    marisa::UInt32 value = 123;
    writer.write(value);
    writer.write(value);
    double values[] = { 345, 456 };
    writer.write(values, 2);
    EXCEPT(writer.write(values, 1U << 30), MARISA_SIZE_ERROR);
  }

  {
    marisa::Writer writer;
    writer.open("io-test.dat", false, 4, SEEK_SET);
    marisa::UInt32 value = 234;
    writer.write(value);
  }

  {
    marisa::Writer writer;
    writer.open("io-test.dat", false, 0, SEEK_END);
    double value = 567;
    writer.write(value);
  }

  {
    marisa::Reader reader;
    reader.open("io-test.dat");
    marisa::UInt32 value;
    reader.read(&value);
    ASSERT(value == 123);
    reader.read(&value);
    ASSERT(value == 234);
    double values[3];
    reader.read(values, 3);
    ASSERT(values[0] == 345);
    ASSERT(values[1] == 456);
    ASSERT(values[2] == 567);
    char byte;
    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
  }

  {
    marisa::Mapper mapper;
    mapper.open("io-test.dat");
    marisa::UInt32 value;
    mapper.map(&value);
    ASSERT(value == 123);
    mapper.map(&value);
    ASSERT(value == 234);
    const double *values;
    mapper.map(&values, 3);
    ASSERT(values[0] == 345);
    ASSERT(values[1] == 456);
    ASSERT(values[2] == 567);
    char byte;
    EXCEPT(mapper.map(&byte), MARISA_IO_ERROR);
  }

  {
    marisa::Writer writer;
    writer.open("io-test.dat");
  }

  {
    marisa::Reader reader;
    reader.open("io-test.dat");
    char byte;
    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
  }

  TEST_END();
}

void TestFd() {
  TEST_START();

  {
#ifdef _MSC_VER
    int fd = -1;
    ASSERT(::_sopen_s(&fd, "io-test.dat",
        _O_BINARY | _O_CREAT | _O_WRONLY | _O_TRUNC,
        _SH_DENYRW, _S_IREAD | _S_IWRITE) == 0);
#else  // _MSC_VER
    int fd = ::creat("io-test.dat", 0644);
    ASSERT(fd != -1);
#endif  // _MSC_VER
    marisa::Writer writer(fd);
    marisa::UInt32 value = 345;
    writer.write(value);
    double values[] = { 456, 567, 678 };
    writer.write(values, 3);
#ifdef _MSC_VER
    ASSERT(::_close(fd) == 0);
#else  // _MSC_VER
    ASSERT(::close(fd) == 0);
#endif  // _MSC_VER
  }

  {
#ifdef _MSC_VER
    int fd = -1;
    ASSERT(::_sopen_s(&fd, "io-test.dat", _O_BINARY | _O_RDONLY,
        _SH_DENYRW, _S_IREAD) == 0);
#else  // _MSC_VER
    int fd = ::open("io-test.dat", O_RDONLY);
    ASSERT(fd != -1);
#endif  // _MSC_VER
    marisa::Reader reader(fd);
    marisa::UInt32 value;
    reader.read(&value);
    ASSERT(value == 345);
    double values[3];
    reader.read(values, 3);
    ASSERT(values[0] == 456);
    ASSERT(values[1] == 567);
    ASSERT(values[2] == 678);
    char byte;
    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
#ifdef _MSC_VER
    ASSERT(::_close(fd) == 0);
#else  // _MSC_VER
    ASSERT(::close(fd) == 0);
#endif  // _MSC_VER
  }

  TEST_END();
}

void TestFile() {
  TEST_START();

  {
#ifdef _MSC_VER
    FILE *file = NULL;
    ASSERT(::fopen_s(&file, "io-test.dat", "wb") == 0);
#else  // _MSC_VER
    FILE *file = std::fopen("io-test.dat", "wb");
    ASSERT(file != NULL);
#endif  // _MSC_VER
    marisa::Writer writer(file);
    marisa::UInt32 value = 345;
    writer.write(value);
    double values[3] = { 456, 567, 678 };
    writer.write(values, 3);
    ASSERT(std::fclose(file) == 0);
  }

  {
#ifdef _MSC_VER
    FILE *file = NULL;
    ASSERT(::fopen_s(&file, "io-test.dat", "rb") == 0);
#else  // _MSC_VER
    FILE *file = std::fopen("io-test.dat", "rb");
    ASSERT(file != NULL);
#endif  // _MSC_VER
    marisa::Reader reader(file);
    marisa::UInt32 value;
    reader.read(&value);
    ASSERT(value == 345);
    double values[3];
    reader.read(values, 3);
    ASSERT(values[0] == 456);
    ASSERT(values[1] == 567);
    ASSERT(values[2] == 678);
    char byte;
    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
    ASSERT(std::fclose(file) == 0);
  }

  TEST_END();
}

void TestStream() {
  TEST_START();

  {
    std::ofstream file("io-test.dat", std::ios::binary);
    ASSERT(file.is_open());
    marisa::Writer writer(&file);
    marisa::UInt32 value = 345;
    writer.write(value);
    double values[3] = { 456, 567, 678 };
    writer.write(values, 3);
  }

  {
    std::ifstream file("io-test.dat", std::ios::binary);
    ASSERT(file.is_open());
    marisa::Reader reader(&file);
    marisa::UInt32 value;
    reader.read(&value);
    ASSERT(value == 345);
    double values[3];
    reader.read(values, 3);
    ASSERT(values[0] == 456);
    ASSERT(values[1] == 567);
    ASSERT(values[2] == 678);
    char byte;
    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
  }

  TEST_END();
}

}  // namespace

int main() {
  TestFilename();
  TestFd();
  TestFile();
  TestStream();

  return 0;
}
