1/**
2 * Mouse test suite
3 */
4
5#include <stdio.h>
6#include <limits.h>
7
8#include "SDL.h"
9#include "SDL_test.h"
10
11/* ================= Test Case Implementation ================== */
12
13/* Test case functions */
14
15/* Helper to evaluate state returned from SDL_GetMouseState */
16int _mouseStateCheck(Uint32 state)
17{
18 return (state == 0) ||
19 (state == SDL_BUTTON(SDL_BUTTON_LEFT)) ||
20 (state == SDL_BUTTON(SDL_BUTTON_MIDDLE)) ||
21 (state == SDL_BUTTON(SDL_BUTTON_RIGHT)) ||
22 (state == SDL_BUTTON(SDL_BUTTON_X1)) ||
23 (state == SDL_BUTTON(SDL_BUTTON_X2));
24}
25
26/**
27 * @brief Check call to SDL_GetMouseState
28 *
29 */
30int
31mouse_getMouseState(void *arg)
32{
33 int x;
34 int y;
35 Uint32 state;
36
37 /* Pump some events to update mouse state */
38 SDL_PumpEvents();
39 SDLTest_AssertPass("Call to SDL_PumpEvents()");
40
41 /* Case where x, y pointer is NULL */
42 state = SDL_GetMouseState(NULL, NULL);
43 SDLTest_AssertPass("Call to SDL_GetMouseState(NULL, NULL)");
44 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
45
46 /* Case where x pointer is not NULL */
47 x = INT_MIN;
48 state = SDL_GetMouseState(&x, NULL);
49 SDLTest_AssertPass("Call to SDL_GetMouseState(&x, NULL)");
50 SDLTest_AssertCheck(x > INT_MIN, "Validate that value of x is > INT_MIN, got: %i", x);
51 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
52
53 /* Case where y pointer is not NULL */
54 y = INT_MIN;
55 state = SDL_GetMouseState(NULL, &y);
56 SDLTest_AssertPass("Call to SDL_GetMouseState(NULL, &y)");
57 SDLTest_AssertCheck(y > INT_MIN, "Validate that value of y is > INT_MIN, got: %i", y);
58 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
59
60 /* Case where x and y pointer is not NULL */
61 x = INT_MIN;
62 y = INT_MIN;
63 state = SDL_GetMouseState(&x, &y);
64 SDLTest_AssertPass("Call to SDL_GetMouseState(&x, &y)");
65 SDLTest_AssertCheck(x > INT_MIN, "Validate that value of x is > INT_MIN, got: %i", x);
66 SDLTest_AssertCheck(y > INT_MIN, "Validate that value of y is > INT_MIN, got: %i", y);
67 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
68
69 return TEST_COMPLETED;
70}
71
72/**
73 * @brief Check call to SDL_GetRelativeMouseState
74 *
75 */
76int
77mouse_getRelativeMouseState(void *arg)
78{
79 int x;
80 int y;
81 Uint32 state;
82
83 /* Pump some events to update mouse state */
84 SDL_PumpEvents();
85 SDLTest_AssertPass("Call to SDL_PumpEvents()");
86
87 /* Case where x, y pointer is NULL */
88 state = SDL_GetRelativeMouseState(NULL, NULL);
89 SDLTest_AssertPass("Call to SDL_GetRelativeMouseState(NULL, NULL)");
90 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
91
92 /* Case where x pointer is not NULL */
93 x = INT_MIN;
94 state = SDL_GetRelativeMouseState(&x, NULL);
95 SDLTest_AssertPass("Call to SDL_GetRelativeMouseState(&x, NULL)");
96 SDLTest_AssertCheck(x > INT_MIN, "Validate that value of x is > INT_MIN, got: %i", x);
97 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
98
99 /* Case where y pointer is not NULL */
100 y = INT_MIN;
101 state = SDL_GetRelativeMouseState(NULL, &y);
102 SDLTest_AssertPass("Call to SDL_GetRelativeMouseState(NULL, &y)");
103 SDLTest_AssertCheck(y > INT_MIN, "Validate that value of y is > INT_MIN, got: %i", y);
104 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
105
106 /* Case where x and y pointer is not NULL */
107 x = INT_MIN;
108 y = INT_MIN;
109 state = SDL_GetRelativeMouseState(&x, &y);
110 SDLTest_AssertPass("Call to SDL_GetRelativeMouseState(&x, &y)");
111 SDLTest_AssertCheck(x > INT_MIN, "Validate that value of x is > INT_MIN, got: %i", x);
112 SDLTest_AssertCheck(y > INT_MIN, "Validate that value of y is > INT_MIN, got: %i", y);
113 SDLTest_AssertCheck(_mouseStateCheck(state), "Validate state returned from function, got: %i", state);
114
115 return TEST_COMPLETED;
116}
117
118
119/* XPM definition of mouse Cursor */
120static const char *_mouseArrowData[] = {
121 /* pixels */
122 "X ",
123 "XX ",
124 "X.X ",
125 "X..X ",
126 "X...X ",
127 "X....X ",
128 "X.....X ",
129 "X......X ",
130 "X.......X ",
131 "X........X ",
132 "X.....XXXXX ",
133 "X..X..X ",
134 "X.X X..X ",
135 "XX X..X ",
136 "X X..X ",
137 " X..X ",
138 " X..X ",
139 " X..X ",
140 " XX ",
141 " ",
142 " ",
143 " ",
144 " ",
145 " ",
146 " ",
147 " ",
148 " ",
149 " ",
150 " ",
151 " ",
152 " ",
153 " "
154};
155
156/* Helper that creates a new mouse cursor from an XPM */
157static SDL_Cursor *_initArrowCursor(const char *image[])
158{
159 SDL_Cursor *cursor;
160 int i, row, col;
161 Uint8 data[4*32];
162 Uint8 mask[4*32];
163
164 i = -1;
165 for ( row=0; row<32; ++row ) {
166 for ( col=0; col<32; ++col ) {
167 if ( col % 8 ) {
168 data[i] <<= 1;
169 mask[i] <<= 1;
170 } else {
171 ++i;
172 data[i] = mask[i] = 0;
173 }
174 switch (image[row][col]) {
175 case 'X':
176 data[i] |= 0x01;
177 mask[i] |= 0x01;
178 break;
179 case '.':
180 mask[i] |= 0x01;
181 break;
182 case ' ':
183 break;
184 }
185 }
186 }
187
188 cursor = SDL_CreateCursor(data, mask, 32, 32, 0, 0);
189 return cursor;
190}
191
192/**
193 * @brief Check call to SDL_CreateCursor and SDL_FreeCursor
194 *
195 * @sa http://wiki.libsdl.org/SDL_CreateCursor
196 * @sa http://wiki.libsdl.org/SDL_FreeCursor
197 */
198int
199mouse_createFreeCursor(void *arg)
200{
201 SDL_Cursor *cursor;
202
203 /* Create a cursor */
204 cursor = _initArrowCursor(_mouseArrowData);
205 SDLTest_AssertPass("Call to SDL_CreateCursor()");
206 SDLTest_AssertCheck(cursor != NULL, "Validate result from SDL_CreateCursor() is not NULL");
207 if (cursor == NULL) {
208 return TEST_ABORTED;
209 }
210
211 /* Free cursor again */
212 SDL_FreeCursor(cursor);
213 SDLTest_AssertPass("Call to SDL_FreeCursor()");
214
215 return TEST_COMPLETED;
216}
217
218/**
219 * @brief Check call to SDL_CreateColorCursor and SDL_FreeCursor
220 *
221 * @sa http://wiki.libsdl.org/SDL_CreateColorCursor
222 * @sa http://wiki.libsdl.org/SDL_FreeCursor
223 */
224int
225mouse_createFreeColorCursor(void *arg)
226{
227 SDL_Surface *face;
228 SDL_Cursor *cursor;
229
230 /* Get sample surface */
231 face = SDLTest_ImageFace();
232 SDLTest_AssertCheck(face != NULL, "Validate sample input image is not NULL");
233 if (face == NULL) return TEST_ABORTED;
234
235 /* Create a color cursor from surface */
236 cursor = SDL_CreateColorCursor(face, 0, 0);
237 SDLTest_AssertPass("Call to SDL_CreateColorCursor()");
238 SDLTest_AssertCheck(cursor != NULL, "Validate result from SDL_CreateColorCursor() is not NULL");
239 if (cursor == NULL) {
240 SDL_FreeSurface(face);
241 return TEST_ABORTED;
242 }
243
244 /* Free cursor again */
245 SDL_FreeCursor(cursor);
246 SDLTest_AssertPass("Call to SDL_FreeCursor()");
247
248 /* Clean up */
249 SDL_FreeSurface(face);
250
251 return TEST_COMPLETED;
252}
253
254/* Helper that changes cursor visibility */
255void _changeCursorVisibility(int state)
256{
257 int oldState;
258 int newState;
259 int result;
260
261 oldState = SDL_ShowCursor(SDL_QUERY);
262 SDLTest_AssertPass("Call to SDL_ShowCursor(SDL_QUERY)");
263
264 result = SDL_ShowCursor(state);
265 SDLTest_AssertPass("Call to SDL_ShowCursor(%s)", (state == SDL_ENABLE) ? "SDL_ENABLE" : "SDL_DISABLE");
266 SDLTest_AssertCheck(result == oldState, "Validate result from SDL_ShowCursor(%s), expected: %i, got: %i",
267 (state == SDL_ENABLE) ? "SDL_ENABLE" : "SDL_DISABLE", oldState, result);
268
269 newState = SDL_ShowCursor(SDL_QUERY);
270 SDLTest_AssertPass("Call to SDL_ShowCursor(SDL_QUERY)");
271 SDLTest_AssertCheck(state == newState, "Validate new state, expected: %i, got: %i",
272 state, newState);
273}
274
275/**
276 * @brief Check call to SDL_ShowCursor
277 *
278 * @sa http://wiki.libsdl.org/SDL_ShowCursor
279 */
280int
281mouse_showCursor(void *arg)
282{
283 int currentState;
284
285 /* Get current state */
286 currentState = SDL_ShowCursor(SDL_QUERY);
287 SDLTest_AssertPass("Call to SDL_ShowCursor(SDL_QUERY)");
288 SDLTest_AssertCheck(currentState == SDL_DISABLE || currentState == SDL_ENABLE,
289 "Validate result is %i or %i, got: %i", SDL_DISABLE, SDL_ENABLE, currentState);
290 if (currentState == SDL_DISABLE) {
291 /* Show the cursor, then hide it again */
292 _changeCursorVisibility(SDL_ENABLE);
293 _changeCursorVisibility(SDL_DISABLE);
294 } else if (currentState == SDL_ENABLE) {
295 /* Hide the cursor, then show it again */
296 _changeCursorVisibility(SDL_DISABLE);
297 _changeCursorVisibility(SDL_ENABLE);
298 } else {
299 return TEST_ABORTED;
300 }
301
302 return TEST_COMPLETED;
303}
304
305/**
306 * @brief Check call to SDL_SetCursor
307 *
308 * @sa http://wiki.libsdl.org/SDL_SetCursor
309 */
310int
311mouse_setCursor(void *arg)
312{
313 SDL_Cursor *cursor;
314
315 /* Create a cursor */
316 cursor = _initArrowCursor(_mouseArrowData);
317 SDLTest_AssertPass("Call to SDL_CreateCursor()");
318 SDLTest_AssertCheck(cursor != NULL, "Validate result from SDL_CreateCursor() is not NULL");
319 if (cursor == NULL) {
320 return TEST_ABORTED;
321 }
322
323 /* Set the arrow cursor */
324 SDL_SetCursor(cursor);
325 SDLTest_AssertPass("Call to SDL_SetCursor(cursor)");
326
327 /* Force redraw */
328 SDL_SetCursor(NULL);
329 SDLTest_AssertPass("Call to SDL_SetCursor(NULL)");
330
331 /* Free cursor again */
332 SDL_FreeCursor(cursor);
333 SDLTest_AssertPass("Call to SDL_FreeCursor()");
334
335 return TEST_COMPLETED;
336}
337
338/**
339 * @brief Check call to SDL_GetCursor
340 *
341 * @sa http://wiki.libsdl.org/SDL_GetCursor
342 */
343int
344mouse_getCursor(void *arg)
345{
346 SDL_Cursor *cursor;
347
348 /* Get current cursor */
349 cursor = SDL_GetCursor();
350 SDLTest_AssertPass("Call to SDL_GetCursor()");
351 SDLTest_AssertCheck(cursor != NULL, "Validate result from SDL_GetCursor() is not NULL");
352
353 return TEST_COMPLETED;
354}
355
356/**
357 * @brief Check call to SDL_GetRelativeMouseMode and SDL_SetRelativeMouseMode
358 *
359 * @sa http://wiki.libsdl.org/SDL_GetRelativeMouseMode
360 * @sa http://wiki.libsdl.org/SDL_SetRelativeMouseMode
361 */
362int
363mouse_getSetRelativeMouseMode(void *arg)
364{
365 int result;
366 int i;
367 SDL_bool initialState;
368 SDL_bool currentState;
369
370 /* Capture original state so we can revert back to it later */
371 initialState = SDL_GetRelativeMouseMode();
372 SDLTest_AssertPass("Call to SDL_GetRelativeMouseMode()");
373
374 /* Repeat twice to check D->D transition */
375 for (i=0; i<2; i++) {
376 /* Disable - should always be supported */
377 result = SDL_SetRelativeMouseMode(SDL_FALSE);
378 SDLTest_AssertPass("Call to SDL_SetRelativeMouseMode(FALSE)");
379 SDLTest_AssertCheck(result == 0, "Validate result value from SDL_SetRelativeMouseMode, expected: 0, got: %i", result);
380 currentState = SDL_GetRelativeMouseMode();
381 SDLTest_AssertPass("Call to SDL_GetRelativeMouseMode()");
382 SDLTest_AssertCheck(currentState == SDL_FALSE, "Validate current state is FALSE, got: %i", currentState);
383 }
384
385 /* Repeat twice to check D->E->E transition */
386 for (i=0; i<2; i++) {
387 /* Enable - may not be supported */
388 result = SDL_SetRelativeMouseMode(SDL_TRUE);
389 SDLTest_AssertPass("Call to SDL_SetRelativeMouseMode(TRUE)");
390 if (result != -1) {
391 SDLTest_AssertCheck(result == 0, "Validate result value from SDL_SetRelativeMouseMode, expected: 0, got: %i", result);
392 currentState = SDL_GetRelativeMouseMode();
393 SDLTest_AssertPass("Call to SDL_GetRelativeMouseMode()");
394 SDLTest_AssertCheck(currentState == SDL_TRUE, "Validate current state is TRUE, got: %i", currentState);
395 }
396 }
397
398 /* Disable to check E->D transition */
399 result = SDL_SetRelativeMouseMode(SDL_FALSE);
400 SDLTest_AssertPass("Call to SDL_SetRelativeMouseMode(FALSE)");
401 SDLTest_AssertCheck(result == 0, "Validate result value from SDL_SetRelativeMouseMode, expected: 0, got: %i", result);
402 currentState = SDL_GetRelativeMouseMode();
403 SDLTest_AssertPass("Call to SDL_GetRelativeMouseMode()");
404 SDLTest_AssertCheck(currentState == SDL_FALSE, "Validate current state is FALSE, got: %i", currentState);
405
406 /* Revert to original state - ignore result */
407 result = SDL_SetRelativeMouseMode(initialState);
408
409 return TEST_COMPLETED;
410}
411
412#define MOUSE_TESTWINDOW_WIDTH 320
413#define MOUSE_TESTWINDOW_HEIGHT 200
414
415/**
416 * Creates a test window
417 */
418SDL_Window *_createMouseSuiteTestWindow()
419{
420 int posX = 100, posY = 100, width = MOUSE_TESTWINDOW_WIDTH, height = MOUSE_TESTWINDOW_HEIGHT;
421 SDL_Window *window;
422 window = SDL_CreateWindow("mouse_createMouseSuiteTestWindow", posX, posY, width, height, 0);
423 SDLTest_AssertPass("SDL_CreateWindow()");
424 SDLTest_AssertCheck(window != NULL, "Check SDL_CreateWindow result");
425 return window;
426}
427
428/*
429 * Destroy test window
430 */
431void _destroyMouseSuiteTestWindow(SDL_Window *window)
432{
433 if (window != NULL) {
434 SDL_DestroyWindow(window);
435 window = NULL;
436 SDLTest_AssertPass("SDL_DestroyWindow()");
437 }
438}
439
440/**
441 * @brief Check call to SDL_WarpMouseInWindow
442 *
443 * @sa http://wiki.libsdl.org/SDL_WarpMouseInWindow
444 */
445int
446mouse_warpMouseInWindow(void *arg)
447{
448 const int w = MOUSE_TESTWINDOW_WIDTH, h = MOUSE_TESTWINDOW_HEIGHT;
449 int numPositions = 6;
450 int xPositions[6];
451 int yPositions[6];
452 int x, y, i, j;
453 SDL_Window *window;
454
455 xPositions[0] = -1;
456 xPositions[1] = 0;
457 xPositions[2] = 1;
458 xPositions[3] = w-1;
459 xPositions[4] = w;
460 xPositions[5] = w+1;
461 yPositions[0] = -1;
462 yPositions[1] = 0;
463 yPositions[2] = 1;
464 yPositions[3] = h-1;
465 yPositions[4] = h;
466 yPositions[5] = h+1;
467 /* Create test window */
468 window = _createMouseSuiteTestWindow();
469 if (window == NULL) return TEST_ABORTED;
470
471 /* Mouse to random position inside window */
472 x = SDLTest_RandomIntegerInRange(1, w-1);
473 y = SDLTest_RandomIntegerInRange(1, h-1);
474 SDL_WarpMouseInWindow(window, x, y);
475 SDLTest_AssertPass("SDL_WarpMouseInWindow(...,%i,%i)", x, y);
476
477 /* Same position again */
478 SDL_WarpMouseInWindow(window, x, y);
479 SDLTest_AssertPass("SDL_WarpMouseInWindow(...,%i,%i)", x, y);
480
481 /* Mouse to various boundary positions */
482 for (i=0; i<numPositions; i++) {
483 for (j=0; j<numPositions; j++) {
484 x = xPositions[i];
485 y = yPositions[j];
486 SDL_WarpMouseInWindow(window, x, y);
487 SDLTest_AssertPass("SDL_WarpMouseInWindow(...,%i,%i)", x, y);
488
489 /* TODO: add tracking of events and check that each call generates a mouse motion event */
490 SDL_PumpEvents();
491 SDLTest_AssertPass("SDL_PumpEvents()");
492 }
493 }
494
495
496 /* Clean up test window */
497 _destroyMouseSuiteTestWindow(window);
498
499 return TEST_COMPLETED;
500}
501
502/**
503 * @brief Check call to SDL_GetMouseFocus
504 *
505 * @sa http://wiki.libsdl.org/SDL_GetMouseFocus
506 */
507int
508mouse_getMouseFocus(void *arg)
509{
510 const int w = MOUSE_TESTWINDOW_WIDTH, h = MOUSE_TESTWINDOW_HEIGHT;
511 int x, y;
512 SDL_Window *window;
513 SDL_Window *focusWindow;
514
515 /* Get focus - focus non-deterministic */
516 focusWindow = SDL_GetMouseFocus();
517 SDLTest_AssertPass("SDL_GetMouseFocus()");
518
519 /* Create test window */
520 window = _createMouseSuiteTestWindow();
521 if (window == NULL) return TEST_ABORTED;
522
523 /* Mouse to random position inside window */
524 x = SDLTest_RandomIntegerInRange(1, w-1);
525 y = SDLTest_RandomIntegerInRange(1, h-1);
526 SDL_WarpMouseInWindow(window, x, y);
527 SDLTest_AssertPass("SDL_WarpMouseInWindow(...,%i,%i)", x, y);
528
529 /* Pump events to update focus state */
530 SDL_PumpEvents();
531 SDLTest_AssertPass("SDL_PumpEvents()");
532
533 /* Get focus with explicit window setup - focus deterministic */
534 focusWindow = SDL_GetMouseFocus();
535 SDLTest_AssertPass("SDL_GetMouseFocus()");
536 SDLTest_AssertCheck (focusWindow != NULL, "Check returned window value is not NULL");
537 SDLTest_AssertCheck (focusWindow == window, "Check returned window value is test window");
538
539 /* Mouse to random position outside window */
540 x = SDLTest_RandomIntegerInRange(-9, -1);
541 y = SDLTest_RandomIntegerInRange(-9, -1);
542 SDL_WarpMouseInWindow(window, x, y);
543 SDLTest_AssertPass("SDL_WarpMouseInWindow(...,%i,%i)", x, y);
544
545 /* Clean up test window */
546 _destroyMouseSuiteTestWindow(window);
547
548 /* Pump events to update focus state */
549 SDL_PumpEvents();
550 SDLTest_AssertPass("SDL_PumpEvents()");
551
552 /* Get focus for non-existing window */
553 focusWindow = SDL_GetMouseFocus();
554 SDLTest_AssertPass("SDL_GetMouseFocus()");
555 SDLTest_AssertCheck (focusWindow == NULL, "Check returned window value is NULL");
556
557
558 return TEST_COMPLETED;
559}
560
561/* ================= Test References ================== */
562
563/* Mouse test cases */
564static const SDLTest_TestCaseReference mouseTest1 =
565 { (SDLTest_TestCaseFp)mouse_getMouseState, "mouse_getMouseState", "Check call to SDL_GetMouseState", TEST_ENABLED };
566
567static const SDLTest_TestCaseReference mouseTest2 =
568 { (SDLTest_TestCaseFp)mouse_getRelativeMouseState, "mouse_getRelativeMouseState", "Check call to SDL_GetRelativeMouseState", TEST_ENABLED };
569
570static const SDLTest_TestCaseReference mouseTest3 =
571 { (SDLTest_TestCaseFp)mouse_createFreeCursor, "mouse_createFreeCursor", "Check call to SDL_CreateCursor and SDL_FreeCursor", TEST_ENABLED };
572
573static const SDLTest_TestCaseReference mouseTest4 =
574 { (SDLTest_TestCaseFp)mouse_showCursor, "mouse_showCursor", "Check call to SDL_ShowCursor", TEST_ENABLED };
575
576static const SDLTest_TestCaseReference mouseTest5 =
577 { (SDLTest_TestCaseFp)mouse_setCursor, "mouse_setCursor", "Check call to SDL_SetCursor", TEST_ENABLED };
578
579static const SDLTest_TestCaseReference mouseTest6 =
580 { (SDLTest_TestCaseFp)mouse_getCursor, "mouse_getCursor", "Check call to SDL_GetCursor", TEST_ENABLED };
581
582static const SDLTest_TestCaseReference mouseTest7 =
583 { (SDLTest_TestCaseFp)mouse_warpMouseInWindow, "mouse_warpMouseInWindow", "Check call to SDL_WarpMouseInWindow", TEST_ENABLED };
584
585static const SDLTest_TestCaseReference mouseTest8 =
586 { (SDLTest_TestCaseFp)mouse_getMouseFocus, "mouse_getMouseFocus", "Check call to SDL_getMouseFocus", TEST_ENABLED };
587
588static const SDLTest_TestCaseReference mouseTest9 =
589 { (SDLTest_TestCaseFp)mouse_createFreeColorCursor, "mouse_createFreeColorCursor", "Check call to SDL_CreateColorCursor and SDL_FreeCursor", TEST_ENABLED };
590
591static const SDLTest_TestCaseReference mouseTest10 =
592 { (SDLTest_TestCaseFp)mouse_getSetRelativeMouseMode, "mouse_getSetRelativeMouseMode", "Check call to SDL_GetRelativeMouseMode and SDL_SetRelativeMouseMode", TEST_ENABLED };
593
594/* Sequence of Mouse test cases */
595static const SDLTest_TestCaseReference *mouseTests[] = {
596 &mouseTest1, &mouseTest2, &mouseTest3, &mouseTest4, &mouseTest5, &mouseTest6,
597 &mouseTest7, &mouseTest8, &mouseTest9, &mouseTest10, NULL
598};
599
600/* Mouse test suite (global) */
601SDLTest_TestSuiteReference mouseTestSuite = {
602 "Mouse",
603 NULL,
604 mouseTests,
605 NULL
606};
607