1*61c4878aSAndroid Build Coastguard Worker // Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker //
15*61c4878aSAndroid Build Coastguard Worker // These tests were forked from
16*61c4878aSAndroid Build Coastguard Worker // https://cs.opensource.google/abseil/abseil-cpp/+/main:absl/algorithm/algorithm_test.cc;drc=38b704384cd2f17590b3922b97744be0b43622c9
17*61c4878aSAndroid Build Coastguard Worker // However they were modified to work with containers available in Pigweed
18*61c4878aSAndroid Build Coastguard Worker // without dynamic allocations, i.e. no std::vector, std::map, std::list, etc.
19*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/algorithm.h"
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker #include <algorithm>
22*61c4878aSAndroid Build Coastguard Worker #include <iterator>
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/flat_map.h"
25*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/intrusive_list.h"
26*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/vector.h"
27*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
28*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
29*61c4878aSAndroid Build Coastguard Worker
30*61c4878aSAndroid Build Coastguard Worker namespace {
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Worker class TestItem : public pw::IntrusiveList<TestItem>::Item {
33*61c4878aSAndroid Build Coastguard Worker public:
TestItem()34*61c4878aSAndroid Build Coastguard Worker TestItem() : number_(0) {}
TestItem(int number)35*61c4878aSAndroid Build Coastguard Worker TestItem(int number) : number_(number) {}
36*61c4878aSAndroid Build Coastguard Worker
37*61c4878aSAndroid Build Coastguard Worker // Add equality comparison to ensure comparisons are done by identity rather
38*61c4878aSAndroid Build Coastguard Worker // than equality for the remove function.
operator ==(const TestItem & other) const39*61c4878aSAndroid Build Coastguard Worker bool operator==(const TestItem& other) const {
40*61c4878aSAndroid Build Coastguard Worker return number_ == other.number_;
41*61c4878aSAndroid Build Coastguard Worker }
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker private:
44*61c4878aSAndroid Build Coastguard Worker int number_;
45*61c4878aSAndroid Build Coastguard Worker };
46*61c4878aSAndroid Build Coastguard Worker
47*61c4878aSAndroid Build Coastguard Worker // Most of these tests just check that the code compiles, not that it
48*61c4878aSAndroid Build Coastguard Worker // does the right thing. That's fine since the functions just forward
49*61c4878aSAndroid Build Coastguard Worker // to the STL implementation.
50*61c4878aSAndroid Build Coastguard Worker class NonMutatingTest : public testing::Test {
51*61c4878aSAndroid Build Coastguard Worker protected:
52*61c4878aSAndroid Build Coastguard Worker std::array<int, 3> span_array_ = {1, 2, 3};
53*61c4878aSAndroid Build Coastguard Worker pw::span<int> span_{NonMutatingTest::span_array_};
54*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 3> vector_ = {1, 2, 3};
55*61c4878aSAndroid Build Coastguard Worker int array_[3] = {1, 2, 3};
56*61c4878aSAndroid Build Coastguard Worker };
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker struct AccumulateCalls {
operator ()__anonc90a46a00111::AccumulateCalls59*61c4878aSAndroid Build Coastguard Worker void operator()(int value) { calls.push_back(value); }
60*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 10> calls;
61*61c4878aSAndroid Build Coastguard Worker };
62*61c4878aSAndroid Build Coastguard Worker
Predicate(int value)63*61c4878aSAndroid Build Coastguard Worker bool Predicate(int value) { return value < 3; }
BinPredicate(int v1,int v2)64*61c4878aSAndroid Build Coastguard Worker bool BinPredicate(int v1, int v2) { return v1 < v2; }
Equals(int v1,int v2)65*61c4878aSAndroid Build Coastguard Worker bool Equals(int v1, int v2) { return v1 == v2; }
66*61c4878aSAndroid Build Coastguard Worker
67*61c4878aSAndroid Build Coastguard Worker } // namespace
68*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AllOf)69*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AllOf) {
70*61c4878aSAndroid Build Coastguard Worker const pw::Vector<int>& v = vector_;
71*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::AllOf(v, [](int x) { return x > 1; }));
72*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::AllOf(v, [](int x) { return x > 0; }));
73*61c4878aSAndroid Build Coastguard Worker }
74*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AnyOf)75*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AnyOf) {
76*61c4878aSAndroid Build Coastguard Worker const pw::Vector<int>& v = vector_;
77*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::AnyOf(v, [](int x) { return x > 2; }));
78*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::AnyOf(v, [](int x) { return x > 5; }));
79*61c4878aSAndroid Build Coastguard Worker }
80*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,NoneOf)81*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, NoneOf) {
82*61c4878aSAndroid Build Coastguard Worker const pw::Vector<int>& v = vector_;
83*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::NoneOf(v, [](int x) { return x > 2; }));
84*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::NoneOf(v, [](int x) { return x > 5; }));
85*61c4878aSAndroid Build Coastguard Worker }
86*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,ForEach)87*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, ForEach) {
88*61c4878aSAndroid Build Coastguard Worker AccumulateCalls c = pw::containers::ForEach(span_, AccumulateCalls());
89*61c4878aSAndroid Build Coastguard Worker std::sort(c.calls.begin(), c.calls.end());
90*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(vector_, c.calls);
91*61c4878aSAndroid Build Coastguard Worker }
92*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindReturnsCorrectType)93*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindReturnsCorrectType) {
94*61c4878aSAndroid Build Coastguard Worker auto it = pw::containers::Find(span_, 3);
95*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(3, *it);
96*61c4878aSAndroid Build Coastguard Worker pw::containers::Find(vector_, 3);
97*61c4878aSAndroid Build Coastguard Worker }
98*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindIf)99*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindIf) { pw::containers::FindIf(span_, Predicate); }
100*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindIfNot)101*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindIfNot) {
102*61c4878aSAndroid Build Coastguard Worker pw::containers::FindIfNot(span_, Predicate);
103*61c4878aSAndroid Build Coastguard Worker }
104*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindEnd)105*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindEnd) {
106*61c4878aSAndroid Build Coastguard Worker pw::containers::FindEnd(array_, vector_);
107*61c4878aSAndroid Build Coastguard Worker pw::containers::FindEnd(vector_, array_);
108*61c4878aSAndroid Build Coastguard Worker }
109*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindEndWithPredicate)110*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindEndWithPredicate) {
111*61c4878aSAndroid Build Coastguard Worker pw::containers::FindEnd(array_, vector_, BinPredicate);
112*61c4878aSAndroid Build Coastguard Worker pw::containers::FindEnd(vector_, array_, BinPredicate);
113*61c4878aSAndroid Build Coastguard Worker }
114*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindFirstOf)115*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindFirstOf) {
116*61c4878aSAndroid Build Coastguard Worker pw::containers::FindFirstOf(span_, array_);
117*61c4878aSAndroid Build Coastguard Worker pw::containers::FindFirstOf(array_, span_);
118*61c4878aSAndroid Build Coastguard Worker }
119*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,FindFirstOfWithPredicate)120*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, FindFirstOfWithPredicate) {
121*61c4878aSAndroid Build Coastguard Worker pw::containers::FindFirstOf(span_, array_, BinPredicate);
122*61c4878aSAndroid Build Coastguard Worker pw::containers::FindFirstOf(array_, span_, BinPredicate);
123*61c4878aSAndroid Build Coastguard Worker }
124*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AdjacentFind)125*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AdjacentFind) { pw::containers::AdjacentFind(array_); }
126*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,AdjacentFindWithPredicate)127*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, AdjacentFindWithPredicate) {
128*61c4878aSAndroid Build Coastguard Worker pw::containers::AdjacentFind(array_, BinPredicate);
129*61c4878aSAndroid Build Coastguard Worker }
130*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Count)131*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Count) {
132*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(1, pw::containers::Count(span_, 3));
133*61c4878aSAndroid Build Coastguard Worker }
134*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,CountIf)135*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, CountIf) {
136*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(2, pw::containers::CountIf(span_, Predicate));
137*61c4878aSAndroid Build Coastguard Worker }
138*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Mismatch)139*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Mismatch) {
140*61c4878aSAndroid Build Coastguard Worker // Testing necessary as pw::containers::Mismatch executes logic.
141*61c4878aSAndroid Build Coastguard Worker {
142*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_);
143*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, span_.end());
144*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.end());
145*61c4878aSAndroid Build Coastguard Worker }
146*61c4878aSAndroid Build Coastguard Worker {
147*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_);
148*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.end());
149*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, span_.end());
150*61c4878aSAndroid Build Coastguard Worker }
151*61c4878aSAndroid Build Coastguard Worker
152*61c4878aSAndroid Build Coastguard Worker vector_.back() = 5;
153*61c4878aSAndroid Build Coastguard Worker {
154*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_);
155*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(span_.end()));
156*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(vector_.end()));
157*61c4878aSAndroid Build Coastguard Worker }
158*61c4878aSAndroid Build Coastguard Worker {
159*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_);
160*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(vector_.end()));
161*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(span_.end()));
162*61c4878aSAndroid Build Coastguard Worker }
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Worker vector_.pop_back();
165*61c4878aSAndroid Build Coastguard Worker {
166*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_);
167*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::prev(span_.end()));
168*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.end());
169*61c4878aSAndroid Build Coastguard Worker }
170*61c4878aSAndroid Build Coastguard Worker {
171*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_);
172*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.end());
173*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::prev(span_.end()));
174*61c4878aSAndroid Build Coastguard Worker }
175*61c4878aSAndroid Build Coastguard Worker {
176*61c4878aSAndroid Build Coastguard Worker struct NoNotEquals {
177*61c4878aSAndroid Build Coastguard Worker constexpr bool operator==(NoNotEquals) const { return true; }
178*61c4878aSAndroid Build Coastguard Worker constexpr bool operator!=(NoNotEquals) const = delete;
179*61c4878aSAndroid Build Coastguard Worker };
180*61c4878aSAndroid Build Coastguard Worker pw::Vector<NoNotEquals, 1> first;
181*61c4878aSAndroid Build Coastguard Worker std::array<NoNotEquals, 1> second;
182*61c4878aSAndroid Build Coastguard Worker
183*61c4878aSAndroid Build Coastguard Worker // Check this still compiles.
184*61c4878aSAndroid Build Coastguard Worker pw::containers::Mismatch(first, second);
185*61c4878aSAndroid Build Coastguard Worker }
186*61c4878aSAndroid Build Coastguard Worker }
187*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,MismatchWithPredicate)188*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, MismatchWithPredicate) {
189*61c4878aSAndroid Build Coastguard Worker // Testing necessary as pw::containers::Mismatch executes logic.
190*61c4878aSAndroid Build Coastguard Worker {
191*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_, BinPredicate);
192*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, span_.begin());
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.begin());
194*61c4878aSAndroid Build Coastguard Worker }
195*61c4878aSAndroid Build Coastguard Worker {
196*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_, BinPredicate);
197*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.begin());
198*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, span_.begin());
199*61c4878aSAndroid Build Coastguard Worker }
200*61c4878aSAndroid Build Coastguard Worker
201*61c4878aSAndroid Build Coastguard Worker vector_.front() = 0;
202*61c4878aSAndroid Build Coastguard Worker {
203*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_, BinPredicate);
204*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, span_.begin());
205*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.begin());
206*61c4878aSAndroid Build Coastguard Worker }
207*61c4878aSAndroid Build Coastguard Worker {
208*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_, BinPredicate);
209*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, std::next(vector_.begin()));
210*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, std::next(span_.begin()));
211*61c4878aSAndroid Build Coastguard Worker }
212*61c4878aSAndroid Build Coastguard Worker
213*61c4878aSAndroid Build Coastguard Worker vector_.clear();
214*61c4878aSAndroid Build Coastguard Worker {
215*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(span_, vector_, BinPredicate);
216*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, span_.begin());
217*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, vector_.end());
218*61c4878aSAndroid Build Coastguard Worker }
219*61c4878aSAndroid Build Coastguard Worker {
220*61c4878aSAndroid Build Coastguard Worker auto result = pw::containers::Mismatch(vector_, span_, BinPredicate);
221*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.first, vector_.end());
222*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.second, span_.begin());
223*61c4878aSAndroid Build Coastguard Worker }
224*61c4878aSAndroid Build Coastguard Worker }
225*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Equal)226*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Equal) {
227*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(vector_, span_));
228*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(span_, vector_));
229*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(span_, array_));
230*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(array_, vector_));
231*61c4878aSAndroid Build Coastguard Worker
232*61c4878aSAndroid Build Coastguard Worker pw::containers::FlatMap<char, int, 3> map1({{{'A', 1}, {'B', 2}, {'C', 3}}});
233*61c4878aSAndroid Build Coastguard Worker pw::containers::FlatMap<char, int, 3> map2({{{'B', 2}, {'A', 1}, {'C', 3}}});
234*61c4878aSAndroid Build Coastguard Worker pw::containers::FlatMap<char, int, 3> map3({{{'A', 1}, {'B', 2}, {'C', 4}}});
235*61c4878aSAndroid Build Coastguard Worker pw::containers::FlatMap<char, int, 3> map4({{{'A', 1}, {'B', 2}, {'D', 3}}});
236*61c4878aSAndroid Build Coastguard Worker
237*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(map1, map2));
238*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(map1, map3));
239*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(map1, map4));
240*61c4878aSAndroid Build Coastguard Worker
241*61c4878aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of equal().
242*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 4> vector_plus = {1, 2, 3};
243*61c4878aSAndroid Build Coastguard Worker vector_plus.push_back(4);
244*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(vector_plus, span_));
245*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(span_, vector_plus));
246*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(array_, vector_plus));
247*61c4878aSAndroid Build Coastguard Worker }
248*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,EqualWithPredicate)249*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, EqualWithPredicate) {
250*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(vector_, span_, Equals));
251*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(span_, vector_, Equals));
252*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(array_, span_, Equals));
253*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::Equal(vector_, array_, Equals));
254*61c4878aSAndroid Build Coastguard Worker
255*61c4878aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of equal().
256*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 4> vector_plus = {1, 2, 3};
257*61c4878aSAndroid Build Coastguard Worker vector_plus.push_back(4);
258*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(vector_plus, span_, Equals));
259*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(span_, vector_plus, Equals));
260*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::Equal(vector_plus, array_, Equals));
261*61c4878aSAndroid Build Coastguard Worker }
262*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,IsPermutation)263*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, IsPermutation) {
264*61c4878aSAndroid Build Coastguard Worker auto vector_permut_ = vector_;
265*61c4878aSAndroid Build Coastguard Worker std::next_permutation(vector_permut_.begin(), vector_permut_.end());
266*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::IsPermutation(vector_permut_, span_));
267*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::IsPermutation(span_, vector_permut_));
268*61c4878aSAndroid Build Coastguard Worker
269*61c4878aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of is_permutation().
270*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 4> vector_plus = {1, 2, 3};
271*61c4878aSAndroid Build Coastguard Worker vector_plus.push_back(4);
272*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::IsPermutation(vector_plus, span_));
273*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::IsPermutation(span_, vector_plus));
274*61c4878aSAndroid Build Coastguard Worker }
275*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,IsPermutationWithPredicate)276*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, IsPermutationWithPredicate) {
277*61c4878aSAndroid Build Coastguard Worker auto vector_permut_ = vector_;
278*61c4878aSAndroid Build Coastguard Worker std::next_permutation(vector_permut_.begin(), vector_permut_.end());
279*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::IsPermutation(vector_permut_, span_, Equals));
280*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(pw::containers::IsPermutation(span_, vector_permut_, Equals));
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker // Test that behavior appropriately differs from that of is_permutation().
283*61c4878aSAndroid Build Coastguard Worker pw::Vector<int, 4> vector_plus = {1, 2, 3};
284*61c4878aSAndroid Build Coastguard Worker vector_plus.push_back(4);
285*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::IsPermutation(vector_plus, span_, Equals));
286*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(pw::containers::IsPermutation(span_, vector_plus, Equals));
287*61c4878aSAndroid Build Coastguard Worker }
288*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,Search)289*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, Search) {
290*61c4878aSAndroid Build Coastguard Worker pw::containers::Search(span_, vector_);
291*61c4878aSAndroid Build Coastguard Worker pw::containers::Search(vector_, span_);
292*61c4878aSAndroid Build Coastguard Worker pw::containers::Search(array_, span_);
293*61c4878aSAndroid Build Coastguard Worker }
294*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchWithPredicate)295*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchWithPredicate) {
296*61c4878aSAndroid Build Coastguard Worker pw::containers::Search(span_, vector_, BinPredicate);
297*61c4878aSAndroid Build Coastguard Worker pw::containers::Search(vector_, span_, BinPredicate);
298*61c4878aSAndroid Build Coastguard Worker }
299*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchN)300*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchN) { pw::containers::SearchN(span_, 3, 1); }
301*61c4878aSAndroid Build Coastguard Worker
TEST_F(NonMutatingTest,SearchNWithPredicate)302*61c4878aSAndroid Build Coastguard Worker TEST_F(NonMutatingTest, SearchNWithPredicate) {
303*61c4878aSAndroid Build Coastguard Worker pw::containers::SearchN(span_, 3, 1, BinPredicate);
304*61c4878aSAndroid Build Coastguard Worker }
305