1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/win/enum_variant.h" 6 7 #include "base/win/scoped_com_initializer.h" 8 #include "testing/gtest/include/gtest/gtest.h" 9 10 namespace base { 11 namespace win { 12 13 TEST(EnumVariantTest, EmptyEnumVariant) { 14 ScopedCOMInitializer com_initializer; 15 16 EnumVariant* ev = new EnumVariant(0); 17 ev->AddRef(); 18 19 IUnknown* iunknown; 20 EXPECT_TRUE(SUCCEEDED( 21 ev->QueryInterface(IID_IUnknown, reinterpret_cast<void**>(&iunknown)))); 22 iunknown->Release(); 23 24 IEnumVARIANT* ienumvariant; 25 EXPECT_TRUE(SUCCEEDED( 26 ev->QueryInterface(IID_IEnumVARIANT, 27 reinterpret_cast<void**>(&ienumvariant)))); 28 EXPECT_EQ(ev, ienumvariant); 29 ienumvariant->Release(); 30 31 VARIANT out_element; 32 ULONG out_received = 0; 33 EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); 34 EXPECT_EQ(0, out_received); 35 36 EXPECT_EQ(S_FALSE, ev->Skip(1)); 37 38 EXPECT_EQ(S_OK, ev->Reset()); 39 40 IEnumVARIANT* ev2 = NULL; 41 EXPECT_EQ(S_OK, ev->Clone(&ev2)); 42 43 EXPECT_NE(static_cast<IEnumVARIANT*>(NULL), ev2); 44 EXPECT_NE(ev, ev2); 45 EXPECT_EQ(S_FALSE, ev2->Skip(1)); 46 EXPECT_EQ(S_OK, ev2->Reset()); 47 48 ULONG ev2_finalrefcount = ev2->Release(); 49 EXPECT_EQ(0, ev2_finalrefcount); 50 51 ULONG ev_finalrefcount = ev->Release(); 52 EXPECT_EQ(0, ev_finalrefcount); 53 } 54 55 TEST(EnumVariantTest, SimpleEnumVariant) { 56 ScopedCOMInitializer com_initializer; 57 58 EnumVariant* ev = new EnumVariant(3); 59 ev->AddRef(); 60 ev->ItemAt(0)->vt = VT_I4; 61 ev->ItemAt(0)->lVal = 10; 62 ev->ItemAt(1)->vt = VT_I4; 63 ev->ItemAt(1)->lVal = 20; 64 ev->ItemAt(2)->vt = VT_I4; 65 ev->ItemAt(2)->lVal = 30; 66 67 // Get elements one at a time. 68 VARIANT out_element; 69 ULONG out_received = 0; 70 EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received)); 71 EXPECT_EQ(1, out_received); 72 EXPECT_EQ(VT_I4, out_element.vt); 73 EXPECT_EQ(10, out_element.lVal); 74 EXPECT_EQ(S_OK, ev->Skip(1)); 75 EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received)); 76 EXPECT_EQ(1, out_received); 77 EXPECT_EQ(VT_I4, out_element.vt); 78 EXPECT_EQ(30, out_element.lVal); 79 EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); 80 81 // Reset and get all elements at once. 82 VARIANT out_elements[3]; 83 EXPECT_EQ(S_OK, ev->Reset()); 84 EXPECT_EQ(S_OK, ev->Next(3, out_elements, &out_received)); 85 EXPECT_EQ(3, out_received); 86 EXPECT_EQ(VT_I4, out_elements[0].vt); 87 EXPECT_EQ(10, out_elements[0].lVal); 88 EXPECT_EQ(VT_I4, out_elements[1].vt); 89 EXPECT_EQ(20, out_elements[1].lVal); 90 EXPECT_EQ(VT_I4, out_elements[2].vt); 91 EXPECT_EQ(30, out_elements[2].lVal); 92 EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); 93 94 // Clone it. 95 IEnumVARIANT* ev2 = NULL; 96 EXPECT_EQ(S_OK, ev->Clone(&ev2)); 97 EXPECT_TRUE(ev2 != NULL); 98 EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received)); 99 EXPECT_EQ(S_OK, ev2->Reset()); 100 EXPECT_EQ(S_OK, ev2->Next(3, out_elements, &out_received)); 101 EXPECT_EQ(3, out_received); 102 EXPECT_EQ(VT_I4, out_elements[0].vt); 103 EXPECT_EQ(10, out_elements[0].lVal); 104 EXPECT_EQ(VT_I4, out_elements[1].vt); 105 EXPECT_EQ(20, out_elements[1].lVal); 106 EXPECT_EQ(VT_I4, out_elements[2].vt); 107 EXPECT_EQ(30, out_elements[2].lVal); 108 EXPECT_EQ(S_FALSE, ev2->Next(1, &out_element, &out_received)); 109 110 ULONG ev2_finalrefcount = ev2->Release(); 111 EXPECT_EQ(0, ev2_finalrefcount); 112 113 ULONG ev_finalrefcount = ev->Release(); 114 EXPECT_EQ(0, ev_finalrefcount); 115 } 116 117 } // namespace win 118 } // namespace base 119