Commit 6b4b6d8e59aa11deb2ecae112af5c1dcc07da93f

Pierre Wendling 2022-05-21T23:01:50

Test: Add Asin tests to math suite.

diff --git a/test/testautomation_math.c b/test/testautomation_math.c
index 78d5828..9ae968e 100644
--- a/test/testautomation_math.c
+++ b/test/testautomation_math.c
@@ -2159,6 +2159,94 @@ acos_precisionTest(void *args)
     return helper_dtod_approx("Acos", SDL_acos, precision_cases, SDL_arraysize(precision_cases));
 }
 
+/* SDL_asin tests functions */
+
+/**
+ * \brief Checks limits of the domain (+/-1).
+ */
+static int
+asin_limitCases(void *args)
+{
+    double result;
+
+    result = SDL_asin(1.0);
+    SDLTest_AssertCheck(M_PI / 2.0 == result,
+                        "Asin(%f), expected %f, got %f",
+                        1.0, M_PI / 2.0, result);
+
+    result = SDL_asin(-1.0);
+    SDLTest_AssertCheck(-M_PI / 2.0 == result,
+                        "Asin(%f), expected %f, got %f",
+                        -1.0, -M_PI / 2.0, result);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks values outside the domain (|x| > 1).
+ */
+static int
+asin_outOfDomainCases(void *args)
+{
+    double result;
+
+    result = SDL_asin(1.1);
+    SDLTest_AssertCheck(isnan(result),
+                        "Asin(%f), expected %f, got %f",
+                        1.1, NAN, result);
+
+    result = SDL_asin(-1.1);
+    SDLTest_AssertCheck(isnan(result),
+                        "Asin(%f), expected %f, got %f",
+                        -1.1, NAN, result);
+
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks for nan.
+ */
+static int
+asin_nanCase(void *args)
+{
+    const double result = SDL_asin(NAN);
+    SDLTest_AssertCheck(isnan(result),
+                        "Asin(%f), expected %f, got %f",
+                        NAN, NAN, result);
+    return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks arc sine precision for the first 10 decimals.
+ */
+static int
+asin_precisionTest(void *args)
+{
+    const d_to_d precision_cases[] = {
+        { 0.9, 11197695149.0 },
+        { 0.8, 9272952180.0 },
+        { 0.7, 7753974966.0 },
+        { 0.6, 6435011087.0 },
+        { 0.5, 5235987755.0 },
+        { 0.4, 4115168460.0 },
+        { 0.3, 3046926540.0 },
+        { 0.2, 2013579207.0 },
+        { 0.1, 1001674211.0 },
+        { 0.0, 0.0 },
+        { -0.0, -0.0 },
+        { -0.1, -1001674211.0 },
+        { -0.2, -2013579207.0 },
+        { -0.3, -3046926540.0 },
+        { -0.4, -4115168460.0 },
+        { -0.5, -5235987755.0 },
+        { -0.6, -6435011087.0 },
+        { -0.7, -7753974966.0 },
+        { -0.8, -9272952180.0 },
+        { -0.9, -11197695149.0 }
+    };
+    return helper_dtod_approx("Asin", SDL_asin, precision_cases, SDL_arraysize(precision_cases));
+}
+
 /* ================= Test References ================== */
 
 /* SDL_floor test cases */
@@ -2596,6 +2684,25 @@ static const SDLTest_TestCaseReference acosTestPrecision = {
     "Check acos precision to the tenth decimal", TEST_ENABLED
 };
 
+/* SDL_asin test cases */
+
+static const SDLTest_TestCaseReference asinTestLimit = {
+    (SDLTest_TestCaseFp) asin_limitCases, "asin_limitCases",
+    "Check the edge of the domain (+/-1)", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference asinTestOutOfDomain = {
+    (SDLTest_TestCaseFp) asin_outOfDomainCases, "asin_outOfDomainCases",
+    "Check a for value outside the domain", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference asinTestNan = {
+    (SDLTest_TestCaseFp) asin_nanCase, "asin_nanCase",
+    "Check the NaN special case", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference asinTestPrecision = {
+    (SDLTest_TestCaseFp) asin_precisionTest, "asin_precisionTest",
+    "Check asin precision to the tenth decimal", TEST_ENABLED
+};
+
 static const SDLTest_TestCaseReference *mathTests[] = {
     &floorTestInf, &floorTestZero, &floorTestNan,
     &floorTestRound, &floorTestFraction, &floorTestRange,
@@ -2647,6 +2754,8 @@ static const SDLTest_TestCaseReference *mathTests[] = {
 
     &acosTestLimit, &acosTestOutOfDomain, &acosTestNan, &acosTestPrecision,
 
+    &asinTestLimit, &asinTestOutOfDomain, &asinTestNan, &asinTestPrecision,
+
     NULL
 };