| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/algorithms/privacy/count_min.h" |
| |
| #include <gtest/gtest.h> |
| |
| #include "src/public/lib/statusor/status_macros.h" |
| |
| namespace cobalt { |
| |
| TEST(CountMin, IncrementStringAndGetCount) { |
| std::vector<std::pair<std::string, uint64_t>> test_cases = { |
| {"Hello World", 100}, |
| {"Hallo Welt", 20}, |
| {"Hola Mundo", 73}, |
| {"Bonjour, Monde", 22}, |
| }; |
| auto count_min = CountMin<uint64_t>::MakeSketch(2000, 10); |
| for (auto [data, count] : test_cases) { |
| count_min.Increment(data, count); |
| } |
| |
| for (auto [data, count] : test_cases) { |
| EXPECT_EQ(count, count_min.GetCount(data)); |
| } |
| } |
| |
| TEST(CountMin, IncrementCellAndGetValue) { |
| size_t num_cells_per_hash = 3; |
| size_t num_hashes = 2; |
| auto count_min = CountMin<uint64_t>::MakeSketch(num_cells_per_hash, num_hashes); |
| ASSERT_EQ(count_min.size(), num_cells_per_hash * num_hashes); |
| |
| std::vector<uint64_t> expected_sketch; |
| for (size_t i = 0; i < count_min.size(); ++i) { |
| auto count = static_cast<uint64_t>(i); |
| count_min.IncrementCell(i, count); |
| count_min.IncrementCell(i, count); |
| expected_sketch.push_back(2 * count); |
| } |
| |
| for (size_t i = 0; i < count_min.size(); ++i) { |
| CB_ASSERT_OK_AND_ASSIGN(uint64_t cell_value, count_min.GetCellValue(i)); |
| EXPECT_EQ(expected_sketch[i], cell_value); |
| } |
| } |
| |
| TEST(CountMin, IncrementCellOutOfRange) { |
| auto count_min = CountMin<uint64_t>::MakeSketch(3, 2); |
| EXPECT_FALSE(count_min.IncrementCell(count_min.size(), 1).ok()); |
| } |
| |
| TEST(CountMin, GetCellValueOutOfRange) { |
| auto count_min = CountMin<uint64_t>::MakeSketch(3, 2); |
| EXPECT_FALSE(count_min.GetCellValue(count_min.size()).ok()); |
| } |
| |
| TEST(CountMin, MakeSketchFromCells) { |
| size_t num_cells_per_hash = 3; |
| size_t num_hashes = 2; |
| uint64_t expected_cell_value = 10; |
| std::vector<uint64_t> cells(num_cells_per_hash * num_hashes, expected_cell_value); |
| CB_ASSERT_OK_AND_ASSIGN(auto count_min, CountMin<uint64_t>::MakeSketchFromCells( |
| num_cells_per_hash, num_hashes, cells)); |
| |
| for (size_t i = 0; i < count_min.size(); ++i) { |
| CB_ASSERT_OK_AND_ASSIGN(uint64_t cell_value, count_min.GetCellValue(i)); |
| EXPECT_EQ(expected_cell_value, cell_value); |
| } |
| } |
| |
| TEST(CountMin, MakeSketchFromCellsWrongDimensions) { |
| size_t num_cells_per_hash = 3; |
| size_t num_hashes = 2; |
| uint64_t expected_cell_value = 10; |
| std::vector<uint64_t> cells(num_cells_per_hash * num_hashes + 1, expected_cell_value); |
| EXPECT_FALSE(CountMin<uint64_t>::MakeSketchFromCells(num_cells_per_hash, num_hashes, cells).ok()); |
| } |
| |
| TEST(CountMin, GetCellIndices) { |
| size_t num_cells_per_hash = 3; |
| size_t num_hashes = 2; |
| auto count_min = CountMin<uint64_t>::MakeSketch(num_cells_per_hash, num_hashes); |
| |
| std::string data = "Hello World"; |
| count_min.Increment(data, 1); |
| |
| std::vector<size_t> updated_indices; |
| for (size_t i = 0; i < count_min.size(); ++i) { |
| CB_ASSERT_OK_AND_ASSIGN(uint64_t count, count_min.GetCellValue(i)); |
| if (count != 0) { |
| updated_indices.push_back(i); |
| } |
| } |
| ASSERT_EQ(updated_indices.size(), num_hashes); |
| EXPECT_EQ(updated_indices, count_min.GetCellIndices(data)); |
| } |
| |
| } // namespace cobalt |