Home | History | Annotate | Download | only in test
      1 /**
      2  * Original code: automated SDL rect test written by Edgar Simo "bobbens"
      3  * New/updated tests: aschiffler at ferzkopp dot net
      4  */
      5 
      6 #include <stdio.h>
      7 
      8 #include "SDL.h"
      9 #include "SDL_test.h"
     10 
     11 /* ================= Test Case Implementation ================== */
     12 
     13 /* Helper functions */
     14 
     15 /* !
     16  * \brief Private helper to check SDL_IntersectRectAndLine results
     17  */
     18 void _validateIntersectRectAndLineResults(
     19     SDL_bool intersection, SDL_bool expectedIntersection,
     20     SDL_Rect *rect, SDL_Rect * refRect,
     21     int x1, int y1, int x2, int y2,
     22     int x1Ref, int y1Ref, int x2Ref, int y2Ref)
     23 {
     24     SDLTest_AssertCheck(intersection == expectedIntersection,
     25         "Check for correct intersection result: expected %s, got %s intersecting rect (%d,%d,%d,%d) with line (%d,%d - %d,%d)",
     26         (expectedIntersection == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
     27         (intersection == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
     28         refRect->x, refRect->y, refRect->w, refRect->h,
     29         x1Ref, y1Ref, x2Ref, y2Ref);
     30     SDLTest_AssertCheck(rect->x == refRect->x && rect->y == refRect->y && rect->w == refRect->w && rect->h == refRect->h,
     31         "Check that source rectangle was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
     32         rect->x, rect->y, rect->w, rect->h,
     33         refRect->x, refRect->y, refRect->w, refRect->h);
     34     SDLTest_AssertCheck(x1 == x1Ref && y1 == y1Ref && x2 == x2Ref && y2 == y2Ref,
     35         "Check if line was incorrectly clipped or modified: got (%d,%d - %d,%d) expected (%d,%d - %d,%d)",
     36         x1, y1, x2, y2,
     37         x1Ref, y1Ref, x2Ref, y2Ref);
     38 }
     39 
     40 /* Test case functions */
     41 
     42 /* !
     43  * \brief Tests SDL_IntersectRectAndLine() clipping cases
     44  *
     45  * \sa
     46  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRectAndLine
     47  */
     48 int
     49 rect_testIntersectRectAndLine (void *arg)
     50 {
     51     SDL_Rect refRect = { 0, 0, 32, 32 };
     52     SDL_Rect rect;
     53     int x1, y1;
     54     int x2, y2;
     55     SDL_bool intersected;
     56 
     57     int xLeft = -SDLTest_RandomIntegerInRange(1, refRect.w);
     58     int xRight = refRect.w + SDLTest_RandomIntegerInRange(1, refRect.w);
     59     int yTop = -SDLTest_RandomIntegerInRange(1, refRect.h);
     60     int yBottom = refRect.h + SDLTest_RandomIntegerInRange(1, refRect.h);
     61 
     62     x1 = xLeft;
     63     y1 = 15;
     64     x2 = xRight;
     65     y2 = 15;
     66     rect = refRect;
     67     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
     68     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 0, 15, 31, 15);
     69 
     70     x1 = 15;
     71     y1 = yTop;
     72     x2 = 15;
     73     y2 = yBottom;
     74     rect = refRect;
     75     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
     76     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 15, 0, 15, 31);
     77 
     78     x1 = -refRect.w;
     79     y1 = -refRect.h;
     80     x2 = 2*refRect.w;
     81     y2 = 2*refRect.h;
     82     rect = refRect;
     83     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
     84      _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 0, 0, 31, 31);
     85 
     86     x1 = 2*refRect.w;
     87     y1 = 2*refRect.h;
     88     x2 = -refRect.w;
     89     y2 = -refRect.h;
     90     rect = refRect;
     91     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
     92     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 31, 31, 0, 0);
     93 
     94     x1 = -1;
     95     y1 = 32;
     96     x2 = 32;
     97     y2 = -1;
     98     rect = refRect;
     99     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    100     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 0, 31, 31, 0);
    101 
    102     x1 = 32;
    103     y1 = -1;
    104     x2 = -1;
    105     y2 = 32;
    106     rect = refRect;
    107     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    108     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, 31, 0, 0, 31);
    109 
    110     return TEST_COMPLETED;
    111 }
    112 
    113 /* !
    114  * \brief Tests SDL_IntersectRectAndLine() non-clipping case line inside
    115  *
    116  * \sa
    117  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRectAndLine
    118  */
    119 int
    120 rect_testIntersectRectAndLineInside (void *arg)
    121 {
    122     SDL_Rect refRect = { 0, 0, 32, 32 };
    123     SDL_Rect rect;
    124     int x1, y1;
    125     int x2, y2;
    126     SDL_bool intersected;
    127 
    128     int xmin = refRect.x;
    129     int xmax = refRect.x + refRect.w - 1;
    130     int ymin = refRect.y;
    131     int ymax = refRect.y + refRect.h - 1;
    132     int x1Ref = SDLTest_RandomIntegerInRange(xmin + 1, xmax - 1);
    133     int y1Ref = SDLTest_RandomIntegerInRange(ymin + 1, ymax - 1);
    134     int x2Ref = SDLTest_RandomIntegerInRange(xmin + 1, xmax - 1);
    135     int y2Ref = SDLTest_RandomIntegerInRange(ymin + 1, ymax - 1);
    136 
    137     x1 = x1Ref;
    138     y1 = y1Ref;
    139     x2 = x2Ref;
    140     y2 = y2Ref;
    141     rect = refRect;
    142     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    143     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, x2Ref, y2Ref);
    144 
    145     x1 = x1Ref;
    146     y1 = y1Ref;
    147     x2 = xmax;
    148     y2 = ymax;
    149     rect = refRect;
    150     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    151     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, xmax, ymax);
    152 
    153     x1 = xmin;
    154     y1 = ymin;
    155     x2 = x2Ref;
    156     y2 = y2Ref;
    157     rect = refRect;
    158     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    159     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, xmin, ymin, x2Ref, y2Ref);
    160 
    161     x1 = xmin;
    162     y1 = ymin;
    163     x2 = xmax;
    164     y2 = ymax;
    165     rect = refRect;
    166     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    167     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, xmin, ymin, xmax, ymax);
    168 
    169     x1 = xmin;
    170     y1 = ymax;
    171     x2 = xmax;
    172     y2 = ymin;
    173     rect = refRect;
    174     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    175     _validateIntersectRectAndLineResults(intersected, SDL_TRUE, &rect, &refRect, x1, y1, x2, y2, xmin, ymax, xmax, ymin);
    176 
    177     return TEST_COMPLETED;
    178 }
    179 
    180 /* !
    181  * \brief Tests SDL_IntersectRectAndLine() non-clipping cases outside
    182  *
    183  * \sa
    184  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRectAndLine
    185  */
    186 int
    187 rect_testIntersectRectAndLineOutside (void *arg)
    188 {
    189     SDL_Rect refRect = { 0, 0, 32, 32 };
    190     SDL_Rect rect;
    191     int x1, y1;
    192     int x2, y2;
    193     SDL_bool intersected;
    194 
    195     int xLeft = -SDLTest_RandomIntegerInRange(1, refRect.w);
    196     int xRight = refRect.w + SDLTest_RandomIntegerInRange(1, refRect.w);
    197     int yTop = -SDLTest_RandomIntegerInRange(1, refRect.h);
    198     int yBottom = refRect.h + SDLTest_RandomIntegerInRange(1, refRect.h);
    199 
    200     x1 = xLeft;
    201     y1 = 0;
    202     x2 = xLeft;
    203     y2 = 31;
    204     rect = refRect;
    205     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    206     _validateIntersectRectAndLineResults(intersected, SDL_FALSE, &rect, &refRect, x1, y1, x2, y2, xLeft, 0, xLeft, 31);
    207 
    208     x1 = xRight;
    209     y1 = 0;
    210     x2 = xRight;
    211     y2 = 31;
    212     rect = refRect;
    213     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    214     _validateIntersectRectAndLineResults(intersected, SDL_FALSE, &rect, &refRect, x1, y1, x2, y2, xRight, 0, xRight, 31);
    215 
    216     x1 = 0;
    217     y1 = yTop;
    218     x2 = 31;
    219     y2 = yTop;
    220     rect = refRect;
    221     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    222     _validateIntersectRectAndLineResults(intersected, SDL_FALSE, &rect, &refRect, x1, y1, x2, y2, 0, yTop, 31, yTop);
    223 
    224     x1 = 0;
    225     y1 = yBottom;
    226     x2 = 31;
    227     y2 = yBottom;
    228     rect = refRect;
    229     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    230     _validateIntersectRectAndLineResults(intersected, SDL_FALSE, &rect, &refRect, x1, y1, x2, y2, 0, yBottom, 31, yBottom);
    231 
    232     return TEST_COMPLETED;
    233 }
    234 
    235 /* !
    236  * \brief Tests SDL_IntersectRectAndLine() with empty rectangle
    237  *
    238  * \sa
    239  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRectAndLine
    240  */
    241 int
    242 rect_testIntersectRectAndLineEmpty (void *arg)
    243 {
    244     SDL_Rect refRect;
    245     SDL_Rect rect;
    246     int x1, y1, x1Ref, y1Ref;
    247     int x2, y2, x2Ref, y2Ref;
    248     SDL_bool intersected;
    249 
    250     refRect.x = SDLTest_RandomIntegerInRange(1, 1024);
    251     refRect.y = SDLTest_RandomIntegerInRange(1, 1024);
    252     refRect.w = 0;
    253     refRect.h = 0;
    254     x1Ref = refRect.x;
    255     y1Ref = refRect.y;
    256     x2Ref = SDLTest_RandomIntegerInRange(1, 1024);
    257     y2Ref = SDLTest_RandomIntegerInRange(1, 1024);
    258 
    259     x1 = x1Ref;
    260     y1 = y1Ref;
    261     x2 = x2Ref;
    262     y2 = y2Ref;
    263     rect = refRect;
    264     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    265     _validateIntersectRectAndLineResults(intersected, SDL_FALSE, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, x2Ref, y2Ref);
    266 
    267     return TEST_COMPLETED;
    268 }
    269 
    270 /* !
    271  * \brief Negative tests against SDL_IntersectRectAndLine() with invalid parameters
    272  *
    273  * \sa
    274  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRectAndLine
    275  */
    276 int
    277 rect_testIntersectRectAndLineParam (void *arg)
    278 {
    279     SDL_Rect rect = { 0, 0, 32, 32 };
    280     int x1 = rect.w / 2;
    281     int y1 = rect.h / 2;
    282     int x2 = x1;
    283     int y2 = 2 * rect.h;
    284     SDL_bool intersected;
    285 
    286     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, &y2);
    287     SDLTest_AssertCheck(intersected == SDL_TRUE, "Check that intersection result was SDL_TRUE");
    288 
    289     intersected = SDL_IntersectRectAndLine((SDL_Rect *)NULL, &x1, &y1, &x2, &y2);
    290     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when 1st parameter is NULL");
    291     intersected = SDL_IntersectRectAndLine(&rect, (int *)NULL, &y1, &x2, &y2);
    292     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when 2nd parameter is NULL");
    293     intersected = SDL_IntersectRectAndLine(&rect, &x1, (int *)NULL, &x2, &y2);
    294     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when 3rd parameter is NULL");
    295     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, (int *)NULL, &y2);
    296     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when 4th parameter is NULL");
    297     intersected = SDL_IntersectRectAndLine(&rect, &x1, &y1, &x2, (int *)NULL);
    298     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when 5th parameter is NULL");
    299     intersected = SDL_IntersectRectAndLine((SDL_Rect *)NULL, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL);
    300     SDLTest_AssertCheck(intersected == SDL_FALSE, "Check that function returns SDL_FALSE when all parameters are NULL");
    301 
    302     return TEST_COMPLETED;
    303 }
    304 
    305 /* !
    306  * \brief Private helper to check SDL_HasIntersection results
    307  */
    308 void _validateHasIntersectionResults(
    309     SDL_bool intersection, SDL_bool expectedIntersection,
    310     SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB)
    311 {
    312     SDLTest_AssertCheck(intersection == expectedIntersection,
    313         "Check intersection result: expected %s, got %s intersecting A (%d,%d,%d,%d) with B (%d,%d,%d,%d)",
    314         (expectedIntersection == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    315         (intersection == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    316         rectA->x, rectA->y, rectA->w, rectA->h,
    317         rectB->x, rectB->y, rectB->w, rectB->h);
    318     SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
    319         "Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    320         rectA->x, rectA->y, rectA->w, rectA->h,
    321         refRectA->x, refRectA->y, refRectA->w, refRectA->h);
    322     SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
    323         "Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    324         rectB->x, rectB->y, rectB->w, rectB->h,
    325         refRectB->x, refRectB->y, refRectB->w, refRectB->h);
    326 }
    327 
    328 /* !
    329  * \brief Private helper to check SDL_IntersectRect results
    330  */
    331 void _validateIntersectRectResults(
    332     SDL_bool intersection, SDL_bool expectedIntersection,
    333     SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB,
    334     SDL_Rect *result, SDL_Rect *expectedResult)
    335 {
    336     _validateHasIntersectionResults(intersection, expectedIntersection, rectA, rectB, refRectA, refRectB);
    337     if (result && expectedResult) {
    338         SDLTest_AssertCheck(result->x == expectedResult->x && result->y == expectedResult->y && result->w == expectedResult->w && result->h == expectedResult->h,
    339             "Check that intersection of rectangles A (%d,%d,%d,%d) and B (%d,%d,%d,%d) was correctly calculated, got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    340             rectA->x, rectA->y, rectA->w, rectA->h,
    341             rectB->x, rectB->y, rectB->w, rectB->h,
    342             result->x, result->y, result->w, result->h,
    343             expectedResult->x, expectedResult->y, expectedResult->w, expectedResult->h);
    344     }
    345 }
    346 
    347 /* !
    348  * \brief Private helper to check SDL_UnionRect results
    349  */
    350 void _validateUnionRectResults(
    351     SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB,
    352     SDL_Rect *result, SDL_Rect *expectedResult)
    353 {
    354     SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
    355         "Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    356         rectA->x, rectA->y, rectA->w, rectA->h,
    357         refRectA->x, refRectA->y, refRectA->w, refRectA->h);
    358     SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
    359         "Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    360         rectB->x, rectB->y, rectB->w, rectB->h,
    361         refRectB->x, refRectB->y, refRectB->w, refRectB->h);
    362     SDLTest_AssertCheck(result->x == expectedResult->x && result->y == expectedResult->y && result->w == expectedResult->w && result->h == expectedResult->h,
    363         "Check that union of rectangles A (%d,%d,%d,%d) and B (%d,%d,%d,%d) was correctly calculated, got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    364         rectA->x, rectA->y, rectA->w, rectA->h,
    365         rectB->x, rectB->y, rectB->w, rectB->h,
    366         result->x, result->y, result->w, result->h,
    367         expectedResult->x, expectedResult->y, expectedResult->w, expectedResult->h);
    368 }
    369 
    370 /* !
    371  * \brief Private helper to check SDL_RectEmpty results
    372  */
    373 void _validateRectEmptyResults(
    374     SDL_bool empty, SDL_bool expectedEmpty,
    375     SDL_Rect *rect, SDL_Rect *refRect)
    376 {
    377     SDLTest_AssertCheck(empty == expectedEmpty,
    378         "Check for correct empty result: expected %s, got %s testing (%d,%d,%d,%d)",
    379         (expectedEmpty == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    380         (empty == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    381         rect->x, rect->y, rect->w, rect->h);
    382     SDLTest_AssertCheck(rect->x == refRect->x && rect->y == refRect->y && rect->w == refRect->w && rect->h == refRect->h,
    383         "Check that source rectangle was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    384         rect->x, rect->y, rect->w, rect->h,
    385         refRect->x, refRect->y, refRect->w, refRect->h);
    386 }
    387 
    388 /* !
    389  * \brief Private helper to check SDL_RectEquals results
    390  */
    391 void _validateRectEqualsResults(
    392     SDL_bool equals, SDL_bool expectedEquals,
    393     SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB)
    394 {
    395     SDLTest_AssertCheck(equals == expectedEquals,
    396         "Check for correct equals result: expected %s, got %s testing (%d,%d,%d,%d) and (%d,%d,%d,%d)",
    397         (expectedEquals == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    398         (equals == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    399         rectA->x, rectA->y, rectA->w, rectA->h,
    400         rectB->x, rectB->y, rectB->w, rectB->h);
    401     SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
    402         "Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    403         rectA->x, rectA->y, rectA->w, rectA->h,
    404         refRectA->x, refRectA->y, refRectA->w, refRectA->h);
    405     SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
    406         "Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
    407         rectB->x, rectB->y, rectB->w, rectB->h,
    408         refRectB->x, refRectB->y, refRectB->w, refRectB->h);
    409 }
    410 
    411 /* !
    412  * \brief Tests SDL_IntersectRect() with B fully inside A
    413  *
    414  * \sa
    415  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    416  */
    417 int rect_testIntersectRectInside (void *arg)
    418 {
    419     SDL_Rect refRectA = { 0, 0, 32, 32 };
    420     SDL_Rect refRectB;
    421     SDL_Rect rectA;
    422     SDL_Rect rectB;
    423     SDL_Rect result;
    424     SDL_bool intersection;
    425 
    426     /* rectB fully contained in rectA */
    427     refRectB.x = 0;
    428     refRectB.y = 0;
    429     refRectB.w = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
    430     refRectB.h = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
    431     rectA = refRectA;
    432     rectB = refRectB;
    433     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    434     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &refRectB);
    435 
    436     return TEST_COMPLETED;
    437 }
    438 
    439 /* !
    440  * \brief Tests SDL_IntersectRect() with B fully outside A
    441  *
    442  * \sa
    443  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    444  */
    445 int rect_testIntersectRectOutside (void *arg)
    446 {
    447     SDL_Rect refRectA = { 0, 0, 32, 32 };
    448     SDL_Rect refRectB;
    449     SDL_Rect rectA;
    450     SDL_Rect rectB;
    451     SDL_Rect result;
    452     SDL_bool intersection;
    453 
    454     /* rectB fully outside of rectA */
    455     refRectB.x = refRectA.x + refRectA.w + SDLTest_RandomIntegerInRange(1, 10);
    456     refRectB.y = refRectA.y + refRectA.h + SDLTest_RandomIntegerInRange(1, 10);
    457     refRectB.w = refRectA.w;
    458     refRectB.h = refRectA.h;
    459     rectA = refRectA;
    460     rectB = refRectB;
    461     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    462     _validateIntersectRectResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    463 
    464     return TEST_COMPLETED;
    465 }
    466 
    467 /* !
    468  * \brief Tests SDL_IntersectRect() with B partially intersecting A
    469  *
    470  * \sa
    471  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    472  */
    473 int rect_testIntersectRectPartial (void *arg)
    474 {
    475     SDL_Rect refRectA = { 0, 0, 32, 32 };
    476     SDL_Rect refRectB;
    477     SDL_Rect rectA;
    478     SDL_Rect rectB;
    479     SDL_Rect result;
    480     SDL_Rect expectedResult;
    481     SDL_bool intersection;
    482 
    483     /* rectB partially contained in rectA */
    484     refRectB.x = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
    485     refRectB.y = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
    486     refRectB.w = refRectA.w;
    487     refRectB.h = refRectA.h;
    488     rectA = refRectA;
    489     rectB = refRectB;
    490     expectedResult.x = refRectB.x;
    491     expectedResult.y = refRectB.y;
    492     expectedResult.w = refRectA.w - refRectB.x;
    493     expectedResult.h = refRectA.h - refRectB.y;
    494     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    495     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
    496 
    497     /* rectB right edge */
    498     refRectB.x = rectA.w - 1;
    499     refRectB.y = rectA.y;
    500     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    501     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    502     rectA = refRectA;
    503     rectB = refRectB;
    504     expectedResult.x = refRectB.x;
    505     expectedResult.y = refRectB.y;
    506     expectedResult.w = 1;
    507     expectedResult.h = refRectB.h;
    508     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    509     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
    510 
    511     /* rectB left edge */
    512     refRectB.x = 1 - rectA.w;
    513     refRectB.y = rectA.y;
    514     refRectB.w = refRectA.w;
    515     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    516     rectA = refRectA;
    517     rectB = refRectB;
    518     expectedResult.x = 0;
    519     expectedResult.y = refRectB.y;
    520     expectedResult.w = 1;
    521     expectedResult.h = refRectB.h;
    522     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    523     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
    524 
    525     /* rectB bottom edge */
    526     refRectB.x = rectA.x;
    527     refRectB.y = rectA.h - 1;
    528     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    529     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    530     rectA = refRectA;
    531     rectB = refRectB;
    532     expectedResult.x = refRectB.x;
    533     expectedResult.y = refRectB.y;
    534     expectedResult.w = refRectB.w;
    535     expectedResult.h = 1;
    536     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    537     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
    538 
    539     /* rectB top edge */
    540     refRectB.x = rectA.x;
    541     refRectB.y = 1 - rectA.h;
    542     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    543     refRectB.h = rectA.h;
    544     rectA = refRectA;
    545     rectB = refRectB;
    546     expectedResult.x = refRectB.x;
    547     expectedResult.y = 0;
    548     expectedResult.w = refRectB.w;
    549     expectedResult.h = 1;
    550     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    551     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
    552 
    553     return TEST_COMPLETED;
    554 }
    555 
    556 /* !
    557  * \brief Tests SDL_IntersectRect() with 1x1 pixel sized rectangles
    558  *
    559  * \sa
    560  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    561  */
    562 int rect_testIntersectRectPoint (void *arg)
    563 {
    564     SDL_Rect refRectA = { 0, 0, 1, 1 };
    565     SDL_Rect refRectB = { 0, 0, 1, 1 };
    566     SDL_Rect rectA;
    567     SDL_Rect rectB;
    568     SDL_Rect result;
    569     SDL_bool intersection;
    570     int offsetX, offsetY;
    571 
    572     /* intersecting pixels */
    573     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    574     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    575     refRectB.x = refRectA.x;
    576     refRectB.y = refRectA.y;
    577     rectA = refRectA;
    578     rectB = refRectB;
    579     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    580     _validateIntersectRectResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB, &result, &refRectA);
    581 
    582     /* non-intersecting pixels cases */
    583     for (offsetX = -1; offsetX <= 1; offsetX++) {
    584         for (offsetY = -1; offsetY <= 1; offsetY++) {
    585             if (offsetX != 0 || offsetY != 0) {
    586                 refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    587                 refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    588                 refRectB.x = refRectA.x;
    589                 refRectB.y = refRectA.y;
    590                 refRectB.x += offsetX;
    591                 refRectB.y += offsetY;
    592                 rectA = refRectA;
    593                 rectB = refRectB;
    594                 intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    595                 _validateIntersectRectResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    596             }
    597         }
    598     }
    599 
    600     return TEST_COMPLETED;
    601 }
    602 
    603 /* !
    604  * \brief Tests SDL_IntersectRect() with empty rectangles
    605  *
    606  * \sa
    607  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    608  */
    609 int rect_testIntersectRectEmpty (void *arg)
    610 {
    611     SDL_Rect refRectA;
    612     SDL_Rect refRectB;
    613     SDL_Rect rectA;
    614     SDL_Rect rectB;
    615     SDL_Rect result;
    616     SDL_bool intersection;
    617     SDL_bool empty;
    618 
    619     /* Rect A empty */
    620     result.w = SDLTest_RandomIntegerInRange(1, 100);
    621     result.h = SDLTest_RandomIntegerInRange(1, 100);
    622     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    623     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    624     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    625     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    626     refRectB = refRectA;
    627     refRectA.w = 0;
    628     refRectA.h = 0;
    629     rectA = refRectA;
    630     rectB = refRectB;
    631     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    632     _validateIntersectRectResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    633     empty = (SDL_bool)SDL_RectEmpty(&result);
    634     SDLTest_AssertCheck(empty == SDL_TRUE, "Validate result is empty Rect; got: %s", (empty == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
    635 
    636     /* Rect B empty */
    637     result.w = SDLTest_RandomIntegerInRange(1, 100);
    638     result.h = SDLTest_RandomIntegerInRange(1, 100);
    639     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    640     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    641     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    642     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    643     refRectB = refRectA;
    644     refRectB.w = 0;
    645     refRectB.h = 0;
    646     rectA = refRectA;
    647     rectB = refRectB;
    648     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    649     _validateIntersectRectResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    650     empty = (SDL_bool)SDL_RectEmpty(&result);
    651     SDLTest_AssertCheck(empty == SDL_TRUE, "Validate result is empty Rect; got: %s", (empty == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
    652 
    653     /* Rect A and B empty */
    654     result.w = SDLTest_RandomIntegerInRange(1, 100);
    655     result.h = SDLTest_RandomIntegerInRange(1, 100);
    656     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    657     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    658     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    659     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    660     refRectB = refRectA;
    661     refRectA.w = 0;
    662     refRectA.h = 0;
    663     refRectB.w = 0;
    664     refRectB.h = 0;
    665     rectA = refRectA;
    666     rectB = refRectB;
    667     intersection = SDL_IntersectRect(&rectA, &rectB, &result);
    668     _validateIntersectRectResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    669     empty = (SDL_bool)SDL_RectEmpty(&result);
    670     SDLTest_AssertCheck(empty == SDL_TRUE, "Validate result is empty Rect; got: %s", (empty == SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
    671 
    672     return TEST_COMPLETED;
    673 }
    674 
    675 /* !
    676  * \brief Negative tests against SDL_IntersectRect() with invalid parameters
    677  *
    678  * \sa
    679  * http://wiki.libsdl.org/moin.cgi/SDL_IntersectRect
    680  */
    681 int rect_testIntersectRectParam(void *arg)
    682 {
    683     SDL_Rect rectA;
    684     SDL_Rect rectB;
    685     SDL_Rect result;
    686     SDL_bool intersection;
    687 
    688     /* invalid parameter combinations */
    689     intersection = SDL_IntersectRect((SDL_Rect *)NULL, &rectB, &result);
    690     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 1st parameter is NULL");
    691     intersection = SDL_IntersectRect(&rectA, (SDL_Rect *)NULL, &result);
    692     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 2st parameter is NULL");
    693     intersection = SDL_IntersectRect(&rectA, &rectB, (SDL_Rect *)NULL);
    694     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 3st parameter is NULL");
    695     intersection = SDL_IntersectRect((SDL_Rect *)NULL, (SDL_Rect *)NULL, &result);
    696     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 1st and 2nd parameters are NULL");
    697     intersection = SDL_IntersectRect((SDL_Rect *)NULL, &rectB, (SDL_Rect *)NULL);
    698     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 1st and 3rd parameters are NULL ");
    699     intersection = SDL_IntersectRect((SDL_Rect *)NULL, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
    700     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when all parameters are NULL");
    701 
    702     return TEST_COMPLETED;
    703 }
    704 
    705 /* !
    706  * \brief Tests SDL_HasIntersection() with B fully inside A
    707  *
    708  * \sa
    709  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    710  */
    711 int rect_testHasIntersectionInside (void *arg)
    712 {
    713     SDL_Rect refRectA = { 0, 0, 32, 32 };
    714     SDL_Rect refRectB;
    715     SDL_Rect rectA;
    716     SDL_Rect rectB;
    717     SDL_bool intersection;
    718 
    719     /* rectB fully contained in rectA */
    720     refRectB.x = 0;
    721     refRectB.y = 0;
    722     refRectB.w = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
    723     refRectB.h = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
    724     rectA = refRectA;
    725     rectB = refRectB;
    726     intersection = SDL_HasIntersection(&rectA, &rectB);
    727     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    728 
    729     return TEST_COMPLETED;
    730 }
    731 
    732 /* !
    733  * \brief Tests SDL_HasIntersection() with B fully outside A
    734  *
    735  * \sa
    736  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    737  */
    738 int rect_testHasIntersectionOutside (void *arg)
    739 {
    740     SDL_Rect refRectA = { 0, 0, 32, 32 };
    741     SDL_Rect refRectB;
    742     SDL_Rect rectA;
    743     SDL_Rect rectB;
    744     SDL_bool intersection;
    745 
    746     /* rectB fully outside of rectA */
    747     refRectB.x = refRectA.x + refRectA.w + SDLTest_RandomIntegerInRange(1, 10);
    748     refRectB.y = refRectA.y + refRectA.h + SDLTest_RandomIntegerInRange(1, 10);
    749     refRectB.w = refRectA.w;
    750     refRectB.h = refRectA.h;
    751     rectA = refRectA;
    752     rectB = refRectB;
    753     intersection = SDL_HasIntersection(&rectA, &rectB);
    754     _validateHasIntersectionResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB);
    755 
    756     return TEST_COMPLETED;
    757 }
    758 
    759 /* !
    760  * \brief Tests SDL_HasIntersection() with B partially intersecting A
    761  *
    762  * \sa
    763  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    764  */
    765 int rect_testHasIntersectionPartial (void *arg)
    766 {
    767     SDL_Rect refRectA = { 0, 0, 32, 32 };
    768     SDL_Rect refRectB;
    769     SDL_Rect rectA;
    770     SDL_Rect rectB;
    771     SDL_bool intersection;
    772 
    773     /* rectB partially contained in rectA */
    774     refRectB.x = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
    775     refRectB.y = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
    776     refRectB.w = refRectA.w;
    777     refRectB.h = refRectA.h;
    778     rectA = refRectA;
    779     rectB = refRectB;
    780     intersection = SDL_HasIntersection(&rectA, &rectB);
    781     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    782 
    783     /* rectB right edge */
    784     refRectB.x = rectA.w - 1;
    785     refRectB.y = rectA.y;
    786     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    787     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    788     rectA = refRectA;
    789     rectB = refRectB;
    790     intersection = SDL_HasIntersection(&rectA, &rectB);
    791     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    792 
    793     /* rectB left edge */
    794     refRectB.x = 1 - rectA.w;
    795     refRectB.y = rectA.y;
    796     refRectB.w = refRectA.w;
    797     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    798     rectA = refRectA;
    799     rectB = refRectB;
    800     intersection = SDL_HasIntersection(&rectA, &rectB);
    801     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    802 
    803     /* rectB bottom edge */
    804     refRectB.x = rectA.x;
    805     refRectB.y = rectA.h - 1;
    806     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    807     refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
    808     rectA = refRectA;
    809     rectB = refRectB;
    810     intersection = SDL_HasIntersection(&rectA, &rectB);
    811     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    812 
    813     /* rectB top edge */
    814     refRectB.x = rectA.x;
    815     refRectB.y = 1 - rectA.h;
    816     refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
    817     refRectB.h = rectA.h;
    818     rectA = refRectA;
    819     rectB = refRectB;
    820     intersection = SDL_HasIntersection(&rectA, &rectB);
    821     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    822 
    823     return TEST_COMPLETED;
    824 }
    825 
    826 /* !
    827  * \brief Tests SDL_HasIntersection() with 1x1 pixel sized rectangles
    828  *
    829  * \sa
    830  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    831  */
    832 int rect_testHasIntersectionPoint (void *arg)
    833 {
    834     SDL_Rect refRectA = { 0, 0, 1, 1 };
    835     SDL_Rect refRectB = { 0, 0, 1, 1 };
    836     SDL_Rect rectA;
    837     SDL_Rect rectB;
    838     SDL_bool intersection;
    839     int offsetX, offsetY;
    840 
    841     /* intersecting pixels */
    842     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    843     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    844     refRectB.x = refRectA.x;
    845     refRectB.y = refRectA.y;
    846     rectA = refRectA;
    847     rectB = refRectB;
    848     intersection = SDL_HasIntersection(&rectA, &rectB);
    849     _validateHasIntersectionResults(intersection, SDL_TRUE, &rectA, &rectB, &refRectA, &refRectB);
    850 
    851     /* non-intersecting pixels cases */
    852     for (offsetX = -1; offsetX <= 1; offsetX++) {
    853         for (offsetY = -1; offsetY <= 1; offsetY++) {
    854             if (offsetX != 0 || offsetY != 0) {
    855                 refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    856                 refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    857                 refRectB.x = refRectA.x;
    858                 refRectB.y = refRectA.y;
    859                 refRectB.x += offsetX;
    860                 refRectB.y += offsetY;
    861                 rectA = refRectA;
    862                 rectB = refRectB;
    863                 intersection = SDL_HasIntersection(&rectA, &rectB);
    864                 _validateHasIntersectionResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB);
    865             }
    866         }
    867     }
    868 
    869     return TEST_COMPLETED;
    870 }
    871 
    872 /* !
    873  * \brief Tests SDL_HasIntersection() with empty rectangles
    874  *
    875  * \sa
    876  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    877  */
    878 int rect_testHasIntersectionEmpty (void *arg)
    879 {
    880     SDL_Rect refRectA;
    881     SDL_Rect refRectB;
    882     SDL_Rect rectA;
    883     SDL_Rect rectB;
    884     SDL_bool intersection;
    885 
    886     /* Rect A empty */
    887     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    888     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    889     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    890     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    891     refRectB = refRectA;
    892     refRectA.w = 0;
    893     refRectA.h = 0;
    894     rectA = refRectA;
    895     rectB = refRectB;
    896     intersection = SDL_HasIntersection(&rectA, &rectB);
    897     _validateHasIntersectionResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB);
    898 
    899     /* Rect B empty */
    900     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    901     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    902     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    903     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    904     refRectB = refRectA;
    905     refRectB.w = 0;
    906     refRectB.h = 0;
    907     rectA = refRectA;
    908     rectB = refRectB;
    909     intersection = SDL_HasIntersection(&rectA, &rectB);
    910     _validateHasIntersectionResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB);
    911 
    912     /* Rect A and B empty */
    913     refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
    914     refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
    915     refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
    916     refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
    917     refRectB = refRectA;
    918     refRectA.w = 0;
    919     refRectA.h = 0;
    920     refRectB.w = 0;
    921     refRectB.h = 0;
    922     rectA = refRectA;
    923     rectB = refRectB;
    924     intersection = SDL_HasIntersection(&rectA, &rectB);
    925     _validateHasIntersectionResults(intersection, SDL_FALSE, &rectA, &rectB, &refRectA, &refRectB);
    926 
    927     return TEST_COMPLETED;
    928 }
    929 
    930 /* !
    931  * \brief Negative tests against SDL_HasIntersection() with invalid parameters
    932  *
    933  * \sa
    934  * http://wiki.libsdl.org/moin.cgi/SDL_HasIntersection
    935  */
    936 int rect_testHasIntersectionParam(void *arg)
    937 {
    938     SDL_Rect rectA;
    939     SDL_Rect rectB;
    940     SDL_bool intersection;
    941 
    942     /* invalid parameter combinations */
    943     intersection = SDL_HasIntersection((SDL_Rect *)NULL, &rectB);
    944     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 1st parameter is NULL");
    945     intersection = SDL_HasIntersection(&rectA, (SDL_Rect *)NULL);
    946     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when 2st parameter is NULL");
    947     intersection = SDL_HasIntersection((SDL_Rect *)NULL, (SDL_Rect *)NULL);
    948     SDLTest_AssertCheck(intersection == SDL_FALSE, "Check that function returns SDL_FALSE when all parameters are NULL");
    949 
    950     return TEST_COMPLETED;
    951 }
    952 
    953 /* !
    954  * \brief Test SDL_EnclosePoints() without clipping
    955  *
    956  * \sa
    957  * http://wiki.libsdl.org/moin.cgi/SDL_EnclosePoints
    958  */
    959 int rect_testEnclosePoints(void *arg)
    960 {
    961     const int numPoints = 16;
    962     SDL_Point refPoints[16];
    963     SDL_Point points[16];
    964     SDL_Rect result;
    965     SDL_bool anyEnclosed;
    966     SDL_bool anyEnclosedNoResult;
    967     SDL_bool expectedEnclosed = SDL_TRUE;
    968     int newx, newy;
    969     int minx = 0, maxx = 0, miny = 0, maxy = 0;
    970     int i;
    971 
    972     /* Create input data, tracking result */
    973     for (i=0; i<numPoints; i++) {
    974         newx = SDLTest_RandomIntegerInRange(-1024, 1024);
    975         newy = SDLTest_RandomIntegerInRange(-1024, 1024);
    976         refPoints[i].x = newx;
    977         refPoints[i].y = newy;
    978         points[i].x = newx;
    979         points[i].y = newy;
    980         if (i==0) {
    981             minx = newx;
    982             maxx = newx;
    983             miny = newy;
    984             maxy = newy;
    985         } else {
    986             if (newx < minx) minx = newx;
    987             if (newx > maxx) maxx = newx;
    988             if (newy < miny) miny = newy;
    989             if (newy > maxy) maxy = newy;
    990         }
    991     }
    992 
    993     /* Call function and validate - special case: no result requested */
    994     anyEnclosedNoResult = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)NULL, (SDL_Rect *)NULL);
    995     SDLTest_AssertCheck(expectedEnclosed==anyEnclosedNoResult,
    996         "Check expected return value %s, got %s",
    997         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
    998         (anyEnclosedNoResult==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
    999     for (i=0; i<numPoints; i++) {
   1000         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1001             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1002             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1003     }
   1004 
   1005     /* Call function and validate */
   1006     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)NULL, &result);
   1007     SDLTest_AssertCheck(expectedEnclosed==anyEnclosed,
   1008         "Check return value %s, got %s",
   1009         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1010         (anyEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1011     for (i=0; i<numPoints; i++) {
   1012         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1013             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1014             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1015     }
   1016     SDLTest_AssertCheck(result.x==minx && result.y==miny && result.w==(maxx - minx + 1) && result.h==(maxy - miny + 1),
   1017         "Resulting enclosing rectangle incorrect: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
   1018         minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
   1019 
   1020     return TEST_COMPLETED;
   1021 }
   1022 
   1023 /* !
   1024  * \brief Test SDL_EnclosePoints() with repeated input points
   1025  *
   1026  * \sa
   1027  * http://wiki.libsdl.org/moin.cgi/SDL_EnclosePoints
   1028  */
   1029 int rect_testEnclosePointsRepeatedInput(void *arg)
   1030 {
   1031     const int numPoints = 8;
   1032     const int halfPoints = 4;
   1033     SDL_Point refPoints[8];
   1034     SDL_Point points[8];
   1035     SDL_Rect result;
   1036     SDL_bool anyEnclosed;
   1037     SDL_bool anyEnclosedNoResult;
   1038     SDL_bool expectedEnclosed = SDL_TRUE;
   1039     int newx, newy;
   1040     int minx = 0, maxx = 0, miny = 0, maxy = 0;
   1041     int i;
   1042 
   1043     /* Create input data, tracking result */
   1044     for (i=0; i<numPoints; i++) {
   1045         if (i < halfPoints) {
   1046             newx = SDLTest_RandomIntegerInRange(-1024, 1024);
   1047             newy = SDLTest_RandomIntegerInRange(-1024, 1024);
   1048         } else {
   1049             newx = refPoints[i-halfPoints].x;
   1050             newy = refPoints[i-halfPoints].y;
   1051         }
   1052         refPoints[i].x = newx;
   1053         refPoints[i].y = newy;
   1054         points[i].x = newx;
   1055         points[i].y = newy;
   1056         if (i==0) {
   1057             minx = newx;
   1058             maxx = newx;
   1059             miny = newy;
   1060             maxy = newy;
   1061         } else {
   1062             if (newx < minx) minx = newx;
   1063             if (newx > maxx) maxx = newx;
   1064             if (newy < miny) miny = newy;
   1065             if (newy > maxy) maxy = newy;
   1066         }
   1067     }
   1068 
   1069     /* Call function and validate - special case: no result requested */
   1070     anyEnclosedNoResult = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)NULL, (SDL_Rect *)NULL);
   1071     SDLTest_AssertCheck(expectedEnclosed==anyEnclosedNoResult,
   1072         "Check return value %s, got %s",
   1073         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1074         (anyEnclosedNoResult==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1075     for (i=0; i<numPoints; i++) {
   1076         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1077             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1078             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1079     }
   1080 
   1081     /* Call function and validate */
   1082     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)NULL, &result);
   1083     SDLTest_AssertCheck(expectedEnclosed==anyEnclosed,
   1084         "Check return value %s, got %s",
   1085         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1086         (anyEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1087     for (i=0; i<numPoints; i++) {
   1088         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1089             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1090             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1091     }
   1092     SDLTest_AssertCheck(result.x==minx && result.y==miny && result.w==(maxx - minx + 1) && result.h==(maxy - miny + 1),
   1093         "Check resulting enclosing rectangle: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
   1094         minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
   1095 
   1096     return TEST_COMPLETED;
   1097 }
   1098 
   1099 /* !
   1100  * \brief Test SDL_EnclosePoints() with clipping
   1101  *
   1102  * \sa
   1103  * http://wiki.libsdl.org/moin.cgi/SDL_EnclosePoints
   1104  */
   1105 int rect_testEnclosePointsWithClipping(void *arg)
   1106 {
   1107     const int numPoints = 16;
   1108     SDL_Point refPoints[16];
   1109     SDL_Point points[16];
   1110     SDL_Rect refClip;
   1111     SDL_Rect clip;
   1112     SDL_Rect result;
   1113     SDL_bool anyEnclosed;
   1114     SDL_bool anyEnclosedNoResult;
   1115     SDL_bool expectedEnclosed = SDL_FALSE;
   1116     int newx, newy;
   1117     int minx = 0, maxx = 0, miny = 0, maxy = 0;
   1118     int i;
   1119 
   1120     /* Setup clipping rectangle */
   1121     refClip.x = SDLTest_RandomIntegerInRange(-1024, 1024);
   1122     refClip.y = SDLTest_RandomIntegerInRange(-1024, 1024);
   1123     refClip.w = SDLTest_RandomIntegerInRange(1, 1024);
   1124     refClip.h = SDLTest_RandomIntegerInRange(1, 1024);
   1125 
   1126     /* Create input data, tracking result */
   1127     for (i=0; i<numPoints; i++) {
   1128         newx = SDLTest_RandomIntegerInRange(-1024, 1024);
   1129         newy = SDLTest_RandomIntegerInRange(-1024, 1024);
   1130         refPoints[i].x = newx;
   1131         refPoints[i].y = newy;
   1132         points[i].x = newx;
   1133         points[i].y = newy;
   1134         if ((newx>=refClip.x) && (newx<(refClip.x + refClip.w)) &&
   1135             (newy>=refClip.y) && (newy<(refClip.y + refClip.h))) {
   1136             if (expectedEnclosed==SDL_FALSE) {
   1137                 minx = newx;
   1138                 maxx = newx;
   1139                 miny = newy;
   1140                 maxy = newy;
   1141             } else {
   1142                 if (newx < minx) minx = newx;
   1143                 if (newx > maxx) maxx = newx;
   1144                 if (newy < miny) miny = newy;
   1145                 if (newy > maxy) maxy = newy;
   1146             }
   1147             expectedEnclosed = SDL_TRUE;
   1148         }
   1149     }
   1150 
   1151     /* Call function and validate - special case: no result requested */
   1152     clip = refClip;
   1153     anyEnclosedNoResult = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)&clip, (SDL_Rect *)NULL);
   1154     SDLTest_AssertCheck(expectedEnclosed==anyEnclosedNoResult,
   1155         "Expected return value %s, got %s",
   1156         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1157         (anyEnclosedNoResult==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1158     for (i=0; i<numPoints; i++) {
   1159         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1160             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1161             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1162     }
   1163     SDLTest_AssertCheck(refClip.x==clip.x && refClip.y==clip.y && refClip.w==clip.w && refClip.h==clip.h,
   1164         "Check that source clipping rectangle was not modified");
   1165 
   1166     /* Call function and validate */
   1167     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)&clip, &result);
   1168     SDLTest_AssertCheck(expectedEnclosed==anyEnclosed,
   1169         "Check return value %s, got %s",
   1170         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1171         (anyEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1172     for (i=0; i<numPoints; i++) {
   1173         SDLTest_AssertCheck(refPoints[i].x==points[i].x && refPoints[i].y==points[i].y,
   1174             "Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
   1175             i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
   1176     }
   1177     SDLTest_AssertCheck(refClip.x==clip.x && refClip.y==clip.y && refClip.w==clip.w && refClip.h==clip.h,
   1178         "Check that source clipping rectangle was not modified");
   1179     if (expectedEnclosed==SDL_TRUE) {
   1180         SDLTest_AssertCheck(result.x==minx && result.y==miny && result.w==(maxx - minx + 1) && result.h==(maxy - miny + 1),
   1181             "Check resulting enclosing rectangle: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
   1182             minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
   1183     }
   1184 
   1185     /* Empty clipping rectangle */
   1186     clip.w = 0;
   1187     clip.h = 0;
   1188     expectedEnclosed = SDL_FALSE;
   1189     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, numPoints, (const SDL_Rect *)&clip, &result);
   1190     SDLTest_AssertCheck(expectedEnclosed==anyEnclosed,
   1191         "Check return value %s, got %s",
   1192         (expectedEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE",
   1193         (anyEnclosed==SDL_TRUE) ? "SDL_TRUE" : "SDL_FALSE");
   1194 
   1195     return TEST_COMPLETED;
   1196 }
   1197 
   1198 /* !
   1199  * \brief Negative tests against SDL_EnclosePoints() with invalid parameters
   1200  *
   1201  * \sa
   1202  * http://wiki.libsdl.org/moin.cgi/SDL_EnclosePoints
   1203  */
   1204 int rect_testEnclosePointsParam(void *arg)
   1205 {
   1206     SDL_Point points[1];
   1207     int count;
   1208     SDL_Rect clip;
   1209     SDL_Rect result;
   1210     SDL_bool anyEnclosed;
   1211 
   1212     /* invalid parameter combinations */
   1213     anyEnclosed = SDL_EnclosePoints((SDL_Point *)NULL, 1, (const SDL_Rect *)&clip, &result);
   1214     SDLTest_AssertCheck(anyEnclosed == SDL_FALSE, "Check that functions returns SDL_FALSE when 1st parameter is NULL");
   1215     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, 0, (const SDL_Rect *)&clip, &result);
   1216     SDLTest_AssertCheck(anyEnclosed == SDL_FALSE, "Check that functions returns SDL_FALSE when 2nd parameter is 0");
   1217     count = SDLTest_RandomIntegerInRange(-100, -1);
   1218     anyEnclosed = SDL_EnclosePoints((const SDL_Point *)points, count, (const SDL_Rect *)&clip, &result);
   1219     SDLTest_AssertCheck(anyEnclosed == SDL_FALSE, "Check that functions returns SDL_FALSE when 2nd parameter is %i (negative)", count);
   1220     anyEnclosed = SDL_EnclosePoints((SDL_Point *)NULL, 0, (const SDL_Rect *)&clip, &result);
   1221     SDLTest_AssertCheck(anyEnclosed == SDL_FALSE, "Check that functions returns SDL_FALSE when 1st parameter is NULL and 2nd parameter was 0");
   1222 
   1223     return TEST_COMPLETED;
   1224 }
   1225 
   1226 /* !
   1227  * \brief Tests SDL_UnionRect() where rect B is outside rect A
   1228  *
   1229  * \sa
   1230  * http://wiki.libsdl.org/moin.cgi/SDL_UnionRect
   1231  */
   1232 int rect_testUnionRectOutside(void *arg)
   1233 {
   1234     SDL_Rect refRectA, refRectB;
   1235     SDL_Rect rectA, rectB;
   1236     SDL_Rect expectedResult;
   1237     SDL_Rect result;
   1238     int minx, maxx, miny, maxy;
   1239     int dx, dy;
   1240 
   1241     /* Union 1x1 outside */
   1242     for (dx = -1; dx < 2; dx++) {
   1243         for (dy = -1; dy < 2; dy++) {
   1244             if ((dx != 0) || (dy != 0)) {
   1245                 refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1246                 refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1247                 refRectA.w=1;
   1248                 refRectA.h=1;
   1249                 refRectB.x=SDLTest_RandomIntegerInRange(-1024, 1024) + dx*2048;
   1250                 refRectB.y=SDLTest_RandomIntegerInRange(-1024, 1024) + dx*2048;
   1251                 refRectB.w=1;
   1252                 refRectB.h=1;
   1253                 minx = (refRectA.x<refRectB.x) ? refRectA.x : refRectB.x;
   1254                 maxx = (refRectA.x>refRectB.x) ? refRectA.x : refRectB.x;
   1255                 miny = (refRectA.y<refRectB.y) ? refRectA.y : refRectB.y;
   1256                 maxy = (refRectA.y>refRectB.y) ? refRectA.y : refRectB.y;
   1257                 expectedResult.x = minx;
   1258                 expectedResult.y = miny;
   1259                 expectedResult.w = maxx - minx + 1;
   1260                 expectedResult.h = maxy - miny + 1;
   1261                 rectA = refRectA;
   1262                 rectB = refRectB;
   1263                 SDL_UnionRect(&rectA, &rectB, &result);
   1264                 _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1265             }
   1266         }
   1267     }
   1268 
   1269     /* Union outside overlap */
   1270     for (dx = -1; dx < 2; dx++) {
   1271         for (dy = -1; dy < 2; dy++) {
   1272             if ((dx != 0) || (dy != 0)) {
   1273                 refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1274                 refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1275                 refRectA.w=SDLTest_RandomIntegerInRange(256, 512);
   1276                 refRectA.h=SDLTest_RandomIntegerInRange(256, 512);
   1277                 refRectB.x=refRectA.x + 1 + dx*2;
   1278                 refRectB.y=refRectA.y + 1 + dy*2;
   1279                 refRectB.w=refRectA.w - 2;
   1280                 refRectB.h=refRectA.h - 2;
   1281                 expectedResult = refRectA;
   1282                 if (dx == -1) expectedResult.x--;
   1283                 if (dy == -1) expectedResult.y--;
   1284                 if ((dx == 1) || (dx == -1)) expectedResult.w++;
   1285                 if ((dy == 1) || (dy == -1)) expectedResult.h++;
   1286                 rectA = refRectA;
   1287                 rectB = refRectB;
   1288                 SDL_UnionRect(&rectA, &rectB, &result);
   1289                 _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1290             }
   1291         }
   1292     }
   1293 
   1294     return TEST_COMPLETED;
   1295 }
   1296 
   1297 /* !
   1298  * \brief Tests SDL_UnionRect() where rect A or rect B are empty
   1299  *
   1300  * \sa
   1301  * http://wiki.libsdl.org/moin.cgi/SDL_UnionRect
   1302  */
   1303 int rect_testUnionRectEmpty(void *arg)
   1304 {
   1305     SDL_Rect refRectA, refRectB;
   1306     SDL_Rect rectA, rectB;
   1307     SDL_Rect expectedResult;
   1308     SDL_Rect result;
   1309 
   1310     /* A empty */
   1311     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1312     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1313     refRectA.w=0;
   1314     refRectA.h=0;
   1315     refRectB.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1316     refRectB.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1317     refRectB.w=SDLTest_RandomIntegerInRange(1, 1024);
   1318     refRectB.h=SDLTest_RandomIntegerInRange(1, 1024);
   1319     expectedResult = refRectB;
   1320     rectA = refRectA;
   1321     rectB = refRectB;
   1322     SDL_UnionRect(&rectA, &rectB, &result);
   1323     _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1324 
   1325     /* B empty */
   1326     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1327     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1328     refRectA.w=SDLTest_RandomIntegerInRange(1, 1024);
   1329     refRectA.h=SDLTest_RandomIntegerInRange(1, 1024);
   1330     refRectB.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1331     refRectB.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1332     refRectB.w=0;
   1333     refRectB.h=0;
   1334     expectedResult = refRectA;
   1335     rectA = refRectA;
   1336     rectB = refRectB;
   1337     SDL_UnionRect(&rectA, &rectB, &result);
   1338     _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1339 
   1340     /* A and B empty */
   1341     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1342     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1343     refRectA.w=0;
   1344     refRectA.h=0;
   1345     refRectB.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1346     refRectB.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1347     refRectB.w=0;
   1348     refRectB.h=0;
   1349     result.x=0;
   1350     result.y=0;
   1351     result.w=0;
   1352     result.h=0;
   1353     expectedResult = result;
   1354     rectA = refRectA;
   1355     rectB = refRectB;
   1356     SDL_UnionRect(&rectA, &rectB, &result);
   1357     _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1358 
   1359     return TEST_COMPLETED;
   1360 }
   1361 
   1362 /* !
   1363  * \brief Tests SDL_UnionRect() where rect B is inside rect A
   1364  *
   1365  * \sa
   1366  * http://wiki.libsdl.org/moin.cgi/SDL_UnionRect
   1367  */
   1368 int rect_testUnionRectInside(void *arg)
   1369 {
   1370     SDL_Rect refRectA, refRectB;
   1371     SDL_Rect rectA, rectB;
   1372     SDL_Rect expectedResult;
   1373     SDL_Rect result;
   1374     int dx, dy;
   1375 
   1376     /* Union 1x1 with itself */
   1377     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1378     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1379     refRectA.w=1;
   1380     refRectA.h=1;
   1381     expectedResult = refRectA;
   1382     rectA = refRectA;
   1383     SDL_UnionRect(&rectA, &rectA, &result);
   1384     _validateUnionRectResults(&rectA, &rectA, &refRectA, &refRectA, &result, &expectedResult);
   1385 
   1386     /* Union 1x1 somewhere inside */
   1387     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1388     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1389     refRectA.w=SDLTest_RandomIntegerInRange(256, 1024);
   1390     refRectA.h=SDLTest_RandomIntegerInRange(256, 1024);
   1391     refRectB.x=refRectA.x + 1 + SDLTest_RandomIntegerInRange(1, refRectA.w - 2);
   1392     refRectB.y=refRectA.y + 1 + SDLTest_RandomIntegerInRange(1, refRectA.h - 2);
   1393     refRectB.w=1;
   1394     refRectB.h=1;
   1395     expectedResult = refRectA;
   1396     rectA = refRectA;
   1397     rectB = refRectB;
   1398     SDL_UnionRect(&rectA, &rectB, &result);
   1399     _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1400 
   1401     /* Union inside with edges modified */
   1402     for (dx = -1; dx < 2; dx++) {
   1403         for (dy = -1; dy < 2; dy++) {
   1404             if ((dx != 0) || (dy != 0)) {
   1405                 refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1406                 refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1407                 refRectA.w=SDLTest_RandomIntegerInRange(256, 1024);
   1408                 refRectA.h=SDLTest_RandomIntegerInRange(256, 1024);
   1409                 refRectB = refRectA;
   1410                 if (dx == -1) refRectB.x++;
   1411                 if ((dx == 1) || (dx == -1)) refRectB.w--;
   1412                 if (dy == -1) refRectB.y++;
   1413                 if ((dy == 1) || (dy == -1)) refRectB.h--;
   1414                 expectedResult = refRectA;
   1415                 rectA = refRectA;
   1416                 rectB = refRectB;
   1417                 SDL_UnionRect(&rectA, &rectB, &result);
   1418                 _validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
   1419             }
   1420         }
   1421     }
   1422 
   1423     return TEST_COMPLETED;
   1424 }
   1425 
   1426 /* !
   1427  * \brief Negative tests against SDL_UnionRect() with invalid parameters
   1428  *
   1429  * \sa
   1430  * http://wiki.libsdl.org/moin.cgi/SDL_UnionRect
   1431  */
   1432 int rect_testUnionRectParam(void *arg)
   1433 {
   1434     SDL_Rect rectA, rectB;
   1435     SDL_Rect result;
   1436 
   1437     /* invalid parameter combinations */
   1438     SDL_UnionRect((SDL_Rect *)NULL, &rectB, &result);
   1439     SDLTest_AssertPass("Check that function returns when 1st parameter is NULL");
   1440     SDL_UnionRect(&rectA, (SDL_Rect *)NULL, &result);
   1441     SDLTest_AssertPass("Check that function returns  when 2nd parameter is NULL");
   1442     SDL_UnionRect(&rectA, &rectB, (SDL_Rect *)NULL);
   1443     SDLTest_AssertPass("Check that function returns  when 3rd parameter is NULL");
   1444     SDL_UnionRect((SDL_Rect *)NULL, &rectB, (SDL_Rect *)NULL);
   1445     SDLTest_AssertPass("Check that function returns  when 1st and 3rd parameter are NULL");
   1446     SDL_UnionRect(&rectA, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
   1447     SDLTest_AssertPass("Check that function returns  when 2nd and 3rd parameter are NULL");
   1448     SDL_UnionRect((SDL_Rect *)NULL, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
   1449     SDLTest_AssertPass("Check that function returns  when all parameters are NULL");
   1450 
   1451     return TEST_COMPLETED;
   1452 }
   1453 
   1454 /* !
   1455  * \brief Tests SDL_RectEmpty() with various inputs
   1456  *
   1457  * \sa
   1458  * http://wiki.libsdl.org/moin.cgi/SDL_RectEmpty
   1459  */
   1460 int rect_testRectEmpty(void *arg)
   1461 {
   1462     SDL_Rect refRect;
   1463     SDL_Rect rect;
   1464     SDL_bool expectedResult;
   1465     SDL_bool result;
   1466     int w, h;
   1467 
   1468     /* Non-empty case */
   1469     refRect.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1470     refRect.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1471     refRect.w=SDLTest_RandomIntegerInRange(256, 1024);
   1472     refRect.h=SDLTest_RandomIntegerInRange(256, 1024);
   1473     expectedResult = SDL_FALSE;
   1474     rect = refRect;
   1475     result = (SDL_bool)SDL_RectEmpty((const SDL_Rect *)&rect);
   1476     _validateRectEmptyResults(result, expectedResult, &rect, &refRect);
   1477 
   1478     /* Empty case */
   1479     for (w=-1; w<2; w++) {
   1480         for (h=-1; h<2; h++) {
   1481             if ((w != 1) || (h != 1)) {
   1482                 refRect.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1483                 refRect.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1484                 refRect.w=w;
   1485                 refRect.h=h;
   1486                 expectedResult = SDL_TRUE;
   1487                 rect = refRect;
   1488                 result = (SDL_bool)SDL_RectEmpty((const SDL_Rect *)&rect);
   1489                 _validateRectEmptyResults(result, expectedResult, &rect, &refRect);
   1490             }
   1491         }
   1492     }
   1493 
   1494     return TEST_COMPLETED;
   1495 }
   1496 
   1497 /* !
   1498  * \brief Negative tests against SDL_RectEmpty() with invalid parameters
   1499  *
   1500  * \sa
   1501  * http://wiki.libsdl.org/moin.cgi/SDL_RectEmpty
   1502  */
   1503 int rect_testRectEmptyParam(void *arg)
   1504 {
   1505     SDL_bool result;
   1506 
   1507     /* invalid parameter combinations */
   1508     result = (SDL_bool)SDL_RectEmpty((const SDL_Rect *)NULL);
   1509     SDLTest_AssertCheck(result == SDL_TRUE, "Check that function returns TRUE when 1st parameter is NULL");
   1510 
   1511     return TEST_COMPLETED;
   1512 }
   1513 
   1514 /* !
   1515  * \brief Tests SDL_RectEquals() with various inputs
   1516  *
   1517  * \sa
   1518  * http://wiki.libsdl.org/moin.cgi/SDL_RectEquals
   1519  */
   1520 int rect_testRectEquals(void *arg)
   1521 {
   1522     SDL_Rect refRectA;
   1523     SDL_Rect refRectB;
   1524     SDL_Rect rectA;
   1525     SDL_Rect rectB;
   1526     SDL_bool expectedResult;
   1527     SDL_bool result;
   1528 
   1529     /* Equals */
   1530     refRectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1531     refRectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1532     refRectA.w=SDLTest_RandomIntegerInRange(1, 1024);
   1533     refRectA.h=SDLTest_RandomIntegerInRange(1, 1024);
   1534     refRectB = refRectA;
   1535     expectedResult = SDL_TRUE;
   1536     rectA = refRectA;
   1537     rectB = refRectB;
   1538     result = (SDL_bool)SDL_RectEquals((const SDL_Rect *)&rectA, (const SDL_Rect *)&rectB);
   1539     _validateRectEqualsResults(result, expectedResult, &rectA, &rectB, &refRectA, &refRectB);
   1540 
   1541     return TEST_COMPLETED;
   1542 }
   1543 
   1544 /* !
   1545  * \brief Negative tests against SDL_RectEquals() with invalid parameters
   1546  *
   1547  * \sa
   1548  * http://wiki.libsdl.org/moin.cgi/SDL_RectEquals
   1549  */
   1550 int rect_testRectEqualsParam(void *arg)
   1551 {
   1552     SDL_Rect rectA;
   1553     SDL_Rect rectB;
   1554     SDL_bool result;
   1555 
   1556     /* data setup */
   1557     rectA.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1558     rectA.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1559     rectA.w=SDLTest_RandomIntegerInRange(1, 1024);
   1560     rectA.h=SDLTest_RandomIntegerInRange(1, 1024);
   1561     rectB.x=SDLTest_RandomIntegerInRange(-1024, 1024);
   1562     rectB.y=SDLTest_RandomIntegerInRange(-1024, 1024);
   1563     rectB.w=SDLTest_RandomIntegerInRange(1, 1024);
   1564     rectB.h=SDLTest_RandomIntegerInRange(1, 1024);
   1565 
   1566     /* invalid parameter combinations */
   1567     result = (SDL_bool)SDL_RectEquals((const SDL_Rect *)NULL, (const SDL_Rect *)&rectB);
   1568     SDLTest_AssertCheck(result == SDL_FALSE, "Check that function returns SDL_FALSE when 1st parameter is NULL");
   1569     result = (SDL_bool)SDL_RectEquals((const SDL_Rect *)&rectA, (const SDL_Rect *)NULL);
   1570     SDLTest_AssertCheck(result == SDL_FALSE, "Check that function returns SDL_FALSE when 2nd parameter is NULL");
   1571     result = (SDL_bool)SDL_RectEquals((const SDL_Rect *)NULL, (const SDL_Rect *)NULL);
   1572     SDLTest_AssertCheck(result == SDL_FALSE, "Check that function returns SDL_FALSE when 1st and 2nd parameter are NULL");
   1573 
   1574     return TEST_COMPLETED;
   1575 }
   1576 
   1577 /* ================= Test References ================== */
   1578 
   1579 /* Rect test cases */
   1580 
   1581 /* SDL_IntersectRectAndLine */
   1582 static const SDLTest_TestCaseReference rectTest1 =
   1583         { (SDLTest_TestCaseFp)rect_testIntersectRectAndLine,"rect_testIntersectRectAndLine",  "Tests SDL_IntersectRectAndLine clipping cases", TEST_ENABLED };
   1584 
   1585 static const SDLTest_TestCaseReference rectTest2 =
   1586         { (SDLTest_TestCaseFp)rect_testIntersectRectAndLineInside, "rect_testIntersectRectAndLineInside", "Tests SDL_IntersectRectAndLine with line fully contained in rect", TEST_ENABLED };
   1587 
   1588 static const SDLTest_TestCaseReference rectTest3 =
   1589         { (SDLTest_TestCaseFp)rect_testIntersectRectAndLineOutside, "rect_testIntersectRectAndLineOutside", "Tests SDL_IntersectRectAndLine with line fully outside of rect", TEST_ENABLED };
   1590 
   1591 static const SDLTest_TestCaseReference rectTest4 =
   1592         { (SDLTest_TestCaseFp)rect_testIntersectRectAndLineEmpty, "rect_testIntersectRectAndLineEmpty", "Tests SDL_IntersectRectAndLine with empty rectangle ", TEST_ENABLED };
   1593 
   1594 static const SDLTest_TestCaseReference rectTest5 =
   1595         { (SDLTest_TestCaseFp)rect_testIntersectRectAndLineParam, "rect_testIntersectRectAndLineParam", "Negative tests against SDL_IntersectRectAndLine with invalid parameters", TEST_ENABLED };
   1596 
   1597 /* SDL_IntersectRect */
   1598 static const SDLTest_TestCaseReference rectTest6 =
   1599         { (SDLTest_TestCaseFp)rect_testIntersectRectInside, "rect_testIntersectRectInside", "Tests SDL_IntersectRect with B fully contained in A", TEST_ENABLED };
   1600 
   1601 static const SDLTest_TestCaseReference rectTest7 =
   1602         { (SDLTest_TestCaseFp)rect_testIntersectRectOutside, "rect_testIntersectRectOutside", "Tests SDL_IntersectRect with B fully outside of A", TEST_ENABLED };
   1603 
   1604 static const SDLTest_TestCaseReference rectTest8 =
   1605         { (SDLTest_TestCaseFp)rect_testIntersectRectPartial, "rect_testIntersectRectPartial", "Tests SDL_IntersectRect with B partially intersecting A", TEST_ENABLED };
   1606 
   1607 static const SDLTest_TestCaseReference rectTest9 =
   1608         { (SDLTest_TestCaseFp)rect_testIntersectRectPoint, "rect_testIntersectRectPoint", "Tests SDL_IntersectRect with 1x1 sized rectangles", TEST_ENABLED };
   1609 
   1610 static const SDLTest_TestCaseReference rectTest10 =
   1611         { (SDLTest_TestCaseFp)rect_testIntersectRectEmpty, "rect_testIntersectRectEmpty", "Tests SDL_IntersectRect with empty rectangles", TEST_ENABLED };
   1612 
   1613 static const SDLTest_TestCaseReference rectTest11 =
   1614         { (SDLTest_TestCaseFp)rect_testIntersectRectParam, "rect_testIntersectRectParam", "Negative tests against SDL_IntersectRect with invalid parameters", TEST_ENABLED };
   1615 
   1616 /* SDL_HasIntersection */
   1617 static const SDLTest_TestCaseReference rectTest12 =
   1618         { (SDLTest_TestCaseFp)rect_testHasIntersectionInside, "rect_testHasIntersectionInside", "Tests SDL_HasIntersection with B fully contained in A", TEST_ENABLED };
   1619 
   1620 static const SDLTest_TestCaseReference rectTest13 =
   1621         { (SDLTest_TestCaseFp)rect_testHasIntersectionOutside, "rect_testHasIntersectionOutside", "Tests SDL_HasIntersection with B fully outside of A", TEST_ENABLED };
   1622 
   1623 static const SDLTest_TestCaseReference rectTest14 =
   1624         { (SDLTest_TestCaseFp)rect_testHasIntersectionPartial,"rect_testHasIntersectionPartial",  "Tests SDL_HasIntersection with B partially intersecting A", TEST_ENABLED };
   1625 
   1626 static const SDLTest_TestCaseReference rectTest15 =
   1627         { (SDLTest_TestCaseFp)rect_testHasIntersectionPoint, "rect_testHasIntersectionPoint", "Tests SDL_HasIntersection with 1x1 sized rectangles", TEST_ENABLED };
   1628 
   1629 static const SDLTest_TestCaseReference rectTest16 =
   1630         { (SDLTest_TestCaseFp)rect_testHasIntersectionEmpty, "rect_testHasIntersectionEmpty", "Tests SDL_HasIntersection with empty rectangles", TEST_ENABLED };
   1631 
   1632 static const SDLTest_TestCaseReference rectTest17 =
   1633         { (SDLTest_TestCaseFp)rect_testHasIntersectionParam, "rect_testHasIntersectionParam", "Negative tests against SDL_HasIntersection with invalid parameters", TEST_ENABLED };
   1634 
   1635 /* SDL_EnclosePoints */
   1636 static const SDLTest_TestCaseReference rectTest18 =
   1637         { (SDLTest_TestCaseFp)rect_testEnclosePoints, "rect_testEnclosePoints", "Tests SDL_EnclosePoints without clipping", TEST_ENABLED };
   1638 
   1639 static const SDLTest_TestCaseReference rectTest19 =
   1640         { (SDLTest_TestCaseFp)rect_testEnclosePointsWithClipping, "rect_testEnclosePointsWithClipping", "Tests SDL_EnclosePoints with clipping", TEST_ENABLED };
   1641 
   1642 static const SDLTest_TestCaseReference rectTest20 =
   1643         { (SDLTest_TestCaseFp)rect_testEnclosePointsRepeatedInput, "rect_testEnclosePointsRepeatedInput", "Tests SDL_EnclosePoints with repeated input", TEST_ENABLED };
   1644 
   1645 static const SDLTest_TestCaseReference rectTest21 =
   1646         { (SDLTest_TestCaseFp)rect_testEnclosePointsParam, "rect_testEnclosePointsParam", "Negative tests against SDL_EnclosePoints with invalid parameters", TEST_ENABLED };
   1647 
   1648 /* SDL_UnionRect */
   1649 static const SDLTest_TestCaseReference rectTest22 =
   1650         { (SDLTest_TestCaseFp)rect_testUnionRectInside, "rect_testUnionRectInside", "Tests SDL_UnionRect where rect B is inside rect A", TEST_ENABLED };
   1651 
   1652 static const SDLTest_TestCaseReference rectTest23 =
   1653         { (SDLTest_TestCaseFp)rect_testUnionRectOutside, "rect_testUnionRectOutside", "Tests SDL_UnionRect where rect B is outside rect A", TEST_ENABLED };
   1654 
   1655 static const SDLTest_TestCaseReference rectTest24 =
   1656         { (SDLTest_TestCaseFp)rect_testUnionRectEmpty, "rect_testUnionRectEmpty", "Tests SDL_UnionRect where rect A or rect B are empty", TEST_ENABLED };
   1657 
   1658 static const SDLTest_TestCaseReference rectTest25 =
   1659         { (SDLTest_TestCaseFp)rect_testUnionRectParam, "rect_testUnionRectParam", "Negative tests against SDL_UnionRect with invalid parameters", TEST_ENABLED };
   1660 
   1661 /* SDL_RectEmpty */
   1662 static const SDLTest_TestCaseReference rectTest26 =
   1663         { (SDLTest_TestCaseFp)rect_testRectEmpty, "rect_testRectEmpty", "Tests SDL_RectEmpty with various inputs", TEST_ENABLED };
   1664 
   1665 static const SDLTest_TestCaseReference rectTest27 =
   1666         { (SDLTest_TestCaseFp)rect_testRectEmptyParam, "rect_testRectEmptyParam", "Negative tests against SDL_RectEmpty with invalid parameters", TEST_ENABLED };
   1667 
   1668 /* SDL_RectEquals */
   1669 
   1670 static const SDLTest_TestCaseReference rectTest28 =
   1671         { (SDLTest_TestCaseFp)rect_testRectEquals, "rect_testRectEquals", "Tests SDL_RectEquals with various inputs", TEST_ENABLED };
   1672 
   1673 static const SDLTest_TestCaseReference rectTest29 =
   1674         { (SDLTest_TestCaseFp)rect_testRectEqualsParam, "rect_testRectEqualsParam", "Negative tests against SDL_RectEquals with invalid parameters", TEST_ENABLED };
   1675 
   1676 
   1677 /* !
   1678  * \brief Sequence of Rect test cases; functions that handle simple rectangles including overlaps and merges.
   1679  *
   1680  * \sa
   1681  * http://wiki.libsdl.org/moin.cgi/CategoryRect
   1682  */
   1683 static const SDLTest_TestCaseReference *rectTests[] =  {
   1684     &rectTest1, &rectTest2, &rectTest3, &rectTest4, &rectTest5, &rectTest6, &rectTest7, &rectTest8, &rectTest9, &rectTest10, &rectTest11, &rectTest12, &rectTest13, &rectTest14,
   1685     &rectTest15, &rectTest16, &rectTest17, &rectTest18, &rectTest19, &rectTest20, &rectTest21, &rectTest22, &rectTest23, &rectTest24, &rectTest25, &rectTest26, &rectTest27,
   1686     &rectTest28, &rectTest29, NULL
   1687 };
   1688 
   1689 
   1690 /* Rect test suite (global) */
   1691 SDLTest_TestSuiteReference rectTestSuite = {
   1692     "Rect",
   1693     NULL,
   1694     rectTests,
   1695     NULL
   1696 };
   1697