| // 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/developer/debug/shared/largest_less_or_equal.h" | |
| #include <functional> | |
| #include <gtest/gtest.h> | |
| namespace debug_ipc { | |
| TEST(LargestLessOrEqual, Empty) { | |
| std::vector<int> empty; | |
| EXPECT_EQ(empty.end(), LargestLessOrEqual(empty.begin(), empty.end(), 25, std::less<int>(), | |
| std::equal_to<int>())); | |
| } | |
| TEST(LargestLessOrEqual, One) { | |
| std::vector<int> one{1}; | |
| // Before begin. | |
| EXPECT_EQ(one.end(), | |
| LargestLessOrEqual(one.begin(), one.end(), 0, std::less<int>(), std::equal_to<int>())); | |
| // Equal. | |
| EXPECT_EQ(one.begin(), | |
| LargestLessOrEqual(one.begin(), one.end(), 1, std::less<int>(), std::equal_to<int>())); | |
| // Greater. | |
| EXPECT_EQ(one.begin(), | |
| LargestLessOrEqual(one.begin(), one.end(), 2, std::less<int>(), std::equal_to<int>())); | |
| } | |
| TEST(LargestLessOrEqual, Several) { | |
| std::vector<int> several{1, 3, 5}; | |
| EXPECT_EQ(several.end(), LargestLessOrEqual(several.begin(), several.end(), 0, std::less<int>(), | |
| std::equal_to<int>())); | |
| EXPECT_EQ(several.begin(), LargestLessOrEqual(several.begin(), several.end(), 1, std::less<int>(), | |
| std::equal_to<int>())); | |
| EXPECT_EQ(several.begin(), LargestLessOrEqual(several.begin(), several.end(), 2, std::less<int>(), | |
| std::equal_to<int>())); | |
| EXPECT_EQ(several.begin() + 1, LargestLessOrEqual(several.begin(), several.end(), 3, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(several.begin() + 1, LargestLessOrEqual(several.begin(), several.end(), 4, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(several.begin() + 2, LargestLessOrEqual(several.begin(), several.end(), 5, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(several.begin() + 2, LargestLessOrEqual(several.begin(), several.end(), 6, | |
| std::less<int>(), std::equal_to<int>())); | |
| } | |
| // Tests comparator usage when the contained item is not the same as the searched-for one. | |
| TEST(LargestLessOrEqual, Container) { | |
| using Pair = std::pair<int, double>; | |
| std::vector<Pair> container{{1, 100.3}}; | |
| auto pair_first_less = [](Pair p, int i) { return p.first < i; }; | |
| auto pair_first_equal = [](Pair p, int i) { return p.first == i; }; | |
| EXPECT_EQ(container.end(), LargestLessOrEqual(container.begin(), container.end(), 0, | |
| pair_first_less, pair_first_equal)); | |
| EXPECT_EQ(container.begin(), LargestLessOrEqual(container.begin(), container.end(), 1, | |
| pair_first_less, pair_first_equal)); | |
| EXPECT_EQ(container.begin(), LargestLessOrEqual(container.begin(), container.end(), 2, | |
| pair_first_less, pair_first_equal)); | |
| } | |
| TEST(LargestLessOrEqual, Duplicates) { | |
| // Indices: 0 1 2 3 4 5 6 | |
| std::vector<int> container{1, 1, 3, 3, 3, 5, 5}; | |
| // Querying exactly for a duplicate will return the first one of that sequence. | |
| EXPECT_EQ(container.begin(), LargestLessOrEqual(container.begin(), container.end(), 1, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(container.begin() + 2, LargestLessOrEqual(container.begin(), container.end(), 3, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(container.begin() + 5, LargestLessOrEqual(container.begin(), container.end(), 5, | |
| std::less<int>(), std::equal_to<int>())); | |
| // Querying for the following value will return the last one of the sequence. | |
| EXPECT_EQ(container.begin() + 1, LargestLessOrEqual(container.begin(), container.end(), 2, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(container.begin() + 4, LargestLessOrEqual(container.begin(), container.end(), 4, | |
| std::less<int>(), std::equal_to<int>())); | |
| EXPECT_EQ(container.begin() + 6, LargestLessOrEqual(container.begin(), container.end(), 6, | |
| std::less<int>(), std::equal_to<int>())); | |
| } | |
| } // namespace debug_ipc |