1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 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 <stdint.h>
6*6777b538SAndroid Build Coastguard Worker #include <wrl/client.h>
7*6777b538SAndroid Build Coastguard Worker #include <wrl/implements.h>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include <utility>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include "base/win/dispatch_stub.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_variant.h"
13*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker using base::win::test::DispatchStub;
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 constexpr wchar_t kTestString[] = L"Test string for BSTRs.";
23*6777b538SAndroid Build Coastguard Worker
InitializeVariantWithBstr(VARIANT * var)24*6777b538SAndroid Build Coastguard Worker void InitializeVariantWithBstr(VARIANT* var) {
25*6777b538SAndroid Build Coastguard Worker if (!var) {
26*6777b538SAndroid Build Coastguard Worker ADD_FAILURE() << "|var| cannot be null.";
27*6777b538SAndroid Build Coastguard Worker return;
28*6777b538SAndroid Build Coastguard Worker }
29*6777b538SAndroid Build Coastguard Worker
30*6777b538SAndroid Build Coastguard Worker var->vt = VT_BSTR;
31*6777b538SAndroid Build Coastguard Worker V_BSTR(var) = ::SysAllocString(kTestString);
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker
ExpectRefCount(ULONG expected_refcount,IUnknown * object)34*6777b538SAndroid Build Coastguard Worker void ExpectRefCount(ULONG expected_refcount, IUnknown* object) {
35*6777b538SAndroid Build Coastguard Worker // In general, code should not check the values of AddRef() and Release().
36*6777b538SAndroid Build Coastguard Worker // However, tests need to validate that ScopedVariant safely owns a COM object
37*6777b538SAndroid Build Coastguard Worker // so they are checked for this unit test.
38*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_refcount + 1, object->AddRef());
39*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_refcount, object->Release());
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker
ExpectVariantType(VARENUM var_type,const ScopedVariant & var)42*6777b538SAndroid Build Coastguard Worker void ExpectVariantType(VARENUM var_type, const ScopedVariant& var) {
43*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(var_type, var.type());
44*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(var_type, V_VT(var.ptr()));
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker
47*6777b538SAndroid Build Coastguard Worker } // namespace
48*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,Empty)49*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, Empty) {
50*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
51*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_EMPTY, var);
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,ConstructBstr)54*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, ConstructBstr) {
55*6777b538SAndroid Build Coastguard Worker ScopedVariant var(kTestString);
56*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BSTR, var);
57*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(kTestString, V_BSTR(var.ptr()));
58*6777b538SAndroid Build Coastguard Worker }
59*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetBstr)60*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetBstr) {
61*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
62*6777b538SAndroid Build Coastguard Worker var.Set(kTestString);
63*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BSTR, var);
64*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(kTestString, V_BSTR(var.ptr()));
65*6777b538SAndroid Build Coastguard Worker }
66*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,ReleaseBstr)67*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, ReleaseBstr) {
68*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
69*6777b538SAndroid Build Coastguard Worker var.Set(kTestString);
70*6777b538SAndroid Build Coastguard Worker VARIANT released_variant = var.Release();
71*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_EMPTY, var);
72*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(VT_BSTR, V_VT(&released_variant));
73*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(kTestString, V_BSTR(&released_variant));
74*6777b538SAndroid Build Coastguard Worker ::VariantClear(&released_variant);
75*6777b538SAndroid Build Coastguard Worker }
76*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,ResetToEmptyBstr)77*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, ResetToEmptyBstr) {
78*6777b538SAndroid Build Coastguard Worker ScopedVariant var(kTestString);
79*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BSTR, var);
80*6777b538SAndroid Build Coastguard Worker var.Reset();
81*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_EMPTY, var);
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,TakeOwnershipBstr)84*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, TakeOwnershipBstr) {
85*6777b538SAndroid Build Coastguard Worker VARIANT bstr_variant;
86*6777b538SAndroid Build Coastguard Worker bstr_variant.vt = VT_BSTR;
87*6777b538SAndroid Build Coastguard Worker bstr_variant.bstrVal = ::SysAllocString(kTestString);
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
90*6777b538SAndroid Build Coastguard Worker var.Reset(bstr_variant);
91*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BSTR, var);
92*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bstr_variant.bstrVal, V_BSTR(var.ptr()));
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SwapBstr)95*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SwapBstr) {
96*6777b538SAndroid Build Coastguard Worker ScopedVariant from(kTestString);
97*6777b538SAndroid Build Coastguard Worker ScopedVariant to;
98*6777b538SAndroid Build Coastguard Worker to.Swap(from);
99*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_EMPTY, from);
100*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BSTR, to);
101*6777b538SAndroid Build Coastguard Worker EXPECT_STREQ(kTestString, V_BSTR(to.ptr()));
102*6777b538SAndroid Build Coastguard Worker }
103*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,CompareBstr)104*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, CompareBstr) {
105*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr1;
106*6777b538SAndroid Build Coastguard Worker InitializeVariantWithBstr(var_bstr1.Receive());
107*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr2(V_BSTR(var_bstr1.ptr()));
108*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, var_bstr1.Compare(var_bstr2));
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker var_bstr2.Reset();
111*6777b538SAndroid Build Coastguard Worker EXPECT_NE(0, var_bstr1.Compare(var_bstr2));
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,ReceiveAndCopyBstr)114*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, ReceiveAndCopyBstr) {
115*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr1;
116*6777b538SAndroid Build Coastguard Worker InitializeVariantWithBstr(var_bstr1.Receive());
117*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr2;
118*6777b538SAndroid Build Coastguard Worker var_bstr2.Reset(var_bstr1.Copy());
119*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, var_bstr1.Compare(var_bstr2));
120*6777b538SAndroid Build Coastguard Worker }
121*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetBstrFromBstrVariant)122*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetBstrFromBstrVariant) {
123*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr1;
124*6777b538SAndroid Build Coastguard Worker InitializeVariantWithBstr(var_bstr1.Receive());
125*6777b538SAndroid Build Coastguard Worker ScopedVariant var_bstr2;
126*6777b538SAndroid Build Coastguard Worker var_bstr2.Set(V_BSTR(var_bstr1.ptr()));
127*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, var_bstr1.Compare(var_bstr2));
128*6777b538SAndroid Build Coastguard Worker }
129*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetDate)130*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetDate) {
131*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
132*6777b538SAndroid Build Coastguard Worker SYSTEMTIME sys_time;
133*6777b538SAndroid Build Coastguard Worker ::GetSystemTime(&sys_time);
134*6777b538SAndroid Build Coastguard Worker DATE date;
135*6777b538SAndroid Build Coastguard Worker ::SystemTimeToVariantTime(&sys_time, &date);
136*6777b538SAndroid Build Coastguard Worker var.SetDate(date);
137*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_DATE, var);
138*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(date, V_DATE(var.ptr()));
139*6777b538SAndroid Build Coastguard Worker }
140*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetSigned1Byte)141*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetSigned1Byte) {
142*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
143*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<int8_t>('v'));
144*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_I1, var);
145*6777b538SAndroid Build Coastguard Worker EXPECT_EQ('v', V_I1(var.ptr()));
146*6777b538SAndroid Build Coastguard Worker }
147*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetSigned2Byte)148*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetSigned2Byte) {
149*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
150*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<int16_t>(123));
151*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_I2, var);
152*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, V_I2(var.ptr()));
153*6777b538SAndroid Build Coastguard Worker }
154*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetSigned4Byte)155*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetSigned4Byte) {
156*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
157*6777b538SAndroid Build Coastguard Worker var.Set(123);
158*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_I4, var);
159*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, V_I4(var.ptr()));
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetSigned8Byte)162*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetSigned8Byte) {
163*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
164*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<int64_t>(123));
165*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_I8, var);
166*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123, V_I8(var.ptr()));
167*6777b538SAndroid Build Coastguard Worker }
168*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetUnsigned1Byte)169*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetUnsigned1Byte) {
170*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
171*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<uint8_t>(123));
172*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UI1, var);
173*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123u, V_UI1(var.ptr()));
174*6777b538SAndroid Build Coastguard Worker }
175*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetUnsigned2Byte)176*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetUnsigned2Byte) {
177*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
178*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<uint16_t>(123));
179*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UI2, var);
180*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123u, V_UI2(var.ptr()));
181*6777b538SAndroid Build Coastguard Worker }
182*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetUnsigned4Byte)183*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetUnsigned4Byte) {
184*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
185*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<uint32_t>(123));
186*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UI4, var);
187*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123u, V_UI4(var.ptr()));
188*6777b538SAndroid Build Coastguard Worker }
189*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetUnsigned8Byte)190*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetUnsigned8Byte) {
191*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
192*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<uint64_t>(123));
193*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UI8, var);
194*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123u, V_UI8(var.ptr()));
195*6777b538SAndroid Build Coastguard Worker }
196*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetReal4Byte)197*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetReal4Byte) {
198*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
199*6777b538SAndroid Build Coastguard Worker var.Set(123.123f);
200*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_R4, var);
201*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123.123f, V_R4(var.ptr()));
202*6777b538SAndroid Build Coastguard Worker }
203*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetReal8Byte)204*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetReal8Byte) {
205*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
206*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<double>(123.123));
207*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_R8, var);
208*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(123.123, V_R8(var.ptr()));
209*6777b538SAndroid Build Coastguard Worker }
210*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetBooleanTrue)211*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetBooleanTrue) {
212*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
213*6777b538SAndroid Build Coastguard Worker var.Set(true);
214*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BOOL, var);
215*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(VARIANT_TRUE, V_BOOL(var.ptr()));
216*6777b538SAndroid Build Coastguard Worker }
217*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetBooleanFalse)218*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetBooleanFalse) {
219*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
220*6777b538SAndroid Build Coastguard Worker var.Set(false);
221*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_BOOL, var);
222*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(VARIANT_FALSE, V_BOOL(var.ptr()));
223*6777b538SAndroid Build Coastguard Worker }
224*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetComIDispatch)225*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetComIDispatch) {
226*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
227*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IDispatch> dispatch_stub =
228*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
229*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, dispatch_stub.Get());
230*6777b538SAndroid Build Coastguard Worker var.Set(dispatch_stub.Get());
231*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_DISPATCH, var);
232*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(dispatch_stub.Get(), V_DISPATCH(var.ptr()));
233*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
234*6777b538SAndroid Build Coastguard Worker var.Reset();
235*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, dispatch_stub.Get());
236*6777b538SAndroid Build Coastguard Worker }
237*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetComNullIDispatch)238*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetComNullIDispatch) {
239*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
240*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<IDispatch*>(nullptr));
241*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_DISPATCH, var);
242*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, V_DISPATCH(var.ptr()));
243*6777b538SAndroid Build Coastguard Worker }
244*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetComIUnknown)245*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetComIUnknown) {
246*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
247*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IUnknown> unknown_stub =
248*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
249*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, unknown_stub.Get());
250*6777b538SAndroid Build Coastguard Worker var.Set(unknown_stub.Get());
251*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UNKNOWN, var);
252*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(unknown_stub.Get(), V_UNKNOWN(var.ptr()));
253*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, unknown_stub.Get());
254*6777b538SAndroid Build Coastguard Worker var.Reset();
255*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, unknown_stub.Get());
256*6777b538SAndroid Build Coastguard Worker }
257*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariantTest,SetComNullIUnknown)258*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariantTest, SetComNullIUnknown) {
259*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
260*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<IUnknown*>(nullptr));
261*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UNKNOWN, var);
262*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(nullptr, V_UNKNOWN(var.ptr()));
263*6777b538SAndroid Build Coastguard Worker }
264*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,ScopedComIDispatchConstructor)265*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, ScopedComIDispatchConstructor) {
266*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IDispatch> dispatch_stub =
267*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
268*6777b538SAndroid Build Coastguard Worker {
269*6777b538SAndroid Build Coastguard Worker ScopedVariant var(dispatch_stub.Get());
270*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_DISPATCH, var);
271*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(dispatch_stub.Get(), V_DISPATCH(var.ptr()));
272*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, dispatch_stub.Get());
275*6777b538SAndroid Build Coastguard Worker }
276*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,ScopedComIDispatchMove)277*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, ScopedComIDispatchMove) {
278*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IDispatch> dispatch_stub =
279*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
280*6777b538SAndroid Build Coastguard Worker {
281*6777b538SAndroid Build Coastguard Worker ScopedVariant var1(dispatch_stub.Get());
282*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
283*6777b538SAndroid Build Coastguard Worker ScopedVariant var2(std::move(var1));
284*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
285*6777b538SAndroid Build Coastguard Worker ScopedVariant var3;
286*6777b538SAndroid Build Coastguard Worker var3 = std::move(var2);
287*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
288*6777b538SAndroid Build Coastguard Worker }
289*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, dispatch_stub.Get());
290*6777b538SAndroid Build Coastguard Worker }
291*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,ScopedComIDispatchCopy)292*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, ScopedComIDispatchCopy) {
293*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IDispatch> dispatch_stub =
294*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
295*6777b538SAndroid Build Coastguard Worker {
296*6777b538SAndroid Build Coastguard Worker ScopedVariant var1(dispatch_stub.Get());
297*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, dispatch_stub.Get());
298*6777b538SAndroid Build Coastguard Worker ScopedVariant var2(static_cast<const VARIANT&>(var1));
299*6777b538SAndroid Build Coastguard Worker ExpectRefCount(3U, dispatch_stub.Get());
300*6777b538SAndroid Build Coastguard Worker ScopedVariant var3;
301*6777b538SAndroid Build Coastguard Worker var3 = static_cast<const VARIANT&>(var2);
302*6777b538SAndroid Build Coastguard Worker ExpectRefCount(4U, dispatch_stub.Get());
303*6777b538SAndroid Build Coastguard Worker }
304*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, dispatch_stub.Get());
305*6777b538SAndroid Build Coastguard Worker }
306*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,ScopedComIUnknownConstructor)307*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, ScopedComIUnknownConstructor) {
308*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IUnknown> unknown_stub =
309*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
310*6777b538SAndroid Build Coastguard Worker {
311*6777b538SAndroid Build Coastguard Worker ScopedVariant unk_var(unknown_stub.Get());
312*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_UNKNOWN, unk_var);
313*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(unknown_stub.Get(), V_UNKNOWN(unk_var.ptr()));
314*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, unknown_stub.Get());
315*6777b538SAndroid Build Coastguard Worker }
316*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, unknown_stub.Get());
317*6777b538SAndroid Build Coastguard Worker }
318*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,ScopedComIUnknownWithRawVariant)319*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, ScopedComIUnknownWithRawVariant) {
320*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
321*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::ComPtr<IUnknown> unknown_stub =
322*6777b538SAndroid Build Coastguard Worker Microsoft::WRL::Make<DispatchStub>();
323*6777b538SAndroid Build Coastguard Worker VARIANT raw;
324*6777b538SAndroid Build Coastguard Worker raw.vt = VT_UNKNOWN;
325*6777b538SAndroid Build Coastguard Worker raw.punkVal = unknown_stub.Get();
326*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, unknown_stub.Get());
327*6777b538SAndroid Build Coastguard Worker var.Set(raw);
328*6777b538SAndroid Build Coastguard Worker ExpectRefCount(2U, unknown_stub.Get());
329*6777b538SAndroid Build Coastguard Worker var.Reset();
330*6777b538SAndroid Build Coastguard Worker ExpectRefCount(1U, unknown_stub.Get());
331*6777b538SAndroid Build Coastguard Worker }
332*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,SetSafeArray)333*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, SetSafeArray) {
334*6777b538SAndroid Build Coastguard Worker SAFEARRAY* sa = ::SafeArrayCreateVector(VT_UI1, 0, 100);
335*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(sa);
336*6777b538SAndroid Build Coastguard Worker
337*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
338*6777b538SAndroid Build Coastguard Worker var.Set(sa);
339*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ScopedVariant::IsLeakableVarType(var.type()));
340*6777b538SAndroid Build Coastguard Worker ExpectVariantType(static_cast<VARENUM>(VT_ARRAY | VT_UI1), var);
341*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(sa, V_ARRAY(var.ptr()));
342*6777b538SAndroid Build Coastguard Worker // The array is destroyed in the destructor of var.
343*6777b538SAndroid Build Coastguard Worker sa = nullptr;
344*6777b538SAndroid Build Coastguard Worker }
345*6777b538SAndroid Build Coastguard Worker
TEST(ScopedVariant,SetNullSafeArray)346*6777b538SAndroid Build Coastguard Worker TEST(ScopedVariant, SetNullSafeArray) {
347*6777b538SAndroid Build Coastguard Worker ScopedVariant var;
348*6777b538SAndroid Build Coastguard Worker var.Set(static_cast<SAFEARRAY*>(nullptr));
349*6777b538SAndroid Build Coastguard Worker ExpectVariantType(VT_EMPTY, var);
350*6777b538SAndroid Build Coastguard Worker }
351*6777b538SAndroid Build Coastguard Worker
352*6777b538SAndroid Build Coastguard Worker } // namespace win
353*6777b538SAndroid Build Coastguard Worker } // namespace base
354