Index: trunk/psLib/test/math/tst_psPolyFit1D.c
===================================================================
--- trunk/psLib/test/math/tst_psPolyFit1D.c	(revision 6484)
+++ trunk/psLib/test/math/tst_psPolyFit1D.c	(revision 7105)
@@ -13,5 +13,5 @@
 #include "pslib.h"
 #include "psTest.h"
-#define NUM_DATA 35
+#define NUM_DATA 100
 #define POLY_ORDER 5
 #define A 2.0
@@ -52,5 +52,5 @@
 }
 
-psS32 genericTest(
+bool genericTest(
     psU32 flags,
     psS32 polyOrder,
@@ -59,5 +59,5 @@
 {
     psS32 currentId = psMemGetId();
-    psS32 testStatus = true;
+    bool testStatus = true;
     psS32 memLeaks = 0;
     psPolynomial1D *myPoly = NULL;
@@ -94,43 +94,65 @@
     if (flags & TS00_X_NULL) {
         printf(" using a NULL x vector\n");
-    }
+        numData = 30;
+    }
+
+    psVector *xTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    psVector *fTruth = psVectorAlloc(numData, PS_TYPE_F64);
+    xTruth->n = numData;
+    fTruth->n = numData;
+    psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 1); // Using a known seed
+    for (int i = 0; i < numData; i++) {
+        xTruth->data.F64[i] = (flags & TS00_X_NULL) ? i : 2.0*psRandomUniform(rng) - 1.0;
+        fTruth->data.F64[i] = setData(xTruth->data.F64[i]);
+    }
+    if (flags & TS00_X_NULL && flags & TS00_POLY_CHEB) {
+        // Renormalise the indices
+        p_psNormalizeVectorRange(xTruth, -1.0, 1.0);
+    }
+    psFree(rng);
+    #if VERBOSE
+
+    for (int i = 0; i < numData; i++) {
+        printf("Original %d: %f\t%f\n", i, xTruth->data.F64[i], fTruth->data.F64[i]);
+    }
+    #endif
 
     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 0
 
         if (flags & TS00_POLY_CHEB) {
             p_psNormalizeVectorRange(x, -1.0, 1.0);
         }
+        #endif
+
     }
 
     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 0
 
         if (flags & TS00_POLY_CHEB) {
             p_psNormalizeVectorRange(x, -1, 1);
         }
+        #endif
+
     }
 
     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);
+
+        #if 0
 
         if (flags & TS00_POLY_CHEB) {
             p_psNormalizeVectorRange(x, -1.0, 1.0);
         }
+        #endif
+
     }
 
@@ -141,9 +163,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);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_F32);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -152,19 +170,9 @@
             f->data.F32[3*numData/4]*= 2.0;
         }
-
-        if (VERBOSE) {
-            for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F32[i]);
-            }
-        }
     }
 
     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);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_S32);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -174,18 +182,9 @@
         }
 
-        if (VERBOSE) {
-            for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %d)\n", i, (psF32) i, f->data.S32[i]);
-            }
-        }
     }
 
     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);
-        }
+        f = psVectorCopy(NULL, fTruth, PS_TYPE_F64);
         // Set a few outliers in the data.
         if (OUTLIERS && (flags & TS00_CLIP_FIT)) {
@@ -193,10 +192,4 @@
             f->data.F64[numData/2]*= 2.0;
             f->data.F64[3*numData/4]*= 2.0;
-        }
-
-        if (VERBOSE) {
-            for (psS32 i=0;i<numData;i++) {
-                printf("Original data %d: (%.1f %.1f)\n", i, (psF32) i, f->data.F64[i]);
-            }
         }
     }
@@ -279,46 +272,24 @@
         }
 
-        for (psS32 i=0 ;i<numData; i++) {
+        psVector *result = psPolynomial1DEvalVector(myPoly, xTruth);
+        for (psS32 i=0; i<numData; i++) {
             // Skip the outliers.
             if ((i == numData/4) || (i == numData/2) || (i == 3*numData/4)) {
                 continue;
             }
-            psF32 expectData;
-            psF32 xData;
-            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) {
-                if (flags & TS00_POLY_ORD) {
-                    xData = (psF32) i;
-                } else if (flags & TS00_POLY_CHEB) {
-                    xData = ((2.0 / ((psF32) (numData - 1))) * ((psF32) i)) - 1.0;
-                }
-            }
-
-            psF32 actualData = psPolynomial1DEval(myPoly, xData);
-
+            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 --> %.1f vs %.1f\n",
+                       i, xTruth->data.F64[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: %1.f --> %.1f vs %.1f\n",
+                           i, xTruth->data.F64[i], actualData, expectData);
                 }
             }
         }
+        psFree(result);
     }
 
@@ -328,4 +299,6 @@
     psFree(x);
     psFree(f);
+    psFree(xTruth);
+    psFree(fTruth);
     psFree(fErr);
     psFree(stats);
@@ -353,5 +326,5 @@
     F64 tests: Chebyshev polys, clip fit
  *****************************************************************************/
-psS32 main()
+int main()
 {
     psBool testStatus = true;
