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