From 14395fe12b76fea5e78df804acaaadb6eade7468 Mon Sep 17 00:00:00 2001
From: Nozomi Kodama <nozomi.kodama@yahoo.com>
Date: Tue, 16 Oct 2012 16:22:00 -1000
Subject: Add tests for D3DXSHRotateZ

---
 dlls/d3dx9_36/tests/math.c |  138 ++++++++++++++++++++++++++++++++------------
 1 file changed, 100 insertions(+), 38 deletions(-)

diff --git a/dlls/d3dx9_36/tests/math.c b/dlls/d3dx9_36/tests/math.c
index 166b14a..3e27a41 100644
--- a/dlls/d3dx9_36/tests/math.c
+++ b/dlls/d3dx9_36/tests/math.c
@@ -2780,49 +2780,111 @@ static void test_D3DXSHRotate(void)
 
 static void test_D3DXSHRotateZ(void)
 {
-    unsigned int i, j, order, square;
-    FLOAT angle[] = { D3DX_PI / 3.0f, -D3DX_PI / 3.0f, 4.0f * D3DX_PI / 3.0f, }, expected, in[49], out[49], *received_ptr, table[] =
-    { /* Angle =  D3DX_PI / 3.0f */
-      1.01f, 4.477762f, 3.010000f, 0.264289f, 5.297888f, 9.941864f, 7.010000f, -1.199813f,
-      -8.843789f, -10.010002f, 7.494040f, 18.138016f, 13.010000, -3.395966f, -17.039942f,
-      -16.009998f, -30.164297f, -18.010004f, 10.422242f, 29.066219f, 21.010000f, -6.324171f,
-      -27.968145f, -24.009998f, 2.226099f, -18.180565, -43.824551f, -28.010004f, 14.082493f,
-      42.726471f,  31.010000f, -9.984426f, -41.628399f, -34.009995f, 5.886358f, 40.530331f,
-      /* Angle =  D3DX_PI / 3.0f */
-      1.01f, -2.467762f, 3.010000f, 3.745711f, -10.307890f, -3.931864f, 7.010000f, 9.209813f,
-      -0.166214f, -10.010002f, -18.504044f, -6.128017f, 13.010000f, 17.405966f, 2.029938f,
-      -16.009998f, 13.154303f, -18.010004f, -29.432247f, -9.056221f, 21.010000f, 28.334169f,
-      4.958139f, -24.010002f, -27.236092f, 44.190582f, 16.814558f, -28.009996f, -43.092499f,
-      -12.716474f, 31.010000f, 41.994423f, 8.618393f, -34.010002f, -40.896347f, -4.520310f,
-      /* Angle =  4.0f * D3DX_PI / 3.0f */
-      1.01f, -4.477762f, 3.010000f, -0.264289f, 5.297887f, -9.941864f, 7.010000f, 1.199814f,
-      -8.843788f, 10.010004f, 7.494038f, -18.138016f, 13.010000f, 3.395967f, -17.039940f,
-      16.009996f, -30.164293f, 18.010006f, 10.422239f, -29.066219f, 21.010000f, 6.324172f,
-      -27.968143f, 24.009993f, 2.226105f, 18.180552f, -43.824543f, 28.010008f, 14.082489f,
-      -42.726471f, 31.010000f, 9.984427f, -41.628399f, 34.009987f, 5.886366f, -40.530327, };
+    unsigned int end, i, j, l, order, square;
+    FLOAT expected, in[49], out[49], *out_temp, *received_ptr;
+    const FLOAT angle[] = { D3DX_PI / 3.0f, -D3DX_PI / 3.0f, 4.0f * D3DX_PI / 3.0f, }, table[] =
+    { /* Angle = D3DX_PI / 3.0f */
+      1.01f, 4.477762f, 3.010000f, 0.264289f, 5.297888f, 9.941864f,
+      7.010000f, -1.199813f, -8.843789f, -10.010002f, 7.494040f, 18.138016f,
+      13.010000, -3.395966f, -17.039942f, -16.009998f, -30.164297f, -18.010004f,
+      10.422242f, 29.066219f, 21.010000f, -6.324171f, -27.968145f, -24.009998f,
+      2.226099f, -18.180565, -43.824551f, -28.010004f, 14.082493f, 42.726471f,
+      31.010000f, -9.984426f, -41.628399f, -34.009995f, 5.886358f, 40.530331f,
+
+      1.01f, 4.477762f, 0.0f, -5.816784f, 5.297888f, 6.936864f,
+      0.0f, -9.011250f, -2.294052f, -10.010002f, 12.999042f, 12.133017f,
+      0.0f, -15.761250f, -5.628748f, 0.0f, -30.164297f, 0.0f,
+      19.927244f, 19.061220f, 0.0f, -24.761251f, -8.628748f, 0.0f,
+      -13.061530f, -18.180565f, -30.319553f, 0.0f, 28.587496f, 27.721474f,
+      0.0f, -36.011253f, -12.378746f, 0.0f, -13.128758f, -23.617250f,
+
+      1.010000f, 3.977762f, 3.977762f, 1.114195f, 7.245791f, 10.559759f,
+      10.559759f, -0.995160f, -0.467341f, 0.467339f, 12.765371f, 18.515701f,
+      18.515701f, -1.797287f, 0.493916f, -0.493916f, -21.412342f, 21.412338f,
+      9.221072f, 23.671757f, 23.671757f, 3.850195f, -20.468727f, 20.468723f,
+      -10.662103f, -36.516628f, -12.061245f, 12.061240f, 22.556875f, 38.999908f,
+      38.999908f, -0.034875f, -10.427902f, 10.427900f, -36.838284f, -27.652803f,
+      /* Angle = -D3DX_PI / 3.0f */
+      1.01f, -2.467762f, 3.010000f, 3.745711f, -10.307890f, -3.931864f,
+      7.010000f, 9.209813f, -0.166214f, -10.010002f, -18.504044f, -6.128017f,
+      13.010000f, 17.405966f, 2.029938f, -16.009998f, 13.154303f, -18.010004f,
+      -29.432247f, -9.056221f, 21.010000f, 28.334169f, 4.958139f, -24.010002f,
+      -27.236092f, 44.190582f, 16.814558f, -28.009996f, -43.092499f, -12.716474f,
+      31.010000f, 41.994423f, 8.618393f, -34.010002f, -40.896347f, -4.520310f,
+
+      1.01f, -2.467762f, 0.0f, -3.205718f, -10.307890f, -6.936864f,
+      0.0f, -9.011250f, -4.463446f, -10.009998f, -12.999042f, -12.133017f,
+      0.0f, -15.761250f, -5.628748f, 0.0f, 13.154303f, 0.0f,
+      -19.927244f, -19.061220f, 0.0f, -24.761251f, -8.628748f, 0.0f,
+      -5.695983f, 44.190582f, 30.319553f, 0.0f, -28.587496f, -27.721474f,
+      0.0f, -36.011253f, -12.378746f, 0.0f, -13.128758f, -57.405258f,
+
+      1.010000f, -2.967762f, -2.967762f, -0.609195f, -7.498291f, -10.686009f,
+      -10.686009f, -11.836716f, 5.390780f, -5.390779f, -10.303651f, -17.284842f,
+      -17.284842f, -17.565643f, 4.114273f, -4.114273f, 23.716436f, -23.716433f,
+      -8.069025f, -23.095732f, -23.095732f, -18.535847f, -11.271107f, 11.271104f,
+      -2.072484f, 30.149330f, 15.244893f, -15.244888f, -20.965050f, -38.203999f,
+      -38.203999f, -37.258266f, 5.426677f, -5.426679f, -23.396751f, -9.903559f,
+      /* Angle = 4.0f * D3DX_PI / 3.0f */
+      1.01f, -4.477762f, 3.010000f, -0.264289f, 5.297887f, -9.941864f,
+      7.010000f, 1.199814f, -8.843788f, 10.010004f, 7.494038f, -18.138016f,
+      13.010000f, 3.395967f, -17.039940f, 16.009996f, -30.164293f, 18.010006f,
+      10.422239f, -29.066219f, 21.010000f, 6.324172f, -27.968143f, 24.009993f,
+      2.226105f, 18.180552f, -43.824543f, 28.010008f, 14.082489f, -42.726471f,
+      31.010000f, 9.984427f, -41.628399f, 34.009987f, 5.886366f, -40.530327f,
+
+      1.01f, -4.477762f, 0.0f, -1.938928f, 5.297887f, -6.936864f,
+      0.0f, -3.003751f, -2.294051f, 10.010004f, 12.999040f, -12.133017f,
+      0.0f, -5.253751f, -5.628747f, 0.0f, -30.164293f, 0.0f,
+      19.927242f, -19.061220f, 0.0f, -8.253753f, -8.628746f, 0.0f,
+      -13.061535f, 18.180552f, -30.319553f, 0.0f, 28.587492f, -27.721474f,
+      0.0f, -12.003753f, -12.378742f, 0.0f, -13.128765f, -7.872400f,
+
+      1.010000f, -3.977762f, -3.977762f, 2.863566f, 6.371104f, -10.122416f,
+      -10.122416f, 10.578746f, -7.769295f, -7.769290f, 16.883686f, -20.574858f,
+      -20.574858f, 24.909130f, -5.726166f, -5.726164f, -18.796221f, -18.796211f,
+      29.325350f, -33.723892f, -33.723892f, 42.258442f, -4.851232f, -4.851226f,
+      -2.533393f, 32.452259f, -46.545670f, -46.545654f, 51.860325f, -53.651630f,
+      -53.651630f, 71.738174f, 4.440616f, 4.440629f, 25.884174f, -10.748116f, };
+
+    for (l = 0; l < 3; l++)
+    {
+        if (l == 0)
+            out_temp = out;
+        else
+            out_temp = &in[l - 1];
 
-    for (i = 0; i < 49; i++)
-        in[i] = i + 1.01f;
+        if (l < 2)
+            end = 49;
+        else
+            end = 48;
 
-    for (j = 0; j < 3; j++)
-    {
-        for (order = 0; order <= D3DXSH_MAXORDER + 1; order++)
+        for (j = 0; j < 3; j++)
         {
-            for (i = 0; i < 49; i++)
-                out[i] = ( i + 1.0f ) * ( i + 1.0f );
+            for (order = 0; order <= D3DXSH_MAXORDER + 1; order++)
+            {
+                for (i = 0; i < 49; i++)
+                {
+                    out[i] = ( i + 1.0f ) * ( i + 1.0f );
+                    in[i] = i + 1.01f;
+                }
 
-            received_ptr = D3DXSHRotateZ(out, order, angle[j], in);
-            ok(received_ptr == out, "angle %f, order %u, Expected %p, received %p\n", angle[j], order, out, received_ptr);
+                received_ptr = D3DXSHRotateZ(out_temp, order, angle[j], in);
+                ok(received_ptr == out_temp, "angle %f, order %u, Expected %p, received %p\n", angle[j], order, out_temp, received_ptr);
 
-            for (i = 0; i < 49; i++)
-            {
-                /* order = 0 or order = 1 behaves like order = D3DXSH_MINORDER */
-                square = ( order <= D3DXSH_MINORDER ) ? D3DXSH_MINORDER * D3DXSH_MINORDER : order * order;
-                if ( i >= square || ( (order >= D3DXSH_MAXORDER) && ( i >= D3DXSH_MAXORDER * D3DXSH_MAXORDER ) ) )
-                    expected = ( i + 1.0f ) * ( i + 1.0f );
-                else
-                    expected = table[36 * j + i];
-                ok(relative_error(out[i], expected) < admitted_error, "angle %f, order %u index %u, Expected %f, received %f\n", angle[j], order, i, expected, out[i]);
+                for (i = 0; i < end; i++)
+                {
+                    /* order = 0 or order = 1 behaves like order = D3DXSH_MINORDER */
+                    square = ( order <= D3DXSH_MINORDER ) ? D3DXSH_MINORDER * D3DXSH_MINORDER : order * order;
+                    if ( i >= square || ( (order >= D3DXSH_MAXORDER) && ( i >= D3DXSH_MAXORDER * D3DXSH_MAXORDER ) ) )
+                        if (l > 0)
+                            expected = i + l + 0.01f;
+                        else
+                            expected = ( i + 1.0f ) * ( i + 1.0f );
+                    else
+                        expected = table[36 * (l + 3 * j ) + i];
+                    ok(relative_error(expected, out_temp[i]) < admitted_error, "angle %f, order %u index %u, Expected %f, received %f\n", angle[j], order, i, expected, out_temp[i]);
+                }
             }
         }
     }
-- 
1.7.9.5

