diff options
Diffstat (limited to 'coding/coding_tests/bwt_coder_tests.cpp')
-rw-r--r-- | coding/coding_tests/bwt_coder_tests.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/coding/coding_tests/bwt_coder_tests.cpp b/coding/coding_tests/bwt_coder_tests.cpp new file mode 100644 index 0000000000..28965a54e9 --- /dev/null +++ b/coding/coding_tests/bwt_coder_tests.cpp @@ -0,0 +1,82 @@ +#include "testing/testing.hpp" + +#include "coding/bwt_coder.hpp" +#include "coding/reader.hpp" +#include "coding/writer.hpp" + +#include <algorithm> +#include <iterator> +#include <random> +#include <string> + +using namespace coding; +using namespace std; + +namespace +{ +string EncodeDecode(BWTCoder::Params const & params, string const & s) +{ + vector<uint8_t> data; + + { + MemWriter<decltype(data)> sink(data); + BWTCoder::EncodeAndWrite(params, sink, s.size(), reinterpret_cast<uint8_t const *>(s.data())); + } + + string result; + { + MemReader reader(data.data(), data.size()); + ReaderSource<MemReader> source(reader); + + BWTCoder::ReadAndDecode(source, back_inserter(result)); + } + + return result; +} + +UNIT_TEST(BWTEncoder_Smoke) +{ + for (size_t blockSize = 1; blockSize < 100; ++blockSize) + { + BWTCoder::Params params; + + params.m_blockSize = blockSize; + string const s = "abracadabra"; + TEST_EQUAL(s, EncodeDecode(params, s), (blockSize)); + } + + string const strings[] = {"", "mississippi", "again and again and again"}; + for (auto const & s : strings) + TEST_EQUAL(s, EncodeDecode(BWTCoder::Params{}, s), ()); +} + +UNIT_TEST(BWT_Large) +{ + string s; + for (size_t i = 0; i < 10000; ++i) + s += "mississippi"; + TEST_EQUAL(s, EncodeDecode(BWTCoder::Params{}, s), ()); +} + +UNIT_TEST(BWT_AllBytes) +{ + int kSeed = 42; + int kMin = 1; + int kMax = 1000; + + mt19937 engine(kSeed); + uniform_int_distribution<int> uid(kMin, kMax); + + string s; + for (size_t i = 0; i < 256; ++i) + { + auto const count = uid(engine); + ASSERT_GREATER_OR_EQUAL(count, kMin, ()); + ASSERT_LESS_OR_EQUAL(count, kMax, ()); + for (int j = 0; j < count; ++j) + s.push_back(static_cast<uint8_t>(i)); + } + shuffle(s.begin(), s.end(), engine); + TEST_EQUAL(s, EncodeDecode(BWTCoder::Params{}, s), ()); +} +} // namespace |