Add surface test suite; minor improvements to render suite; refactor image saving into test lib compare function; fix for Haiku build
2 * Original code: automated SDL surface test written by Edgar Simo "bobbens"
3 * Adapted/rewritten for test lib by Andreas Schiffler
12 /* ================= Test Case Implementation ================== */
15 /* Shared test surface */
17 static SDL_Surface *testsurface = NULL;
22 _surfaceSetUp(void *arg)
24 testsurface = SDLTest_ImageBlit();
25 SDLTest_AssertCheck(testsurface != NULL, "Check that testsurface is not NULL");
29 _surfaceTearDown(void *arg)
31 if (testsurface != NULL) {
32 SDL_FreeSurface(testsurface);
37 /* Helper functions for the test cases */
39 #define TEST_SURFACE_WIDTH testsurface->w
40 #define TEST_SURFACE_HEIGHT testsurface->h
43 * Helper that clears the test surface
45 void _clearTestSurface()
51 color = SDL_MapRGB( testsurface->format, 0, 0, 0);
52 SDLTest_AssertPass("Call to SDL_MapRGB()");
53 ret = SDL_FillRect( testsurface, NULL, color);
54 SDLTest_AssertPass("Call to SDL_FillRect()");
55 SDLTest_AssertCheck(ret == 0, "Verify result from SDL_FillRect, expected: 0, got: %i", ret);
59 * Helper that blits in a specific blend mode, -1 for basic blitting, -2 for color mod, -3 for alpha mod, -4 for mixed blend modes.
61 void _testBlitBlendMode(int mode)
74 /* Check test surface */
75 SDLTest_AssertCheck(testsurface != NULL, "Verify testsurface is not NULL");
76 if (testsurface == NULL) return;
78 /* Create sample surface */
79 face = SDLTest_ImageFace();
80 SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
81 if (face == NULL) return;
83 /* Clear the test surface */
86 /* Target rect size */
91 ni = testsurface->w - face->w;
92 nj = testsurface->h - face->h;
94 /* Optionally set blend mode. */
96 ret = SDL_SetSurfaceBlendMode( face, (SDL_BlendMode)mode );
97 SDLTest_AssertPass("Call to SDL_SetSurfaceBlendMode()");
98 SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceBlendMode(..., %i), expected: 0, got: %i", mode, ret);
101 /* Test blend mode. */
106 for (j=0; j <= nj; j+=4) {
107 for (i=0; i <= ni; i+=4) {
109 /* Set colour mod. */
110 ret = SDL_SetSurfaceColorMod( face, (255/nj)*j, (255/ni)*i, (255/nj)*j );
111 if (ret != 0) checkFailCount2++;
113 else if (mode == -3) {
115 ret = SDL_SetSurfaceAlphaMod( face, (255/ni)*i );
116 if (ret != 0) checkFailCount3++;
118 else if (mode == -4) {
119 /* Crazy blending mode magic. */
120 nmode = (i/4*j/4) % 4;
121 if (nmode==0) nmode = SDL_BLENDMODE_NONE;
122 else if (nmode==1) nmode = SDL_BLENDMODE_BLEND;
123 else if (nmode==2) nmode = SDL_BLENDMODE_ADD;
124 else if (nmode==3) nmode = SDL_BLENDMODE_MOD;
125 ret = SDL_SetSurfaceBlendMode( face, nmode );
126 if (ret != 0) checkFailCount4++;
132 ret = SDL_BlitSurface( face, NULL, testsurface, &rect );
133 if (ret != 0) checkFailCount1++;
136 SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_BlitSurface, expected: 0, got: %i", checkFailCount1);
137 SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetSurfaceColorMod, expected: 0, got: %i", checkFailCount2);
138 SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_SetSurfaceAlphaMod, expected: 0, got: %i", checkFailCount3);
139 SDLTest_AssertCheck(checkFailCount4 == 0, "Validate results from calls to SDL_SetSurfaceBlendMode, expected: 0, got: %i", checkFailCount4);
143 SDL_FreeSurface(face);
148 /* Helper to check that a file exists */
150 _AssertFileExist(const char *filename)
153 int ret = stat(filename, &st);
155 SDLTest_AssertCheck(ret == 0, "Verify file '%s' exists", filename);
159 /* Test case functions */
162 * @brief Tests sprite saving and loading
165 surface_testSaveLoadBitmap(void *arg)
168 const char *sampleFilename = "testSaveLoadBitmap.bmp";
172 /* Create sample surface */
173 face = SDLTest_ImageFace();
174 SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
175 if (face == NULL) return;
177 /* Delete test file; ignore errors */
178 unlink(sampleFilename);
181 ret = SDL_SaveBMP(face, sampleFilename);
182 SDLTest_AssertPass("Call to SDL_SaveBMP()");
183 SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SaveBMP, expected: 0, got: %i", ret);
184 _AssertFileExist(sampleFilename);
187 rface = SDL_LoadBMP(sampleFilename);
188 SDLTest_AssertPass("Call to SDL_LoadBMP()");
189 SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_LoadBMP is not NULL");
191 SDLTest_AssertCheck(face->w == rface->w, "Verify width of loaded surface, expected: %i, got: %i", face->w, rface->w);
192 SDLTest_AssertCheck(face->h == rface->h, "Verify height of loaded surface, expected: %i, got: %i", face->h, rface->h);
195 /* Delete test file; ignore errors */
196 unlink(sampleFilename);
200 SDL_FreeSurface(face);
204 SDL_FreeSurface(rface);
208 return TEST_COMPLETED;
212 * Tests surface conversion.
215 surface_testSurfaceConversion(void *arg)
217 SDL_Surface *rface = NULL, *face = NULL;
220 /* Create sample surface */
221 face = SDLTest_ImageFace();
222 SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
226 /* Set transparent pixel as the pixel at (0,0) */
227 if (face->format->palette) {
228 ret = SDL_SetColorKey(face, SDL_RLEACCEL, *(Uint8 *) face->pixels);
229 SDLTest_AssertPass("Call to SDL_SetColorKey()");
230 SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetColorKey, expected: 0, got: %i", ret);
233 /* Convert to 32 bit to compare. */
234 rface = SDL_ConvertSurface( face, testsurface->format, 0 );
235 SDLTest_AssertPass("Call to SDL_ConvertSurface()");
236 SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_ConvertSurface is not NULL");
238 /* Compare surface. */
239 ret = SDLTest_CompareSurfaces( rface, face, 0 );
240 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
244 SDL_FreeSurface( face );
248 SDL_FreeSurface( rface );
252 return TEST_COMPLETED;
257 * @brief Tests sprite loading. A failure case.
260 surface_testLoadFailure(void *arg)
262 SDL_Surface *face = SDL_LoadBMP("nonexistant.bmp");
263 SDLTest_AssertCheck(face == NULL, "SDL_CreateLoadBmp");
265 return TEST_COMPLETED;
269 * @brief Tests some blitting routines.
272 surface_testBlit(void *arg)
275 SDL_Surface *referenceSurface;
278 _testBlitBlendMode(-1);
280 /* Verify result by comparing surfaces */
281 referenceSurface = SDLTest_ImageBlit();
282 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
283 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
286 if (referenceSurface != NULL) {
287 SDL_FreeSurface( referenceSurface );
290 return TEST_COMPLETED;
294 * @brief Tests some blitting routines with color mod
297 surface_testBlitColorMod(void *arg)
300 SDL_Surface *referenceSurface;
302 /* Basic blitting with color mod */
303 _testBlitBlendMode(-2);
305 /* Verify result by comparing surfaces */
306 referenceSurface = SDLTest_ImageBlitColor();
307 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
308 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
311 if (referenceSurface != NULL) {
312 SDL_FreeSurface( referenceSurface );
315 return TEST_COMPLETED;
319 * @brief Tests some blitting routines with alpha mod
322 surface_testBlitAlphaMod(void *arg)
325 SDL_Surface *referenceSurface;
327 /* Basic blitting with alpha mod */
328 _testBlitBlendMode(-3);
330 /* Verify result by comparing surfaces */
331 referenceSurface = SDLTest_ImageBlitAlpha();
332 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
333 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
336 if (referenceSurface != NULL) {
337 SDL_FreeSurface( referenceSurface );
340 return TEST_COMPLETED;
345 * @brief Tests some more blitting routines.
348 surface_testBlitBlendNone(void *arg)
351 SDL_Surface *referenceSurface;
354 _testBlitBlendMode(SDL_BLENDMODE_NONE);
356 /* Verify result by comparing surfaces */
357 referenceSurface = SDLTest_ImageBlitBlendNone();
358 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
359 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
362 if (referenceSurface != NULL) {
363 SDL_FreeSurface( referenceSurface );
366 return TEST_COMPLETED;
370 * @brief Tests some more blitting routines.
373 surface_testBlitBlendBlend(void *arg)
376 SDL_Surface *referenceSurface;
379 _testBlitBlendMode(SDL_BLENDMODE_BLEND);
381 /* Verify result by comparing surfaces */
382 referenceSurface = SDLTest_ImageBlitBlend();
383 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
384 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
387 if (referenceSurface != NULL) {
388 SDL_FreeSurface( referenceSurface );
391 return TEST_COMPLETED;
395 * @brief Tests some more blitting routines.
398 surface_testBlitBlendAdd(void *arg)
401 SDL_Surface *referenceSurface;
404 _testBlitBlendMode(SDL_BLENDMODE_ADD);
406 /* Verify result by comparing surfaces */
407 referenceSurface = SDLTest_ImageBlitBlendAdd();
408 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
409 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
412 if (referenceSurface != NULL) {
413 SDL_FreeSurface( referenceSurface );
416 return TEST_COMPLETED;
420 * @brief Tests some more blitting routines.
423 surface_testBlitBlendMod(void *arg)
426 SDL_Surface *referenceSurface;
429 _testBlitBlendMode(SDL_BLENDMODE_MOD);
431 /* Verify result by comparing surfaces */
432 referenceSurface = SDLTest_ImageBlitBlendMod();
433 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
434 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
437 if (referenceSurface != NULL) {
438 SDL_FreeSurface( referenceSurface );
441 return TEST_COMPLETED;
445 * @brief Tests some more blitting routines with loop
448 surface_testBlitBlendLoop(void *arg) {
451 SDL_Surface *referenceSurface;
454 _testBlitBlendMode(-4);
456 /* Verify result by comparing surfaces */
457 referenceSurface = SDLTest_ImageBlitBlendAll();
458 ret = SDLTest_CompareSurfaces( testsurface, referenceSurface, 0 );
459 SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
462 if (referenceSurface != NULL) {
463 SDL_FreeSurface( referenceSurface );
466 return TEST_COMPLETED;
470 /* ================= Test References ================== */
472 /* Surface test cases */
473 static const SDLTest_TestCaseReference surfaceTest1 =
474 { (SDLTest_TestCaseFp)surface_testSaveLoadBitmap, "surface_testSaveLoadBitmap", "Tests sprite saving and loading.", TEST_ENABLED};
476 static const SDLTest_TestCaseReference surfaceTest2 =
477 { (SDLTest_TestCaseFp)surface_testBlit, "surface_testBlit", "Tests basic blitting.", TEST_ENABLED};
479 static const SDLTest_TestCaseReference surfaceTest3 =
480 { (SDLTest_TestCaseFp)surface_testBlitBlendNone, "surface_testBlitBlendNone", "Tests blitting routines with none blending mode.", TEST_ENABLED};
482 static const SDLTest_TestCaseReference surfaceTest4 =
483 { (SDLTest_TestCaseFp)surface_testLoadFailure, "surface_testLoadFailure", "Tests sprite loading. A failure case.", TEST_ENABLED};
485 static const SDLTest_TestCaseReference surfaceTest5 =
486 { (SDLTest_TestCaseFp)surface_testSurfaceConversion, "surface_testSurfaceConversion", "Tests surface conversion.", TEST_ENABLED};
488 static const SDLTest_TestCaseReference surfaceTest6 =
489 { (SDLTest_TestCaseFp)surface_testBlitColorMod, "surface_testBlitColorMod", "Tests some blitting routines with color mod.", TEST_ENABLED};
491 static const SDLTest_TestCaseReference surfaceTest7 =
492 { (SDLTest_TestCaseFp)surface_testBlitAlphaMod, "surface_testBlitAlphaMod", "Tests some blitting routines with alpha mod.", TEST_ENABLED};
494 static const SDLTest_TestCaseReference surfaceTest8 =
495 { (SDLTest_TestCaseFp)surface_testBlitBlendLoop, "surface_testBlitBlendLoop", "Test blittin routines with verious blending modes", TEST_ENABLED};
497 static const SDLTest_TestCaseReference surfaceTest9 =
498 { (SDLTest_TestCaseFp)surface_testBlitBlendBlend, "surface_testBlitBlendBlend", "Tests blitting routines with blend blending mode.", TEST_ENABLED};
500 static const SDLTest_TestCaseReference surfaceTest10 =
501 { (SDLTest_TestCaseFp)surface_testBlitBlendAdd, "surface_testBlitBlendAdd", "Tests blitting routines with add blending mode.", TEST_ENABLED};
503 static const SDLTest_TestCaseReference surfaceTest11 =
504 { (SDLTest_TestCaseFp)surface_testBlitBlendMod, "surface_testBlitBlendMod", "Tests blitting routines with mod blending mode.", TEST_ENABLED};
506 /* Sequence of Surface test cases */
507 static const SDLTest_TestCaseReference *surfaceTests[] = {
508 &surfaceTest1, &surfaceTest2, &surfaceTest3, &surfaceTest4, &surfaceTest5,
509 &surfaceTest6, &surfaceTest7, &surfaceTest8, &surfaceTest9, &surfaceTest10, &surfaceTest11, NULL
512 /* Surface test suite (global) */
513 SDLTest_TestSuiteReference surfaceTestSuite = {