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/iunknown_impl.h"
6
7#include "base/win/scoped_com_initializer.h"
8#include "testing/gtest/include/gtest/gtest.h"
9
10namespace base {
11namespace win {
12
13class TestIUnknownImplSubclass : public IUnknownImpl {
14 public:
15  TestIUnknownImplSubclass() {
16    ++instance_count;
17  }
18  virtual ~TestIUnknownImplSubclass() {
19    --instance_count;
20  }
21  static int instance_count;
22};
23
24// static
25int TestIUnknownImplSubclass::instance_count = 0;
26
27TEST(IUnknownImplTest, IUnknownImpl) {
28  ScopedCOMInitializer com_initializer;
29
30  EXPECT_EQ(0, TestIUnknownImplSubclass::instance_count);
31  IUnknown* u = new TestIUnknownImplSubclass();
32
33  EXPECT_EQ(1, TestIUnknownImplSubclass::instance_count);
34
35  EXPECT_EQ(1, u->AddRef());
36  EXPECT_EQ(1, u->AddRef());
37
38  IUnknown* other = NULL;
39  EXPECT_EQ(E_NOINTERFACE, u->QueryInterface(
40      IID_IDispatch, reinterpret_cast<void**>(&other)));
41  EXPECT_EQ(S_OK, u->QueryInterface(
42      IID_IUnknown, reinterpret_cast<void**>(&other)));
43  other->Release();
44
45  EXPECT_EQ(1, u->Release());
46  EXPECT_EQ(0, u->Release());
47  EXPECT_EQ(0, TestIUnknownImplSubclass::instance_count);
48}
49
50}  // namespace win
51}  // namespace base
52