blob: 07b6e8706c17d1f03e7400c388989b1668395795 [file] [log] [blame]
#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 <sstream>
#include <marisa/grimoire/io.h>
#include "marisa-assert.h"
namespace {
void TestFilename() {
TEST_START();
{
marisa::grimoire::Writer writer;
writer.open("io-test.dat");
writer.write((marisa::UInt32)123);
writer.write((marisa::UInt32)234);
double values[] = { 3.45, 4.56 };
writer.write(values, 2);
EXCEPT(writer.write(values, MARISA_SIZE_MAX), MARISA_SIZE_ERROR);
}
{
marisa::grimoire::Reader reader;
reader.open("io-test.dat");
marisa::UInt32 value;
reader.read(&value);
ASSERT(value == 123);
reader.read(&value);
ASSERT(value == 234);
double values[2];
reader.read(values, 2);
ASSERT(values[0] == 3.45);
ASSERT(values[1] == 4.56);
char byte;
EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
}
{
marisa::grimoire::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, 2);
ASSERT(values[0] == 3.45);
ASSERT(values[1] == 4.56);
char byte;
EXCEPT(mapper.map(&byte), MARISA_IO_ERROR);
}
{
marisa::grimoire::Writer writer;
writer.open("io-test.dat");
}
{
marisa::grimoire::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::grimoire::Writer writer;
writer.open(fd);
marisa::UInt32 value = 234;
writer.write(value);
double values[] = { 34.5, 67.8 };
writer.write(values, 2);
#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::grimoire::Reader reader;
reader.open(fd);
marisa::UInt32 value;
reader.read(&value);
ASSERT(value == 234);
double values[2];
reader.read(values, 2);
ASSERT(values[0] == 34.5);
ASSERT(values[1] == 67.8);
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::grimoire::Writer writer;
writer.open(file);
marisa::UInt32 value = 10;
writer.write(value);
double values[2] = { 0.1, 0.2 };
writer.write(values, 2);
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::grimoire::Reader reader;
reader.open(file);
marisa::UInt32 value;
reader.read(&value);
ASSERT(value == 10);
double values[2];
reader.read(values, 2);
ASSERT(values[0] == 0.1);
ASSERT(values[1] == 0.2);
char byte;
EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
ASSERT(std::fclose(file) == 0);
}
TEST_END();
}
void TestStream() {
TEST_START();
std::stringstream stream;
{
marisa::grimoire::Writer writer;
writer.open(stream);
marisa::UInt32 value = 12;
writer.write(value);
double values[2] = { 3.4, 5.6 };
writer.write(values, 2);
}
{
marisa::grimoire::Reader reader;
reader.open(stream);
marisa::UInt32 value;
reader.read(&value);
ASSERT(value == 12);
double values[2];
reader.read(values, 2);
ASSERT(values[0] == 3.4);
ASSERT(values[1] == 5.6);
char byte;
EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
}
TEST_END();
}
} // namespace
int main() try {
TestFilename();
TestFd();
TestFile();
TestStream();
return 0;
} catch (const marisa::Exception &ex) {
std::cerr << ex.what() << std::endl;
throw;
}