SDL: Added tests to cover invalid surface blits

From 89d7d406ab1f0033ecdd5837b1fce4da69bef260 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 22 Apr 2025 13:05:38 -0700
Subject: [PATCH] Added tests to cover invalid surface blits

Reproduction case for https://github.com/libsdl-org/SDL/issues/12844
---
 test/testautomation_surface.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/test/testautomation_surface.c b/test/testautomation_surface.c
index 3b840039d8573..d3382309229d7 100644
--- a/test/testautomation_surface.c
+++ b/test/testautomation_surface.c
@@ -959,6 +959,36 @@ static int SDLCALL surface_testBlitBlendMul(void *arg)
     return TEST_COMPLETED;
 }
 
+/**
+ * Tests blitting invalid surfaces.
+ */
+static int SDLCALL surface_testBlitInvalid(void *arg)
+{
+    SDL_Surface *valid, *invalid;
+    bool result;
+
+    valid = SDL_CreateSurface(1, 1, SDL_PIXELFORMAT_RGBA8888);
+    SDLTest_AssertCheck(valid != NULL, "Check surface creation");
+    invalid = SDL_CreateSurface(0, 0, SDL_PIXELFORMAT_RGBA8888);
+    SDLTest_AssertCheck(invalid != NULL, "Check surface creation");
+    SDLTest_AssertCheck(invalid->pixels == NULL, "Check surface pixels are NULL");
+
+    result = SDL_BlitSurface(invalid, NULL, valid, NULL);
+    SDLTest_AssertCheck(result == true, "SDL_BlitSurface(invalid, NULL, valid, NULL), result = %s\n", result ? "true" : "false");
+    result = SDL_BlitSurface(valid, NULL, invalid, NULL);
+    SDLTest_AssertCheck(result == true, "SDL_BlitSurface(valid, NULL, invalid, NULL), result = %s\n", result ? "true" : "false");
+
+    result = SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST);
+    SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(invalid, NULL, valid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false");
+    result = SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST);
+    SDLTest_AssertCheck(result == false, "SDL_BlitSurfaceScaled(valid, NULL, invalid, NULL, SDL_SCALEMODE_NEAREST), result = %s\n", result ? "true" : "false");
+
+    SDL_DestroySurface(valid);
+    SDL_DestroySurface(invalid);
+
+    return TEST_COMPLETED;
+}
+
 static int SDLCALL surface_testOverflow(void *arg)
 {
     char buf[1024];
@@ -1632,6 +1662,10 @@ static const SDLTest_TestCaseReference surfaceTestBlitBlendMul = {
     surface_testBlitBlendMul, "surface_testBlitBlendMul", "Tests blitting routines with mul blending mode.", TEST_ENABLED
 };
 
+static const SDLTest_TestCaseReference surfaceTestBlitInvalid = {
+    surface_testBlitInvalid, "surface_testBlitInvalid", "Tests blitting routines with invalid surfaces.", TEST_ENABLED
+};
+
 static const SDLTest_TestCaseReference surfaceTestOverflow = {
     surface_testOverflow, "surface_testOverflow", "Test overflow detection.", TEST_ENABLED
 };
@@ -1680,6 +1714,7 @@ static const SDLTest_TestCaseReference *surfaceTests[] = {
     &surfaceTestBlitBlendAddPremultiplied,
     &surfaceTestBlitBlendMod,
     &surfaceTestBlitBlendMul,
+    &surfaceTestBlitInvalid,
     &surfaceTestOverflow,
     &surfaceTestFlip,
     &surfaceTestPalette,