198bb1986SVitaly Buka //===-- sanitizer_lzw_test.cpp ----------------------------------*- C++ -*-===//
298bb1986SVitaly Buka //
398bb1986SVitaly Buka // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
498bb1986SVitaly Buka // See https://llvm.org/LICENSE.txt for license information.
598bb1986SVitaly Buka // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
698bb1986SVitaly Buka //
798bb1986SVitaly Buka //===----------------------------------------------------------------------===//
898bb1986SVitaly Buka #include "sanitizer_common/sanitizer_lzw.h"
998bb1986SVitaly Buka
10*063cd554SHaowei Wu #include <algorithm>
1198bb1986SVitaly Buka #include <iterator>
1298bb1986SVitaly Buka
1398bb1986SVitaly Buka #include "gtest/gtest.h"
1498bb1986SVitaly Buka #include "sanitizer_hash.h"
1598bb1986SVitaly Buka
1698bb1986SVitaly Buka namespace __sanitizer {
1798bb1986SVitaly Buka
1898bb1986SVitaly Buka template <typename T>
1998bb1986SVitaly Buka struct LzwTest : public ::testing::Test {
2098bb1986SVitaly Buka template <typename Generator>
Run__sanitizer::LzwTest2198bb1986SVitaly Buka void Run(size_t n, Generator gen) {
2298bb1986SVitaly Buka std::vector<T> data(n);
2398bb1986SVitaly Buka std::generate(data.begin(), data.end(), gen);
2498bb1986SVitaly Buka
2598bb1986SVitaly Buka std::vector<u64> lzw;
2698bb1986SVitaly Buka LzwEncode<T>(data.begin(), data.end(), std::back_inserter(lzw));
2798bb1986SVitaly Buka
2898bb1986SVitaly Buka std::vector<T> unlzw(data.size() * 2);
2998bb1986SVitaly Buka auto unlzw_end = LzwDecode<T>(lzw.begin(), lzw.end(), unlzw.data());
3098bb1986SVitaly Buka unlzw.resize(unlzw_end - unlzw.data());
3198bb1986SVitaly Buka
3298bb1986SVitaly Buka EXPECT_EQ(data, unlzw);
3398bb1986SVitaly Buka }
3498bb1986SVitaly Buka };
3598bb1986SVitaly Buka
3698bb1986SVitaly Buka static constexpr size_t kSizes[] = {0, 1, 2, 7, 13, 32, 129, 10000};
3798bb1986SVitaly Buka
3898bb1986SVitaly Buka using LzwTestTypes = ::testing::Types<u8, u16, u32, u64>;
3998bb1986SVitaly Buka TYPED_TEST_SUITE(LzwTest, LzwTestTypes, );
4098bb1986SVitaly Buka
TYPED_TEST(LzwTest,Same)4198bb1986SVitaly Buka TYPED_TEST(LzwTest, Same) {
4298bb1986SVitaly Buka MurMur2Hash64Builder h(0);
4398bb1986SVitaly Buka for (size_t sz : kSizes) {
4498bb1986SVitaly Buka u64 v = 0;
4598bb1986SVitaly Buka for (size_t i = 0; i < 100 && !this->HasFailure(); ++i) {
4698bb1986SVitaly Buka this->Run(sz, [&] { return v; });
4798bb1986SVitaly Buka h.add(i);
4898bb1986SVitaly Buka v = h.get();
4998bb1986SVitaly Buka }
5098bb1986SVitaly Buka }
5198bb1986SVitaly Buka }
5298bb1986SVitaly Buka
TYPED_TEST(LzwTest,Increment)5398bb1986SVitaly Buka TYPED_TEST(LzwTest, Increment) {
5498bb1986SVitaly Buka MurMur2Hash64Builder h(0);
5598bb1986SVitaly Buka for (size_t sz : kSizes) {
5698bb1986SVitaly Buka u64 v = 0;
5798bb1986SVitaly Buka for (size_t i = 0; i < 100 && !this->HasFailure(); ++i) {
5898bb1986SVitaly Buka this->Run(sz, [&v] { return v++; });
5998bb1986SVitaly Buka h.add(i);
6098bb1986SVitaly Buka v = h.get();
6198bb1986SVitaly Buka }
6298bb1986SVitaly Buka }
6398bb1986SVitaly Buka }
6498bb1986SVitaly Buka
TYPED_TEST(LzwTest,IncrementMod)6598bb1986SVitaly Buka TYPED_TEST(LzwTest, IncrementMod) {
6698bb1986SVitaly Buka MurMur2Hash64Builder h(0);
6798bb1986SVitaly Buka for (size_t sz : kSizes) {
6898bb1986SVitaly Buka u64 v = 0;
6998bb1986SVitaly Buka for (size_t i = 1; i < 16 && !this->HasFailure(); ++i) {
7098bb1986SVitaly Buka this->Run(sz, [&] { return v++ % i; });
7198bb1986SVitaly Buka h.add(i);
7298bb1986SVitaly Buka v = h.get();
7398bb1986SVitaly Buka }
7498bb1986SVitaly Buka }
7598bb1986SVitaly Buka }
7698bb1986SVitaly Buka
TYPED_TEST(LzwTest,RandomLimited)7798bb1986SVitaly Buka TYPED_TEST(LzwTest, RandomLimited) {
7898bb1986SVitaly Buka for (size_t sz : kSizes) {
7998bb1986SVitaly Buka for (size_t i = 1; i < 1000 && !this->HasFailure(); i *= 2) {
8098bb1986SVitaly Buka u64 v = 0;
8198bb1986SVitaly Buka this->Run(sz, [&] {
8298bb1986SVitaly Buka MurMur2Hash64Builder h(v % i /* Keep unique set limited */);
8398bb1986SVitaly Buka v = h.get();
8498bb1986SVitaly Buka return v;
8598bb1986SVitaly Buka });
8698bb1986SVitaly Buka }
8798bb1986SVitaly Buka }
8898bb1986SVitaly Buka }
8998bb1986SVitaly Buka
9098bb1986SVitaly Buka } // namespace __sanitizer
91