ReactOS 0.4.17-dev-970-gcf0f1a6
timeline.c File Reference
#include "qedit.h"
#include "wine/test.h"
Include dependency graph for timeline.c:

Go to the source code of this file.

Macros

#define COBJMACROS
 

Functions

static ULONG get_refcount (void *iface)
 
static HRESULT WINAPI outer_QueryInterface (IUnknown *iface, REFIID iid, void **out)
 
static ULONG WINAPI outer_AddRef (IUnknown *iface)
 
static ULONG WINAPI outer_Release (IUnknown *iface)
 
static void test_aggregation (void)
 
static void test_timeline (void)
 
static void test_timelineobj_interfaces (void)
 
 START_TEST (timeline)
 

Variables

static const GUID test_iid = {0x33333333}
 
static LONG outer_ref = 1
 
static const IUnknownVtbl outer_vtbl
 
static IUnknown test_outer = {&outer_vtbl}
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file timeline.c.

Function Documentation

◆ get_refcount()

static ULONG get_refcount ( void *  iface)
static

Definition at line 25 of file timeline.c.

26{
27 IUnknown *unknown = iface;
28 IUnknown_AddRef(unknown);
29 return IUnknown_Release(unknown);
30}
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1674

Referenced by test_aggregation().

◆ outer_AddRef()

static ULONG WINAPI outer_AddRef ( IUnknown *  iface)
static

Definition at line 48 of file timeline.c.

49{
51}
#define InterlockedIncrement
Definition: armddk.h:53
static LONG outer_ref
Definition: timeline.c:33

◆ outer_QueryInterface()

static HRESULT WINAPI outer_QueryInterface ( IUnknown *  iface,
REFIID  iid,
void **  out 
)
static

Definition at line 35 of file timeline.c.

36{
37 if (IsEqualGUID(iid, &IID_IUnknown)
38 || IsEqualGUID(iid, &IID_IAMTimeline)
39 || IsEqualGUID(iid, &test_iid))
40 {
41 *out = (IUnknown *)0xdeadbeef;
42 return S_OK;
43 }
44 ok(0, "unexpected call %s\n", wine_dbgstr_guid(iid));
45 return E_NOINTERFACE;
46}
#define ok(value,...)
Definition: atltest.h:57
const GUID IID_IUnknown
#define S_OK
Definition: intsafe.h:52
static const GUID test_iid
Definition: timeline.c:32
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:181
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ outer_Release()

static ULONG WINAPI outer_Release ( IUnknown *  iface)
static

Definition at line 53 of file timeline.c.

54{
56}
#define InterlockedDecrement
Definition: armddk.h:52

◆ START_TEST()

START_TEST ( timeline  )

Definition at line 247 of file timeline.c.

248{
249 IAMTimeline *timeline;
250 HRESULT hr;
251
253
254 if (FAILED(hr = CoCreateInstance(&CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER,
255 &IID_IAMTimeline, (void **)&timeline)))
256 {
257 /* qedit.dll does not exist on 2003. */
258 win_skip("Failed to create timeline object, hr %#lx.\n", hr);
259 return;
260 }
261 IAMTimeline_Release(timeline);
262
266
268}
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
#define FAILED(hr)
Definition: intsafe.h:51
#define win_skip
Definition: minitest.h:67
static void test_timelineobj_interfaces(void)
Definition: timeline.c:213
static void test_timeline(void)
Definition: timeline.c:126
static void test_aggregation(void)
Definition: timeline.c:67

◆ test_aggregation()

static void test_aggregation ( void  )
static

Definition at line 67 of file timeline.c.

68{
69 IAMTimeline *timeline, *timeline2;
70 IUnknown *unk, *unk2;
71 HRESULT hr;
72 ULONG ref;
73
74 timeline = (IAMTimeline *)0xdeadbeef;
75 hr = CoCreateInstance(&CLSID_AMTimeline, &test_outer, CLSCTX_INPROC_SERVER,
76 &IID_IAMTimeline, (void **)&timeline);
77 ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr);
78 ok(!timeline, "Got interface %p.\n", timeline);
79
80 hr = CoCreateInstance(&CLSID_AMTimeline, &test_outer, CLSCTX_INPROC_SERVER,
81 &IID_IUnknown, (void **)&unk);
82 ok(hr == S_OK, "Got hr %#lx.\n", hr);
83 ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref);
84 ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n");
85 ref = get_refcount(unk);
86 ok(ref == 1, "Got unexpected refcount %ld.\n", ref);
87
88 ref = IUnknown_AddRef(unk);
89 ok(ref == 2, "Got unexpected refcount %ld.\n", ref);
90 ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref);
91
92 ref = IUnknown_Release(unk);
93 ok(ref == 1, "Got unexpected refcount %ld.\n", ref);
94 ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref);
95
96 hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2);
97 ok(hr == S_OK, "Got hr %#lx.\n", hr);
98 ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2);
99 IUnknown_Release(unk2);
100
101 hr = IUnknown_QueryInterface(unk, &IID_IAMTimeline, (void **)&timeline);
102 ok(hr == S_OK, "Got hr %#lx.\n", hr);
103
104 hr = IAMTimeline_QueryInterface(timeline, &IID_IUnknown, (void **)&unk2);
105 ok(hr == S_OK, "Got hr %#lx.\n", hr);
106 ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2);
107
108 hr = IAMTimeline_QueryInterface(timeline, &IID_IAMTimeline, (void **)&timeline2);
109 ok(hr == S_OK, "Got hr %#lx.\n", hr);
110 ok(timeline2 == (IAMTimeline *)0xdeadbeef, "Got unexpected IAMTimeline %p.\n", timeline2);
111
112 hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2);
113 ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr);
114 ok(!unk2, "Got unexpected IUnknown %p.\n", unk2);
115
116 hr = IAMTimeline_QueryInterface(timeline, &test_iid, (void **)&unk2);
117 ok(hr == S_OK, "Got hr %#lx.\n", hr);
118 ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2);
119
120 IAMTimeline_Release(timeline);
121 ref = IUnknown_Release(unk);
122 ok(!ref, "Got unexpected refcount %ld.\n", ref);
123 ok(outer_ref == 1, "Got unexpected refcount %ld.\n", outer_ref);
124}
static ULONG get_refcount(void *iface)
Definition: timeline.c:25
static IUnknown test_outer
Definition: timeline.c:65
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

Referenced by START_TEST().

◆ test_timeline()

static void test_timeline ( void  )
static

Definition at line 126 of file timeline.c.

127{
128 HRESULT hr;
129 IAMTimeline *timeline = NULL;
130 IAMTimeline *timeline2 = (IAMTimeline *)0xdeadbeef;
131 IAMTimelineObj *obj = (IAMTimelineObj *)0xdeadbeef;
132 IAMTimelineObj obj_iface;
134
135 hr = CoCreateInstance(&CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, &IID_IAMTimeline, (void **)&timeline);
136 ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), "Got hr %#lx.\n", hr);
137 if (!timeline) return;
138
139 hr = IAMTimeline_QueryInterface(timeline, &IID_IAMTimelineObj, NULL);
140 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
141
142 hr = IAMTimeline_QueryInterface(timeline, &IID_IAMTimelineObj, (void **)&obj);
143 ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr);
144 ok(!obj, "Expected NULL got %p\n", obj);
145
146 hr = IAMTimeline_CreateEmptyNode(timeline, NULL, 0);
147 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
148
149 hr = IAMTimeline_CreateEmptyNode(timeline, NULL, TIMELINE_MAJOR_TYPE_COMPOSITE);
150 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
151
152 for (type = 0; type < 256; type++)
153 {
154 obj = &obj_iface;
155 hr = IAMTimeline_CreateEmptyNode(timeline, &obj, type);
156 switch (type)
157 {
164 ok(hr == S_OK, "Got hr %#lx.\n", hr);
165 if (obj != &obj_iface) IAMTimelineObj_Release(obj);
166 break;
167 default:
168 ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr);
169 ok(obj == &obj_iface, "Expected %p got %p\n", &obj_iface, obj);
170 }
171 }
172
173 obj = NULL;
174 hr = IAMTimeline_CreateEmptyNode(timeline, &obj, TIMELINE_MAJOR_TYPE_COMPOSITE);
175 ok(hr == S_OK, "Got hr %#lx.\n", hr);
176 if (!obj) return;
177
178 hr = IAMTimelineObj_QueryInterface(obj, &IID_IAMTimeline, NULL);
179 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
180
181 hr = IAMTimelineObj_QueryInterface(obj, &IID_IAMTimeline, (void **)&timeline2);
182 ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr);
183 ok(!timeline2, "Expected NULL got %p\n", timeline2);
184
185 hr = IAMTimelineObj_GetTimelineType(obj, NULL);
186 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
187
188 hr = IAMTimelineObj_GetTimelineType(obj, &type);
189 ok(hr == S_OK, "Got hr %#lx.\n", hr);
190 ok(type == TIMELINE_MAJOR_TYPE_COMPOSITE, "Expected TIMELINE_MAJOR_TYPE_COMPOSITE got %d\n", type);
191
192 for (type = 0; type < 256; type++)
193 {
194 hr = IAMTimelineObj_SetTimelineType(obj, type);
196 ok(hr == S_OK, "Got hr %#lx.\n", hr);
197 else
198 ok(hr == E_INVALIDARG, "Got hr %#lx.\n", hr);
199 }
200
201 hr = IAMTimelineObj_GetTimelineNoRef(obj, NULL);
202 ok(hr == E_POINTER, "Got hr %#lx.\n", hr);
203
204 timeline2 = (IAMTimeline *)0xdeadbeef;
205 hr = IAMTimelineObj_GetTimelineNoRef(obj, &timeline2);
206 ok(hr == E_NOINTERFACE, "Got hr %#lx.\n", hr);
207 ok(!timeline2, "Expected NULL got %p\n", timeline2);
208
209 IAMTimelineObj_Release(obj);
210 IAMTimeline_Release(timeline);
211}
#define broken(x)
Definition: atltest.h:178
#define E_INVALIDARG
Definition: ddrawi.h:101
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
TIMELINE_MAJOR_TYPE
Definition: qedit.idl:303
@ TIMELINE_MAJOR_TYPE_EFFECT
Definition: qedit.idl:308
@ TIMELINE_MAJOR_TYPE_TRANSITION
Definition: qedit.idl:307
@ TIMELINE_MAJOR_TYPE_COMPOSITE
Definition: qedit.idl:304
@ TIMELINE_MAJOR_TYPE_SOURCE
Definition: qedit.idl:306
@ TIMELINE_MAJOR_TYPE_GROUP
Definition: qedit.idl:309
@ TIMELINE_MAJOR_TYPE_TRACK
Definition: qedit.idl:305
#define REGDB_E_CLASSNOTREG
Definition: winerror.h:3801
#define E_POINTER
Definition: winerror.h:3480

Referenced by START_TEST().

◆ test_timelineobj_interfaces()

static void test_timelineobj_interfaces ( void  )
static

Definition at line 213 of file timeline.c.

214{
215 HRESULT hr;
216 IAMTimeline *timeline = NULL;
218
219 hr = CoCreateInstance(&CLSID_AMTimeline, NULL, CLSCTX_INPROC_SERVER, &IID_IAMTimeline, (void **)&timeline);
220 ok(hr == S_OK || broken(hr == REGDB_E_CLASSNOTREG), "Got hr %#lx.\n", hr);
221 if (!timeline)
222 return;
223
224 hr = IAMTimeline_CreateEmptyNode(timeline, &obj, TIMELINE_MAJOR_TYPE_GROUP);
225 ok(hr == S_OK, "Got hr %#lx.\n", hr);
226 if(hr == S_OK)
227 {
229 IAMTimelineObj *obj2;
230
231 hr = IAMTimelineObj_QueryInterface(obj, &IID_IAMTimelineGroup, (void **)&group);
232 ok(hr == S_OK, "Got hr %#lx.\n", hr);
233
234 hr = IAMTimelineGroup_QueryInterface(group, &IID_IAMTimelineObj, (void **)&obj2);
235 ok(hr == S_OK, "Got hr %#lx.\n", hr);
236 ok(obj == obj2, "Different pointers\n");
237 IAMTimelineObj_Release(obj2);
238
239 IAMTimelineGroup_Release(group);
240
241 IAMTimelineObj_Release(obj);
242 }
243
244 IAMTimeline_Release(timeline);
245}
GLboolean GLuint group
Definition: glext.h:11120

Referenced by START_TEST().

Variable Documentation

◆ outer_ref

LONG outer_ref = 1
static

Definition at line 33 of file timeline.c.

Referenced by outer_AddRef(), outer_Release(), and test_aggregation().

◆ outer_vtbl

const IUnknownVtbl outer_vtbl
static
Initial value:
=
{
}
static ULONG WINAPI outer_AddRef(IUnknown *iface)
Definition: timeline.c:48
static HRESULT WINAPI outer_QueryInterface(IUnknown *iface, REFIID iid, void **out)
Definition: timeline.c:35
static ULONG WINAPI outer_Release(IUnknown *iface)
Definition: timeline.c:53

Definition at line 58 of file timeline.c.

◆ test_iid

const GUID test_iid = {0x33333333}
static

Definition at line 32 of file timeline.c.

Referenced by outer_QueryInterface(), and test_aggregation().

◆ test_outer

IUnknown test_outer = {&outer_vtbl}
static

Definition at line 65 of file timeline.c.

Referenced by test_aggregation().