1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/win/scoped_variant.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace base {
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace win {
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const wchar_t kTestString1[] = L"Used to create BSTRs";
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const wchar_t kTestString2[] = L"Also used to create BSTRs";
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid GiveMeAVariant(VARIANT* ret) {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ret != NULL);
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ret->vt = VT_BSTR;
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  V_BSTR(ret) = ::SysAllocString(kTestString1);
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A dummy IDispatch implementation (if you can call it that).
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The class does nothing intelligent really.  Only increments a counter
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// when AddRef is called and decrements it when Release is called.
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FakeComObject : public IDispatch {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FakeComObject() : ref_(0) {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD_(DWORD, AddRef)() {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ref_++;
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ref_;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD_(DWORD, Release)() {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ref_--;
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ref_;
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD(QueryInterface)(REFIID, void**) {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return E_NOTIMPL;
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD(GetTypeInfoCount)(UINT*) {
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return E_NOTIMPL;
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) {
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return E_NOTIMPL;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*) {
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return E_NOTIMPL;
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  STDMETHOD(Invoke)(DISPID, REFIID, LCID, WORD, DISPPARAMS*, VARIANT*,
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    EXCEPINFO*, UINT*) {
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return E_NOTIMPL;
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A way to check the internal reference count of the class.
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int ref_count() const {
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return ref_;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int ref_;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(ScopedVariantTest, ScopedVariant) {
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedVariant var;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(var.type() == VT_EMPTY);
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // V_BSTR(&var) = NULL;  <- NOTE: Assignment like that is not supported
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedVariant var_bstr(L"VT_BSTR");
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BSTR, V_VT(&var_bstr));
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(V_BSTR(&var_bstr) != NULL);  // can't use EXPECT_NE for BSTR
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr.Reset();
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(VT_BSTR, V_VT(&var_bstr));
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr.Set(kTestString2);
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BSTR, V_VT(&var_bstr));
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VARIANT tmp = var_bstr.Release();
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_EMPTY, V_VT(&var_bstr));
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BSTR, V_VT(&tmp));
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, lstrcmp(V_BSTR(&tmp), kTestString2));
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset(tmp);
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BSTR, V_VT(&var));
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, lstrcmpW(V_BSTR(&var), kTestString2));
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr.Swap(var);
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_EMPTY, V_VT(&var));
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BSTR, V_VT(&var_bstr));
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, lstrcmpW(V_BSTR(&var_bstr), kTestString2));
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr.Reset();
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test the Compare and Copy routines.
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GiveMeAVariant(var_bstr.Receive());
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ScopedVariant var_bstr2(V_BSTR(&var_bstr));
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr2.Reset();
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(0, var_bstr.Compare(var_bstr2));
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr2.Reset(var_bstr.Copy());
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr2.Reset();
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr2.Set(V_BSTR(&var_bstr));
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr2.Reset();
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var_bstr.Reset();
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test for the SetDate setter.
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEMTIME sys_time;
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::GetSystemTime(&sys_time);
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DATE date;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ::SystemTimeToVariantTime(&sys_time, &date);
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.SetDate(date);
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_DATE, var.type());
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(date, V_DATE(&var));
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Simple setter tests.  These do not require resetting the variant
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // after each test since the variant type is not "leakable" (i.e. doesn't
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // need to be freed explicitly).
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We need static cast here since char defaults to int (!?).
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<int8>('v'));
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_I1, var.type());
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ('v', V_I1(&var));
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<short>(123));
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_I2, var.type());
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_I2(&var));
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<int32>(123));
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_I4, var.type());
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_I4(&var));
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<int64>(123));
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_I8, var.type());
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_I8(&var));
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<uint8>(123));
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UI1, var.type());
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_UI1(&var));
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<unsigned short>(123));
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UI2, var.type());
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_UI2(&var));
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<uint32>(123));
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UI4, var.type());
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_UI4(&var));
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<uint64>(123));
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UI8, var.type());
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, V_UI8(&var));
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(123.123f);
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_R4, var.type());
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123.123f, V_R4(&var));
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<double>(123.123));
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_R8, var.type());
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123.123, V_R8(&var));
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(true);
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BOOL, var.type());
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VARIANT_TRUE, V_BOOL(&var));
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(false);
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_BOOL, var.type());
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VARIANT_FALSE, V_BOOL(&var));
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Com interface tests
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<IDispatch*>(NULL));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_DISPATCH, var.type());
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(NULL, V_DISPATCH(&var));
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<IUnknown*>(NULL));
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UNKNOWN, var.type());
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(NULL, V_UNKNOWN(&var));
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FakeComObject faker;
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<IDispatch*>(&faker));
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_DISPATCH, var.type());
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&faker, V_DISPATCH(&var));
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, faker.ref_count());
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<IUnknown*>(&faker));
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_UNKNOWN, var.type());
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(&faker, V_UNKNOWN(&var));
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, faker.ref_count());
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant disp_var(&faker);
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VT_DISPATCH, disp_var.type());
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(&faker, V_DISPATCH(&disp_var));
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(1, faker.ref_count());
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant ref1(&faker);
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(1, faker.ref_count());
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant ref2(static_cast<const VARIANT&>(ref1));
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(2, faker.ref_count());
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant ref3;
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ref3 = static_cast<const VARIANT&>(ref2);
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(3, faker.ref_count());
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant unk_var(static_cast<IUnknown*>(&faker));
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VT_UNKNOWN, unk_var.type());
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(&faker, V_UNKNOWN(&unk_var));
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(1, faker.ref_count());
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VARIANT raw;
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  raw.vt = VT_UNKNOWN;
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  raw.punkVal = &faker;
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(raw);
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, faker.ref_count());
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Reset();
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, faker.ref_count());
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ScopedVariant number(123);
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VT_I4, number.type());
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(123, V_I4(&number));
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // SAFEARRAY tests
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(static_cast<SAFEARRAY*>(NULL));
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_EMPTY, var.type());
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SAFEARRAY* sa = ::SafeArrayCreateVector(VT_UI1, 0, 100);
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(sa != NULL);
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  var.Set(sa);
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef OFFICIAL_BUILD
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(ScopedVariant::IsLeakableVarType(var.type()));
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(VT_ARRAY | VT_UI1, var.type());
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(sa, V_ARRAY(&var));
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The array is destroyed in the destructor of var.
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace win
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace base
264