1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 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/scoped_safearray.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <array>
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <utility>
12*6777b538SAndroid Build Coastguard Worker #include <vector>
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
15*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace base {
18*6777b538SAndroid Build Coastguard Worker namespace win {
19*6777b538SAndroid Build Coastguard Worker
20*6777b538SAndroid Build Coastguard Worker namespace {
21*6777b538SAndroid Build Coastguard Worker
22*6777b538SAndroid Build Coastguard Worker static constexpr std::array<int, 5> kInputValues = {0, 1, 2, 1, 0};
23*6777b538SAndroid Build Coastguard Worker
PopulateScopedSafearrayOfInts(ScopedSafearray & scoped_safe_array)24*6777b538SAndroid Build Coastguard Worker static void PopulateScopedSafearrayOfInts(ScopedSafearray& scoped_safe_array) {
25*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1082005): Create a safer alternative to SAFEARRAY methods.
26*6777b538SAndroid Build Coastguard Worker scoped_safe_array.Reset(SafeArrayCreateVector(
27*6777b538SAndroid Build Coastguard Worker /*vartype=*/VT_I4, /*lower_bound=*/2,
28*6777b538SAndroid Build Coastguard Worker /*element_count=*/kInputValues.size()));
29*6777b538SAndroid Build Coastguard Worker ASSERT_NE(scoped_safe_array.Get(), nullptr);
30*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(SafeArrayGetDim(scoped_safe_array.Get()), 1U);
31*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(scoped_safe_array.GetCount(), kInputValues.size());
32*6777b538SAndroid Build Coastguard Worker
33*6777b538SAndroid Build Coastguard Worker int* int_array;
34*6777b538SAndroid Build Coastguard Worker ASSERT_HRESULT_SUCCEEDED(SafeArrayAccessData(
35*6777b538SAndroid Build Coastguard Worker scoped_safe_array.Get(), reinterpret_cast<void**>(&int_array)));
36*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < kInputValues.size(); ++i)
37*6777b538SAndroid Build Coastguard Worker int_array[i] = kInputValues[i];
38*6777b538SAndroid Build Coastguard Worker ASSERT_HRESULT_SUCCEEDED(SafeArrayUnaccessData(scoped_safe_array.Get()));
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Worker } // namespace
42*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayMethods)43*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayMethods) {
44*6777b538SAndroid Build Coastguard Worker ScopedSafearray empty_safe_array;
45*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(empty_safe_array.Get(), nullptr);
46*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(empty_safe_array.Release(), nullptr);
47*6777b538SAndroid Build Coastguard Worker EXPECT_NE(empty_safe_array.Receive(), nullptr);
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker SAFEARRAY* safe_array = SafeArrayCreateVector(
50*6777b538SAndroid Build Coastguard Worker VT_R8 /* element type */, 0 /* lower bound */, 4 /* elements */);
51*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array(safe_array);
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), safe_array);
53*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Release(), safe_array);
54*6777b538SAndroid Build Coastguard Worker EXPECT_NE(scoped_safe_array.Receive(), nullptr);
55*6777b538SAndroid Build Coastguard Worker
56*6777b538SAndroid Build Coastguard Worker // The Release() call should have set the internal pointer to nullptr
57*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), nullptr);
58*6777b538SAndroid Build Coastguard Worker
59*6777b538SAndroid Build Coastguard Worker scoped_safe_array.Reset(safe_array);
60*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), safe_array);
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker ScopedSafearray moved_safe_array(std::move(scoped_safe_array));
63*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(moved_safe_array.Get(), safe_array);
64*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(moved_safe_array.Release(), safe_array);
65*6777b538SAndroid Build Coastguard Worker EXPECT_NE(moved_safe_array.Receive(), nullptr);
66*6777b538SAndroid Build Coastguard Worker
67*6777b538SAndroid Build Coastguard Worker // std::move should have cleared the values of scoped_safe_array
68*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), nullptr);
69*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Release(), nullptr);
70*6777b538SAndroid Build Coastguard Worker EXPECT_NE(scoped_safe_array.Receive(), nullptr);
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker scoped_safe_array.Reset(safe_array);
73*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), safe_array);
74*6777b538SAndroid Build Coastguard Worker
75*6777b538SAndroid Build Coastguard Worker ScopedSafearray assigment_moved_safe_array = std::move(scoped_safe_array);
76*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(assigment_moved_safe_array.Get(), safe_array);
77*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(assigment_moved_safe_array.Release(), safe_array);
78*6777b538SAndroid Build Coastguard Worker EXPECT_NE(assigment_moved_safe_array.Receive(), nullptr);
79*6777b538SAndroid Build Coastguard Worker
80*6777b538SAndroid Build Coastguard Worker // The move-assign operator= should have cleared the values of
81*6777b538SAndroid Build Coastguard Worker // scoped_safe_array
82*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Get(), nullptr);
83*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.Release(), nullptr);
84*6777b538SAndroid Build Coastguard Worker EXPECT_NE(scoped_safe_array.Receive(), nullptr);
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker // Calling Receive() will free the existing reference
87*6777b538SAndroid Build Coastguard Worker ScopedSafearray safe_array_received(SafeArrayCreateVector(
88*6777b538SAndroid Build Coastguard Worker VT_R8 /* element type */, 0 /* lower bound */, 4 /* elements */));
89*6777b538SAndroid Build Coastguard Worker EXPECT_NE(safe_array_received.Receive(), nullptr);
90*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(safe_array_received.Get(), nullptr);
91*6777b538SAndroid Build Coastguard Worker }
92*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayMoveConstructor)93*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayMoveConstructor) {
94*6777b538SAndroid Build Coastguard Worker ScopedSafearray first;
95*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(first);
96*6777b538SAndroid Build Coastguard Worker EXPECT_NE(first.Get(), nullptr);
97*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first.GetCount(), kInputValues.size());
98*6777b538SAndroid Build Coastguard Worker
99*6777b538SAndroid Build Coastguard Worker SAFEARRAY* safearray = first.Get();
100*6777b538SAndroid Build Coastguard Worker ScopedSafearray second(std::move(first));
101*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first.Get(), nullptr);
102*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.Get(), safearray);
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayMoveAssignOperator)105*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayMoveAssignOperator) {
106*6777b538SAndroid Build Coastguard Worker ScopedSafearray first, second;
107*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(first);
108*6777b538SAndroid Build Coastguard Worker EXPECT_NE(first.Get(), nullptr);
109*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first.GetCount(), kInputValues.size());
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker SAFEARRAY* safearray = first.Get();
112*6777b538SAndroid Build Coastguard Worker second = std::move(first);
113*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first.Get(), nullptr);
114*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.Get(), safearray);
115*6777b538SAndroid Build Coastguard Worker
116*6777b538SAndroid Build Coastguard Worker // Indirectly move |second| into itself.
117*6777b538SAndroid Build Coastguard Worker ScopedSafearray& reference_to_second = second;
118*6777b538SAndroid Build Coastguard Worker second = std::move(reference_to_second);
119*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.GetCount(), kInputValues.size());
120*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.Get(), safearray);
121*6777b538SAndroid Build Coastguard Worker }
122*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayCast)123*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayCast) {
124*6777b538SAndroid Build Coastguard Worker SAFEARRAY* safe_array = SafeArrayCreateVector(
125*6777b538SAndroid Build Coastguard Worker VT_R8 /* element type */, 1 /* lower bound */, 5 /* elements */);
126*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array(safe_array);
127*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SafeArrayGetDim(scoped_safe_array.Get()), 1U);
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker LONG lower_bound;
130*6777b538SAndroid Build Coastguard Worker EXPECT_HRESULT_SUCCEEDED(
131*6777b538SAndroid Build Coastguard Worker SafeArrayGetLBound(scoped_safe_array.Get(), 1, &lower_bound));
132*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(lower_bound, 1);
133*6777b538SAndroid Build Coastguard Worker
134*6777b538SAndroid Build Coastguard Worker LONG upper_bound;
135*6777b538SAndroid Build Coastguard Worker EXPECT_HRESULT_SUCCEEDED(
136*6777b538SAndroid Build Coastguard Worker SafeArrayGetUBound(scoped_safe_array.Get(), 1, &upper_bound));
137*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(upper_bound, 5);
138*6777b538SAndroid Build Coastguard Worker
139*6777b538SAndroid Build Coastguard Worker VARTYPE variable_type;
140*6777b538SAndroid Build Coastguard Worker EXPECT_HRESULT_SUCCEEDED(
141*6777b538SAndroid Build Coastguard Worker SafeArrayGetVartype(scoped_safe_array.Get(), &variable_type));
142*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(variable_type, VT_R8);
143*6777b538SAndroid Build Coastguard Worker }
144*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,InitiallyEmpty)145*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, InitiallyEmpty) {
146*6777b538SAndroid Build Coastguard Worker ScopedSafearray empty_safe_array;
147*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(empty_safe_array.Get(), nullptr);
148*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(empty_safe_array.GetCount());
149*6777b538SAndroid Build Coastguard Worker }
150*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayGetCount)151*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayGetCount) {
152*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1082005): Create a safer alternative to SAFEARRAY methods.
153*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array(SafeArrayCreateVector(
154*6777b538SAndroid Build Coastguard Worker /*vartype=*/VT_I4, /*lower_bound=*/2, /*element_count=*/5));
155*6777b538SAndroid Build Coastguard Worker ASSERT_NE(scoped_safe_array.Get(), nullptr);
156*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(SafeArrayGetDim(scoped_safe_array.Get()), 1U);
157*6777b538SAndroid Build Coastguard Worker
158*6777b538SAndroid Build Coastguard Worker LONG lower_bound;
159*6777b538SAndroid Build Coastguard Worker EXPECT_HRESULT_SUCCEEDED(
160*6777b538SAndroid Build Coastguard Worker SafeArrayGetLBound(scoped_safe_array.Get(), 1, &lower_bound));
161*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(lower_bound, 2);
162*6777b538SAndroid Build Coastguard Worker
163*6777b538SAndroid Build Coastguard Worker LONG upper_bound;
164*6777b538SAndroid Build Coastguard Worker EXPECT_HRESULT_SUCCEEDED(
165*6777b538SAndroid Build Coastguard Worker SafeArrayGetUBound(scoped_safe_array.Get(), 1, &upper_bound));
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(upper_bound, 6);
167*6777b538SAndroid Build Coastguard Worker
168*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(scoped_safe_array.GetCount(), 5U);
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayInitialLockScope)171*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayInitialLockScope) {
172*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
173*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_I4>> lock_scope =
174*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_I4>();
175*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(lock_scope.has_value());
176*6777b538SAndroid Build Coastguard Worker }
177*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayLockScopeMoveConstructor)178*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayLockScopeMoveConstructor) {
179*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
180*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(scoped_safe_array);
181*6777b538SAndroid Build Coastguard Worker
182*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_I4>> first =
183*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_I4>();
184*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(first.has_value());
185*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->Type(), VT_I4);
186*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->size(), kInputValues.size());
187*6777b538SAndroid Build Coastguard Worker
188*6777b538SAndroid Build Coastguard Worker ScopedSafearray::LockScope<VT_I4> second(std::move(*first));
189*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->Type(), VT_EMPTY);
190*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->size(), 0U);
191*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.Type(), VT_I4);
192*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.size(), kInputValues.size());
193*6777b538SAndroid Build Coastguard Worker }
194*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayLockScopeMoveAssignOperator)195*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayLockScopeMoveAssignOperator) {
196*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
197*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(scoped_safe_array);
198*6777b538SAndroid Build Coastguard Worker
199*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_I4>> first =
200*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_I4>();
201*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(first.has_value());
202*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->Type(), VT_I4);
203*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->size(), kInputValues.size());
204*6777b538SAndroid Build Coastguard Worker
205*6777b538SAndroid Build Coastguard Worker ScopedSafearray::LockScope<VT_I4> second;
206*6777b538SAndroid Build Coastguard Worker second = std::move(*first);
207*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->Type(), VT_EMPTY);
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(first->size(), 0U);
209*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.Type(), VT_I4);
210*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(second.size(), kInputValues.size());
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker // Indirectly move |second| into itself.
213*6777b538SAndroid Build Coastguard Worker ScopedSafearray::LockScope<VT_I4>& reference_to_second = second;
214*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH(second = std::move(reference_to_second));
215*6777b538SAndroid Build Coastguard Worker }
216*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayLockScopeTypeMismatch)217*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayLockScopeTypeMismatch) {
218*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
219*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(scoped_safe_array);
220*6777b538SAndroid Build Coastguard Worker
221*6777b538SAndroid Build Coastguard Worker {
222*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_BSTR>> invalid_lock_scope =
223*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_BSTR>();
224*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_lock_scope.has_value());
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker
227*6777b538SAndroid Build Coastguard Worker {
228*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_UI4>> invalid_lock_scope =
229*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_UI4>();
230*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(invalid_lock_scope.has_value());
231*6777b538SAndroid Build Coastguard Worker }
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayLockScopeRandomAccess)234*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayLockScopeRandomAccess) {
235*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
236*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(scoped_safe_array);
237*6777b538SAndroid Build Coastguard Worker
238*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_I4>> lock_scope =
239*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_I4>();
240*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(lock_scope.has_value());
241*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(lock_scope->Type(), VT_I4);
242*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(lock_scope->size(), kInputValues.size());
243*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < kInputValues.size(); ++i) {
244*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(lock_scope->at(i), kInputValues[i]);
245*6777b538SAndroid Build Coastguard Worker EXPECT_EQ((*lock_scope)[i], kInputValues[i]);
246*6777b538SAndroid Build Coastguard Worker }
247*6777b538SAndroid Build Coastguard Worker }
248*6777b538SAndroid Build Coastguard Worker
TEST(ScopedSafearrayTest,ScopedSafearrayLockScopeIterator)249*6777b538SAndroid Build Coastguard Worker TEST(ScopedSafearrayTest, ScopedSafearrayLockScopeIterator) {
250*6777b538SAndroid Build Coastguard Worker ScopedSafearray scoped_safe_array;
251*6777b538SAndroid Build Coastguard Worker PopulateScopedSafearrayOfInts(scoped_safe_array);
252*6777b538SAndroid Build Coastguard Worker
253*6777b538SAndroid Build Coastguard Worker std::optional<ScopedSafearray::LockScope<VT_I4>> lock_scope =
254*6777b538SAndroid Build Coastguard Worker scoped_safe_array.CreateLockScope<VT_I4>();
255*6777b538SAndroid Build Coastguard Worker
256*6777b538SAndroid Build Coastguard Worker std::vector<int> unpacked_vector(lock_scope->begin(), lock_scope->end());
257*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(unpacked_vector.size(), kInputValues.size());
258*6777b538SAndroid Build Coastguard Worker for (size_t i = 0; i < kInputValues.size(); ++i)
259*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(unpacked_vector[i], kInputValues[i]);
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker
262*6777b538SAndroid Build Coastguard Worker } // namespace win
263*6777b538SAndroid Build Coastguard Worker } // namespace base
264