1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/win/vector.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <windows.foundation.h>
8*6777b538SAndroid Build Coastguard Worker #include <wrl/client.h>
9*6777b538SAndroid Build Coastguard Worker
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
12*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker namespace ABI {
15*6777b538SAndroid Build Coastguard Worker namespace Windows {
16*6777b538SAndroid Build Coastguard Worker namespace Foundation {
17*6777b538SAndroid Build Coastguard Worker namespace Collections {
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker // Note: As UWP does not provide int specializations for IObservableVector and
20*6777b538SAndroid Build Coastguard Worker // VectorChangedEventHandler we need to supply our own. UUIDs were generated
21*6777b538SAndroid Build Coastguard Worker // using `uuidgen`.
22*6777b538SAndroid Build Coastguard Worker template <>
23*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("21c2c195-91a4-4fce-8346-2a85f4478e26"))
24*6777b538SAndroid Build Coastguard Worker IObservableVector<int> : IObservableVector_impl<int> {};
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker template <>
27*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("86b0071e-5e72-4d3d-82d3-420ebd2b2716"))
28*6777b538SAndroid Build Coastguard Worker VectorChangedEventHandler<int> : VectorChangedEventHandler_impl<int> {};
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker namespace {
31*6777b538SAndroid Build Coastguard Worker using UriPtrAggregate = Internal::AggregateType<Uri*, IUriRuntimeClass*>;
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker template <>
35*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("12311764-f245-4245-9dc9-bab258eddd4e"))
36*6777b538SAndroid Build Coastguard Worker IObservableVector<Uri*> : IObservableVector_impl<UriPtrAggregate> {};
37*6777b538SAndroid Build Coastguard Worker
38*6777b538SAndroid Build Coastguard Worker template <>
39*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("050e4b78-71b2-43ff-bf7c-f6ba589aced9"))
40*6777b538SAndroid Build Coastguard Worker VectorChangedEventHandler<Uri*>
41*6777b538SAndroid Build Coastguard Worker : VectorChangedEventHandler_impl<UriPtrAggregate> {};
42*6777b538SAndroid Build Coastguard Worker
43*6777b538SAndroid Build Coastguard Worker #ifdef NTDDI_WIN10_VB // Windows 10.0.19041
44*6777b538SAndroid Build Coastguard Worker // Specialization templates that used to be in windows.foundation.h, removed in
45*6777b538SAndroid Build Coastguard Worker // the 10.0.19041.0 SDK, so placed here instead.
46*6777b538SAndroid Build Coastguard Worker template <>
47*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("b939af5b-b45d-5489-9149-61442c1905fe")) IVector<int>
48*6777b538SAndroid Build Coastguard Worker : IVector_impl<int> {};
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Worker template <>
51*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("8d720cdf-3934-5d3f-9a55-40e8063b086a")) IVectorView<int>
52*6777b538SAndroid Build Coastguard Worker : IVectorView_impl<int> {};
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker template <>
55*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("bfea7f78-50c2-5f1d-a6ea-9e978d2699ff")) IIterator<int>
56*6777b538SAndroid Build Coastguard Worker : IIterator_impl<int> {};
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker template <>
59*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("81a643fb-f51c-5565-83c4-f96425777b66")) IIterable<int>
60*6777b538SAndroid Build Coastguard Worker : IIterable_impl<int> {};
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker template <>
63*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("0d82bd8d-fe62-5d67-a7b9-7886dd75bc4e")) IVector<Uri*>
64*6777b538SAndroid Build Coastguard Worker : IVector_impl<Internal::AggregateType<Uri*, IUriRuntimeClass*>> {};
65*6777b538SAndroid Build Coastguard Worker
66*6777b538SAndroid Build Coastguard Worker template <>
67*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("4b8385bd-a2cd-5ff1-bf74-7ea580423e50"))
68*6777b538SAndroid Build Coastguard Worker IVectorView<Uri*>
69*6777b538SAndroid Build Coastguard Worker : IVectorView_impl<Internal::AggregateType<Uri*, IUriRuntimeClass*>> {};
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker template <>
72*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("1c157d0f-5efe-5cec-bbd6-0c6ce9af07a5")) IIterator<Uri*>
73*6777b538SAndroid Build Coastguard Worker : IIterator_impl<Internal::AggregateType<Uri*, IUriRuntimeClass*>> {};
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker template <>
76*6777b538SAndroid Build Coastguard Worker struct __declspec(uuid("b0d63b78-78ad-5e31-b6d8-e32a0e16c447")) IIterable<Uri*>
77*6777b538SAndroid Build Coastguard Worker : IIterable_impl<Internal::AggregateType<Uri*, IUriRuntimeClass*>> {};
78*6777b538SAndroid Build Coastguard Worker #endif
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker } // namespace Collections
81*6777b538SAndroid Build Coastguard Worker } // namespace Foundation
82*6777b538SAndroid Build Coastguard Worker } // namespace Windows
83*6777b538SAndroid Build Coastguard Worker } // namespace ABI
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker namespace base {
86*6777b538SAndroid Build Coastguard Worker namespace win {
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker namespace {
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Uri;
91*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::CollectionChange;
92*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::CollectionChange_ItemChanged;
93*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::CollectionChange_ItemInserted;
94*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::CollectionChange_ItemRemoved;
95*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::CollectionChange_Reset;
96*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::IIterator;
97*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::IObservableVector;
98*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::IVectorChangedEventArgs;
99*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::IVectorView;
100*6777b538SAndroid Build Coastguard Worker using ABI::Windows::Foundation::Collections::VectorChangedEventHandler;
101*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::ClassicCom;
102*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::ComPtr;
103*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::InhibitRoOriginateError;
104*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::Make;
105*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::RuntimeClass;
106*6777b538SAndroid Build Coastguard Worker using Microsoft::WRL::RuntimeClassFlags;
107*6777b538SAndroid Build Coastguard Worker using ::testing::ElementsAre;
108*6777b538SAndroid Build Coastguard Worker using ::testing::IsEmpty;
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker template <typename T>
111*6777b538SAndroid Build Coastguard Worker class FakeVectorChangedEventHandler
112*6777b538SAndroid Build Coastguard Worker : public RuntimeClass<
113*6777b538SAndroid Build Coastguard Worker RuntimeClassFlags<ClassicCom | InhibitRoOriginateError>,
114*6777b538SAndroid Build Coastguard Worker VectorChangedEventHandler<T>> {
115*6777b538SAndroid Build Coastguard Worker public:
FakeVectorChangedEventHandler(ComPtr<IObservableVector<T>> vector)116*6777b538SAndroid Build Coastguard Worker explicit FakeVectorChangedEventHandler(ComPtr<IObservableVector<T>> vector)
117*6777b538SAndroid Build Coastguard Worker : vector_(std::move(vector)) {
118*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(vector_->add_VectorChanged(this, &token_)));
119*6777b538SAndroid Build Coastguard Worker }
120*6777b538SAndroid Build Coastguard Worker
~FakeVectorChangedEventHandler()121*6777b538SAndroid Build Coastguard Worker ~FakeVectorChangedEventHandler() override {
122*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(vector_->remove_VectorChanged(token_)));
123*6777b538SAndroid Build Coastguard Worker }
124*6777b538SAndroid Build Coastguard Worker
125*6777b538SAndroid Build Coastguard Worker // VectorChangedEventHandler:
Invoke(IObservableVector<T> * sender,IVectorChangedEventArgs * e)126*6777b538SAndroid Build Coastguard Worker IFACEMETHODIMP Invoke(IObservableVector<T>* sender,
127*6777b538SAndroid Build Coastguard Worker IVectorChangedEventArgs* e) {
128*6777b538SAndroid Build Coastguard Worker sender_ = sender;
129*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(e->get_CollectionChange(&change_)));
130*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(e->get_Index(&index_)));
131*6777b538SAndroid Build Coastguard Worker return S_OK;
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker
sender()134*6777b538SAndroid Build Coastguard Worker IObservableVector<T>* sender() { return sender_; }
change()135*6777b538SAndroid Build Coastguard Worker CollectionChange change() { return change_; }
index()136*6777b538SAndroid Build Coastguard Worker unsigned int index() { return index_; }
137*6777b538SAndroid Build Coastguard Worker
138*6777b538SAndroid Build Coastguard Worker private:
139*6777b538SAndroid Build Coastguard Worker ComPtr<IObservableVector<T>> vector_;
140*6777b538SAndroid Build Coastguard Worker EventRegistrationToken token_;
141*6777b538SAndroid Build Coastguard Worker raw_ptr<IObservableVector<T>> sender_ = nullptr;
142*6777b538SAndroid Build Coastguard Worker CollectionChange change_ = CollectionChange_Reset;
143*6777b538SAndroid Build Coastguard Worker unsigned int index_ = 0;
144*6777b538SAndroid Build Coastguard Worker };
145*6777b538SAndroid Build Coastguard Worker
146*6777b538SAndroid Build Coastguard Worker // The ReplaceAll test requires a non-const data() member, thus these vectors
147*6777b538SAndroid Build Coastguard Worker // are not declared const, even though no test mutates them.
148*6777b538SAndroid Build Coastguard Worker std::vector<int> g_empty;
149*6777b538SAndroid Build Coastguard Worker std::vector<int> g_one = {1};
150*6777b538SAndroid Build Coastguard Worker std::vector<int> g_one_two = {1, 2};
151*6777b538SAndroid Build Coastguard Worker std::vector<int> g_one_two_three = {1, 2, 3};
152*6777b538SAndroid Build Coastguard Worker
153*6777b538SAndroid Build Coastguard Worker } // namespace
154*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetAt_Empty)155*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetAt_Empty) {
156*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>();
157*6777b538SAndroid Build Coastguard Worker int value;
158*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetAt(0, &value);
159*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetAt_One)162*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetAt_One) {
163*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
164*6777b538SAndroid Build Coastguard Worker int value;
165*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetAt(0, &value);
166*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
167*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, value);
168*6777b538SAndroid Build Coastguard Worker
169*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(1, &value);
170*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetAt_OneTwo)173*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetAt_OneTwo) {
174*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two);
175*6777b538SAndroid Build Coastguard Worker int value;
176*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetAt(0, &value);
177*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
178*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, value);
179*6777b538SAndroid Build Coastguard Worker
180*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(1, &value);
181*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
182*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, value);
183*6777b538SAndroid Build Coastguard Worker
184*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(2, &value);
185*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
186*6777b538SAndroid Build Coastguard Worker }
187*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetAt_OneTwoThree)188*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetAt_OneTwoThree) {
189*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
190*6777b538SAndroid Build Coastguard Worker int value;
191*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetAt(0, &value);
192*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
193*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, value);
194*6777b538SAndroid Build Coastguard Worker
195*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(1, &value);
196*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
197*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, value);
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(2, &value);
200*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
201*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, value);
202*6777b538SAndroid Build Coastguard Worker
203*6777b538SAndroid Build Coastguard Worker hr = vec->GetAt(3, &value);
204*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
205*6777b538SAndroid Build Coastguard Worker }
206*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,get_Size_Empty)207*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, get_Size_Empty) {
208*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>();
209*6777b538SAndroid Build Coastguard Worker unsigned size;
210*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->get_Size(&size);
211*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
212*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, size);
213*6777b538SAndroid Build Coastguard Worker }
214*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,get_Size_One)215*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, get_Size_One) {
216*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
217*6777b538SAndroid Build Coastguard Worker unsigned size;
218*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->get_Size(&size);
219*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
220*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, size);
221*6777b538SAndroid Build Coastguard Worker }
222*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,get_Size_OneTwo)223*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, get_Size_OneTwo) {
224*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two);
225*6777b538SAndroid Build Coastguard Worker unsigned size;
226*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->get_Size(&size);
227*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
228*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, size);
229*6777b538SAndroid Build Coastguard Worker }
230*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,get_Size_OneTwoThree)231*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, get_Size_OneTwoThree) {
232*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
233*6777b538SAndroid Build Coastguard Worker unsigned size;
234*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->get_Size(&size);
235*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
236*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, size);
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetView)239*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetView) {
240*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
241*6777b538SAndroid Build Coastguard Worker ComPtr<IVectorView<int>> view;
242*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetView(&view);
243*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker int value;
246*6777b538SAndroid Build Coastguard Worker hr = view->GetAt(0, &value);
247*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
248*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, value);
249*6777b538SAndroid Build Coastguard Worker
250*6777b538SAndroid Build Coastguard Worker hr = view->GetAt(1, &value);
251*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
252*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, value);
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker hr = view->GetAt(2, &value);
255*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
256*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, value);
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker hr = view->GetAt(3, &value);
259*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
260*6777b538SAndroid Build Coastguard Worker
261*6777b538SAndroid Build Coastguard Worker unsigned size;
262*6777b538SAndroid Build Coastguard Worker hr = view->get_Size(&size);
263*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
264*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, size);
265*6777b538SAndroid Build Coastguard Worker
266*6777b538SAndroid Build Coastguard Worker unsigned index;
267*6777b538SAndroid Build Coastguard Worker boolean found;
268*6777b538SAndroid Build Coastguard Worker hr = view->IndexOf(1, &index, &found);
269*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
270*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
271*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
272*6777b538SAndroid Build Coastguard Worker
273*6777b538SAndroid Build Coastguard Worker hr = view->IndexOf(2, &index, &found);
274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
275*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, index);
276*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
277*6777b538SAndroid Build Coastguard Worker
278*6777b538SAndroid Build Coastguard Worker hr = view->IndexOf(3, &index, &found);
279*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
280*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, index);
281*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
282*6777b538SAndroid Build Coastguard Worker
283*6777b538SAndroid Build Coastguard Worker hr = view->IndexOf(4, &index, &found);
284*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
285*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
286*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(found);
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker std::vector<int> copy(3);
289*6777b538SAndroid Build Coastguard Worker unsigned actual;
290*6777b538SAndroid Build Coastguard Worker hr = view->GetMany(0, copy.size(), copy.data(), &actual);
291*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, actual);
293*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1, 2, 3));
294*6777b538SAndroid Build Coastguard Worker
295*6777b538SAndroid Build Coastguard Worker hr = vec->Append(4);
296*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
297*6777b538SAndroid Build Coastguard Worker
298*6777b538SAndroid Build Coastguard Worker // The view is supposed to be a snapshot of the vector when it's created.
299*6777b538SAndroid Build Coastguard Worker // Further modifications to the vector will invalidate the view.
300*6777b538SAndroid Build Coastguard Worker hr = view->GetAt(3, &value);
301*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, hr);
302*6777b538SAndroid Build Coastguard Worker
303*6777b538SAndroid Build Coastguard Worker hr = view->get_Size(&size);
304*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, hr);
305*6777b538SAndroid Build Coastguard Worker
306*6777b538SAndroid Build Coastguard Worker hr = view->IndexOf(1, &index, &found);
307*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, hr);
308*6777b538SAndroid Build Coastguard Worker
309*6777b538SAndroid Build Coastguard Worker hr = view->GetMany(0, copy.size(), copy.data(), &actual);
310*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, hr);
311*6777b538SAndroid Build Coastguard Worker }
312*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,IndexOf_Empty)313*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, IndexOf_Empty) {
314*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>();
315*6777b538SAndroid Build Coastguard Worker unsigned index;
316*6777b538SAndroid Build Coastguard Worker boolean found;
317*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->IndexOf(1, &index, &found);
318*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
319*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
320*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(found);
321*6777b538SAndroid Build Coastguard Worker }
322*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,IndexOf_One)323*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, IndexOf_One) {
324*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
325*6777b538SAndroid Build Coastguard Worker unsigned index;
326*6777b538SAndroid Build Coastguard Worker boolean found;
327*6777b538SAndroid Build Coastguard Worker
328*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->IndexOf(1, &index, &found);
329*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
330*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
331*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
332*6777b538SAndroid Build Coastguard Worker
333*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(2, &index, &found);
334*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
335*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
336*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(found);
337*6777b538SAndroid Build Coastguard Worker }
338*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,IndexOf_OneTwo)339*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, IndexOf_OneTwo) {
340*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two);
341*6777b538SAndroid Build Coastguard Worker unsigned index;
342*6777b538SAndroid Build Coastguard Worker boolean found;
343*6777b538SAndroid Build Coastguard Worker
344*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->IndexOf(1, &index, &found);
345*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
347*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
348*6777b538SAndroid Build Coastguard Worker
349*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(2, &index, &found);
350*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
351*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, index);
352*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
353*6777b538SAndroid Build Coastguard Worker
354*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(3, &index, &found);
355*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
356*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
357*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(found);
358*6777b538SAndroid Build Coastguard Worker }
359*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,IndexOf_OneTwoThree)360*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, IndexOf_OneTwoThree) {
361*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
362*6777b538SAndroid Build Coastguard Worker unsigned index;
363*6777b538SAndroid Build Coastguard Worker boolean found;
364*6777b538SAndroid Build Coastguard Worker
365*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->IndexOf(1, &index, &found);
366*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
367*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
368*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
369*6777b538SAndroid Build Coastguard Worker
370*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(2, &index, &found);
371*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
372*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, index);
373*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
374*6777b538SAndroid Build Coastguard Worker
375*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(3, &index, &found);
376*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, index);
378*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(found);
379*6777b538SAndroid Build Coastguard Worker
380*6777b538SAndroid Build Coastguard Worker hr = vec->IndexOf(4, &index, &found);
381*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
382*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, index);
383*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(found);
384*6777b538SAndroid Build Coastguard Worker }
385*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,SetAt)386*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, SetAt) {
387*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
388*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
389*6777b538SAndroid Build Coastguard Worker
390*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->SetAt(0, 4);
391*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
392*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(4, 2, 3));
393*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
394*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemChanged, handler->change());
395*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
396*6777b538SAndroid Build Coastguard Worker
397*6777b538SAndroid Build Coastguard Worker hr = vec->SetAt(1, 5);
398*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
399*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(4, 5, 3));
400*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
401*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemChanged, handler->change());
402*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, handler->index());
403*6777b538SAndroid Build Coastguard Worker
404*6777b538SAndroid Build Coastguard Worker hr = vec->SetAt(2, 6);
405*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
406*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(4, 5, 6));
407*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
408*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemChanged, handler->change());
409*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, handler->index());
410*6777b538SAndroid Build Coastguard Worker
411*6777b538SAndroid Build Coastguard Worker hr = vec->SetAt(3, 7);
412*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
413*6777b538SAndroid Build Coastguard Worker }
414*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,InsertAt)415*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, InsertAt) {
416*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
417*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
418*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->InsertAt(4, 4);
419*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
420*6777b538SAndroid Build Coastguard Worker
421*6777b538SAndroid Build Coastguard Worker hr = vec->InsertAt(3, 4);
422*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
423*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2, 3, 4));
424*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
425*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
426*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, handler->index());
427*6777b538SAndroid Build Coastguard Worker
428*6777b538SAndroid Build Coastguard Worker hr = vec->InsertAt(2, 5);
429*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
430*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2, 5, 3, 4));
431*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
432*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
433*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, handler->index());
434*6777b538SAndroid Build Coastguard Worker
435*6777b538SAndroid Build Coastguard Worker hr = vec->InsertAt(1, 6);
436*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
437*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 6, 2, 5, 3, 4));
438*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
439*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
440*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, handler->index());
441*6777b538SAndroid Build Coastguard Worker
442*6777b538SAndroid Build Coastguard Worker hr = vec->InsertAt(0, 7);
443*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
444*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(7, 1, 6, 2, 5, 3, 4));
445*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
446*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
447*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
448*6777b538SAndroid Build Coastguard Worker }
449*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,RemoveAt)450*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, RemoveAt) {
451*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
452*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
453*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->RemoveAt(3);
454*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
455*6777b538SAndroid Build Coastguard Worker
456*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(2);
457*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
458*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2));
459*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
460*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
461*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, handler->index());
462*6777b538SAndroid Build Coastguard Worker
463*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(2);
464*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
465*6777b538SAndroid Build Coastguard Worker
466*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(1);
467*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
468*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1));
469*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
470*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
471*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, handler->index());
472*6777b538SAndroid Build Coastguard Worker
473*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(1);
474*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
475*6777b538SAndroid Build Coastguard Worker
476*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(0);
477*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
478*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), IsEmpty());
479*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
480*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
481*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
482*6777b538SAndroid Build Coastguard Worker
483*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAt(0);
484*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
485*6777b538SAndroid Build Coastguard Worker }
486*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,Append)487*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, Append) {
488*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>();
489*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
490*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->Append(1);
491*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
492*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1));
493*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
494*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
495*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
496*6777b538SAndroid Build Coastguard Worker
497*6777b538SAndroid Build Coastguard Worker hr = vec->Append(2);
498*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
499*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2));
500*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
501*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
502*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, handler->index());
503*6777b538SAndroid Build Coastguard Worker
504*6777b538SAndroid Build Coastguard Worker hr = vec->Append(3);
505*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
506*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2, 3));
507*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
508*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemInserted, handler->change());
509*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, handler->index());
510*6777b538SAndroid Build Coastguard Worker }
511*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,RemoveAtEnd)512*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, RemoveAtEnd) {
513*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
514*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
515*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->RemoveAtEnd();
516*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
517*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2));
518*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
519*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
520*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, handler->index());
521*6777b538SAndroid Build Coastguard Worker
522*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAtEnd();
523*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
524*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1));
525*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
526*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
527*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, handler->index());
528*6777b538SAndroid Build Coastguard Worker
529*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAtEnd();
530*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
531*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), IsEmpty());
532*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
533*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_ItemRemoved, handler->change());
534*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
535*6777b538SAndroid Build Coastguard Worker
536*6777b538SAndroid Build Coastguard Worker hr = vec->RemoveAtEnd();
537*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
538*6777b538SAndroid Build Coastguard Worker }
539*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,Clear)540*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, Clear) {
541*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
542*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
543*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->Clear();
544*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
545*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), IsEmpty());
546*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
547*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_Reset, handler->change());
548*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
549*6777b538SAndroid Build Coastguard Worker }
550*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,GetMany)551*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, GetMany) {
552*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
553*6777b538SAndroid Build Coastguard Worker std::vector<int> copy;
554*6777b538SAndroid Build Coastguard Worker unsigned actual;
555*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->GetMany(0, copy.size(), copy.data(), &actual);
556*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
557*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, actual);
558*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, IsEmpty());
559*6777b538SAndroid Build Coastguard Worker
560*6777b538SAndroid Build Coastguard Worker copy.resize(1);
561*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(0, copy.size(), copy.data(), &actual);
562*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
563*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, actual);
564*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1));
565*6777b538SAndroid Build Coastguard Worker
566*6777b538SAndroid Build Coastguard Worker copy.resize(2);
567*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(0, copy.size(), copy.data(), &actual);
568*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
569*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, actual);
570*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1, 2));
571*6777b538SAndroid Build Coastguard Worker
572*6777b538SAndroid Build Coastguard Worker copy.resize(3);
573*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(0, copy.size(), copy.data(), &actual);
574*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
575*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, actual);
576*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1, 2, 3));
577*6777b538SAndroid Build Coastguard Worker
578*6777b538SAndroid Build Coastguard Worker copy.resize(4);
579*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(0, copy.size(), copy.data(), &actual);
580*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
581*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, actual);
582*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1, 2, 3, 0));
583*6777b538SAndroid Build Coastguard Worker
584*6777b538SAndroid Build Coastguard Worker copy.resize(0);
585*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(1, copy.size(), copy.data(), &actual);
586*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
587*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, actual);
588*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, IsEmpty());
589*6777b538SAndroid Build Coastguard Worker
590*6777b538SAndroid Build Coastguard Worker copy.resize(1);
591*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(1, copy.size(), copy.data(), &actual);
592*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
593*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, actual);
594*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(2));
595*6777b538SAndroid Build Coastguard Worker
596*6777b538SAndroid Build Coastguard Worker copy.resize(2);
597*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(1, copy.size(), copy.data(), &actual);
598*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
599*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, actual);
600*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(2, 3));
601*6777b538SAndroid Build Coastguard Worker
602*6777b538SAndroid Build Coastguard Worker copy.resize(3);
603*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(1, copy.size(), copy.data(), &actual);
604*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
605*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2u, actual);
606*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(2, 3, 0));
607*6777b538SAndroid Build Coastguard Worker
608*6777b538SAndroid Build Coastguard Worker copy.resize(0);
609*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(2, copy.size(), copy.data(), &actual);
610*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
611*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, actual);
612*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, IsEmpty());
613*6777b538SAndroid Build Coastguard Worker
614*6777b538SAndroid Build Coastguard Worker copy.resize(1);
615*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(2, copy.size(), copy.data(), &actual);
616*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
617*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, actual);
618*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(3));
619*6777b538SAndroid Build Coastguard Worker
620*6777b538SAndroid Build Coastguard Worker copy.resize(2);
621*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(2, copy.size(), copy.data(), &actual);
622*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
623*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1u, actual);
624*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(3, 0));
625*6777b538SAndroid Build Coastguard Worker
626*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(3, copy.size(), copy.data(), &actual);
627*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
628*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, actual);
629*6777b538SAndroid Build Coastguard Worker
630*6777b538SAndroid Build Coastguard Worker hr = vec->GetMany(4, copy.size(), copy.data(), &actual);
631*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
632*6777b538SAndroid Build Coastguard Worker }
633*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,ReplaceAll)634*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, ReplaceAll) {
635*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
636*6777b538SAndroid Build Coastguard Worker auto handler = Make<FakeVectorChangedEventHandler<int>>(vec.Get());
637*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->ReplaceAll(g_empty.size(), g_empty.data());
638*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
639*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), IsEmpty());
640*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
641*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_Reset, handler->change());
642*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
643*6777b538SAndroid Build Coastguard Worker
644*6777b538SAndroid Build Coastguard Worker hr = vec->ReplaceAll(g_one.size(), g_one.data());
645*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
646*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1));
647*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
648*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_Reset, handler->change());
649*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
650*6777b538SAndroid Build Coastguard Worker
651*6777b538SAndroid Build Coastguard Worker hr = vec->ReplaceAll(g_one_two.size(), g_one_two.data());
652*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
653*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2));
654*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
655*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_Reset, handler->change());
656*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
657*6777b538SAndroid Build Coastguard Worker
658*6777b538SAndroid Build Coastguard Worker hr = vec->ReplaceAll(g_one_two_three.size(), g_one_two_three.data());
659*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
660*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(vec->vector_for_testing(), ElementsAre(1, 2, 3));
661*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(vec.Get(), handler->sender());
662*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(CollectionChange_Reset, handler->change());
663*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, handler->index());
664*6777b538SAndroid Build Coastguard Worker }
665*6777b538SAndroid Build Coastguard Worker
666*6777b538SAndroid Build Coastguard Worker // Uri* is an AggregateType which ABI representation is IUriRuntimeClass*.
TEST(VectorTest,ConstructWithAggregateType)667*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, ConstructWithAggregateType) {
668*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<Uri*>>();
669*6777b538SAndroid Build Coastguard Worker unsigned size;
670*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->get_Size(&size);
671*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
672*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, size);
673*6777b538SAndroid Build Coastguard Worker }
674*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,First)675*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, First) {
676*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
677*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
678*6777b538SAndroid Build Coastguard Worker HRESULT hr = vec->First(&iterator);
679*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
680*6777b538SAndroid Build Coastguard Worker boolean has_current;
681*6777b538SAndroid Build Coastguard Worker hr = iterator->get_HasCurrent(&has_current);
682*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
683*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_current);
684*6777b538SAndroid Build Coastguard Worker int current;
685*6777b538SAndroid Build Coastguard Worker hr = iterator->get_Current(¤t);
686*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
687*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, current);
688*6777b538SAndroid Build Coastguard Worker hr = iterator->MoveNext(&has_current);
689*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
690*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_current);
691*6777b538SAndroid Build Coastguard Worker hr = iterator->get_Current(¤t);
692*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
693*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, current);
694*6777b538SAndroid Build Coastguard Worker hr = iterator->MoveNext(&has_current);
695*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
696*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_current);
697*6777b538SAndroid Build Coastguard Worker hr = iterator->get_Current(¤t);
698*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
699*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, current);
700*6777b538SAndroid Build Coastguard Worker hr = iterator->MoveNext(&has_current);
701*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
702*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(has_current);
703*6777b538SAndroid Build Coastguard Worker hr = iterator->get_Current(¤t);
704*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SUCCEEDED(hr));
705*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
706*6777b538SAndroid Build Coastguard Worker hr = iterator->MoveNext(&has_current);
707*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SUCCEEDED(hr));
708*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, hr);
709*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(has_current);
710*6777b538SAndroid Build Coastguard Worker
711*6777b538SAndroid Build Coastguard Worker hr = vec->First(&iterator);
712*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
713*6777b538SAndroid Build Coastguard Worker std::vector<int> copy(3);
714*6777b538SAndroid Build Coastguard Worker unsigned actual;
715*6777b538SAndroid Build Coastguard Worker hr = iterator->GetMany(copy.size(), copy.data(), &actual);
716*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SUCCEEDED(hr));
717*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3u, actual);
718*6777b538SAndroid Build Coastguard Worker EXPECT_THAT(copy, ElementsAre(1, 2, 3));
719*6777b538SAndroid Build Coastguard Worker }
720*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_S_OK_ValidItem)721*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_S_OK_ValidItem) {
722*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
723*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
724*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
725*6777b538SAndroid Build Coastguard Worker boolean has_current;
726*6777b538SAndroid Build Coastguard Worker
727*6777b538SAndroid Build Coastguard Worker // Moving next to a valid item should return S_OK:
728*6777b538SAndroid Build Coastguard Worker // [1, 2, 3]
729*6777b538SAndroid Build Coastguard Worker // |->|
730*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(S_OK, iterator->MoveNext(&has_current));
731*6777b538SAndroid Build Coastguard Worker }
732*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_S_OK_FromLastItem)733*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_S_OK_FromLastItem) {
734*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
735*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
736*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
737*6777b538SAndroid Build Coastguard Worker boolean has_current;
738*6777b538SAndroid Build Coastguard Worker
739*6777b538SAndroid Build Coastguard Worker // Moving next past the last item should return S_OK:
740*6777b538SAndroid Build Coastguard Worker // [1]
741*6777b538SAndroid Build Coastguard Worker // |->|
742*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(S_OK, iterator->MoveNext(&has_current));
743*6777b538SAndroid Build Coastguard Worker }
744*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_E_CHANGED_STATE_ValidItem)745*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_E_CHANGED_STATE_ValidItem) {
746*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
747*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
748*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
749*6777b538SAndroid Build Coastguard Worker boolean has_current;
750*6777b538SAndroid Build Coastguard Worker
751*6777b538SAndroid Build Coastguard Worker vec->Append(4);
752*6777b538SAndroid Build Coastguard Worker
753*6777b538SAndroid Build Coastguard Worker // Moving next after changing the vector should return E_CHANGED_STATE:
754*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, iterator->MoveNext(&has_current));
755*6777b538SAndroid Build Coastguard Worker }
756*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_E_CHANGED_STATE_AfterLastItem)757*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_E_CHANGED_STATE_AfterLastItem) {
758*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
759*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
760*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
761*6777b538SAndroid Build Coastguard Worker boolean has_current;
762*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
763*6777b538SAndroid Build Coastguard Worker
764*6777b538SAndroid Build Coastguard Worker vec->Append(4);
765*6777b538SAndroid Build Coastguard Worker
766*6777b538SAndroid Build Coastguard Worker // Moving next after changing the vector should return E_CHANGED_STATE:
767*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_CHANGED_STATE, iterator->MoveNext(&has_current));
768*6777b538SAndroid Build Coastguard Worker }
769*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_E_BOUNDS)770*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_E_BOUNDS) {
771*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
772*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
773*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
774*6777b538SAndroid Build Coastguard Worker boolean has_current;
775*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
776*6777b538SAndroid Build Coastguard Worker
777*6777b538SAndroid Build Coastguard Worker // Moving next when already past the last item should return E_BOUNDS:
778*6777b538SAndroid Build Coastguard Worker // [1]
779*6777b538SAndroid Build Coastguard Worker // |->|
780*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(E_BOUNDS, iterator->MoveNext(&has_current));
781*6777b538SAndroid Build Coastguard Worker }
782*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_HasCurrent_ValidItem)783*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_HasCurrent_ValidItem) {
784*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two_three);
785*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
786*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
787*6777b538SAndroid Build Coastguard Worker boolean has_current;
788*6777b538SAndroid Build Coastguard Worker
789*6777b538SAndroid Build Coastguard Worker // Moving next to a valid item should set |has_current| to true:
790*6777b538SAndroid Build Coastguard Worker // [1, 2, 3]
791*6777b538SAndroid Build Coastguard Worker // |->|
792*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
793*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_current);
794*6777b538SAndroid Build Coastguard Worker }
795*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_HasCurrent_LastItem)796*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_HasCurrent_LastItem) {
797*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two);
798*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
799*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
800*6777b538SAndroid Build Coastguard Worker boolean has_current;
801*6777b538SAndroid Build Coastguard Worker
802*6777b538SAndroid Build Coastguard Worker // Moving next to the last item should set |has_current| to true:
803*6777b538SAndroid Build Coastguard Worker // [1, 2]
804*6777b538SAndroid Build Coastguard Worker // |->|
805*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
806*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(has_current);
807*6777b538SAndroid Build Coastguard Worker }
808*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_HasCurrent_FromLastItem)809*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_HasCurrent_FromLastItem) {
810*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
811*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
812*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
813*6777b538SAndroid Build Coastguard Worker boolean has_current;
814*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
815*6777b538SAndroid Build Coastguard Worker
816*6777b538SAndroid Build Coastguard Worker // Moving next when already past the end should set |has_current| to false:
817*6777b538SAndroid Build Coastguard Worker // [1]
818*6777b538SAndroid Build Coastguard Worker // |->|
819*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
820*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(has_current);
821*6777b538SAndroid Build Coastguard Worker }
822*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_HasCurrent_AfterLastItem)823*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_HasCurrent_AfterLastItem) {
824*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one);
825*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
826*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
827*6777b538SAndroid Build Coastguard Worker
828*6777b538SAndroid Build Coastguard Worker // Moving next from the last item should set |has_current| to false:
829*6777b538SAndroid Build Coastguard Worker // [1]
830*6777b538SAndroid Build Coastguard Worker // |->|
831*6777b538SAndroid Build Coastguard Worker boolean has_current;
832*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
833*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(has_current);
834*6777b538SAndroid Build Coastguard Worker }
835*6777b538SAndroid Build Coastguard Worker
TEST(VectorTest,MoveNext_HasCurrent_Changed)836*6777b538SAndroid Build Coastguard Worker TEST(VectorTest, MoveNext_HasCurrent_Changed) {
837*6777b538SAndroid Build Coastguard Worker auto vec = Make<Vector<int>>(g_one_two);
838*6777b538SAndroid Build Coastguard Worker ComPtr<IIterator<int>> iterator;
839*6777b538SAndroid Build Coastguard Worker vec->First(&iterator);
840*6777b538SAndroid Build Coastguard Worker boolean has_current;
841*6777b538SAndroid Build Coastguard Worker
842*6777b538SAndroid Build Coastguard Worker vec->Append(4);
843*6777b538SAndroid Build Coastguard Worker
844*6777b538SAndroid Build Coastguard Worker // Moving next after changing the vector should set |has_current| to false:
845*6777b538SAndroid Build Coastguard Worker iterator->MoveNext(&has_current);
846*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(has_current);
847*6777b538SAndroid Build Coastguard Worker }
848*6777b538SAndroid Build Coastguard Worker
849*6777b538SAndroid Build Coastguard Worker } // namespace win
850*6777b538SAndroid Build Coastguard Worker } // namespace base
851