2 * Unit tests for Video Renderer functions
4 * Copyright (C) 2007 Google (Lei Zhang)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/test.h"
26 #define QI_SUCCEED(iface, riid, ppv) hr = IUnknown_QueryInterface(iface, &riid, (LPVOID*)&ppv); \
27 ok(hr == S_OK, "IUnknown_QueryInterface returned %x\n", hr); \
28 ok(ppv != NULL, "Pointer is NULL\n");
30 #define QI_FAIL(iface, riid, ppv) hr = IUnknown_QueryInterface(iface, &riid, (LPVOID*)&ppv); \
31 ok(hr == E_NOINTERFACE, "IUnknown_QueryInterface returned %x\n", hr); \
32 ok(ppv == NULL, "Pointer is %p\n", ppv);
34 #define ADDREF_EXPECT(iface, num) if (iface) { \
35 hr = IUnknown_AddRef(iface); \
36 ok(hr == num, "IUnknown_AddRef should return %d, got %d\n", num, hr); \
39 #define RELEASE_EXPECT(iface, num) if (iface) { \
40 hr = IUnknown_Release(iface); \
41 ok(hr == num, "IUnknown_Release should return %d, got %d\n", num, hr); \
44 static IUnknown
*pVideoRenderer
= NULL
;
46 static void test_aggregation(const CLSID clsidOuter
, const CLSID clsidInner
,
47 const IID iidOuter
, const IID iidInner
)
50 IUnknown
*pUnkOuter
= NULL
;
51 IUnknown
*pUnkInner
= NULL
;
52 IUnknown
*pUnkInnerFail
= NULL
;
53 IUnknown
*pUnkOuterTest
= NULL
;
54 IUnknown
*pUnkInnerTest
= NULL
;
55 IUnknown
*pUnkAggregatee
= NULL
;
56 IUnknown
*pUnkAggregator
= NULL
;
57 IUnknown
*pUnkTest
= NULL
;
59 hr
= CoCreateInstance(&clsidOuter
, NULL
, CLSCTX_INPROC_SERVER
,
60 &IID_IUnknown
, (LPVOID
*)&pUnkOuter
);
61 ok(hr
== S_OK
, "CoCreateInstance failed with %x\n", hr
);
62 ok(pUnkOuter
!= NULL
, "pUnkOuter is NULL\n");
66 skip("pUnkOuter is NULL\n");
70 /* for aggregation, we should only be able to request IUnknown */
71 hr
= CoCreateInstance(&clsidInner
, pUnkOuter
, CLSCTX_INPROC_SERVER
,
72 &iidInner
, (LPVOID
*)&pUnkInnerFail
);
73 ok(hr
== E_NOINTERFACE
, "CoCreateInstance returned %x\n", hr
);
74 ok(pUnkInnerFail
== NULL
, "pUnkInnerFail is not NULL\n");
76 /* aggregation, request IUnknown */
77 hr
= CoCreateInstance(&clsidInner
, pUnkOuter
, CLSCTX_INPROC_SERVER
,
78 &IID_IUnknown
, (LPVOID
*)&pUnkInner
);
79 ok(hr
== S_OK
, "CoCreateInstance returned %x\n", hr
);
80 ok(pUnkInner
!= NULL
, "pUnkInner is NULL\n");
84 skip("pUnkInner is NULL\n");
88 ADDREF_EXPECT(pUnkOuter
, 2);
89 ADDREF_EXPECT(pUnkInner
, 2);
90 RELEASE_EXPECT(pUnkOuter
, 1);
91 RELEASE_EXPECT(pUnkInner
, 1);
93 QI_FAIL(pUnkOuter
, iidInner
, pUnkAggregatee
);
94 QI_FAIL(pUnkInner
, iidOuter
, pUnkAggregator
);
96 /* these QueryInterface calls should work */
97 QI_SUCCEED(pUnkOuter
, iidOuter
, pUnkAggregator
);
98 QI_SUCCEED(pUnkOuter
, IID_IUnknown
, pUnkOuterTest
);
99 QI_SUCCEED(pUnkInner
, iidInner
, pUnkAggregatee
);
100 QI_SUCCEED(pUnkInner
, IID_IUnknown
, pUnkInnerTest
);
102 if (!pUnkAggregator
|| !pUnkOuterTest
|| !pUnkAggregatee \
105 skip("One of the required interfaces is NULL\n");
109 ADDREF_EXPECT(pUnkAggregator
, 5);
110 ADDREF_EXPECT(pUnkOuterTest
, 6);
111 ADDREF_EXPECT(pUnkAggregatee
, 7);
112 ADDREF_EXPECT(pUnkInnerTest
, 3);
113 RELEASE_EXPECT(pUnkAggregator
, 6);
114 RELEASE_EXPECT(pUnkOuterTest
, 5);
115 RELEASE_EXPECT(pUnkAggregatee
, 4);
116 RELEASE_EXPECT(pUnkInnerTest
, 2);
118 QI_SUCCEED(pUnkAggregator
, IID_IUnknown
, pUnkTest
);
119 QI_SUCCEED(pUnkOuterTest
, IID_IUnknown
, pUnkTest
);
120 QI_SUCCEED(pUnkAggregatee
, IID_IUnknown
, pUnkTest
);
121 QI_SUCCEED(pUnkInnerTest
, IID_IUnknown
, pUnkTest
);
123 QI_FAIL(pUnkAggregator
, iidInner
, pUnkTest
);
124 QI_FAIL(pUnkOuterTest
, iidInner
, pUnkTest
);
125 QI_FAIL(pUnkAggregatee
, iidInner
, pUnkTest
);
126 QI_SUCCEED(pUnkInnerTest
, iidInner
, pUnkTest
);
128 QI_SUCCEED(pUnkAggregator
, iidOuter
, pUnkTest
);
129 QI_SUCCEED(pUnkOuterTest
, iidOuter
, pUnkTest
);
130 QI_SUCCEED(pUnkAggregatee
, iidOuter
, pUnkTest
);
131 QI_FAIL(pUnkInnerTest
, iidOuter
, pUnkTest
);
133 RELEASE_EXPECT(pUnkAggregator
, 10);
134 RELEASE_EXPECT(pUnkOuterTest
, 9);
135 RELEASE_EXPECT(pUnkAggregatee
, 8);
136 RELEASE_EXPECT(pUnkInnerTest
, 2);
137 RELEASE_EXPECT(pUnkOuter
, 7);
138 RELEASE_EXPECT(pUnkInner
, 1);
141 static int create_video_renderer(void)
145 hr
= CoCreateInstance(&CLSID_VideoRenderer
, NULL
, CLSCTX_INPROC_SERVER
,
146 &IID_IUnknown
, (LPVOID
*)&pVideoRenderer
);
147 return (hr
== S_OK
&& pVideoRenderer
!= NULL
);
150 static void release_video_renderer(void)
154 hr
= IUnknown_Release(pVideoRenderer
);
155 ok(hr
== 0, "IUnknown_Release failed with %x\n", hr
);
158 static void test_query_interface(void)
161 IBaseFilter
*pBaseFilter
= NULL
;
162 IBasicVideo
*pBasicVideo
= NULL
;
163 IDirectDrawVideo
*pDirectDrawVideo
= NULL
;
164 IKsPropertySet
*pKsPropertySet
= NULL
;
165 IMediaPosition
*pMediaPosition
= NULL
;
166 IMediaSeeking
*pMediaSeeking
= NULL
;
167 IQualityControl
*pQualityControl
= NULL
;
168 IQualProp
*pQualProp
= NULL
;
169 IVideoWindow
*pVideoWindow
= NULL
;
171 QI_SUCCEED(pVideoRenderer
, IID_IBaseFilter
, pBaseFilter
);
172 RELEASE_EXPECT(pBaseFilter
, 1);
173 QI_SUCCEED(pVideoRenderer
, IID_IBasicVideo
, pBasicVideo
);
174 RELEASE_EXPECT(pBasicVideo
, 1);
176 QI_SUCCEED(pVideoRenderer
, IID_IDirectDrawVideo
, pDirectDrawVideo
);
177 RELEASE_EXPECT(pDirectDrawVideo
, 1);
178 QI_SUCCEED(pVideoRenderer
, IID_IKsPropertySet
, pKsPropertySet
);
179 RELEASE_EXPECT(pKsPropertySet
, 1);
180 QI_SUCCEED(pVideoRenderer
, IID_IMediaPosition
, pMediaPosition
);
181 RELEASE_EXPECT(pMediaPosition
, 1);
182 QI_SUCCEED(pVideoRenderer
, IID_IMediaSeeking
, pMediaSeeking
);
183 RELEASE_EXPECT(pMediaSeeking
, 1);
184 QI_SUCCEED(pVideoRenderer
, IID_IQualityControl
, pQualityControl
);
185 RELEASE_EXPECT(pQualityControl
, 1);
186 QI_SUCCEED(pVideoRenderer
, IID_IQualProp
, pQualProp
);
187 RELEASE_EXPECT(pQualProp
, 1);
189 QI_SUCCEED(pVideoRenderer
, IID_IVideoWindow
, pVideoWindow
);
190 RELEASE_EXPECT(pVideoWindow
, 1);
193 static void test_all_aggregations(void)
196 IID_IMediaFilter
, IID_IBaseFilter
, IID_IBasicVideo
, IID_IVideoWindow
200 for (i
= 0; i
< sizeof(iids
) / sizeof(iids
[0]); i
++)
202 test_aggregation(CLSID_SystemClock
, CLSID_VideoRenderer
,
203 IID_IReferenceClock
, iids
[i
]);
207 START_TEST(videorenderer
)
210 if (!create_video_renderer())
213 test_query_interface();
214 test_all_aggregations();
216 release_video_renderer();