SDL: Test: Add Scalbn tests to math suite.

From 7a55fa4e56cd988b7817ae0fb8bf4a34c4f6e057 Mon Sep 17 00:00:00 2001
From: Pierre Wendling <[EMAIL REDACTED]>
Date: Sun, 15 May 2022 19:03:53 -0400
Subject: [PATCH] Test: Add Scalbn tests to math suite.

---
 test/testautomation_math.c | 133 +++++++++++++++++++++++++++++++++++++
 1 file changed, 133 insertions(+)

diff --git a/test/testautomation_math.c b/test/testautomation_math.c
index be07bddea33..14d0afdfe08 100644
--- a/test/testautomation_math.c
+++ b/test/testautomation_math.c
@@ -1631,6 +1631,113 @@ sqrt_regularCases(void *args)
     return helper_dtod("Sqrt", SDL_sqrt, regular_cases, SDL_arraysize(regular_cases));
 }
 
+/* SDL_scalbn tests functions */
+
+/**
+ * \brief Checks for positive and negative infinity arg.
+ */
+static int
+scalbn_infCases(void *args)
+{
+    double result;
+
+    result = SDL_scalbn(INFINITY, 1);
+    SDLTest_AssertCheck(INFINITY == result,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        INFINITY, 1, INFINITY, result);
+
+    result = SDL_scalbn(-INFINITY, 1);
+    SDLTest_AssertCheck(-INFINITY == result,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        -INFINITY, 1, -INFINITY, result);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks for positive and negative zero arg.
+ */
+static int
+scalbn_baseZeroCases(void *args)
+{
+    double result;
+
+    result = SDL_scalbn(0.0, 1);
+    SDLTest_AssertCheck(0.0 == result,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        0.0, 1, 0.0, result);
+
+    result = SDL_scalbn(-0.0, 1);
+    SDLTest_AssertCheck(-0.0 == result,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        -0.0, 1, -0.0, result);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks for zero exp.
+ */
+static int
+scalbn_expZeroCase(void *args)
+{
+    const double result = SDL_scalbn(42.0, 0);
+    SDLTest_AssertCheck(42.0 == result,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        42.0, 0, 42.0, result);
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks for NAN arg.
+ */
+static int
+scalbn_nanCase(void *args)
+{
+    const double result = SDL_scalbn(NAN, 2);
+    SDLTest_AssertCheck(isnan(result),
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        NAN, 2, NAN, result);
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks a set of regular values.
+ *
+ * This test depends on SDL_pow functionning.
+ */
+static int
+scalbn_regularCases(void *args)
+{
+    double result, expected;
+
+    result = SDL_scalbn(2.0, 2);
+    expected = 2.0 * SDL_pow(FLT_RADIX, 2);
+    SDLTest_AssertCheck(result == expected,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        2.0, 2, expected, result);
+
+    result = SDL_scalbn(1.0, 13);
+    expected = 1.0 * SDL_pow(FLT_RADIX, 13);
+    SDLTest_AssertCheck(result == expected,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        1.0, 13, expected, result);
+
+    result = SDL_scalbn(2.0, -5);
+    expected = 2.0 * SDL_pow(FLT_RADIX, -5);
+    SDLTest_AssertCheck(result == expected,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        2.0, -5, expected, result);
+
+    result = SDL_scalbn(-1.0, -13);
+    expected = -1.0 * SDL_pow(FLT_RADIX, -13);
+    SDLTest_AssertCheck(result == expected,
+                        "Scalbn(%f,%d), expected %f, got %f",
+                        -1.0, -13, expected, result);
+
+    return TEST_COMPLETED;
+}
+
 /* ================= Test References ================== */
 
 /* SDL_floor test cases */
@@ -1961,6 +2068,29 @@ static const SDLTest_TestCaseReference sqrtTestRegular = {
     "Check a set of regular values", TEST_ENABLED
 };
 
+/* SDL_scalbn test cases */
+
+static const SDLTest_TestCaseReference scalbnTestInf = {
+    (SDLTest_TestCaseFp) scalbn_infCases, "scalbn_infCases",
+    "Check positive and negative infinity arg", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference scalbnTestBaseZero = {
+    (SDLTest_TestCaseFp) scalbn_baseZeroCases, "scalbn_baseZeroCases",
+    "Check for positive and negative zero arg", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference scalbnTestExpZero = {
+    (SDLTest_TestCaseFp) scalbn_expZeroCase, "scalbn_expZeroCase",
+    "Check for zero exp", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference scalbnTestNan = {
+    (SDLTest_TestCaseFp) scalbn_nanCase, "scalbn_nanCase",
+    "Check the NaN special case", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference scalbnTestRegular = {
+    (SDLTest_TestCaseFp) scalbn_regularCases, "scalbn_regularCases",
+    "Check a set of regular cases", TEST_ENABLED
+};
+
 static const SDLTest_TestCaseReference *mathTests[] = {
     &floorTestInf, &floorTestZero, &floorTestNan,
     &floorTestRound, &floorTestFraction, &floorTestRange,
@@ -1999,6 +2129,9 @@ static const SDLTest_TestCaseReference *mathTests[] = {
     &sqrtTestInf, &sqrtTestNan, &sqrtTestDomain,
     &sqrtTestBase, &sqrtTestRegular,
 
+    &scalbnTestInf, &scalbnTestBaseZero, &scalbnTestExpZero,
+    &scalbnTestNan, &scalbnTestRegular,
+
     NULL
 };