Index: /trunk/psModules/src/Makefile.am
===================================================================
--- /trunk/psModules/src/Makefile.am	(revision 1848)
+++ /trunk/psModules/src/Makefile.am	(revision 1849)
@@ -2,6 +2,6 @@
 bin_PROGRAMS = tst_pmFlatField tst_pmMaskBadPixels
 
-libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c
-libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h
+libpsmodule_a_SOURCES = pmFlatField.c pmMaskBadPixels.c psTest.c
+libpsmodule_a_HEADERS = pmFlatField.h pmMaskBadPixels.h psTest.h
 libpsmodule_adir = .
 
@@ -11,3 +11,2 @@
 tst_pmMaskBadPixels_SOURCES = tst_pmMaskBadPixels.c
 tst_pmMaskBadPixels_LDFLAGS = libpsmodule.a
-
Index: /trunk/psModules/src/pmFlatField.c
===================================================================
--- /trunk/psModules/src/pmFlatField.c	(revision 1848)
+++ /trunk/psModules/src/pmFlatField.c	(revision 1849)
@@ -18,6 +18,6 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-09-20 20:36:46 $
+ *  @version $Revision: 1.10 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-09-22 19:58:57 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
@@ -31,4 +31,5 @@
 #include<math.h>
 
+#include "pslib.h"
 #include "pmFlatField.h"
 #include "pmMaskBadPixels.h"
@@ -50,5 +51,4 @@
     // Check for nulls
     if (in == NULL) {
-        psError(__func__, " : Line %d - Null not allowed for input readout", __LINE__);
         return false;
     } else if(flat==NULL) {
@@ -71,19 +71,11 @@
 
     // Check input image and its mask are not larger than flat image
-    if(inImage->numRows > flatImage->numRows) {
-        psError(__func__, " : Line %d - Input image exceeds mask image in number of rows. (%d vs %d).",
-                __LINE__, inImage->numRows, flatImage->numRows);
+    if(inImage->numRows>flatImage->numRows || inImage->numCols>flatImage->numCols) {
+        psError(__func__, " : Line %d - Input image size exceeds that of flat image: (%d, %d) vs (%d, %d)",
+                __LINE__, inImage->numRows, inImage->numCols, flatImage->numRows, flatImage->numCols);
         return false;
-    } else if(inImage->numCols > flatImage->numCols) {
-        psError(__func__, " : Line %d - Input image exceeds mask image in number of columns. (%d vs %d).",
-                __LINE__, inImage->numCols, flatImage->numCols);
-        return false;
-    } else if(inMask->numRows > flatImage->numRows) {
-        psError(__func__, " : Line %d - Input image mask exceeds mask image in number of rows. (%d vs %d).",
-                __LINE__, inImage->numRows, flatImage->numRows);
-        return false;
-    } else if(inMask->numCols > flatImage->numCols) {
-        psError(__func__, " : Line %d - Input image mask exceeds mask image in number of columns. (%d vs %d).",
-                __LINE__, inImage->numCols, flatImage->numCols);
+    } else if(inMask->numRows>flatImage->numRows || inMask->numCols > flatImage->numCols) {
+        psError(__func__, " : Line %d - Input image mask size exceeds that of flat image: (%d, %d) vs (%d, %d)",
+                __LINE__, inMask->numRows, inMask->numCols, flatImage->numRows, flatImage->numCols);
         return false;
     }
@@ -94,27 +86,15 @@
 
     // Check that offsets are within image limits
-    if(totOffRow > flatImage->numRows-1) {
-        psError(__func__, " : Line %d - Initial row offset exceeds that of mask image. (%d vs %d).",
-                __LINE__, totOffRow, flatImage->numRows);
+    if(totOffRow>=flatImage->numRows || totOffCol>=flatImage->numCols) {
+        psError(__func__, " : Line %d - Total offset >= flat image size: (%d, %d) vs (%d, %d)",
+                __LINE__, totOffRow, totOffCol, flatImage->numRows, flatImage->numCols);
         return false;
-    } else if(totOffCol > flatImage->numCols-1) {
-        psError(__func__, " : Line %d - Initial column offset exceeds that of mask image. (%d vs %d).",
-                __LINE__, totOffCol, flatImage->numCols);
+    } else if(totOffRow>=inImage->numRows || totOffCol>=inImage->numCols) {
+        psError(__func__, " : Line %d - Total offset >= input image: (%d, %d) vs (%d, %d)",
+                __LINE__, totOffRow, totOffCol, inImage->numRows, inImage->numCols);
         return false;
-    } else if(totOffRow > inImage->numRows-1) {
-        psError(__func__, " : Line %d - Initial row offset exceeds that of input image. (%d vs %d).",
-                __LINE__, totOffRow, inImage->numRows);
-        return false;
-    } else if(totOffCol > inImage->numCols-1) {
-        psError(__func__, " : Line %d - Initial column offset exceeds that of input image. (%d vs %d).",
-                __LINE__, totOffCol, inImage->numCols);
-        return false;
-    } else if(totOffRow > inMask->numRows-1) {
-        psError(__func__, " : Line %d - Initial row offset exceeds that of input image mask. (%d vs %d).",
-                __LINE__, totOffRow, inMask->numRows);
-        return false;
-    } else if(totOffCol > inMask->numCols-1) {
-        psError(__func__, " : Line %d - Initial column offset exceeds that of input image mask. (%d vs %d).",
-                __LINE__, totOffCol, inMask->numCols);
+    } else if(totOffRow>=inMask->numRows || totOffCol>=inMask->numCols) {
+        psError(__func__, " : Line %d - Total offset >= input image mask: (%d, %d) vs (%d, %d)",
+                __LINE__, totOffRow, totOffCol, inMask->numRows, inMask->numCols);
         return false;
     }
@@ -136,5 +116,5 @@
         return false;
     } else if(inType != flatType) {
-        psError(__func__, " : Line %d - Input and flat image types differ. (%d vs %d)", __LINE__, inType,
+        psError(__func__, " : Line %d - Input and flat image types differ: (%d vs %d)", __LINE__, inType,
                 flatType);
         return false;
@@ -149,5 +129,5 @@
             if(flatImage->data.TYPE[j][i] <= 0.0) {                                                          \
                 /* Negative or zero flat pixels shall be masked in input image as  PM_MASK_FLAT */           \
-                inMask->data.PS_TYPE_MASK_DATA[j][i] = PM_MASK_FLAT;                                         \
+                inMask->data.PS_TYPE_MASK_DATA[j][i] |= PM_MASK_FLAT;                                        \
             }                                                                                                \
         }                                                                                                    \
@@ -178,5 +158,4 @@
     }
 
-    printf("");
     return true;
 }
Index: /trunk/psModules/src/pmFlatField.h
===================================================================
--- /trunk/psModules/src/pmFlatField.h	(revision 1848)
+++ /trunk/psModules/src/pmFlatField.h	(revision 1849)
@@ -18,11 +18,9 @@
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-09-17 00:49:04 $
+ *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-09-22 19:58:57 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
  */
-
-#include "pslib.h"
 
 /** Execute flat field module.
Index: /trunk/psModules/src/tst_pmFlatField.c
===================================================================
--- /trunk/psModules/src/tst_pmFlatField.c	(revision 1848)
+++ /trunk/psModules/src/tst_pmFlatField.c	(revision 1849)
@@ -1,61 +1,223 @@
-/** @file  filename.h
- *
- *  @brief Contains the definitions for ...
- *
- *  Detailed Description goes here.
+/** @file tst_pmFlatField.c
+ *
+ *  @brief Contains the tests for pmFlatField.c:
  *
  *  @author Ross Harman, MHPCC
  *
- *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
- *  @date $Date: 2004-09-20 20:36:46 $
+ *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
+ *  @date $Date: 2004-09-22 19:58:57 $
  *
  *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
  */
 
+#include<stdlib.h>
+
+#include "psTest.h"
+#include "pslib.h"
 #include "pmFlatField.h"
 
 
-#define PRINT_MATRIX(IMAGE,TYPE)                                                                             \
-for(int i=IMAGE->numRows-1; i>-1; i--) {                                                                 \
-    for(int j=0; j<IMAGE->numCols; j++) {                                                                \
-        if(PS_IS_PSELEMTYPE_COMPLEX(IMAGE->type.type)) {                                                 \
-            printf("%f+%fi ", creal(IMAGE->data.TYPE[i][j]), cimag(IMAGE->data.TYPE[i][j]));             \
-        } else if(PS_IS_PSELEMTYPE_INT(IMAGE->type.type)) {                                              \
-            printf("%d ", (int)IMAGE->data.TYPE[i][j]);                                                  \
-        } else {                                                                                         \
-            printf("%f ", (double)IMAGE->data.TYPE[i][j]);                                               \
-        }                                                                                                \
-    }                                                                                                    \
-    printf("\n");                                                                                        \
-}                                                                                                        \
+#define PRINT_MATRIX(IMAGE,TYPE,STRING)                                                                      \
+printf(STRING);                                                                                              \
+printf("\n");                                                                                                \
+for(int i=IMAGE->numRows-1; i>-1; i--) {                                                                     \
+    for(int j=0; j<IMAGE->numCols; j++) {                                                                    \
+        if(PS_IS_PSELEMTYPE_COMPLEX(IMAGE->type.type)) {                                                     \
+            printf("%f+%fi ", creal(IMAGE->data.TYPE[i][j]), cimag(IMAGE->data.TYPE[i][j]));                 \
+        } else if(PS_IS_PSELEMTYPE_INT(IMAGE->type.type)) {                                                  \
+            printf("%d ", (int)IMAGE->data.TYPE[i][j]);                                                      \
+        } else {                                                                                             \
+            printf("%f ", (double)IMAGE->data.TYPE[i][j]);                                                   \
+        }                                                                                                    \
+    }                                                                                                        \
+    printf("\n");                                                                                            \
+}                                                                                                            \
 printf("\n");
 
 
-int main(void)
+#define CREATE_AND_SET_IMAGE(NAME,TYPE,VALUE,NROWS,NCOLS)                                                    \
+psImage *NAME = (psImage*)psImageAlloc(NCOLS,NROWS,PS_TYPE_##TYPE);                                          \
+for(int i=0; i<NAME->numRows; i++) {                                                                         \
+    for(int j=0; j<NAME->numCols; j++) {                                                                     \
+        NAME->data.TYPE[i][j] = VALUE;                                                                       \
+    }                                                                                                        \
+}
+
+
+static int testFlatField(void);
+
+
+testDescription tests[] = {
+                              {testFlatField, 884, "pmFlatField", 0, false},
+                              {NULL}
+                          };
+
+
+int main(int argc, char* argv[])
 {
-    psImage *inImage = psImageAlloc(3, 3, PS_TYPE_F64);
-    psImage *flatImage1 = psImageAlloc(3, 3, PS_TYPE_F64);
-    psImage *flatImage2 = psImageAlloc(3, 3, PS_TYPE_F64);
+    return !runTestSuite(stderr, "Test Point Driver", tests, argc, argv);
+}
+
+
+int testFlatField( void )
+{
+    // Test A - Divide input image by flat image
+    printPositiveTestHeader(stdout, "pmFlatField", "Test A - Divide input image by flat image");
+    printf("Divide input image by flat image\n\n");
+    CREATE_AND_SET_IMAGE(inImage,F64,6.0,3,3)
     psReadout *inReadout  = psReadoutAlloc(0, 0, inImage);
+    PRINT_MATRIX(inImage,F64,"Input image:");
+    CREATE_AND_SET_IMAGE(flatImage1,F64,2.0,3,3)
     psReadout *flatReadout  = psReadoutAlloc(0, 0, flatImage1);
-
-    for(int r=0;r<3;r++) {
-        for(int c=0;c<3;c++) {
-            inImage->data.F64[r][c]=8.0;
-            flatImage1->data.F64[r][c]=4.0;
-            flatImage2->data.F64[r][c]=0.0;
-        }
-    }
-
-    PRINT_MATRIX(inImage,F64);
-    PRINT_MATRIX(flatImage1, F64);
-    pmFlatField(inReadout, flatReadout);
-    PRINT_MATRIX(inImage,F64);
-
-    PRINT_MATRIX(inImage, F64);
-    PRINT_MATRIX(flatImage2, F64);
+    PRINT_MATRIX(flatImage1,F64,"Flat image:");
+    pmFlatField(inReadout, flatReadout);
+    PRINT_MATRIX(inImage,F64, "Resulting image:");
+    printFooter(stdout, "pmFlatField", "Test A - Divide input image by flat image", true);
+    printf("\n\n\n");
+
+
+    // Test B - Mask flat image data
+    printPositiveTestHeader(stdout, "pmFlatField", "Test B - Mask flat image data");
+    PRINT_MATRIX(inImage, F64, "Input image:");
+    CREATE_AND_SET_IMAGE(flatImage2,F64,0.0,3,3)
+    PRINT_MATRIX(flatImage2, F64, "Flat image:");
     flatReadout->image = flatImage2;
     pmFlatField(inReadout, flatReadout);
-    PRINT_MATRIX(inReadout->mask, PS_TYPE_MASK_DATA);
+    PRINT_MATRIX(inReadout->mask, PS_TYPE_MASK_DATA, "Resulting mask:");
+    printFooter(stdout, "pmFlatField", "Test B - Mask flat image data", true);
+    printf("\n\n\n");
+
+
+    // Test C - Mask flat image data starting with non-null mask
+    printf("Mask flat image data starting with non-null mask\n\n");
+    printPositiveTestHeader(stdout, "pmFlatField", "Test C - Mask flat image data starting with non-null mask");
+    PRINT_MATRIX(inImage, F64, "Input image:");
+    flatImage2->data.F64[0][0] = 1.0;
+    PRINT_MATRIX(flatImage2, F64, "Flat image:");
+    CREATE_AND_SET_IMAGE(mask1,U8,0,3,3);
+    psFree(inReadout->mask);
+    inReadout->mask = mask1;
+    pmFlatField(inReadout, flatReadout);
+    PRINT_MATRIX(inReadout->mask, PS_TYPE_MASK_DATA,"Resulting mask:");
+    printFooter(stdout, "pmFlatField", "Test C - Mask flat image data starting with non-null mask", true);
+    printf("\n\n\n");
+
+
+    // Test D - Attempt to use null flat readout
+    printNegativeTestHeader(stdout,"pmFlatField", "Test D - Attempt to use null flat readout",
+                            "Null not allowed for flat readout", 0);
+    pmFlatField(inReadout, NULL);
+    printFooter(stdout, "pmFlatField", "Test D - Attempt to use null flat readout", true);
+    printf("\n\n\n");
+
+
+    // Test E - Attempt to use null input image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test E - Attempt to use null input image",
+                            "Null not allowed for input image", 0);
+    psImage *temp = inReadout->image;
+    inReadout->image = NULL;
+    pmFlatField(inReadout, flatReadout);
+    inReadout->image = temp;
+    printFooter(stdout, "pmFlatField", "Test E - Attempt to use null input image", true);
+    printf("\n\n\n");
+
+
+    // Test F - Attempt tp use null flat image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test F - Attempt tp use null flat image",
+                            "Null not allowed for flat image", 0);
+    temp = flatReadout->image;
+    flatReadout->image = NULL;
+    pmFlatField(inReadout, flatReadout);
+    flatReadout->image = temp;
+    printFooter(stdout, "pmFlatField", "Test F - Attempt tp use null flat image", true);
+    printf("\n\n\n");
+
+
+    // Test G - Attempt to use input image bigger than flat image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test G - Attempt to use input image bigger than flat image",
+                            "Input image size exceeds that of flat image", 0);
+    CREATE_AND_SET_IMAGE(smallFlat,F64,0.0,2,2);
+    temp = flatReadout->image;
+    flatReadout->image = smallFlat;
+    pmFlatField(inReadout, flatReadout);
+    flatReadout->image = temp;
+    printFooter(stdout, "pmFlatField", "Test G - Attempt to use input image bigger than flat image", true);
+    printf("\n\n\n");
+
+
+    // Test H - Attempt to use input image mask bigger than flat image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test H - Attempt to use input image mask bigger than flat image",
+                            "Input image mask size exceeds that of flat image", 0);
+    CREATE_AND_SET_IMAGE(largeMask,F64,0.0,4,4);
+    temp = inReadout->mask;
+    inReadout->mask = largeMask;
+    pmFlatField(inReadout, flatReadout);
+    inReadout->mask = temp;
+    printFooter(stdout, "pmFlatField", "Test H - Attempt to use input image mask bigger than flat image", true);
+    printf("\n\n\n");
+
+
+    // Test I - Attempt to use offset greater than input image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test I - Attempt to use offset greater than input image",
+                            "Total offset >= input image size", 0);
+    *(int*)&inReadout->col0 = 50;
+    *(int*)&inReadout->row0 = 50;
+    pmFlatField(inReadout, flatReadout);
+    *(int*)&inReadout->col0 = 0;
+    *(int*)&inReadout->row0 = 0;
+    printFooter(stdout, "pmFlatField", "Test I - Attempt to use offset greater than input image", true);
+    printf("\n\n\n");
+
+
+    // Test J - Attempt to use complex input image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test J - Attempt to use complex input image",
+                            "Complex types not allowed for input image", 0);
+    *(psElemType* ) & inReadout->image->type.type = PS_TYPE_C64;
+    pmFlatField(inReadout, flatReadout);
+    *(psElemType* ) & inReadout->image->type.type = PS_TYPE_F64;
+    printFooter(stdout, "pmFlatField", "Test J - Attempt to use complex input image", true);
+    printf("\n\n\n");
+
+
+    // Test K - Attempt to use complex flat image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test K - Attempt to use complex flat image",
+                            "Complex types not allowed for flat image", 0);
+    *(psElemType* ) & flatReadout->image->type.type = PS_TYPE_C64;
+    pmFlatField(inReadout, flatReadout);
+    *(psElemType* ) & flatReadout->image->type.type = PS_TYPE_F64;
+    printFooter(stdout, "pmFlatField", "Test K - Attempt to use complex flat image", true);
+    printf("\n\n\n");
+
+
+    // Test L - Attempt to use non-equal input and flat image types
+    printNegativeTestHeader(stdout,"pmFlatField", "Test L - Attempt to use non-equal input and flat image types",
+                            "Input and flat image types differ", 0);
+    *(psElemType* ) & flatReadout->image->type.type = PS_TYPE_F32;
+    pmFlatField(inReadout, flatReadout);
+    *(psElemType* ) & flatReadout->image->type.type = PS_TYPE_F64;
+    printFooter(stdout, "pmFlatField", "Test L - Attempt to use non-equal input and flat image types", true);
+    printf("\n\n\n");
+
+
+    // Test M - Attempt to use non-mask type mask image
+    printNegativeTestHeader(stdout,"pmFlatField", "Test M - Attempt to use non-mask type mask image",
+                            "Mask must be PS_TYPE_MASK type", 0);
+    *(psElemType* ) & inReadout->mask->type.type = PS_TYPE_F32;
+    pmFlatField(inReadout, flatReadout);
+    *(psElemType* ) & inReadout->mask->type.type = PS_TYPE_MASK;
+    printFooter(stdout, "pmFlatField", "Test M - Attempt to use non-mask type mask image", true);
+    printf("\n\n\n");
+
+
+    // Free memory
+    psFree(inReadout);
+    psFree(flatReadout);
+    psFree(inImage);
+    psFree(flatImage1);
+    psFree(flatImage1);
+    psFree(smallFlat);
+    psFree(largeMask);
+
     return 0;
 }
+
