SDL/test/testautomation_rect.c
Sam Lantinga a90ad3b0e2 Removed SDL_bool in favor of plain bool
We require stdbool.h in the build environment, so we might as well use the plain bool type.

If your environment doesn't have stdbool.h, this simple replacement will suffice:
typedef signed char bool;
2024-09-18 08:32:30 -07:00

2137 lines
81 KiB
C

/**
* Original code: automated SDL rect test written by Edgar Simo "bobbens"
* New/updated tests: aschiffler at ferzkopp dot net
*/
#include <limits.h>
#include <SDL3/SDL.h>
#include <SDL3/SDL_test.h>
#include "testautomation_suites.h"
/* ================= Test Case Implementation ================== */
/* Helper functions */
/**
* Private helper to check SDL_GetRectAndLineIntersectionFloat results
*/
static void validateIntersectRectAndLineFloatResults(
bool intersection, bool expectedIntersection,
SDL_FRect *rect,
float x1, float y1, float x2, float y2,
float x1Ref, float y1Ref, float x2Ref, float y2Ref)
{
SDLTest_AssertCheck(intersection == expectedIntersection,
"Check for correct intersection result: expected %s, got %s intersecting rect (%.2f,%.2f,%.2f,%.2f) with line (%.2f,%.2f - %.2f,%.2f)",
(expectedIntersection == true) ? "true" : "false",
(intersection == true) ? "true" : "false",
rect->x, rect->y, rect->w, rect->h,
x1Ref, y1Ref, x2Ref, y2Ref);
SDLTest_AssertCheck(x1 == x1Ref && y1 == y1Ref && x2 == x2Ref && y2 == y2Ref,
"Check if line was incorrectly clipped or modified: got (%.2f,%.2f - %.2f,%.2f) expected (%.2f,%.2f - %.2f,%.2f)",
x1, y1, x2, y2,
x1Ref, y1Ref, x2Ref, y2Ref);
}
/**
* Private helper to check SDL_GetRectAndLineIntersection results
*/
static void validateIntersectRectAndLineResults(
bool intersection, bool expectedIntersection,
SDL_Rect *rect, SDL_Rect *refRect,
int x1, int y1, int x2, int y2,
int x1Ref, int y1Ref, int x2Ref, int y2Ref)
{
SDLTest_AssertCheck(intersection == expectedIntersection,
"Check for correct intersection result: expected %s, got %s intersecting rect (%d,%d,%d,%d) with line (%d,%d - %d,%d)",
(expectedIntersection == true) ? "true" : "false",
(intersection == true) ? "true" : "false",
refRect->x, refRect->y, refRect->w, refRect->h,
x1Ref, y1Ref, x2Ref, y2Ref);
SDLTest_AssertCheck(rect->x == refRect->x && rect->y == refRect->y && rect->w == refRect->w && rect->h == refRect->h,
"Check that source rectangle was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rect->x, rect->y, rect->w, rect->h,
refRect->x, refRect->y, refRect->w, refRect->h);
SDLTest_AssertCheck(x1 == x1Ref && y1 == y1Ref && x2 == x2Ref && y2 == y2Ref,
"Check if line was incorrectly clipped or modified: got (%d,%d - %d,%d) expected (%d,%d - %d,%d)",
x1, y1, x2, y2,
x1Ref, y1Ref, x2Ref, y2Ref);
}
/* Test case functions */
/**
* Tests SDL_GetRectAndLineIntersectionFloat() clipping cases
*
* \sa SDL_GetRectAndLineIntersectionFloat
*/
static int SDLCALL rect_testIntersectRectAndLineFloat(void *arg)
{
SDL_FRect rect;
float x1, y1;
float x2, y2;
bool intersected;
x1 = 5.0f;
y1 = 6.0f;
x2 = 23.0f;
y2 = 6.0f;
rect.x = 2.5f;
rect.y = 1.5f;
rect.w = 15.25f;
rect.h = 12.0f;
intersected = SDL_GetRectAndLineIntersectionFloat(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineFloatResults(intersected, true, &rect, x1, y1, x2, y2, 5.0f, 6.0f, 17.75f, 6.0f);
x1 = 0.0f;
y1 = 6.0f;
x2 = 23.0f;
y2 = 6.0f;
rect.x = 2.5f;
rect.y = 1.5f;
rect.w = 0.25f;
rect.h = 12.0f;
intersected = SDL_GetRectAndLineIntersectionFloat(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineFloatResults(intersected, true, &rect, x1, y1, x2, y2, 2.5f, 6.0f, 2.75f, 6.0f);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectAndLineIntersection() clipping cases
*
* \sa SDL_GetRectAndLineIntersection
*/
static int SDLCALL rect_testIntersectRectAndLine(void *arg)
{
SDL_Rect refRect = { 0, 0, 32, 32 };
SDL_Rect rect;
int x1, y1;
int x2, y2;
bool intersected;
int xLeft = -SDLTest_RandomIntegerInRange(1, refRect.w);
int xRight = refRect.w + SDLTest_RandomIntegerInRange(1, refRect.w);
int yTop = -SDLTest_RandomIntegerInRange(1, refRect.h);
int yBottom = refRect.h + SDLTest_RandomIntegerInRange(1, refRect.h);
x1 = xLeft;
y1 = 15;
x2 = xRight;
y2 = 15;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 0, 15, 31, 15);
x1 = 15;
y1 = yTop;
x2 = 15;
y2 = yBottom;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 15, 0, 15, 31);
x1 = -refRect.w;
y1 = -refRect.h;
x2 = 2 * refRect.w;
y2 = 2 * refRect.h;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 0, 0, 31, 31);
x1 = 2 * refRect.w;
y1 = 2 * refRect.h;
x2 = -refRect.w;
y2 = -refRect.h;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 31, 31, 0, 0);
x1 = -1;
y1 = 32;
x2 = 32;
y2 = -1;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 0, 31, 31, 0);
x1 = 32;
y1 = -1;
x2 = -1;
y2 = 32;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, 31, 0, 0, 31);
/* Test some overflow cases */
refRect.x = INT_MAX - 4;
refRect.y = INT_MAX - 4;
x1 = INT_MAX;
y1 = INT_MIN;
x2 = INT_MIN;
y2 = INT_MAX;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, x1, y1, x2, y2);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectAndLineIntersection() non-clipping case line inside
*
* \sa SDL_GetRectAndLineIntersection
*/
static int SDLCALL rect_testIntersectRectAndLineInside(void *arg)
{
SDL_Rect refRect = { 0, 0, 32, 32 };
SDL_Rect rect;
int x1, y1;
int x2, y2;
bool intersected;
int xmin = refRect.x;
int xmax = refRect.x + refRect.w - 1;
int ymin = refRect.y;
int ymax = refRect.y + refRect.h - 1;
int x1Ref = SDLTest_RandomIntegerInRange(xmin + 1, xmax - 1);
int y1Ref = SDLTest_RandomIntegerInRange(ymin + 1, ymax - 1);
int x2Ref = SDLTest_RandomIntegerInRange(xmin + 1, xmax - 1);
int y2Ref = SDLTest_RandomIntegerInRange(ymin + 1, ymax - 1);
x1 = x1Ref;
y1 = y1Ref;
x2 = x2Ref;
y2 = y2Ref;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, x2Ref, y2Ref);
x1 = x1Ref;
y1 = y1Ref;
x2 = xmax;
y2 = ymax;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, xmax, ymax);
x1 = xmin;
y1 = ymin;
x2 = x2Ref;
y2 = y2Ref;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, xmin, ymin, x2Ref, y2Ref);
x1 = xmin;
y1 = ymin;
x2 = xmax;
y2 = ymax;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, xmin, ymin, xmax, ymax);
x1 = xmin;
y1 = ymax;
x2 = xmax;
y2 = ymin;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, true, &rect, &refRect, x1, y1, x2, y2, xmin, ymax, xmax, ymin);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectAndLineIntersection() non-clipping cases outside
*
* \sa SDL_GetRectAndLineIntersection
*/
static int SDLCALL rect_testIntersectRectAndLineOutside(void *arg)
{
SDL_Rect refRect = { 0, 0, 32, 32 };
SDL_Rect rect;
int x1, y1;
int x2, y2;
bool intersected;
int xLeft = -SDLTest_RandomIntegerInRange(1, refRect.w);
int xRight = refRect.w + SDLTest_RandomIntegerInRange(1, refRect.w);
int yTop = -SDLTest_RandomIntegerInRange(1, refRect.h);
int yBottom = refRect.h + SDLTest_RandomIntegerInRange(1, refRect.h);
x1 = xLeft;
y1 = 0;
x2 = xLeft;
y2 = 31;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, xLeft, 0, xLeft, 31);
x1 = xRight;
y1 = 0;
x2 = xRight;
y2 = 31;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, xRight, 0, xRight, 31);
x1 = 0;
y1 = yTop;
x2 = 31;
y2 = yTop;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, 0, yTop, 31, yTop);
x1 = 0;
y1 = yBottom;
x2 = 31;
y2 = yBottom;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, 0, yBottom, 31, yBottom);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectAndLineIntersection() with empty rectangle
*
* \sa SDL_GetRectAndLineIntersection
*/
static int SDLCALL rect_testIntersectRectAndLineEmpty(void *arg)
{
SDL_Rect refRect;
SDL_Rect rect;
int x1, y1, x1Ref, y1Ref;
int x2, y2, x2Ref, y2Ref;
bool intersected;
refRect.x = SDLTest_RandomIntegerInRange(1, 1024);
refRect.y = SDLTest_RandomIntegerInRange(1, 1024);
refRect.w = 0;
refRect.h = 0;
x1Ref = refRect.x;
y1Ref = refRect.y;
x2Ref = SDLTest_RandomIntegerInRange(1, 1024);
y2Ref = SDLTest_RandomIntegerInRange(1, 1024);
x1 = x1Ref;
y1 = y1Ref;
x2 = x2Ref;
y2 = y2Ref;
rect = refRect;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
validateIntersectRectAndLineResults(intersected, false, &rect, &refRect, x1, y1, x2, y2, x1Ref, y1Ref, x2Ref, y2Ref);
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_GetRectAndLineIntersection() with invalid parameters
*
* \sa SDL_GetRectAndLineIntersection
*/
static int SDLCALL rect_testIntersectRectAndLineParam(void *arg)
{
SDL_Rect rect = { 0, 0, 32, 32 };
int x1 = rect.w / 2;
int y1 = rect.h / 2;
int x2 = x1;
int y2 = 2 * rect.h;
bool intersected;
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, &y2);
SDLTest_AssertCheck(intersected == true, "Check that intersection result was true");
intersected = SDL_GetRectAndLineIntersection((SDL_Rect *)NULL, &x1, &y1, &x2, &y2);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when 1st parameter is NULL");
intersected = SDL_GetRectAndLineIntersection(&rect, (int *)NULL, &y1, &x2, &y2);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when 2nd parameter is NULL");
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, (int *)NULL, &x2, &y2);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when 3rd parameter is NULL");
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, (int *)NULL, &y2);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when 4th parameter is NULL");
intersected = SDL_GetRectAndLineIntersection(&rect, &x1, &y1, &x2, (int *)NULL);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when 5th parameter is NULL");
intersected = SDL_GetRectAndLineIntersection((SDL_Rect *)NULL, (int *)NULL, (int *)NULL, (int *)NULL, (int *)NULL);
SDLTest_AssertCheck(intersected == false, "Check that function returns false when all parameters are NULL");
return TEST_COMPLETED;
}
/**
* Private helper to check SDL_HasRectIntersectionFloat results
*/
static void validateHasIntersectionFloatResults(
bool intersection, bool expectedIntersection,
SDL_FRect *rectA, SDL_FRect *rectB)
{
SDLTest_AssertCheck(intersection == expectedIntersection,
"Check intersection result: expected %s, got %s intersecting A (%.2f,%.2f,%.2f,%.2f) with B (%.2f,%.2f,%.2f,%.2f)",
(expectedIntersection == true) ? "true" : "false",
(intersection == true) ? "true" : "false",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h);
}
/**
* Private helper to check SDL_HasRectIntersection results
*/
static void validateHasIntersectionResults(
bool intersection, bool expectedIntersection,
SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB)
{
SDLTest_AssertCheck(intersection == expectedIntersection,
"Check intersection result: expected %s, got %s intersecting A (%d,%d,%d,%d) with B (%d,%d,%d,%d)",
(expectedIntersection == true) ? "true" : "false",
(intersection == true) ? "true" : "false",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h);
SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
"Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectA->x, rectA->y, rectA->w, rectA->h,
refRectA->x, refRectA->y, refRectA->w, refRectA->h);
SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
"Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectB->x, rectB->y, rectB->w, rectB->h,
refRectB->x, refRectB->y, refRectB->w, refRectB->h);
}
/**
* Private helper to check SDL_GetRectIntersection results
*/
static void validateIntersectRectFloatResults(
bool intersection, bool expectedIntersection,
SDL_FRect *rectA, SDL_FRect *rectB,
SDL_FRect *result, SDL_FRect *expectedResult)
{
validateHasIntersectionFloatResults(intersection, expectedIntersection, rectA, rectB);
if (result && expectedResult) {
SDLTest_AssertCheck(result->x == expectedResult->x && result->y == expectedResult->y && result->w == expectedResult->w && result->h == expectedResult->h,
"Check that intersection of rectangles A (%.2f,%.2f, %.2fx%.2f) and B (%.2f,%.2f %.2fx%.2f) was correctly calculated, got (%.2f,%.2f %.2fx%.2f) expected (%.2f,%.2f,%.2f,%.2f)",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h,
result->x, result->y, result->w, result->h,
expectedResult->x, expectedResult->y, expectedResult->w, expectedResult->h);
}
SDLTest_AssertCheck(intersection == SDL_HasRectIntersectionFloat(rectA, rectB),
"Check that intersection (%s) matches SDL_HasRectIntersectionFloat() result (%s)",
intersection ? "true" : "false",
SDL_HasRectIntersectionFloat(rectA, rectB) ? "true" : "false");
}
/**
* Private helper to check SDL_GetRectIntersection results
*/
static void validateIntersectRectResults(
bool intersection, bool expectedIntersection,
SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB,
SDL_Rect *result, SDL_Rect *expectedResult)
{
validateHasIntersectionResults(intersection, expectedIntersection, rectA, rectB, refRectA, refRectB);
if (result && expectedResult) {
SDLTest_AssertCheck(result->x == expectedResult->x && result->y == expectedResult->y && result->w == expectedResult->w && result->h == expectedResult->h,
"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)",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h,
result->x, result->y, result->w, result->h,
expectedResult->x, expectedResult->y, expectedResult->w, expectedResult->h);
}
}
/**
* Private helper to check SDL_GetRectUnion results
*/
static void validateUnionRectResults(
SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB,
SDL_Rect *result, SDL_Rect *expectedResult)
{
SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
"Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectA->x, rectA->y, rectA->w, rectA->h,
refRectA->x, refRectA->y, refRectA->w, refRectA->h);
SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
"Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectB->x, rectB->y, rectB->w, rectB->h,
refRectB->x, refRectB->y, refRectB->w, refRectB->h);
SDLTest_AssertCheck(result->x == expectedResult->x && result->y == expectedResult->y && result->w == expectedResult->w && result->h == expectedResult->h,
"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)",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h,
result->x, result->y, result->w, result->h,
expectedResult->x, expectedResult->y, expectedResult->w, expectedResult->h);
}
/**
* Private helper to check SDL_RectEmptyFloat results
*/
static void validateRectEmptyFloatResults(
bool empty, bool expectedEmpty,
SDL_FRect *rect)
{
SDLTest_AssertCheck(empty == expectedEmpty,
"Check for correct empty result: expected %s, got %s testing (%.2f,%.2f,%.2f,%.2f)",
(expectedEmpty == true) ? "true" : "false",
(empty == true) ? "true" : "false",
rect->x, rect->y, rect->w, rect->h);
}
/**
* Private helper to check SDL_RectEmpty results
*/
static void validateRectEmptyResults(
bool empty, bool expectedEmpty,
SDL_Rect *rect, SDL_Rect *refRect)
{
SDLTest_AssertCheck(empty == expectedEmpty,
"Check for correct empty result: expected %s, got %s testing (%d,%d,%d,%d)",
(expectedEmpty == true) ? "true" : "false",
(empty == true) ? "true" : "false",
rect->x, rect->y, rect->w, rect->h);
SDLTest_AssertCheck(rect->x == refRect->x && rect->y == refRect->y && rect->w == refRect->w && rect->h == refRect->h,
"Check that source rectangle was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rect->x, rect->y, rect->w, rect->h,
refRect->x, refRect->y, refRect->w, refRect->h);
}
/**
* Private helper to check SDL_RectsEqual results
*/
static void validateRectEqualsResults(
bool equals, bool expectedEquals,
SDL_Rect *rectA, SDL_Rect *rectB, SDL_Rect *refRectA, SDL_Rect *refRectB)
{
SDLTest_AssertCheck(equals == expectedEquals,
"Check for correct equals result: expected %s, got %s testing (%d,%d,%d,%d) and (%d,%d,%d,%d)",
(expectedEquals == true) ? "true" : "false",
(equals == true) ? "true" : "false",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h);
SDLTest_AssertCheck(rectA->x == refRectA->x && rectA->y == refRectA->y && rectA->w == refRectA->w && rectA->h == refRectA->h,
"Check that source rectangle A was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectA->x, rectA->y, rectA->w, rectA->h,
refRectA->x, refRectA->y, refRectA->w, refRectA->h);
SDLTest_AssertCheck(rectB->x == refRectB->x && rectB->y == refRectB->y && rectB->w == refRectB->w && rectB->h == refRectB->h,
"Check that source rectangle B was not modified: got (%d,%d,%d,%d) expected (%d,%d,%d,%d)",
rectB->x, rectB->y, rectB->w, rectB->h,
refRectB->x, refRectB->y, refRectB->w, refRectB->h);
}
/**
* Private helper to check SDL_RectsEqualFloat results
*/
static void validateFRectEqualsResults(
bool equals, bool expectedEquals,
SDL_FRect *rectA, SDL_FRect *rectB, SDL_FRect *refRectA, SDL_FRect *refRectB)
{
int cmpRes;
SDLTest_AssertCheck(equals == expectedEquals,
"Check for correct equals result: expected %s, got %s testing (%f,%f,%f,%f) and (%f,%f,%f,%f)",
(expectedEquals == true) ? "true" : "false",
(equals == true) ? "true" : "false",
rectA->x, rectA->y, rectA->w, rectA->h,
rectB->x, rectB->y, rectB->w, rectB->h);
cmpRes = SDL_memcmp(rectA, refRectA, sizeof(*rectA));
SDLTest_AssertCheck(cmpRes == 0,
"Check that source rectangle A was not modified: got (%f,%f,%f,%f) expected (%f,%f,%f,%f)",
rectA->x, rectA->y, rectA->w, rectA->h,
refRectA->x, refRectA->y, refRectA->w, refRectA->h);
cmpRes = SDL_memcmp(rectB, refRectB, sizeof(*rectB));
SDLTest_AssertCheck(cmpRes == 0,
"Check that source rectangle B was not modified: got (%f,%f,%f,%f) expected (%f,%f,%f,%f)",
rectB->x, rectB->y, rectB->w, rectB->h,
refRectB->x, refRectB->y, refRectB->w, refRectB->h);
}
/**
* Tests SDL_GetRectIntersectionFloat()
*
* \sa SDL_GetRectIntersectionFloat
*/
static int SDLCALL rect_testIntersectRectFloat(void *arg)
{
SDL_FRect rectA;
SDL_FRect rectB;
SDL_FRect result;
SDL_FRect expectedResult;
bool intersection;
rectA.x = 0.0f;
rectA.y = 0.0f;
rectA.w = 1.0f;
rectA.h = 1.0f;
rectB.x = 0.0f;
rectB.y = 0.0f;
rectB.w = 1.0f;
rectB.h = 1.0f;
expectedResult = rectA;
intersection = SDL_GetRectIntersectionFloat(&rectA, &rectB, &result);
validateIntersectRectFloatResults(intersection, true, &rectA, &rectB, &result, &expectedResult);
rectA.x = 0.0f;
rectA.y = 0.0f;
rectA.w = 1.0f;
rectA.h = 1.0f;
rectB.x = 1.0f;
rectB.y = 0.0f;
rectB.w = 1.0f;
rectB.h = 1.0f;
expectedResult = rectB;
expectedResult.w = 0.0f;
intersection = SDL_GetRectIntersectionFloat(&rectA, &rectB, &result);
validateIntersectRectFloatResults(intersection, true, &rectA, &rectB, &result, &expectedResult);
rectA.x = 0.0f;
rectA.y = 0.0f;
rectA.w = 1.0f;
rectA.h = 1.0f;
rectB.x = 1.0f;
rectB.y = 1.0f;
rectB.w = 1.0f;
rectB.h = 1.0f;
expectedResult = rectB;
expectedResult.w = 0.0f;
expectedResult.h = 0.0f;
intersection = SDL_GetRectIntersectionFloat(&rectA, &rectB, &result);
validateIntersectRectFloatResults(intersection, true, &rectA, &rectB, &result, &expectedResult);
rectA.x = 0.0f;
rectA.y = 0.0f;
rectA.w = 1.0f;
rectA.h = 1.0f;
rectB.x = 2.0f;
rectB.y = 0.0f;
rectB.w = 1.0f;
rectB.h = 1.0f;
expectedResult = rectB;
expectedResult.w = -1.0f;
intersection = SDL_GetRectIntersectionFloat(&rectA, &rectB, &result);
validateIntersectRectFloatResults(intersection, false, &rectA, &rectB, &result, &expectedResult);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectIntersection() with B fully inside A
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectInside(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
SDL_Rect result;
bool intersection;
/* rectB fully contained in rectA */
refRectB.x = 0;
refRectB.y = 0;
refRectB.w = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &refRectB);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectIntersection() with B fully outside A
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectOutside(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
SDL_Rect result;
bool intersection;
/* rectB fully outside of rectA */
refRectB.x = refRectA.x + refRectA.w + SDLTest_RandomIntegerInRange(1, 10);
refRectB.y = refRectA.y + refRectA.h + SDLTest_RandomIntegerInRange(1, 10);
refRectB.w = refRectA.w;
refRectB.h = refRectA.h;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectIntersection() with B partially intersecting A
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectPartial(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
SDL_Rect result;
SDL_Rect expectedResult;
bool intersection;
/* rectB partially contained in rectA */
refRectB.x = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
refRectB.y = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
refRectB.w = refRectA.w;
refRectB.h = refRectA.h;
rectA = refRectA;
rectB = refRectB;
expectedResult.x = refRectB.x;
expectedResult.y = refRectB.y;
expectedResult.w = refRectA.w - refRectB.x;
expectedResult.h = refRectA.h - refRectB.y;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* rectB right edge */
refRectB.x = rectA.w - 1;
refRectB.y = rectA.y;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
expectedResult.x = refRectB.x;
expectedResult.y = refRectB.y;
expectedResult.w = 1;
expectedResult.h = refRectB.h;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* rectB left edge */
refRectB.x = 1 - rectA.w;
refRectB.y = rectA.y;
refRectB.w = refRectA.w;
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
expectedResult.x = 0;
expectedResult.y = refRectB.y;
expectedResult.w = 1;
expectedResult.h = refRectB.h;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* rectB bottom edge */
refRectB.x = rectA.x;
refRectB.y = rectA.h - 1;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
expectedResult.x = refRectB.x;
expectedResult.y = refRectB.y;
expectedResult.w = refRectB.w;
expectedResult.h = 1;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* rectB top edge */
refRectB.x = rectA.x;
refRectB.y = 1 - rectA.h;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = rectA.h;
rectA = refRectA;
rectB = refRectB;
expectedResult.x = refRectB.x;
expectedResult.y = 0;
expectedResult.w = refRectB.w;
expectedResult.h = 1;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectIntersection() with 1x1 pixel sized rectangles
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectPoint(void *arg)
{
SDL_Rect refRectA = { 0, 0, 1, 1 };
SDL_Rect refRectB = { 0, 0, 1, 1 };
SDL_Rect rectA;
SDL_Rect rectB;
SDL_Rect result;
bool intersection;
int offsetX, offsetY;
/* intersecting pixels */
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectB.x = refRectA.x;
refRectB.y = refRectA.y;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB, &result, &refRectA);
/* non-intersecting pixels cases */
for (offsetX = -1; offsetX <= 1; offsetX++) {
for (offsetY = -1; offsetY <= 1; offsetY++) {
if (offsetX != 0 || offsetY != 0) {
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectB.x = refRectA.x;
refRectB.y = refRectA.y;
refRectB.x += offsetX;
refRectB.y += offsetY;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
}
}
}
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectIntersection() with empty rectangles
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectEmpty(void *arg)
{
SDL_Rect refRectA;
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
SDL_Rect result;
bool intersection;
bool empty;
/* Rect A empty */
result.w = SDLTest_RandomIntegerInRange(1, 100);
result.h = SDLTest_RandomIntegerInRange(1, 100);
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectA.w = 0;
refRectA.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
empty = SDL_RectEmpty(&result);
SDLTest_AssertCheck(empty == true, "Validate result is empty Rect; got: %s", (empty == true) ? "true" : "false");
/* Rect B empty */
result.w = SDLTest_RandomIntegerInRange(1, 100);
result.h = SDLTest_RandomIntegerInRange(1, 100);
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectB.w = 0;
refRectB.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
empty = SDL_RectEmpty(&result);
SDLTest_AssertCheck(empty == true, "Validate result is empty Rect; got: %s", (empty == true) ? "true" : "false");
/* Rect A and B empty */
result.w = SDLTest_RandomIntegerInRange(1, 100);
result.h = SDLTest_RandomIntegerInRange(1, 100);
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectA.w = 0;
refRectA.h = 0;
refRectB.w = 0;
refRectB.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_GetRectIntersection(&rectA, &rectB, &result);
validateIntersectRectResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
empty = SDL_RectEmpty(&result);
SDLTest_AssertCheck(empty == true, "Validate result is empty Rect; got: %s", (empty == true) ? "true" : "false");
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_GetRectIntersection() with invalid parameters
*
* \sa SDL_GetRectIntersection
*/
static int SDLCALL rect_testIntersectRectParam(void *arg)
{
SDL_Rect rectA;
SDL_Rect rectB = { 0 };
SDL_Rect result;
bool intersection;
/* invalid parameter combinations */
intersection = SDL_GetRectIntersection((SDL_Rect *)NULL, &rectB, &result);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 1st parameter is NULL");
intersection = SDL_GetRectIntersection(&rectA, (SDL_Rect *)NULL, &result);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 2nd parameter is NULL");
intersection = SDL_GetRectIntersection(&rectA, &rectB, (SDL_Rect *)NULL);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 3rd parameter is NULL");
intersection = SDL_GetRectIntersection((SDL_Rect *)NULL, (SDL_Rect *)NULL, &result);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 1st and 2nd parameters are NULL");
intersection = SDL_GetRectIntersection((SDL_Rect *)NULL, &rectB, (SDL_Rect *)NULL);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 1st and 3rd parameters are NULL ");
intersection = SDL_GetRectIntersection((SDL_Rect *)NULL, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when all parameters are NULL");
return TEST_COMPLETED;
}
/**
* Tests SDL_HasRectIntersection() with B fully inside A
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionInside(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
bool intersection;
/* rectB fully contained in rectA */
refRectB.x = 0;
refRectB.y = 0;
refRectB.w = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Tests SDL_HasRectIntersection() with B fully outside A
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionOutside(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
bool intersection;
/* rectB fully outside of rectA */
refRectB.x = refRectA.x + refRectA.w + SDLTest_RandomIntegerInRange(1, 10);
refRectB.y = refRectA.y + refRectA.h + SDLTest_RandomIntegerInRange(1, 10);
refRectB.w = refRectA.w;
refRectB.h = refRectA.h;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Tests SDL_HasRectIntersection() with B partially intersecting A
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionPartial(void *arg)
{
SDL_Rect refRectA = { 0, 0, 32, 32 };
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
bool intersection;
/* rectB partially contained in rectA */
refRectB.x = SDLTest_RandomIntegerInRange(refRectA.x + 1, refRectA.x + refRectA.w - 1);
refRectB.y = SDLTest_RandomIntegerInRange(refRectA.y + 1, refRectA.y + refRectA.h - 1);
refRectB.w = refRectA.w;
refRectB.h = refRectA.h;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
/* rectB right edge */
refRectB.x = rectA.w - 1;
refRectB.y = rectA.y;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
/* rectB left edge */
refRectB.x = 1 - rectA.w;
refRectB.y = rectA.y;
refRectB.w = refRectA.w;
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
/* rectB bottom edge */
refRectB.x = rectA.x;
refRectB.y = rectA.h - 1;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = SDLTest_RandomIntegerInRange(1, refRectA.h - 1);
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
/* rectB top edge */
refRectB.x = rectA.x;
refRectB.y = 1 - rectA.h;
refRectB.w = SDLTest_RandomIntegerInRange(1, refRectA.w - 1);
refRectB.h = rectA.h;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Tests SDL_HasRectIntersection() with 1x1 pixel sized rectangles
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionPoint(void *arg)
{
SDL_Rect refRectA = { 0, 0, 1, 1 };
SDL_Rect refRectB = { 0, 0, 1, 1 };
SDL_Rect rectA;
SDL_Rect rectB;
bool intersection;
int offsetX, offsetY;
/* intersecting pixels */
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectB.x = refRectA.x;
refRectB.y = refRectA.y;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, true, &rectA, &rectB, &refRectA, &refRectB);
/* non-intersecting pixels cases */
for (offsetX = -1; offsetX <= 1; offsetX++) {
for (offsetY = -1; offsetY <= 1; offsetY++) {
if (offsetX != 0 || offsetY != 0) {
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectB.x = refRectA.x;
refRectB.y = refRectA.y;
refRectB.x += offsetX;
refRectB.y += offsetY;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB);
}
}
}
return TEST_COMPLETED;
}
/**
* Tests SDL_HasRectIntersection() with empty rectangles
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionEmpty(void *arg)
{
SDL_Rect refRectA;
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
bool intersection;
/* Rect A empty */
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectA.w = 0;
refRectA.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB);
/* Rect B empty */
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectB.w = 0;
refRectB.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB);
/* Rect A and B empty */
refRectA.x = SDLTest_RandomIntegerInRange(1, 100);
refRectA.y = SDLTest_RandomIntegerInRange(1, 100);
refRectA.w = SDLTest_RandomIntegerInRange(1, 100);
refRectA.h = SDLTest_RandomIntegerInRange(1, 100);
refRectB = refRectA;
refRectA.w = 0;
refRectA.h = 0;
refRectB.w = 0;
refRectB.h = 0;
rectA = refRectA;
rectB = refRectB;
intersection = SDL_HasRectIntersection(&rectA, &rectB);
validateHasIntersectionResults(intersection, false, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_HasRectIntersection() with invalid parameters
*
* \sa SDL_HasRectIntersection
*/
static int SDLCALL rect_testHasIntersectionParam(void *arg)
{
SDL_Rect rectA;
SDL_Rect rectB = { 0 };
bool intersection;
/* invalid parameter combinations */
intersection = SDL_HasRectIntersection((SDL_Rect *)NULL, &rectB);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 1st parameter is NULL");
intersection = SDL_HasRectIntersection(&rectA, (SDL_Rect *)NULL);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when 2nd parameter is NULL");
intersection = SDL_HasRectIntersection((SDL_Rect *)NULL, (SDL_Rect *)NULL);
SDLTest_AssertCheck(intersection == false, "Check that function returns false when all parameters are NULL");
return TEST_COMPLETED;
}
/**
* Test SDL_GetRectEnclosingPointsFloat()
*
* \sa SDL_GetRectEnclosingPointsFloat
*/
static int SDLCALL rect_testEnclosePointsFloat(void *arg)
{
SDL_FPoint fpts[3] = { { 1.25f, 2.5f }, { 1.75f, 3.75f }, { 3.5f, 3.0f } };
int i, count = 3;
SDL_FRect clip = { 0.0f, 1.0f, 4.0f, 4.0f };
SDL_FRect result;
SDL_GetRectEnclosingPointsFloat(fpts, count, &clip, &result);
SDLTest_AssertCheck(result.x == 1.25f && result.y == 2.5f && result.w == 2.25f && result.h == 1.25f,
"Resulting enclosing rectangle incorrect: expected (%.2f,%.2f - %.2fx%.2f), actual (%.2f,%.2f - %.2fx%.2f)",
1.25f, 2.5f, 2.25f, 1.25f, result.x, result.y, result.w, result.h);
for (i = 0; i != count; i++) {
bool inside;
inside = SDL_PointInRectFloat(&fpts[i], &clip);
SDLTest_AssertCheck(inside,
"Expected point (%.2f,%.2f) to be inside clip rect (%.2f,%.2f - %.2fx%.2f)",
fpts[i].x, fpts[i].y, clip.x, clip.y, clip.w, clip.h);
inside = SDL_PointInRectFloat(&fpts[i], &result);
SDLTest_AssertCheck(inside,
"Expected point (%.2f,%.2f) to be inside result rect (%.2f,%.2f - %.2fx%.2f)",
fpts[i].x, fpts[i].y, result.x, result.y, result.w, result.h);
}
return TEST_COMPLETED;
}
/**
* Test SDL_GetRectEnclosingPoints() without clipping
*
* \sa SDL_GetRectEnclosingPoints
*/
static int SDLCALL rect_testEnclosePoints(void *arg)
{
const int numPoints = 16;
SDL_Point refPoints[16];
SDL_Point points[16];
SDL_Rect result;
bool anyEnclosed;
bool anyEnclosedNoResult;
bool expectedEnclosed = true;
int newx, newy;
int minx = 0, maxx = 0, miny = 0, maxy = 0;
int i;
/* Create input data, tracking result */
for (i = 0; i < numPoints; i++) {
newx = SDLTest_RandomIntegerInRange(-1024, 1024);
newy = SDLTest_RandomIntegerInRange(-1024, 1024);
refPoints[i].x = newx;
refPoints[i].y = newy;
points[i].x = newx;
points[i].y = newy;
if (i == 0) {
minx = newx;
maxx = newx;
miny = newy;
maxy = newy;
} else {
if (newx < minx) {
minx = newx;
}
if (newx > maxx) {
maxx = newx;
}
if (newy < miny) {
miny = newy;
}
if (newy > maxy) {
maxy = newy;
}
}
}
/* Call function and validate - special case: no result requested */
anyEnclosedNoResult = SDL_GetRectEnclosingPoints(points, numPoints, NULL, (SDL_Rect *)NULL);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosedNoResult,
"Check expected return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosedNoResult == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
/* Call function and validate */
anyEnclosed = SDL_GetRectEnclosingPoints(points, numPoints, NULL, &result);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosed,
"Check return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosed == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
SDLTest_AssertCheck(result.x == minx && result.y == miny && result.w == (maxx - minx + 1) && result.h == (maxy - miny + 1),
"Resulting enclosing rectangle incorrect: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
return TEST_COMPLETED;
}
/**
* Test SDL_GetRectEnclosingPoints() with repeated input points
*
* \sa SDL_GetRectEnclosingPoints
*/
static int SDLCALL rect_testEnclosePointsRepeatedInput(void *arg)
{
const int numPoints = 8;
const int halfPoints = 4;
SDL_Point refPoints[8];
SDL_Point points[8];
SDL_Rect result;
bool anyEnclosed;
bool anyEnclosedNoResult;
bool expectedEnclosed = true;
int newx, newy;
int minx = 0, maxx = 0, miny = 0, maxy = 0;
int i;
/* Create input data, tracking result */
for (i = 0; i < numPoints; i++) {
if (i < halfPoints) {
newx = SDLTest_RandomIntegerInRange(-1024, 1024);
newy = SDLTest_RandomIntegerInRange(-1024, 1024);
} else {
newx = refPoints[i - halfPoints].x;
newy = refPoints[i - halfPoints].y;
}
refPoints[i].x = newx;
refPoints[i].y = newy;
points[i].x = newx;
points[i].y = newy;
if (i == 0) {
minx = newx;
maxx = newx;
miny = newy;
maxy = newy;
} else {
if (newx < minx) {
minx = newx;
}
if (newx > maxx) {
maxx = newx;
}
if (newy < miny) {
miny = newy;
}
if (newy > maxy) {
maxy = newy;
}
}
}
/* Call function and validate - special case: no result requested */
anyEnclosedNoResult = SDL_GetRectEnclosingPoints(points, numPoints, NULL, (SDL_Rect *)NULL);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosedNoResult,
"Check return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosedNoResult == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
/* Call function and validate */
anyEnclosed = SDL_GetRectEnclosingPoints(points, numPoints, NULL, &result);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosed,
"Check return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosed == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
SDLTest_AssertCheck(result.x == minx && result.y == miny && result.w == (maxx - minx + 1) && result.h == (maxy - miny + 1),
"Check resulting enclosing rectangle: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
return TEST_COMPLETED;
}
/**
* Test SDL_GetRectEnclosingPoints() with clipping
*
* \sa SDL_GetRectEnclosingPoints
*/
static int SDLCALL rect_testEnclosePointsWithClipping(void *arg)
{
const int numPoints = 16;
SDL_Point refPoints[16];
SDL_Point points[16];
SDL_Rect refClip;
SDL_Rect clip;
SDL_Rect result;
bool anyEnclosed;
bool anyEnclosedNoResult;
bool expectedEnclosed = false;
int newx, newy;
int minx = 0, maxx = 0, miny = 0, maxy = 0;
int i;
/* Setup clipping rectangle */
refClip.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refClip.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refClip.w = SDLTest_RandomIntegerInRange(1, 1024);
refClip.h = SDLTest_RandomIntegerInRange(1, 1024);
/* Create input data, tracking result */
for (i = 0; i < numPoints; i++) {
newx = SDLTest_RandomIntegerInRange(-1024, 1024);
newy = SDLTest_RandomIntegerInRange(-1024, 1024);
refPoints[i].x = newx;
refPoints[i].y = newy;
points[i].x = newx;
points[i].y = newy;
if ((newx >= refClip.x) && (newx < (refClip.x + refClip.w)) &&
(newy >= refClip.y) && (newy < (refClip.y + refClip.h))) {
if (expectedEnclosed == false) {
minx = newx;
maxx = newx;
miny = newy;
maxy = newy;
} else {
if (newx < minx) {
minx = newx;
}
if (newx > maxx) {
maxx = newx;
}
if (newy < miny) {
miny = newy;
}
if (newy > maxy) {
maxy = newy;
}
}
expectedEnclosed = true;
}
}
/* Call function and validate - special case: no result requested */
clip = refClip;
anyEnclosedNoResult = SDL_GetRectEnclosingPoints(points, numPoints, &clip, NULL);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosedNoResult,
"Expected return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosedNoResult == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
SDLTest_AssertCheck(refClip.x == clip.x && refClip.y == clip.y && refClip.w == clip.w && refClip.h == clip.h,
"Check that source clipping rectangle was not modified");
/* Call function and validate */
anyEnclosed = SDL_GetRectEnclosingPoints(points, numPoints, &clip, &result);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosed,
"Check return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosed == true) ? "true" : "false");
for (i = 0; i < numPoints; i++) {
SDLTest_AssertCheck(refPoints[i].x == points[i].x && refPoints[i].y == points[i].y,
"Check that source point %i was not modified: expected (%i,%i) actual (%i,%i)",
i, refPoints[i].x, refPoints[i].y, points[i].x, points[i].y);
}
SDLTest_AssertCheck(refClip.x == clip.x && refClip.y == clip.y && refClip.w == clip.w && refClip.h == clip.h,
"Check that source clipping rectangle was not modified");
if (expectedEnclosed == true) {
SDLTest_AssertCheck(result.x == minx && result.y == miny && result.w == (maxx - minx + 1) && result.h == (maxy - miny + 1),
"Check resulting enclosing rectangle: expected (%i,%i - %i,%i), actual (%i,%i - %i,%i)",
minx, miny, maxx, maxy, result.x, result.y, result.x + result.w - 1, result.y + result.h - 1);
}
/* Empty clipping rectangle */
clip.w = 0;
clip.h = 0;
expectedEnclosed = false;
anyEnclosed = SDL_GetRectEnclosingPoints(points, numPoints, &clip, &result);
SDLTest_AssertCheck(expectedEnclosed == anyEnclosed,
"Check return value %s, got %s",
(expectedEnclosed == true) ? "true" : "false",
(anyEnclosed == true) ? "true" : "false");
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_GetRectEnclosingPoints() with invalid parameters
*
* \sa SDL_GetRectEnclosingPoints
*/
static int SDLCALL rect_testEnclosePointsParam(void *arg)
{
SDL_Point points[1];
int count;
SDL_Rect clip = { 0 };
SDL_Rect result;
bool anyEnclosed;
/* invalid parameter combinations */
anyEnclosed = SDL_GetRectEnclosingPoints((SDL_Point *)NULL, 1, &clip, &result);
SDLTest_AssertCheck(anyEnclosed == false, "Check that functions returns false when 1st parameter is NULL");
anyEnclosed = SDL_GetRectEnclosingPoints(points, 0, &clip, &result);
SDLTest_AssertCheck(anyEnclosed == false, "Check that functions returns false when 2nd parameter is 0");
count = SDLTest_RandomIntegerInRange(-100, -1);
anyEnclosed = SDL_GetRectEnclosingPoints(points, count, &clip, &result);
SDLTest_AssertCheck(anyEnclosed == false, "Check that functions returns false when 2nd parameter is %i (negative)", count);
anyEnclosed = SDL_GetRectEnclosingPoints((SDL_Point *)NULL, 0, &clip, &result);
SDLTest_AssertCheck(anyEnclosed == false, "Check that functions returns false when 1st parameter is NULL and 2nd parameter was 0");
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectUnion() where rect B is outside rect A
*
* \sa SDL_GetRectUnion
*/
static int SDLCALL rect_testUnionRectOutside(void *arg)
{
SDL_Rect refRectA, refRectB;
SDL_Rect rectA, rectB;
SDL_Rect expectedResult;
SDL_Rect result;
int minx, maxx, miny, maxy;
int dx, dy;
/* Union 1x1 outside */
for (dx = -1; dx < 2; dx++) {
for (dy = -1; dy < 2; dy++) {
if ((dx != 0) || (dy != 0)) {
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = 1;
refRectA.h = 1;
refRectB.x = SDLTest_RandomIntegerInRange(-1024, 1024) + dx * 2048;
refRectB.y = SDLTest_RandomIntegerInRange(-1024, 1024) + dx * 2048;
refRectB.w = 1;
refRectB.h = 1;
minx = (refRectA.x < refRectB.x) ? refRectA.x : refRectB.x;
maxx = (refRectA.x > refRectB.x) ? refRectA.x : refRectB.x;
miny = (refRectA.y < refRectB.y) ? refRectA.y : refRectB.y;
maxy = (refRectA.y > refRectB.y) ? refRectA.y : refRectB.y;
expectedResult.x = minx;
expectedResult.y = miny;
expectedResult.w = maxx - minx + 1;
expectedResult.h = maxy - miny + 1;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
}
}
}
/* Union outside overlap */
for (dx = -1; dx < 2; dx++) {
for (dy = -1; dy < 2; dy++) {
if ((dx != 0) || (dy != 0)) {
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = SDLTest_RandomIntegerInRange(256, 512);
refRectA.h = SDLTest_RandomIntegerInRange(256, 512);
refRectB.x = refRectA.x + 1 + dx * 2;
refRectB.y = refRectA.y + 1 + dy * 2;
refRectB.w = refRectA.w - 2;
refRectB.h = refRectA.h - 2;
expectedResult = refRectA;
if (dx == -1) {
expectedResult.x--;
}
if (dy == -1) {
expectedResult.y--;
}
if ((dx == 1) || (dx == -1)) {
expectedResult.w++;
}
if ((dy == 1) || (dy == -1)) {
expectedResult.h++;
}
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
}
}
}
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectUnion() where rect A or rect B are empty
*
* \sa SDL_GetRectUnion
*/
static int SDLCALL rect_testUnionRectEmpty(void *arg)
{
SDL_Rect refRectA, refRectB;
SDL_Rect rectA, rectB;
SDL_Rect expectedResult;
SDL_Rect result;
/* A empty */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = 0;
refRectA.h = 0;
refRectB.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.w = SDLTest_RandomIntegerInRange(1, 1024);
refRectB.h = SDLTest_RandomIntegerInRange(1, 1024);
expectedResult = refRectB;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* B empty */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = SDLTest_RandomIntegerInRange(1, 1024);
refRectA.h = SDLTest_RandomIntegerInRange(1, 1024);
refRectB.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.w = 0;
refRectB.h = 0;
expectedResult = refRectA;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* A and B empty */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = 0;
refRectA.h = 0;
refRectB.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectB.w = 0;
refRectB.h = 0;
result.x = 0;
result.y = 0;
result.w = 0;
result.h = 0;
expectedResult = result;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
return TEST_COMPLETED;
}
/**
* Tests SDL_GetRectUnion() where rect B is inside rect A
*
* \sa SDL_GetRectUnion
*/
static int SDLCALL rect_testUnionRectInside(void *arg)
{
SDL_Rect refRectA, refRectB;
SDL_Rect rectA, rectB;
SDL_Rect expectedResult;
SDL_Rect result;
int dx, dy;
/* Union 1x1 with itself */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = 1;
refRectA.h = 1;
expectedResult = refRectA;
rectA = refRectA;
SDL_GetRectUnion(&rectA, &rectA, &result);
validateUnionRectResults(&rectA, &rectA, &refRectA, &refRectA, &result, &expectedResult);
/* Union 1x1 somewhere inside */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = SDLTest_RandomIntegerInRange(256, 1024);
refRectA.h = SDLTest_RandomIntegerInRange(256, 1024);
refRectB.x = refRectA.x + 1 + SDLTest_RandomIntegerInRange(1, refRectA.w - 2);
refRectB.y = refRectA.y + 1 + SDLTest_RandomIntegerInRange(1, refRectA.h - 2);
refRectB.w = 1;
refRectB.h = 1;
expectedResult = refRectA;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
/* Union inside with edges modified */
for (dx = -1; dx < 2; dx++) {
for (dy = -1; dy < 2; dy++) {
if ((dx != 0) || (dy != 0)) {
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = SDLTest_RandomIntegerInRange(256, 1024);
refRectA.h = SDLTest_RandomIntegerInRange(256, 1024);
refRectB = refRectA;
if (dx == -1) {
refRectB.x++;
}
if ((dx == 1) || (dx == -1)) {
refRectB.w--;
}
if (dy == -1) {
refRectB.y++;
}
if ((dy == 1) || (dy == -1)) {
refRectB.h--;
}
expectedResult = refRectA;
rectA = refRectA;
rectB = refRectB;
SDL_GetRectUnion(&rectA, &rectB, &result);
validateUnionRectResults(&rectA, &rectB, &refRectA, &refRectB, &result, &expectedResult);
}
}
}
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_GetRectUnion() with invalid parameters
*
* \sa SDL_GetRectUnion
*/
static int SDLCALL rect_testUnionRectParam(void *arg)
{
SDL_Rect rectA, rectB = { 0 };
SDL_Rect result;
/* invalid parameter combinations */
SDL_GetRectUnion((SDL_Rect *)NULL, &rectB, &result);
SDLTest_AssertPass("Check that function returns when 1st parameter is NULL");
SDL_GetRectUnion(&rectA, (SDL_Rect *)NULL, &result);
SDLTest_AssertPass("Check that function returns when 2nd parameter is NULL");
SDL_GetRectUnion(&rectA, &rectB, (SDL_Rect *)NULL);
SDLTest_AssertPass("Check that function returns when 3rd parameter is NULL");
SDL_GetRectUnion((SDL_Rect *)NULL, &rectB, (SDL_Rect *)NULL);
SDLTest_AssertPass("Check that function returns when 1st and 3rd parameter are NULL");
SDL_GetRectUnion(&rectA, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
SDLTest_AssertPass("Check that function returns when 2nd and 3rd parameter are NULL");
SDL_GetRectUnion((SDL_Rect *)NULL, (SDL_Rect *)NULL, (SDL_Rect *)NULL);
SDLTest_AssertPass("Check that function returns when all parameters are NULL");
return TEST_COMPLETED;
}
/**
* Tests SDL_RectEmptyFloat() with various inputs
*
* \sa SDL_RectEmptyFloat
*/
static int SDLCALL rect_testRectEmptyFloat(void *arg)
{
SDL_FRect rect;
bool result;
rect.x = 0.0f;
rect.y = 0.0f;
rect.w = 1.0f;
rect.h = 1.0f;
result = SDL_RectEmptyFloat(&rect);
validateRectEmptyFloatResults(result, false, &rect);
rect.x = 0.0f;
rect.y = 0.0f;
rect.w = 0.0f;
rect.h = 0.0f;
result = SDL_RectEmptyFloat(&rect);
validateRectEmptyFloatResults(result, false, &rect);
rect.x = 0.0f;
rect.y = 0.0f;
rect.w = -1.0f;
rect.h = 1.0f;
result = SDL_RectEmptyFloat(&rect);
validateRectEmptyFloatResults(result, true, &rect);
rect.x = 0.0f;
rect.y = 0.0f;
rect.w = 1.0f;
rect.h = -1.0f;
result = SDL_RectEmptyFloat(&rect);
validateRectEmptyFloatResults(result, true, &rect);
return TEST_COMPLETED;
}
/**
* Tests SDL_RectEmpty() with various inputs
*
* \sa SDL_RectEmpty
*/
static int SDLCALL rect_testRectEmpty(void *arg)
{
SDL_Rect refRect;
SDL_Rect rect;
bool expectedResult;
bool result;
int w, h;
/* Non-empty case */
refRect.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRect.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRect.w = SDLTest_RandomIntegerInRange(256, 1024);
refRect.h = SDLTest_RandomIntegerInRange(256, 1024);
expectedResult = false;
rect = refRect;
result = SDL_RectEmpty(&rect);
validateRectEmptyResults(result, expectedResult, &rect, &refRect);
/* Empty case */
for (w = -1; w < 2; w++) {
for (h = -1; h < 2; h++) {
if ((w != 1) || (h != 1)) {
refRect.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRect.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRect.w = w;
refRect.h = h;
expectedResult = true;
rect = refRect;
result = SDL_RectEmpty(&rect);
validateRectEmptyResults(result, expectedResult, &rect, &refRect);
}
}
}
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_RectEmpty() with invalid parameters
*
* \sa SDL_RectEmpty
*/
static int SDLCALL rect_testRectEmptyParam(void *arg)
{
bool result;
/* invalid parameter combinations */
result = SDL_RectEmpty(NULL);
SDLTest_AssertCheck(result == true, "Check that function returns TRUE when 1st parameter is NULL");
return TEST_COMPLETED;
}
/**
* Tests SDL_RectsEqual() with various inputs
*
* \sa SDL_RectsEqual
*/
static int SDLCALL rect_testRectEquals(void *arg)
{
SDL_Rect refRectA;
SDL_Rect refRectB;
SDL_Rect rectA;
SDL_Rect rectB;
bool expectedResult;
bool result;
/* Equals */
refRectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = SDLTest_RandomIntegerInRange(1, 1024);
refRectA.h = SDLTest_RandomIntegerInRange(1, 1024);
refRectB = refRectA;
expectedResult = true;
rectA = refRectA;
rectB = refRectB;
result = SDL_RectsEqual(&rectA, &rectB);
validateRectEqualsResults(result, expectedResult, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_RectsEqual() with invalid parameters
*
* \sa SDL_RectsEqual
*/
static int SDLCALL rect_testRectEqualsParam(void *arg)
{
SDL_Rect rectA;
SDL_Rect rectB;
bool result;
/* data setup */
rectA.x = SDLTest_RandomIntegerInRange(-1024, 1024);
rectA.y = SDLTest_RandomIntegerInRange(-1024, 1024);
rectA.w = SDLTest_RandomIntegerInRange(1, 1024);
rectA.h = SDLTest_RandomIntegerInRange(1, 1024);
rectB.x = SDLTest_RandomIntegerInRange(-1024, 1024);
rectB.y = SDLTest_RandomIntegerInRange(-1024, 1024);
rectB.w = SDLTest_RandomIntegerInRange(1, 1024);
rectB.h = SDLTest_RandomIntegerInRange(1, 1024);
/* invalid parameter combinations */
result = SDL_RectsEqual(NULL, &rectB);
SDLTest_AssertCheck(result == false, "Check that function returns false when 1st parameter is NULL");
result = SDL_RectsEqual(&rectA, NULL);
SDLTest_AssertCheck(result == false, "Check that function returns false when 2nd parameter is NULL");
result = SDL_RectsEqual(NULL, NULL);
SDLTest_AssertCheck(result == false, "Check that function returns false when 1st and 2nd parameter are NULL");
return TEST_COMPLETED;
}
/**
* Tests SDL_RectsEqualFloat() with various inputs
*
* \sa SDL_RectsEqualFloat
*/
static int SDLCALL rect_testFRectEquals(void *arg)
{
SDL_FRect refRectA;
SDL_FRect refRectB;
SDL_FRect rectA;
SDL_FRect rectB;
bool expectedResult;
bool result;
/* Equals */
refRectA.x = (float)SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.y = (float)SDLTest_RandomIntegerInRange(-1024, 1024);
refRectA.w = (float)SDLTest_RandomIntegerInRange(1, 1024);
refRectA.h = (float)SDLTest_RandomIntegerInRange(1, 1024);
refRectB = refRectA;
expectedResult = true;
rectA = refRectA;
rectB = refRectB;
result = SDL_RectsEqualFloat(&rectA, &rectB);
validateFRectEqualsResults(result, expectedResult, &rectA, &rectB, &refRectA, &refRectB);
return TEST_COMPLETED;
}
/**
* Negative tests against SDL_RectsEqualFloat() with invalid parameters
*
* \sa SDL_RectsEqualFloat
*/
static int SDLCALL rect_testFRectEqualsParam(void *arg)
{
SDL_FRect rectA;
SDL_FRect rectB;
bool result;
/* data setup -- For the purpose of this test, the values don't matter. */
rectA.x = SDLTest_RandomFloat();
rectA.y = SDLTest_RandomFloat();
rectA.w = SDLTest_RandomFloat();
rectA.h = SDLTest_RandomFloat();
rectB.x = SDLTest_RandomFloat();
rectB.y = SDLTest_RandomFloat();
rectB.w = SDLTest_RandomFloat();
rectB.h = SDLTest_RandomFloat();
/* invalid parameter combinations */
result = SDL_RectsEqualFloat(NULL, &rectB);
SDLTest_AssertCheck(result == false, "Check that function returns false when 1st parameter is NULL");
result = SDL_RectsEqualFloat(&rectA, NULL);
SDLTest_AssertCheck(result == false, "Check that function returns false when 2nd parameter is NULL");
result = SDL_RectsEqualFloat(NULL, NULL);
SDLTest_AssertCheck(result == false, "Check that function returns false when 1st and 2nd parameter are NULL");
return TEST_COMPLETED;
}
/* ================= Test References ================== */
/* Rect test cases */
/* SDL_GetRectAndLineIntersectionFloat */
static const SDLTest_TestCaseReference rectTestIntersectRectAndLineFloat = {
rect_testIntersectRectAndLineFloat, "rect_testIntersectRectAndLineFloat", "Tests SDL_GetRectAndLineIntersectionFloat", TEST_ENABLED
};
/* SDL_GetRectAndLineIntersection */
static const SDLTest_TestCaseReference rectTestIntersectRectAndLine = {
rect_testIntersectRectAndLine, "rect_testIntersectRectAndLine", "Tests SDL_GetRectAndLineIntersection clipping cases", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectAndLineInside = {
rect_testIntersectRectAndLineInside, "rect_testIntersectRectAndLineInside", "Tests SDL_GetRectAndLineIntersection with line fully contained in rect", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectAndLineOutside = {
rect_testIntersectRectAndLineOutside, "rect_testIntersectRectAndLineOutside", "Tests SDL_GetRectAndLineIntersection with line fully outside of rect", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectAndLineEmpty = {
rect_testIntersectRectAndLineEmpty, "rect_testIntersectRectAndLineEmpty", "Tests SDL_GetRectAndLineIntersection with empty rectangle ", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectAndLineParam = {
rect_testIntersectRectAndLineParam, "rect_testIntersectRectAndLineParam", "Negative tests against SDL_GetRectAndLineIntersection with invalid parameters", TEST_ENABLED
};
/* SDL_GetRectIntersectionFloat */
static const SDLTest_TestCaseReference rectTestIntersectRectFloat = {
rect_testIntersectRectFloat, "rect_testIntersectRectFloat", "Tests SDL_GetRectIntersectionFloat", TEST_ENABLED
};
/* SDL_GetRectIntersection */
static const SDLTest_TestCaseReference rectTestIntersectRectInside = {
rect_testIntersectRectInside, "rect_testIntersectRectInside", "Tests SDL_GetRectIntersection with B fully contained in A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectOutside = {
rect_testIntersectRectOutside, "rect_testIntersectRectOutside", "Tests SDL_GetRectIntersection with B fully outside of A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectPartial = {
rect_testIntersectRectPartial, "rect_testIntersectRectPartial", "Tests SDL_GetRectIntersection with B partially intersecting A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectPoint = {
rect_testIntersectRectPoint, "rect_testIntersectRectPoint", "Tests SDL_GetRectIntersection with 1x1 sized rectangles", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectEmpty = {
rect_testIntersectRectEmpty, "rect_testIntersectRectEmpty", "Tests SDL_GetRectIntersection with empty rectangles", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestIntersectRectParam = {
rect_testIntersectRectParam, "rect_testIntersectRectParam", "Negative tests against SDL_GetRectIntersection with invalid parameters", TEST_ENABLED
};
/* SDL_HasRectIntersection */
static const SDLTest_TestCaseReference rectTestHasIntersectionInside = {
rect_testHasIntersectionInside, "rect_testHasIntersectionInside", "Tests SDL_HasRectIntersection with B fully contained in A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestHasIntersectionOutside = {
rect_testHasIntersectionOutside, "rect_testHasIntersectionOutside", "Tests SDL_HasRectIntersection with B fully outside of A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestHasIntersectionPartial = {
rect_testHasIntersectionPartial, "rect_testHasIntersectionPartial", "Tests SDL_HasRectIntersection with B partially intersecting A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestHasIntersectionPoint = {
rect_testHasIntersectionPoint, "rect_testHasIntersectionPoint", "Tests SDL_HasRectIntersection with 1x1 sized rectangles", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestHasIntersectionEmpty = {
rect_testHasIntersectionEmpty, "rect_testHasIntersectionEmpty", "Tests SDL_HasRectIntersection with empty rectangles", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestHasIntersectionParam = {
rect_testHasIntersectionParam, "rect_testHasIntersectionParam", "Negative tests against SDL_HasRectIntersection with invalid parameters", TEST_ENABLED
};
/* SDL_GetRectEnclosingPointsFloat */
static const SDLTest_TestCaseReference rectTestEnclosePointsFloat = {
rect_testEnclosePointsFloat, "rect_testEnclosePointsFloat", "Tests SDL_GetRectEnclosingPointsFloat", TEST_ENABLED
};
/* SDL_GetRectEnclosingPoints */
static const SDLTest_TestCaseReference rectTestEnclosePoints = {
rect_testEnclosePoints, "rect_testEnclosePoints", "Tests SDL_GetRectEnclosingPoints without clipping", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestEnclosePointsWithClipping = {
rect_testEnclosePointsWithClipping, "rect_testEnclosePointsWithClipping", "Tests SDL_GetRectEnclosingPoints with clipping", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestEnclosePointsRepeatedInput = {
rect_testEnclosePointsRepeatedInput, "rect_testEnclosePointsRepeatedInput", "Tests SDL_GetRectEnclosingPoints with repeated input", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestEnclosePointsParam = {
rect_testEnclosePointsParam, "rect_testEnclosePointsParam", "Negative tests against SDL_GetRectEnclosingPoints with invalid parameters", TEST_ENABLED
};
/* SDL_GetRectUnion */
static const SDLTest_TestCaseReference rectTestUnionRectInside = {
rect_testUnionRectInside, "rect_testUnionRectInside", "Tests SDL_GetRectUnion where rect B is inside rect A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestUnionRectOutside = {
rect_testUnionRectOutside, "rect_testUnionRectOutside", "Tests SDL_GetRectUnion where rect B is outside rect A", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestUnionRectEmpty = {
rect_testUnionRectEmpty, "rect_testUnionRectEmpty", "Tests SDL_GetRectUnion where rect A or rect B are empty", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestUnionRectParam = {
rect_testUnionRectParam, "rect_testUnionRectParam", "Negative tests against SDL_GetRectUnion with invalid parameters", TEST_ENABLED
};
/* SDL_RectEmptyFloat */
static const SDLTest_TestCaseReference rectTestRectEmptyFloat = {
rect_testRectEmptyFloat, "rect_testRectEmptyFloat", "Tests SDL_RectEmptyFloat with various inputs", TEST_ENABLED
};
/* SDL_RectEmpty */
static const SDLTest_TestCaseReference rectTestRectEmpty = {
rect_testRectEmpty, "rect_testRectEmpty", "Tests SDL_RectEmpty with various inputs", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestRectEmptyParam = {
rect_testRectEmptyParam, "rect_testRectEmptyParam", "Negative tests against SDL_RectEmpty with invalid parameters", TEST_ENABLED
};
/* SDL_RectsEqual */
static const SDLTest_TestCaseReference rectTestRectEquals = {
rect_testRectEquals, "rect_testRectEquals", "Tests SDL_RectsEqual with various inputs", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestRectEqualsParam = {
rect_testRectEqualsParam, "rect_testRectEqualsParam", "Negative tests against SDL_RectsEqual with invalid parameters", TEST_ENABLED
};
/* SDL_RectsEqualFloat */
static const SDLTest_TestCaseReference rectTestFRectEquals = {
rect_testFRectEquals, "rect_testFRectEquals", "Tests SDL_RectsEqualFloat with various inputs", TEST_ENABLED
};
static const SDLTest_TestCaseReference rectTestFRectEqualsParam = {
rect_testFRectEqualsParam, "rect_testFRectEqualsParam", "Negative tests against SDL_RectsEqualFloat with invalid parameters", TEST_ENABLED
};
/**
* Sequence of Rect test cases; functions that handle simple rectangles including overlaps and merges.
*/
static const SDLTest_TestCaseReference *rectTests[] = {
&rectTestIntersectRectAndLineFloat,
&rectTestIntersectRectAndLine,
&rectTestIntersectRectAndLineInside,
&rectTestIntersectRectAndLineOutside,
&rectTestIntersectRectAndLineEmpty,
&rectTestIntersectRectAndLineParam,
&rectTestIntersectRectFloat,
&rectTestIntersectRectInside,
&rectTestIntersectRectOutside,
&rectTestIntersectRectPartial,
&rectTestIntersectRectPoint,
&rectTestIntersectRectEmpty,
&rectTestIntersectRectParam,
&rectTestHasIntersectionInside,
&rectTestHasIntersectionOutside,
&rectTestHasIntersectionPartial,
&rectTestHasIntersectionPoint,
&rectTestHasIntersectionEmpty,
&rectTestHasIntersectionParam,
&rectTestEnclosePointsFloat,
&rectTestEnclosePoints,
&rectTestEnclosePointsWithClipping,
&rectTestEnclosePointsRepeatedInput,
&rectTestEnclosePointsParam,
&rectTestUnionRectInside,
&rectTestUnionRectOutside,
&rectTestUnionRectEmpty,
&rectTestUnionRectParam,
&rectTestRectEmptyFloat,
&rectTestRectEmpty,
&rectTestRectEmptyParam,
&rectTestRectEquals,
&rectTestRectEqualsParam,
&rectTestFRectEquals,
&rectTestFRectEqualsParam,
NULL
};
/* Rect test suite (global) */
SDLTest_TestSuiteReference rectTestSuite = {
"Rect",
NULL,
rectTests,
NULL
};