Index: trunk/psLib/test/fileUtils/tst_psFits.c
===================================================================
--- trunk/psLib/test/fileUtils/tst_psFits.c	(revision 3475)
+++ trunk/psLib/test/fileUtils/tst_psFits.c	(revision 3495)
@@ -6,6 +6,6 @@
 *  @author Robert DeSonia, MHPCC
 *
-*  @version $Revision: 1.22 $ $Name: not supported by cvs2svn $
-*  @date $Date: 2005-03-22 21:52:40 $
+*  @version $Revision: 1.23 $ $Name: not supported by cvs2svn $
+*  @date $Date: 2005-03-24 22:21:17 $
 *
 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
@@ -49,4 +49,5 @@
 static psS32 tst_psFitsReadTableColumnNum(void);
 static psS32 tst_psFitsReadTableColumn(void);
+static psS32 tst_psFitsUpdateTable(void);
 
 testDescription tests[] = {
@@ -62,4 +63,5 @@
                               {tst_psFitsReadTableColumnNum,836, "psFitsReadTableColumnNum", 0, false},
                               {tst_psFitsReadTableColumn,839, "psFitsReadTableColumn", 0, false},
+                              {tst_psFitsUpdateTable,840, "psFitsUpdateTable", 0, false},
                               {testImageRead,567, "psFitsReadImage", 0, false},
                               {testImageWrite,569, "psFitsWriteImage", 0, false},
@@ -1081,4 +1083,128 @@
     psFree(err);
 
+    psFree(fits);
+
+    return 0;
+}
+
+static psS32 tst_psFitsUpdateTable( void )
+{
+    psErr* err;
+
+    if (! makeTable()) {
+        return 1;
+    }
+
+    psFits* fits = psFitsAlloc(tableFilename);
+
+    if (fits == NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsAlloc returned NULL on existing file.");
+        return 2;
+    }
+
+    psFitsMoveExtNum(fits,1,false);
+
+    // change the data in the file, going past by one (implicit new row of data)
+    for (int row = 0; row < tableNumRows+1; row++) {
+        psMetadata* md = psMetadataAlloc();
+        psMetadataAddF32(md,PS_LIST_TAIL,"MYFLT","",(float)row/-10.0);
+        psMetadataAddF64(md,PS_LIST_TAIL,"MYDBL","",(double)row/-100.0);
+        psMetadataAddS32(md,PS_LIST_TAIL,"MYINT","",-row);
+
+        if (! psFitsUpdateTable(fits,md,row)) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable returned false, but expected true for row=%d.",
+                    row);
+            return 3;
+        }
+        psFree(md);
+    }
+
+    for (int row = 0; row < tableNumRows+1; row++) {
+        psMetadata* md = psFitsReadTableRow(fits, row);
+        if (abs(psMetadataLookupF32(NULL,md,"MYFLT") - (float)row/-10.0) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the float value for row=%d.",
+                    row);
+            return 4;
+        }
+        if (abs(psMetadataLookupF64(NULL,md,"MYDBL") - (float)row/-100.0) > FLT_EPSILON) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the double value for row=%d.",
+                    row);
+            return 5;
+        }
+        if (psMetadataLookupS32(NULL,md,"MYINT") != -row) {
+            psError(PS_ERR_UNKNOWN, false,
+                    "psFitsUpdateTable did not change the integer value for row=%d.",
+                    row);
+            return 6;
+        }
+        psFree(md);
+    }
+
+    psMetadata* md = psMetadataAlloc();
+    psMetadataAddF32(md,PS_LIST_TAIL,"BOGUS","",-1.0f);
+    psWarning("Following should be a warning.");
+    psErrorClear();
+    if (! psFitsUpdateTable(fits,md,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with bogus column data");
+        return 10;
+    }
+    psFree(md);
+
+    md = psMetadataAlloc();
+    psMetadataAddF32(md,PS_LIST_TAIL,"MYFLT","",-1.0f);
+    psMetadataAddF64(md,PS_LIST_TAIL,"MYDBL","",-2.0);
+    psMetadataAddS32(md,PS_LIST_TAIL,"MYINT","",-3);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(NULL,md,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with NULL psFits");
+        return 20;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with NULL psFits");
+        return 21;
+    }
+    psFree(err);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(fits,NULL,0)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with NULL psMetadata");
+        return 22;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_BAD_PARAMETER_NULL) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with NULL psMetadata");
+        return 23;
+    }
+    psFree(err);
+
+    psWarning("Following should be an error.");
+    psErrorClear();
+    if (psFitsUpdateTable(fits,md,-1)) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not return false with row=-1");
+        return 24;
+    }
+    err = psErrorLast();
+    if (err->code != PS_ERR_IO) {
+        psError(PS_ERR_UNKNOWN, false,
+                "psFitsUpdateTable did not error with row=-1");
+        return 25;
+    }
+
+    psFree(err);
+    psFree(md);
     psFree(fits);
 
