ReactOS 0.4.15-dev-5672-gf73ac17
timer.c
Go to the documentation of this file.
1/*
2 * Test winmm timer
3 *
4 * Copyright (c) 2005 Robert Reif
5 *
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.
10 *
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.
15 *
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
19 */
20
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <math.h>
25
26#include "wine/test.h"
27#include "windef.h"
28#include "winbase.h"
29#include "winnls.h"
30#include "mmsystem.h"
31#define NOBITMAP
32#include "mmreg.h"
33
34#include "winmm_test.h"
35
36static TIMECAPS tc;
37
38static void test_timeGetDevCaps(void)
39{
40 MMRESULT rc;
41
42 rc = timeGetDevCaps(&tc, 0);
44 "timeGetDevCaps() returned %s, should have returned TIMERR_NOCANDO "
45 "or MMSYSERR_INVALPARAM\n", mmsys_error(rc));
46
47 rc = timeGetDevCaps(0, sizeof(tc));
48 ok(rc == TIMERR_NOCANDO || rc == TIMERR_STRUCT,
49 "timeGetDevCaps() returned %s, should have returned TIMERR_NOCANDO "
50 "or TIMERR_STRUCT\n", mmsys_error(rc));
51
52 rc = timeGetDevCaps(0, 0);
54 "timeGetDevCaps() returned %s, should have returned TIMERR_NOCANDO "
55 "or MMSYSERR_INVALPARAM\n", mmsys_error(rc));
56
57 rc = timeGetDevCaps(&tc, sizeof(tc));
58 ok(rc == TIMERR_NOERROR, "timeGetDevCaps() returned %s, "
59 "should have returned TIMERR_NOERROR\n", mmsys_error(rc));
60
61 if (rc == TIMERR_NOERROR)
62 trace("wPeriodMin = %u, wPeriodMax = %u\n",
63 tc.wPeriodMin, tc.wPeriodMax);
64}
65
66#define NUM_SAMPLES 100
67
68static DWORD count = 0;
70
71static void CALLBACK testTimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser,
72 DWORD_PTR dw1, DWORD_PTR dw2)
73{
74 if (count < NUM_SAMPLES)
75 times[count++] = timeGetTime();
76}
77
78static void test_timer(UINT period, UINT resolution)
79{
80 MMRESULT rc;
81 UINT i, id, delta;
82 DWORD dwMin = 0xffffffff, dwMax = 0;
83 double sum = 0.0;
84 double deviation = 0.0;
85
86 count = 0;
87
88 for (i = 0; i < NUM_SAMPLES; i++)
89 times[i] = 0;
90
91 rc = timeBeginPeriod(period);
92 ok(rc == TIMERR_NOERROR, "timeBeginPeriod(%u) returned %s, "
93 "should have returned TIMERR_NOERROR\n", period, mmsys_error(rc));
94 if (rc != TIMERR_NOERROR)
95 return;
96
97 id = timeSetEvent(period, resolution, testTimeProc, 0, TIME_PERIODIC);
98 ok(id != 0, "timeSetEvent(%u, %u, %p, 0, TIME_PERIODIC) returned %d, "
99 "should have returned id > 0\n", period, resolution, testTimeProc, id);
100 if (id == 0)
101 return;
102
103 Sleep((NUM_SAMPLES * period) + (2 * period));
104
105 rc = timeEndPeriod(period);
106 ok(rc == TIMERR_NOERROR, "timeEndPeriod(%u) returned %s, "
107 "should have returned TIMERR_NOERROR\n", period, mmsys_error(rc));
108 if (rc != TIMERR_NOERROR)
109 return;
110
111 rc = timeKillEvent(id);
112 ok(rc == TIMERR_NOERROR, "timeKillEvent(%u) returned %s, "
113 "should have returned TIMERR_NOERROR\n", id, mmsys_error(rc));
114
115 trace("period = %u, resolution = %u\n", period, resolution);
116
117 for (i = 0; i < count; i++)
118 {
119 if (i == 0)
120 {
121 if (winetest_debug > 1)
122 trace("time[%d] = %u\n", i, times[i]);
123 }
124 else
125 {
126 delta = times[i] - times[i - 1];
127
128 if (winetest_debug > 1)
129 trace("time[%d] = %u delta = %d\n", i, times[i], delta);
130
131 sum += delta;
132 deviation += ((delta - period) * (delta - period));
133
134 if (delta < dwMin)
135 dwMin = delta;
136
137 if (delta > dwMax)
138 dwMax = delta;
139 }
140 }
141
142 trace("min = %u, max = %u, average = %f, standard deviation = %f\n",
143 dwMin, dwMax, sum / (count - 1), sqrt(deviation / (count - 2)));
144}
145
146static const char * get_priority(int priority)
147{
148 static char tmp[32];
149#define STR(x) case x: return #x
150 switch(priority) {
158 }
159 sprintf(tmp, "UNKNOWN(%d)", priority);
160 return tmp;
161}
162
163static int priority = 0;
164static BOOL fired = FALSE;
165
166static void CALLBACK priorityTimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser,
167 DWORD_PTR dw1, DWORD_PTR dw2)
168{
170 ok(priority!=THREAD_PRIORITY_ERROR_RETURN, "GetThreadPriority() failed, GetLastError() = %u\n", GetLastError());
171 fired = TRUE;
172}
173
174static void test_priority(void)
175{
176 UINT id;
177
178 id = timeSetEvent(100, 100, priorityTimeProc, 0, TIME_ONESHOT);
179 ok(id != 0, "timeSetEvent(100, 100, %p, 0, TIME_ONESHOT) returned %d, "
180 "should have returned id > 0\n", priorityTimeProc, id);
181 if (id == 0)
182 return;
183
184 Sleep(200);
185
186 ok(fired == TRUE, "Callback not called\n");
187 if (fired)
188 {
190 "thread priority is %s, should be THREAD_PRIORITY_TIME_CRITICAL\n",
192 }
193 timeKillEvent(id);
194}
195
197{
199
200 if (tc.wPeriodMin <= 1) {
201 test_timer(1, 0);
202 test_timer(1, 1);
203 }
204
205 if (tc.wPeriodMin <= 10) {
206 test_timer(10, 0);
207 test_timer(10, 1);
208 test_timer(10, 10);
209 }
210
211 if (tc.wPeriodMin <= 20) {
212 test_timer(20, 0);
213 test_timer(20, 1);
214 test_timer(20, 10);
215 test_timer(20, 20);
216 }
217
219}
_STLP_DECLSPEC complex< float > _STLP_CALL sqrt(const complex< float > &)
Definition: complex.cpp:188
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CALLBACK
Definition: compat.h:35
int WINAPI GetThreadPriority(IN HANDLE hThread)
Definition: thread.c:739
MMRESULT WINAPI timeBeginPeriod(UINT wPeriod)
Definition: time.c:423
DWORD WINAPI timeGetTime(void)
Definition: time.c:466
MMRESULT WINAPI timeKillEvent(UINT wID)
Definition: time.c:370
MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS lpCaps, UINT wSize)
Definition: time.c:401
MMRESULT WINAPI timeSetEvent(UINT wDelay, UINT wResol, LPTIMECALLBACK lpFunc, DWORD_PTR dwUser, UINT wFlags)
Definition: time.c:360
MMRESULT WINAPI timeEndPeriod(UINT wPeriod)
Definition: time.c:446
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
const GLfloat * tc
Definition: glext.h:8925
GLuint id
Definition: glext.h:5910
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
UINT MMRESULT
Definition: mmsystem.h:962
#define TIME_PERIODIC
Definition: mmsystem.h:422
#define TIMERR_NOERROR
Definition: mmsystem.h:418
#define TIME_ONESHOT
Definition: mmsystem.h:421
#define TIMERR_STRUCT
Definition: mmsystem.h:420
#define MMSYSERR_INVALPARAM
Definition: mmsystem.h:107
#define TIMERR_NOCANDO
Definition: mmsystem.h:419
#define sprintf(buf, format,...)
Definition: sprintf.c:55
static void test_timer(void)
Definition: timer.c:25
const char * mmsys_error(MMRESULT error)
Definition: wave.c:220
static void CALLBACK priorityTimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
Definition: timer.c:166
#define STR(x)
static TIMECAPS tc
Definition: timer.c:36
static void test_priority(void)
Definition: timer.c:174
static void test_timeGetDevCaps(void)
Definition: timer.c:38
static const char * get_priority(int priority)
Definition: timer.c:146
static DWORD times[NUM_SAMPLES]
Definition: timer.c:69
static void CALLBACK testTimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
Definition: timer.c:71
static DWORD count
Definition: timer.c:68
static int priority
Definition: timer.c:163
#define NUM_SAMPLES
Definition: timer.c:66
static BOOL fired
Definition: timer.c:164
unsigned int UINT
Definition: ndis.h:50
static int sum(int x_, int y_)
Definition: ptr2_test.cpp:35
int winetest_debug
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
uint32_t DWORD_PTR
Definition: typedefs.h:65
DWORD WINAPI GetLastError(void)
Definition: except.c:1040
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define THREAD_PRIORITY_LOWEST
Definition: winbase.h:279
#define THREAD_PRIORITY_ABOVE_NORMAL
Definition: winbase.h:275
#define THREAD_PRIORITY_HIGHEST
Definition: winbase.h:277
#define THREAD_PRIORITY_TIME_CRITICAL
Definition: winbase.h:281
#define THREAD_PRIORITY_ERROR_RETURN
Definition: winbase.h:282
#define THREAD_PRIORITY_NORMAL
Definition: winbase.h:280
#define THREAD_PRIORITY_BELOW_NORMAL
Definition: winbase.h:276
#define THREAD_PRIORITY_IDLE
Definition: winbase.h:278