1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#include "testing/testing.hpp"
#include "coding/file_sort.hpp"
#include "coding/write_to_sink.hpp"
#include "coding/reader.hpp"
#include "std/random.hpp"
namespace
{
void TestFileSorter(vector<uint32_t> & data, char const * tmpFileName, size_t bufferSize)
{
vector<char> serial;
typedef MemWriter<vector<char> > MemWriterType;
MemWriterType writer(serial);
typedef WriterFunctor<MemWriterType> OutT;
OutT out(writer);
FileSorter<uint32_t, OutT> sorter(bufferSize, tmpFileName, out);
for (size_t i = 0; i < data.size(); ++i)
sorter.Add(data[i]);
sorter.SortAndFinish();
TEST_EQUAL(serial.size(), data.size() * sizeof(data[0]), ());
sort(data.begin(), data.end());
MemReader reader(&serial[0], serial.size());
TEST_EQUAL(reader.Size(), data.size() * sizeof(data[0]), ());
vector<uint32_t> result(data.size());
reader.Read(0, &result[0], reader.Size());
TEST_EQUAL(result, data, ());
}
}
UNIT_TEST(FileSorter_Smoke)
{
vector<uint32_t> data;
data.push_back(2);
data.push_back(3);
data.push_back(1);
TestFileSorter(data, "file_sorter_test_smoke.tmp", 10);
}
UNIT_TEST(FileSorter_Random)
{
mt19937 rng(0);
vector<uint32_t> data(1000);
for (size_t i = 0; i < data.size(); ++i)
data[i] = ((i + 1 % 100) ? rng() : data[i - 20]);
TestFileSorter(data, "file_sorter_test_random.tmp", data.size() / 10);
}
|