From 9d436f697d00ebb739565acf763ccfb753b54013 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Villac=C3=ADs=20Lasso?= Date: Fri, 10 Aug 2007 21:29:26 -0500 Subject: [PATCH] quartz: Add test for IReferenceClock. --- dlls/quartz/tests/Makefile.in | 3 +- dlls/quartz/tests/referenceclock.c | 95 ++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 dlls/quartz/tests/referenceclock.c diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in index 2c8bdc1f078..ce6794412ae 100644 --- a/dlls/quartz/tests/Makefile.in +++ b/dlls/quartz/tests/Makefile.in @@ -8,7 +8,8 @@ EXTRALIBS = -lstrmiids CTESTS = \ filtergraph.c \ - memallocator.c + memallocator.c \ + referenceclock.c @MAKE_TEST_RULES@ diff --git a/dlls/quartz/tests/referenceclock.c b/dlls/quartz/tests/referenceclock.c new file mode 100644 index 00000000000..aeadd480334 --- /dev/null +++ b/dlls/quartz/tests/referenceclock.c @@ -0,0 +1,95 @@ +/* + * Unit tests for Direct Show functions - IReferenceClock + * + * Copyright (C) 2007 Alex VillacĂ­s Lasso + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS + +#include "wine/test.h" +#include "uuids.h" +#include "dshow.h" +#include "control.h" + +/* The following method expects a reference clock that will keep ticking for + * at least 5 seconds since its creation. This method assumes no other methods + * were called on the IReferenceClock interface since its creation. + */ +static void test_IReferenceClock_methods(const char * clockdesc, IReferenceClock * pClock) +{ + HRESULT hr; + REFERENCE_TIME time1; + REFERENCE_TIME time2; + signed long diff; + + /* Test response from invalid (NULL) argument */ + hr = IReferenceClock_GetTime(pClock, NULL); + ok (hr == E_POINTER, "%s - Expected E_POINTER (0x%08x), got 0x%08x\n", clockdesc, E_POINTER, hr); + + /* Test response for valid value - try 1 */ + /* TODO: test whether Windows actually returns S_FALSE in its first invocation */ + time1 = (REFERENCE_TIME)0xdeadbeef; + hr = IReferenceClock_GetTime(pClock, &time1); + ok (hr == S_FALSE || hr == S_OK, "%s - Expected S_OK or S_FALSE, got 0x%08x\n", clockdesc, hr); + ok (time1 != 0xdeadbeef, "%s - value was NOT changed on return!\n", clockdesc); + + /* Test response for valid value - try 2 */ + time2 = (REFERENCE_TIME)0xdeadbeef; + hr = IReferenceClock_GetTime(pClock, &time2); + ok (hr == S_FALSE || hr == S_OK, "%s - Expected S_OK or S_FALSE, got 0x%08x\n", clockdesc, hr); + ok (time2 != 0xdeadbeef, "%s - value was NOT changed on return!\n", clockdesc); + + /* In case the second invocation managed to return S_FALSE, MSDN says the + returned time is the same as the previous one. */ + ok ((hr != S_FALSE || time1 == time2), "%s - returned S_FALSE, but values not equal!\n", clockdesc); + + time1 = time2; + Sleep(1000); /* Sleep for at least 1 second */ + hr = IReferenceClock_GetTime(pClock, &time2); + /* After a 1-second sleep, there is no excuse to get S_FALSE (see TODO above) */ + todo_wine { + ok (hr == S_OK, "%s - Expected S_OK, got 0x%08x\n", clockdesc, hr); + } + + /* FIXME: How much deviation should be allowed after a sleep? */ + diff = time2 - time1; + ok (9980000 <= diff && diff <= 10020000, "%s - Expected difference around 10000000, got %lu\n", clockdesc, diff); + +} + +static void test_IReferenceClock_SystemClock(void) +{ + IReferenceClock * pReferenceClock; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_SystemClock, NULL, CLSCTX_INPROC_SERVER, &IID_IReferenceClock, (LPVOID*)&pReferenceClock); + ok(hr == S_OK, "Unable to create reference clock from system clock %x\n", hr); + if (hr == S_OK) + { + test_IReferenceClock_methods("SystemClock", pReferenceClock); + IReferenceClock_Release(pReferenceClock); + } +} + +START_TEST(referenceclock) +{ + CoInitialize(NULL); + + test_IReferenceClock_SystemClock(); +}