Index: trunk/psLib/test/math/tst_psPolyFit3D.c
===================================================================
--- trunk/psLib/test/math/tst_psPolyFit3D.c	(revision 6484)
+++ trunk/psLib/test/math/tst_psPolyFit3D.c	(revision 7105)
@@ -11,5 +11,5 @@
 #include "pslib.h"
 #include "psTest.h"
-#define NUM_DATA 35
+#define NUM_DATA 30
 #define POLY_ORDER_X 2
 #define POLY_ORDER_Y 3
@@ -27,5 +27,5 @@
 #define ERROR_TOLERANCE 0.10
 #define YERR 10.0
-#define VERBOSE 0
+#define VERBOSE 1
 #define NUM_ITERATIONS 5
 #define CLIP_SIGMA 4.0
@@ -95,4 +95,21 @@
     printPositiveTestHeader(stdout, "psMinimize functions", "3D Polynomial Fitting Functions");
 
+    psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    psVector *yTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    psVector *zTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    xTruth->n = numData;
+    yTruth->n = numData;
+    zTruth->n = numData;
+    fTruth->n = numData;
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using known seed
+    for (int i = 0; i < numData; i++) {
+        xTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0;
+        yTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0;
+        zTruth->data.F64[i] = 2.0*psRandomUniform(rng) - 1.0;
+        fTruth->data.F64[i] = setData(xTruth->data.F64[i], yTruth->data.F64[i], zTruth->data.F64[i]);
+    }
+    psFree(rng);
+
     if (expectedRC == false) {
         printf("This test should generate an error message, and return NULL.\n");
@@ -116,27 +133,15 @@
     if (flags & TS00_X_F32) {
         printf(" using a psF32 x vector\n");
-        x = psVectorAlloc(numData, PS_TYPE_F32);
-        x->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            x->data.F32[i] = (psF32) i;
-        }
+        x = psVectorCopy(NULL, xTruth, PS_TYPE_F32);
     }
 
     if (flags & TS00_X_S32) {
         printf(" using a psS32 x vector\n");
-        x = psVectorAlloc(numData, PS_TYPE_S32);
-        x->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            x->data.S32[i] = (psS32) i;
-        }
+        x = psVectorCopy(NULL, xTruth, PS_TYPE_S32);
     }
 
     if (flags & TS00_X_F64) {
         printf(" using a psF64 x vector\n");
-        x = psVectorAlloc(numData, PS_TYPE_F64);
-        x->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            x->data.F64[i] = (psF64) i;
-        }
+        x = psVectorCopy(NULL, xTruth, PS_TYPE_F64);
     }
 
@@ -148,27 +153,15 @@
     if (flags & TS00_Y_F32) {
         printf(" using a psF32 y vector\n");
-        y = psVectorAlloc(numData, PS_TYPE_F32);
-        y->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            y->data.F32[i] = (psF32) i;
-        }
+        y = psVectorCopy(NULL, yTruth, PS_TYPE_F32);
     }
 
     if (flags & TS00_Y_S32) {
         printf(" using a psS32 y vector\n");
-        y = psVectorAlloc(numData, PS_TYPE_S32);
-        y->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            y->data.S32[i] = (psS32) i;
-        }
+        y = psVectorCopy(NULL, yTruth, PS_TYPE_S32);
     }
 
     if (flags & TS00_Y_F64) {
         printf(" using a psF64 y vector\n");
-        y = psVectorAlloc(numData, PS_TYPE_F64);
-        y->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            y->data.F64[i] = (psF64) i;
-        }
+        y = psVectorCopy(NULL, yTruth, PS_TYPE_F64);
     }
 
@@ -179,27 +172,15 @@
     if (flags & TS00_Z_F32) {
         printf(" using a psF32 z vector\n");
-        z = psVectorAlloc(numData, PS_TYPE_F32);
-        z->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            z->data.F32[i] = (psF32) i;
-        }
+        z = psVectorCopy(NULL, zTruth, PS_TYPE_F32);
     }
 
     if (flags & TS00_Z_S32) {
         printf(" using a psS32 z vector\n");
-        z = psVectorAlloc(numData, PS_TYPE_S32);
-        z->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            z->data.S32[i] = (psS32) i;
-        }
+        z = psVectorCopy(NULL, zTruth, PS_TYPE_S32);
     }
 
     if (flags & TS00_Z_F64) {
         printf(" using a psF64 z vector\n");
-        z = psVectorAlloc(numData, PS_TYPE_F64);
-        z->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            z->data.F64[i] = (psF64) i;
-        }
+        z = psVectorCopy(NULL, zTruth, PS_TYPE_F64);
     }
 
@@ -211,9 +192,5 @@
     if (flags & TS00_F_F32) {
         printf(" using a psF32 f vector\n");
-        f = psVectorAlloc(numData, PS_TYPE_F32);
-        f->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            f->data.F32[i] = setData((psF32) i, (psF32) i, (psF32) i);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_F32);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -225,5 +202,5 @@
         if (VERBOSE) {
             for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F32[i]);
+                printf("Original data %d: (%.1f)\n", i, f->data.F32[i]);
             }
         }
@@ -232,9 +209,5 @@
     if (flags & TS00_F_S32) {
         printf(" using a psS32 f vector\n");
-        f = psVectorAlloc(numData, PS_TYPE_S32);
-        f->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            f->data.S32[i] = (psS32) setData((psF32) i, (psF32) i, (psF32) i);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_S32);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -246,5 +219,5 @@
         if (VERBOSE) {
             for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %d)\n", i, (psF32) i, f->data.S32[i]);
+                printf("Original data %d: (%d)\n", i, f->data.S32[i]);
             }
         }
@@ -253,9 +226,5 @@
     if (flags & TS00_F_F64) {
         printf(" using a psF64 f vector\n");
-        f = psVectorAlloc(numData, PS_TYPE_F64);
-        f->n = numData;
-        for (psS32 i=0;i<numData;i++) {
-            f->data.F64[i] = (psF64) setData((psF32) i, (psF32) i, (psF32) i);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_F64);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -267,5 +236,5 @@
         if (VERBOSE) {
             for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F64[i]);
+                printf("Original data %d: (%.1f)\n", i, f->data.F64[i]);
             }
         }
@@ -353,4 +322,5 @@
         }
 
+        psVector *result = psPolynomial3DEvalVector(myPoly, xTruth, yTruth, zTruth);
         for (psS32 i=0 ;i<numData; i++) {
             // Skip the outliers.
@@ -358,59 +328,19 @@
                 continue;
             }
-            psF32 expectData;
-            psF32 xData;
-            psF32 yData;
-            psF32 zData;
-            if (flags & TS00_F_F32) {
-                expectData = f->data.F32[i];
-            } else if (flags & TS00_F_F64) {
-                expectData = (psF32) f->data.F64[i];
-            } else if (flags & TS00_F_S32) {
-                expectData = (psF32) f->data.S32[i];
-            }
-
-            if (flags & TS00_X_F32) {
-                xData = x->data.F32[i];
-            } else if (flags & TS00_X_F64) {
-                xData = (psF32) x->data.F64[i];
-            } else if (flags & TS00_X_S32) {
-                xData = (psF32) x->data.S32[i];
-            } else if (flags & TS00_X_NULL) {
-                xData = (psF32) i;
-            }
-
-            if (flags & TS00_Y_F32) {
-                yData = y->data.F32[i];
-            } else if (flags & TS00_Y_F64) {
-                yData = (psF32) y->data.F64[i];
-            } else if (flags & TS00_Y_S32) {
-                yData = (psF32) y->data.S32[i];
-            } else if (flags & TS00_Y_NULL) {
-                yData = (psF32) i;
-            }
-
-            if (flags & TS00_Z_F32) {
-                zData = z->data.F32[i];
-            } else if (flags & TS00_Z_F64) {
-                zData = (psF32) z->data.F64[i];
-            } else if (flags & TS00_Z_S32) {
-                zData = (psF32) z->data.S32[i];
-            } else if (flags & TS00_Z_NULL) {
-                zData = (psF32) i;
-            }
-
-            psF32 actualData = psPolynomial3DEval(myPoly, xData, yData, zData);
+            psF32 expectData = fTruth->data.F64[i];
+            psF32 actualData = result->data.F64[i];
 
             if (fabs(actualData-expectData) > fabs(ERROR_TOLERANCE * expectData)) {
-                printf("TEST ERROR: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
-                       i, xData, actualData, expectData);
+                printf("TEST ERROR: Fitted data %d: (%.1f), expected was (%.1f)\n",
+                       i, actualData, expectData);
                 testStatus = false;
             } else {
                 if (VERBOSE) {
-                    printf("GOOD: Fitted data %d: (%.1f %.1f), expected was (%.1f)\n",
-                           i, xData, actualData, expectData);
+                    printf("GOOD: Fitted data %d: (%.1f), expected was (%.1f)\n",
+                           i, actualData, expectData);
                 }
             }
         }
+        psFree(result);
     }
 
@@ -422,4 +352,8 @@
     psFree(z);
     psFree(f);
+    psFree(xTruth);
+    psFree(yTruth);
+    psFree(zTruth);
+    psFree(fTruth);
     psFree(fErr);
     psFree(stats);
