Test: Add Atan tests to math suite.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
diff --git a/test/testautomation_math.c b/test/testautomation_math.c
index 6aa9ba0..851b444 100644
--- a/test/testautomation_math.c
+++ b/test/testautomation_math.c
@@ -2249,6 +2249,93 @@ asin_precisionTest(void *args)
return helper_dtod_approx("Asin", SDL_asin, precision_cases, SDL_arraysize(precision_cases));
}
+/* SDL_atan tests functions */
+
+/**
+ * \brief Checks limits of the domain (+/- infinity).
+ */
+static int
+atan_limitCases(void *args)
+{
+ double result;
+
+ result = SDL_atan(INFINITY);
+ SDLTest_AssertCheck(M_PI / 2.0 == result,
+ "Atan(%f), expected %f, got %f",
+ INFINITY, M_PI / 2.0, result);
+
+ result = SDL_atan(-INFINITY);
+ SDLTest_AssertCheck(-M_PI / 2.0 == result,
+ "Atan(%f), expected %f, got %f",
+ -INFINITY, -M_PI / 2.0, result);
+
+ return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks positive and negative zeros.
+ */
+static int
+atan_zeroCases(void *args)
+{
+ double result;
+
+ result = SDL_atan(0.0);
+ SDLTest_AssertCheck(0.0 == result,
+ "Atan(%f), expected %f, got %f",
+ 0.0, 0.0, result);
+
+ result = SDL_atan(-0.0);
+ SDLTest_AssertCheck(-0.0 == result,
+ "Atan(%f), expected %f, got %f",
+ -0.0, -0.0, result);
+
+ return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks for nan.
+ */
+static int
+atan_nanCase(void *args)
+{
+ const double result = SDL_atan(NAN);
+ SDLTest_AssertCheck(isnan(result),
+ "Atan(%f), expected %f, got %f",
+ NAN, NAN, result);
+ return TEST_COMPLETED;
+}
+
+/**
+ * \brief Checks arc tangent precision for the first 10 decimals.
+ */
+static int
+atan_precisionTest(void *args)
+{
+ /* Checks angles from 9PI/20 -> -9PI/20 with steps of 1/20th */
+ const d_to_d precision_cases[] = {
+ { 6.313751514675041, 14137166941.0 },
+ { 3.0776835371752527, 12566370614.0 },
+ { 1.9626105055051504, 10995574287.0 },
+ { 1.3763819204711734, 9424777960.0 },
+ { 1.0, 7853981633.0 },
+ { 0.7265425280053609, 6283185307.0 },
+ { 0.5095254494944288, 4712388980.0 },
+ { 0.3249196962329063, 3141592653.0 },
+ { 0.15838444032453627, 1570796326.0 },
+ { -0.15838444032453627, -1570796326.0 },
+ { -0.3249196962329063, -3141592653.0 },
+ { -0.5095254494944288, -4712388980.0 },
+ { -0.7265425280053609, -6283185307.0 },
+ { -1.0, -7853981633.0 },
+ { -1.3763819204711734, -9424777960.0 },
+ { -1.9626105055051504, -10995574287.0 },
+ { -3.0776835371752527, -12566370614.0 },
+ { -6.313751514675041, -14137166941.0 },
+ };
+ return helper_dtod_approx("Atan", SDL_atan, precision_cases, SDL_arraysize(precision_cases));
+}
+
/* ================= Test References ================== */
/* SDL_floor test cases */
@@ -2705,6 +2792,25 @@ static const SDLTest_TestCaseReference asinTestPrecision = {
"Check asin precision to the tenth decimal", TEST_ENABLED
};
+/* SDL_atan test cases */
+
+static const SDLTest_TestCaseReference atanTestLimit = {
+ (SDLTest_TestCaseFp) atan_limitCases, "atan_limitCases",
+ "Check the edge of the domain (+/- infinity)", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference atanTestZero = {
+ (SDLTest_TestCaseFp) atan_zeroCases, "atan_zeroCases",
+ "Check for positive and negative zero", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference atanTestNan = {
+ (SDLTest_TestCaseFp) atan_nanCase, "atan_nanCase",
+ "Check the NaN special case", TEST_ENABLED
+};
+static const SDLTest_TestCaseReference atanTestPrecision = {
+ (SDLTest_TestCaseFp) atan_precisionTest, "atan_precisionTest",
+ "Check atan precision to the tenth decimal", TEST_ENABLED
+};
+
static const SDLTest_TestCaseReference *mathTests[] = {
&floorTestInf, &floorTestZero, &floorTestNan,
&floorTestRound, &floorTestFraction, &floorTestRange,
@@ -2758,6 +2864,8 @@ static const SDLTest_TestCaseReference *mathTests[] = {
&asinTestLimit, &asinTestOutOfDomain, &asinTestNan, &asinTestPrecision,
+ &atanTestLimit, &atanTestZero, &atanTestNan, &atanTestPrecision,
+
NULL
};