From e89d876fc61a17567d28ead9e0c1c5a9aa34000a Mon Sep 17 00:00:00 2001 From: Markus Kauppila Date: Sat, 13 Aug 2011 19:00:39 +0300 Subject: [PATCH] Ported tests from "./tests/automated/render" --- .../tests/testdummy/testdummy.c | 3 +- .../tests/testrender/testrender.c | 788 +++++++++++++++++- 2 files changed, 785 insertions(+), 6 deletions(-) diff --git a/test/test-automation/tests/testdummy/testdummy.c b/test/test-automation/tests/testdummy/testdummy.c index 2735296eb..e99b406b5 100644 --- a/test/test-automation/tests/testdummy/testdummy.c +++ b/test/test-automation/tests/testdummy/testdummy.c @@ -141,7 +141,6 @@ dummycase2(void *arg) void dummycase3(void *arg) { - while(0); - //AssertTrue(1, "Assert message"); + AssertTrue(RandomUint8() != 100, "Value is 100"); } diff --git a/test/test-automation/tests/testrender/testrender.c b/test/test-automation/tests/testrender/testrender.c index f5f896e0d..e1a0d0afc 100644 --- a/test/test-automation/tests/testrender/testrender.c +++ b/test/test-automation/tests/testrender/testrender.c @@ -9,7 +9,13 @@ #include "../../include/SDL_test.h" +#define SCREEN_W 80 +#define SCREEN_H 60 +#define FACE_W img_face.width +#define FACE_H img_face.height + +static SDL_Renderer *renderer; /*! * Note: Port tests from "/test/automated/render" here @@ -23,9 +29,31 @@ static const TestCaseReference test1 = static const TestCaseReference test2 = (TestCaseReference){ "render_testCreateRenderer", "Tests SDL_CreateRenderer", TEST_ENABLED, 0, 0 }; +static const TestCaseReference test3 = + (TestCaseReference){ "render_testPrimitives", "Tests rendering primitives", TEST_ENABLED, 0, 0 }; + +static const TestCaseReference test4 = + (TestCaseReference){ "render_testPrimitivesBlend", "Tests rendering primitives with blending", TEST_ENABLED, 0, 0 }; + +static const TestCaseReference test5 = + (TestCaseReference){ "render_testBlit", "Tests blitting", TEST_ENABLED, 0, 0 }; + +static const TestCaseReference test6 = + (TestCaseReference){ "render_testBlitColour", "Tests blitting with color", TEST_ENABLED, 0, 0 }; + +static const TestCaseReference test7 = + (TestCaseReference){ "render_testBlitAlpha", "Tests blitting with alpha", TEST_ENABLED, 0, 0 }; + +static const TestCaseReference test8 = + (TestCaseReference){ "render_testBlitBlend", "Tests blitting with blending", TEST_ENABLED, 0, 0 }; + + + + + /* Test suite */ extern const TestCaseReference *testSuite[] = { - &test1, &test2, NULL + &test1, &test2, &test3, &test4, &test5, &test6, &test7, &test8, NULL }; TestCaseReference **QueryTestSuite() { @@ -38,15 +66,20 @@ void SetUp(void *arg) { /* Start SDL. */ - int ret = SDL_Init( SDL_INIT_VIDEO ); + int ret = SDL_InitSubSystem( SDL_INIT_VIDEO ); AssertTrue(ret==0, "SDL_Init(SDL_INIT_VIDEO): %s", SDL_GetError()); + + SDL_Window *w = SDL_CreateWindow( "title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, + 80, 60, SDL_WINDOW_SHOWN ); + //if (SDL_ATassert( "SDL_CreateWindow", w!=NULL )) + renderer = SDL_CreateRenderer(w, 0, 0 ); } void TearDown(void *arg) { - /* Quit SDL. */ - SDL_Quit(); + /* Quit SDL video */ + SDL_QuitSubSystem(SDL_INIT_VIDEO); } /** @@ -91,3 +124,750 @@ render_testCreateRenderer(void *arg) AssertFail("Could not create window: %s", SDL_GetError()); } } + + + +/** + * @brief Compares screen pixels with image pixels. + * + * @param msg Message on failure. + * @param s Image to compare against. + * @return 0 on success. + */ +static void render_compare( const char *msg, const SurfaceImage_t *s, int allowable_error ) +{ + int ret; + SDL_Rect rect; + Uint8 pix[4*80*60]; + SDL_Surface *testsur; + + /* Read pixels. */ + /* Explicitly specify the rect in case the window isn't expected size... */ + rect.x = 0; + rect.y = 0; + rect.w = 80; + rect.h = 60; + ret = SDL_RenderReadPixels(renderer, &rect, FORMAT, pix, 80*4 ); + AssertEquals(ret, 0, "SDL_RenderReadPixels failed"); + + /* Create surface. */ + testsur = SDL_CreateRGBSurfaceFrom( pix, 80, 60, 32, 80*4, + RMASK, GMASK, BMASK, AMASK); + AssertTrue(testsur!=NULL, "SDL_CreateRGBSurface failed"); + /* Compare surface. */ + ret = surface_compare( testsur, s, allowable_error ); + AssertEquals(ret, 0, "surface_compare failed"); + + /* Clean up. */ + SDL_FreeSurface( testsur ); +} + +/** + * @brief Checks to see if functionality is supported. + */ +static int render_isSupported( int code ) +{ + return (code == 0); +} + + +/** + * @brief Test to see if we can vary the draw colour. + */ +static int render_hasDrawColor (void) +{ + int ret, fail; + Uint8 r, g, b, a; + + fail = 0; + + /* Set colour. */ + ret = SDL_SetRenderDrawColor(renderer, 100, 100, 100, 100 ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a ); + if (!render_isSupported(ret)) + fail = 1; + /* Restore natural. */ + ret = SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE ); + if (!render_isSupported(ret)) + fail = 1; + + /* Something failed, consider not available. */ + if (fail) + return 0; + /* Not set properly, consider failed. */ + else if ((r != 100) || (g != 100) || (b != 100) || (a != 100)) + return 0; + return 1; +} + + +/** + * @brief Test to see if we can vary the blend mode. + */ +static int render_hasBlendModes (void) +{ + int fail; + int ret; + SDL_BlendMode mode; + + fail = 0; + + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawBlendMode(renderer, &mode ); + if (!render_isSupported(ret)) + fail = 1; + ret = (mode != SDL_BLENDMODE_BLEND); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawBlendMode(renderer, &mode ); + if (!render_isSupported(ret)) + fail = 1; + ret = (mode != SDL_BLENDMODE_ADD); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_MOD ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawBlendMode(renderer, &mode ); + if (!render_isSupported(ret)) + fail = 1; + ret = (mode != SDL_BLENDMODE_MOD); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetRenderDrawBlendMode(renderer, &mode ); + if (!render_isSupported(ret)) + fail = 1; + ret = (mode != SDL_BLENDMODE_NONE); + if (!render_isSupported(ret)) + fail = 1; + + return !fail; +} + + +/** + * @brief Loads the test face. + */ +static SDL_Texture * render_loadTestFace (void) +{ + SDL_Surface *face; + SDL_Texture *tface; + + /* Create face surface. */ + face = SDL_CreateRGBSurfaceFrom( (void*)img_face.pixel_data, + img_face.width, img_face.height, 32, img_face.width*4, +#if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + 0xff000000, /* Red bit mask. */ + 0x00ff0000, /* Green bit mask. */ + 0x0000ff00, /* Blue bit mask. */ + 0x000000ff /* Alpha bit mask. */ +#else + 0x000000ff, /* Red bit mask. */ + 0x0000ff00, /* Green bit mask. */ + 0x00ff0000, /* Blue bit mask. */ + 0xff000000 /* Alpha bit mask. */ +#endif + ); + if (face == NULL) + return 0; + tface = SDL_CreateTextureFromSurface(renderer, face); + SDL_FreeSurface(face); + + return tface; +} + + +/** + * @brief Test to see if can set texture colour mode. + */ +static int render_hasTexColor (void) +{ + int fail; + int ret; + SDL_Texture *tface; + Uint8 r, g, b; + + /* Get test face. */ + tface = render_loadTestFace(); + if (tface == 0) + return 0; + + /* See if supported. */ + fail = 0; + ret = SDL_SetTextureColorMod( tface, 100, 100, 100 ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetTextureColorMod( tface, &r, &g, &b ); + if (!render_isSupported(ret)) + fail = 1; + + /* Clean up. */ + SDL_DestroyTexture( tface ); + + if (fail) + return 0; + else if ((r != 100) || (g != 100) || (b != 100)) + return 0; + return 1; +} + + +/** + * @brief Test to see if we can vary the alpha of the texture. + */ +static int render_hasTexAlpha (void) +{ + int fail; + int ret; + SDL_Texture *tface; + Uint8 a; + + /* Get test face. */ + tface = render_loadTestFace(); + if (tface == 0) + return 0; + + /* See if supported. */ + fail = 0; + ret = SDL_SetTextureAlphaMod( tface, 100 ); + if (!render_isSupported(ret)) + fail = 1; + ret = SDL_GetTextureAlphaMod( tface, &a ); + if (!render_isSupported(ret)) + fail = 1; + + /* Clean up. */ + SDL_DestroyTexture( tface ); + + if (fail) + return 0; + else if (a != 100) + return 0; + return 1; +} + + +/** + * @brief Tests the SDL primitives for rendering. + * + * \sa + * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawColor + * http://wiki.libsdl.org/moin.cgi/SDL_RenderFillRect + * http://wiki.libsdl.org/moin.cgi/SDL_RenderDrawLine + * + */ +int render_testPrimitives (void *arg) +{ + int ret; + int x, y; + SDL_Rect rect; + + + /* Need drawcolour or just skip test. */ + AssertTrue(render_hasDrawColor(), "hasDrawColor"); + + /* Draw a rectangle. */ + rect.x = 40; + rect.y = 0; + rect.w = 40; + rect.h = 80; + + ret = SDL_SetRenderDrawColor(renderer, 13, 73, 200, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderFillRect(renderer, &rect ); + AssertEquals(ret, 0,"SDL_RenderFillRect"); + + /* Draw a rectangle. */ + rect.x = 10; + rect.y = 10; + rect.w = 60; + rect.h = 40; + ret = SDL_SetRenderDrawColor(renderer, 200, 0, 100, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderFillRect(renderer, &rect ); + AssertEquals(ret, 0, "SDL_RenderFillRect"); + + /* Draw some points like so: + * X.X.X.X.. + * .X.X.X.X. + * X.X.X.X.. */ + for (y=0; y<3; y++) { + x = y % 2; + for (; x<80; x+=2) { + ret = SDL_SetRenderDrawColor(renderer, x*y, x*y/2, x*y/3, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderDrawPoint(renderer, x, y ); + AssertEquals(ret, 0, "SDL_RenderDrawPoint"); + } + } + + /* Draw some lines. */ + ret = SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderDrawLine(renderer, 0, 30, 80, 30 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + ret = SDL_SetRenderDrawColor(renderer, 55, 55, 5, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderDrawLine(renderer, 40, 30, 40, 60 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + ret = SDL_SetRenderDrawColor(renderer, 5, 105, 105, SDL_ALPHA_OPAQUE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor"); + + ret = SDL_RenderDrawLine(renderer, 0, 0, 29, 29 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + ret = SDL_RenderDrawLine(renderer, 29, 30, 0, 59 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + ret = SDL_RenderDrawLine(renderer, 79, 0, 50, 29 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + ret = SDL_RenderDrawLine(renderer, 79, 59, 50, 30 ); + AssertEquals(ret, 0, "SDL_RenderDrawLine"); + + /* See if it's the same. */ + render_compare( "Primitives output not the same.", &img_primitives, ALLOWABLE_ERROR_OPAQUE ); +} + + +/** + * @brief Tests the SDL primitives with alpha for rendering. + */ +int render_testPrimitivesBlend (void *arg) +{ + int ret; + int i, j; + SDL_Rect rect; + + /* Need drawcolour and blendmode or just skip test. */ + AssertTrue(render_hasDrawColor(), "render_hasDrawColor"); + AssertTrue(render_hasBlendModes(), "render_hasDrawColor"); + + /* Create some rectangles for each blend mode. */ + ret = SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0 ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor" ); + + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawBlendMode" ); + + ret = SDL_RenderFillRect(renderer, NULL ); + AssertEquals(ret, 0, "SDL_RenderFillRect" ); + + rect.x = 10; + rect.y = 25; + rect.w = 40; + rect.h = 25; + ret = SDL_SetRenderDrawColor(renderer, 240, 10, 10, 75 ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor" ); + + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD ); + AssertEquals(ret, 0, "SDL_SetRenderDrawBlendMode" ); + + ret = SDL_RenderFillRect(renderer, &rect ); + AssertEquals(ret, 0, "SDL_RenderFillRect" ); + + rect.x = 30; + rect.y = 40; + rect.w = 45; + rect.h = 15; + ret = SDL_SetRenderDrawColor(renderer, 10, 240, 10, 100 ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor" ); + + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND ); + AssertEquals(ret, 0, "SDL_SetRenderDrawBlendMode" ); + + ret = SDL_RenderFillRect(renderer, &rect ); + AssertEquals(ret, 0, "SDL_RenderFillRect" ); + + rect.x = 25; + rect.y = 25; + rect.w = 25; + rect.h = 25; + ret = SDL_SetRenderDrawColor(renderer, 10, 10, 240, 125 ); + AssertEquals(ret, 0, "SDL_SetRenderDrawColor" ); + + ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE ); + AssertEquals(ret, 0, "SDL_SetRenderDrawBlendMode" ); + + ret = SDL_RenderFillRect(renderer, &rect ); + AssertEquals(ret, 0, "SDL_RenderFillRect" ); + + + /* Draw blended lines, lines for everyone. */ + for (i=0; i