blob: 71cdfef6c6d2abbfd56619f96862afa80227b9c7 [file] [log] [blame]
// 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