1#ifdef _MSC_VER
2#include <io.h>
3#else
4#include <unistd.h>
5#endif  // _MSC_VER
6
7#include <sys/types.h>
8#include <sys/stat.h>
9#include <fcntl.h>
10
11#include <fstream>
12
13#include <marisa/io.h>
14
15#include "assert.h"
16
17namespace {
18
19void TestFilename() {
20  TEST_START();
21
22  {
23    marisa::Writer writer;
24    writer.open("io-test.dat");
25    marisa::UInt32 value = 123;
26    writer.write(value);
27    writer.write(value);
28    double values[] = { 345, 456 };
29    writer.write(values, 2);
30    EXCEPT(writer.write(values, 1U << 30), MARISA_SIZE_ERROR);
31  }
32
33  {
34    marisa::Writer writer;
35    writer.open("io-test.dat", false, 4, SEEK_SET);
36    marisa::UInt32 value = 234;
37    writer.write(value);
38  }
39
40  {
41    marisa::Writer writer;
42    writer.open("io-test.dat", false, 0, SEEK_END);
43    double value = 567;
44    writer.write(value);
45  }
46
47  {
48    marisa::Reader reader;
49    reader.open("io-test.dat");
50    marisa::UInt32 value;
51    reader.read(&value);
52    ASSERT(value == 123);
53    reader.read(&value);
54    ASSERT(value == 234);
55    double values[3];
56    reader.read(values, 3);
57    ASSERT(values[0] == 345);
58    ASSERT(values[1] == 456);
59    ASSERT(values[2] == 567);
60    char byte;
61    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
62  }
63
64  {
65    marisa::Mapper mapper;
66    mapper.open("io-test.dat");
67    marisa::UInt32 value;
68    mapper.map(&value);
69    ASSERT(value == 123);
70    mapper.map(&value);
71    ASSERT(value == 234);
72    const double *values;
73    mapper.map(&values, 3);
74    ASSERT(values[0] == 345);
75    ASSERT(values[1] == 456);
76    ASSERT(values[2] == 567);
77    char byte;
78    EXCEPT(mapper.map(&byte), MARISA_IO_ERROR);
79  }
80
81  {
82    marisa::Writer writer;
83    writer.open("io-test.dat");
84  }
85
86  {
87    marisa::Reader reader;
88    reader.open("io-test.dat");
89    char byte;
90    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
91  }
92
93  TEST_END();
94}
95
96void TestFd() {
97  TEST_START();
98
99  {
100#ifdef _MSC_VER
101    int fd = -1;
102    ASSERT(::_sopen_s(&fd, "io-test.dat",
103        _O_BINARY | _O_CREAT | _O_WRONLY | _O_TRUNC,
104        _SH_DENYRW, _S_IREAD | _S_IWRITE) == 0);
105#else  // _MSC_VER
106    int fd = ::creat("io-test.dat", 0644);
107    ASSERT(fd != -1);
108#endif  // _MSC_VER
109    marisa::Writer writer(fd);
110    marisa::UInt32 value = 345;
111    writer.write(value);
112    double values[] = { 456, 567, 678 };
113    writer.write(values, 3);
114#ifdef _MSC_VER
115    ASSERT(::_close(fd) == 0);
116#else  // _MSC_VER
117    ASSERT(::close(fd) == 0);
118#endif  // _MSC_VER
119  }
120
121  {
122#ifdef _MSC_VER
123    int fd = -1;
124    ASSERT(::_sopen_s(&fd, "io-test.dat", _O_BINARY | _O_RDONLY,
125        _SH_DENYRW, _S_IREAD) == 0);
126#else  // _MSC_VER
127    int fd = ::open("io-test.dat", O_RDONLY);
128    ASSERT(fd != -1);
129#endif  // _MSC_VER
130    marisa::Reader reader(fd);
131    marisa::UInt32 value;
132    reader.read(&value);
133    ASSERT(value == 345);
134    double values[3];
135    reader.read(values, 3);
136    ASSERT(values[0] == 456);
137    ASSERT(values[1] == 567);
138    ASSERT(values[2] == 678);
139    char byte;
140    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
141#ifdef _MSC_VER
142    ASSERT(::_close(fd) == 0);
143#else  // _MSC_VER
144    ASSERT(::close(fd) == 0);
145#endif  // _MSC_VER
146  }
147
148  TEST_END();
149}
150
151void TestFile() {
152  TEST_START();
153
154  {
155#ifdef _MSC_VER
156    FILE *file = NULL;
157    ASSERT(::fopen_s(&file, "io-test.dat", "wb") == 0);
158#else  // _MSC_VER
159    FILE *file = std::fopen("io-test.dat", "wb");
160    ASSERT(file != NULL);
161#endif  // _MSC_VER
162    marisa::Writer writer(file);
163    marisa::UInt32 value = 345;
164    writer.write(value);
165    double values[3] = { 456, 567, 678 };
166    writer.write(values, 3);
167    ASSERT(std::fclose(file) == 0);
168  }
169
170  {
171#ifdef _MSC_VER
172    FILE *file = NULL;
173    ASSERT(::fopen_s(&file, "io-test.dat", "rb") == 0);
174#else  // _MSC_VER
175    FILE *file = std::fopen("io-test.dat", "rb");
176    ASSERT(file != NULL);
177#endif  // _MSC_VER
178    marisa::Reader reader(file);
179    marisa::UInt32 value;
180    reader.read(&value);
181    ASSERT(value == 345);
182    double values[3];
183    reader.read(values, 3);
184    ASSERT(values[0] == 456);
185    ASSERT(values[1] == 567);
186    ASSERT(values[2] == 678);
187    char byte;
188    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
189    ASSERT(std::fclose(file) == 0);
190  }
191
192  TEST_END();
193}
194
195void TestStream() {
196  TEST_START();
197
198  {
199    std::ofstream file("io-test.dat", std::ios::binary);
200    ASSERT(file.is_open());
201    marisa::Writer writer(&file);
202    marisa::UInt32 value = 345;
203    writer.write(value);
204    double values[3] = { 456, 567, 678 };
205    writer.write(values, 3);
206  }
207
208  {
209    std::ifstream file("io-test.dat", std::ios::binary);
210    ASSERT(file.is_open());
211    marisa::Reader reader(&file);
212    marisa::UInt32 value;
213    reader.read(&value);
214    ASSERT(value == 345);
215    double values[3];
216    reader.read(values, 3);
217    ASSERT(values[0] == 456);
218    ASSERT(values[1] == 567);
219    ASSERT(values[2] == 678);
220    char byte;
221    EXCEPT(reader.read(&byte), MARISA_IO_ERROR);
222  }
223
224  TEST_END();
225}
226
227}  // namespace
228
229int main() {
230  TestFilename();
231  TestFd();
232  TestFile();
233  TestStream();
234
235  return 0;
236}
237