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