Index: /trunk/psLib/test/types/tap_psMetadata_printing.c
===================================================================
--- /trunk/psLib/test/types/tap_psMetadata_printing.c	(revision 8313)
+++ /trunk/psLib/test/types/tap_psMetadata_printing.c	(revision 8313)
@@ -0,0 +1,218 @@
+
+#include <fcntl.h>
+#include "pstap.h"
+
+static psMetadata *setupMeta(void);
+
+int main(void)
+{
+    FILE *fd = fopen("psMetadataPrint.out", "w");
+    FILE *fd_read = fopen("Makefile", "r");
+    psMetadata *md = NULL;
+    psMetadata *md2 = NULL;
+    md = setupMeta();
+    md2 = psMetadataAlloc();
+    psSphere *sphere = psSphereAlloc();
+    psMetadataAddPtr(md2, PS_LIST_HEAD, "ptr", PS_DATA_SPHERE, "", sphere);
+    psMetadataAddUnknown(md2, PS_LIST_TAIL, "unknown", 0, "", sphere);
+
+    plan_tests(19);
+    diag("psMetadataPrint and psMetadataItemPrint tests\n>>Test 1:  psMetadataPrint");
+
+    //Return false for NULL psMetadata input
+    {
+        ok( !psMetadataPrint(NULL, NULL, 0),
+            "psMetadataPrint:  return false for NULL psMetadata input.");
+    }
+    //Return false for read-only file descriptor
+    {
+        ok ( !psMetadataPrint(fd_read, md, 0),
+             "psMetadataPrint:  return false for read-only file descriptor.");
+    }
+    fclose(fd_read);
+    //Error and then return true for unprintable datatype (sphere) and DATA_UNKNOWN
+    {
+        ok ( psMetadataPrint(NULL, md2, 0),
+             "psMetadataPrint:  return true for metadata with unknown datatype.");
+    }
+    psFree(md2);
+    md2 = psMetadataAlloc();
+    psVector *vector = psVectorAlloc(2, PS_TYPE_C32);
+    //    psVectorSet(vector, 0, 0);
+
+    psMetadataAddVector(md2, PS_LIST_HEAD, "name here", 0, "I vector", vector);
+    //Return false for unsupported vector type (C32)
+    {
+        ok ( !psMetadataPrint(NULL, md2, 2),
+             "psMetadataPrint:  return false for metadata with unknown vector-type.");
+    }
+    psFree(vector);
+    psFree(md2);
+    md2 = psMetadataAlloc();
+    psMetadataAddStr(md2, PS_LIST_HEAD,
+                     "  >>Hello Wally", 0, "My name is Bubbles", "Pet Me");
+    //Valid case where fd is NULL -> stdout
+    {
+        ok ( psMetadataPrint(NULL, md2, 0),
+             "psMetadataPrint:  return true for NULL file pointer.");
+    }
+    psFree(md2);
+    //Valid case where fd is "psMetadataPrint.out"
+    {
+        ok ( psMetadataPrint(fd, md, 0),
+             "psMetadataPrint:  return true for file='psMetadataPrint.out'.");
+    }
+    fclose(fd);
+
+    printf("\n");
+    diag(">>Test2:  psMetadataItemPrint");
+    //bool psMetadataItemPrint(FILE * fd, const char *format, const psMetadataItem* item)
+    fd = fopen("psMetadataItemPrint.out", "w");
+    psMetadataItem *item1 = psMetadataItemAlloc("bool", PS_DATA_BOOL, "No Comment", true);
+    psMetadataItem *item2 = psMetadataItemAlloc("f32", PS_DATA_F32, "No Comment", 0.66601);
+    psMetadataItem *item3 = psMetadataItemAlloc("string", PS_DATA_STRING, "", "Can't touch this");
+    psMetadataItem *item4 = psMetadataItemAlloc("U16", PS_DATA_U16, "", 1);
+    psMetadataItem *item5 = psMetadataItemAlloc("string", PS_DATA_U8, "", "a");
+
+    //Return false for NULL file-pointer
+    {
+        ok( !psMetadataItemPrint(NULL, "%s", item1),
+            "psMetadataItemPrint:  return false for NULL FILE*.");
+    }
+    //Return false for NULL format paramter
+    {
+        ok( !psMetadataItemPrint(fd, NULL, item1),
+            "psMetadataItemPrint:  return false for NULL format.");
+    }
+    //Return false for NULL metadataItem
+    {
+        ok( !psMetadataItemPrint(fd, "%s", NULL),
+            "psMetadataItemPrint:  return false for NULL psMetadataItem.");
+    }
+    //Return false for incorrect format parameter
+    {
+        ok( !psMetadataItemPrint(fd, "sos \n", item1),
+            "psMetadataItemPrint:  return false for incorrect format.");
+    }
+    //Return false for incorrect format parameter
+    {
+        ok( !psMetadataItemPrint(fd, "%z", item1),
+            "psMetadataItemPrint:  return false for incorrect format.");
+    }
+    //Return false for type that doesn't match format (ie, %s for f32 value)
+    {
+        ok( !psMetadataItemPrint(fd, "%s", item2),
+            "psMetadataItemPrint:  return false for item that doesn't match format.");
+    }
+    //Return true for format parameter containing additional modifiers
+    {
+        ok( psMetadataItemPrint(fd, "%.3f\n", item2),
+            "psMetadataItemPrint:  return true for format with .3 modifier.");
+    }
+    //Return true for valid string input
+    {
+        ok( psMetadataItemPrint(fd, "%s\n", item3),
+            "psMetadataItemPrint:  return true for valid string case.");
+    }
+    //Return true for valid ptr input
+    {
+        ok( psMetadataItemPrint(fd, "%p\n", item3),
+            "psMetadataItemPrint:  return true for valid ptr case.");
+    }
+
+
+
+    //Return true for format = %d, type = int
+    {
+        ok( psMetadataItemPrint(fd, "%d\n", item4),
+            "psMetadataItemPrint:  return true for valid U8 case w/d.");
+    }
+    //Return true for format = %i, type = int
+    {
+        ok( psMetadataItemPrint(fd, "%i\n", item4),
+            "psMetadataItemPrint:  return true for valid U8 case w/i.");
+    }
+    //Return true for format = %c, type = int
+    {
+        ok( psMetadataItemPrint(fd, "%c\n", item5),
+            "psMetadataItemPrint:  return true for valid string case w/c.");
+    }
+
+
+
+    //Check for Memory Leaks before exit
+    {
+        fclose(fd);
+        psFree(item1);
+        psFree(item2);
+        psFree(item3);
+        psFree(item4);
+        psFree(item5);
+        psFree(sphere);
+        psFree(md);
+    }
+
+    done();
+}
+
+static psMetadata *setupMeta(void)
+{
+    psMetadata *md = NULL;
+    psMetadata *newMD = NULL;
+    int i = 0;
+    md = psMetadataAlloc();
+    newMD = psMetadataAlloc();
+
+    psMetadataAddStr(md, PS_LIST_TAIL, "item5", 0, "I am a string", "GNIRTS");
+    psMetadataAddBool(md, PS_LIST_TAIL, "item1", 0, "I am a boolean", true);
+    psMetadataAddBool(md, PS_LIST_TAIL, "item11", 0, "I am a boolean", false);
+    psMetadataAddS8(md, PS_LIST_TAIL, "item6", 0, "I am S8", 6);
+    psMetadataAddS16(md, PS_LIST_TAIL, "item7", 0, "I am S16", -666);
+    psMetadataAddS32(md, PS_LIST_TAIL, "item2", 0, "I am a integer", 55);
+    psMetadataAddS64(md, PS_LIST_TAIL, "item11", 0, "I am S64", 666);
+    psMetadataAddU8(md, PS_LIST_TAIL, "item8", 0, "I am U8", 6);
+    psMetadataAddU16(md, PS_LIST_TAIL, "item9", 0, "I am U16", 666);
+    psMetadataAddU32(md, PS_LIST_TAIL, "item10", 0, "I am U32", 666);
+    psMetadataAddU64(md, PS_LIST_TAIL, "item12", 0, "I am U64", 666);
+    psMetadataAddF32(md, PS_LIST_TAIL, "item3", 0, NULL, 3.14);
+    psMetadataAddF64(md, PS_LIST_TAIL, "item4", 0, "", 6.28);
+
+    psMetadataAddS32(newMD, PS_LIST_TAIL, "ITEM01", 0, NULL, 666);
+    psMetadata *newestMD = NULL;
+    newestMD = psMetadataAlloc();
+    psVector *vec = NULL;
+    vec = psVectorAlloc(60, PS_DATA_S32);
+    for (i = 0; i < 5; i++) {
+        vec->data.S32[i] = i+1;
+    }
+    vec->n = 5;
+    psMetadataAddVector(newestMD, PS_LIST_TAIL, "VECTORNEW", 0, "Newest VECTOR", vec);
+    psMetadataAddStr(newestMD, PS_LIST_TAIL, "cell", 0, "I am a p-Star string", "pStArRs");
+    psMetadataAddMetadata(newMD, PS_LIST_TAIL, "META NEW", 0, "I AM Newest METADATA", newestMD);
+    psMetadataAddF32(newMD, PS_LIST_TAIL, "ITEM02", 0, "I AM FLOAT", 666.6);
+    psMetadataAddF64(newMD, PS_LIST_TAIL, "ITEM03", 0, "I AM DOUBLE", 666.666);
+
+    psMetadataAddMetadata(md, PS_LIST_TAIL, "metadata7", 0, "I am a metadata", newMD);
+    psRegion *region = psRegionAlloc(0.0, 2.0, 0.0, 2.0);
+    psMetadataAddPtr(md, PS_LIST_TAIL, "region", PS_DATA_REGION, "I am a region", region);
+    psList *list = psListAlloc(NULL);
+    psMetadataAddList(md, PS_LIST_TAIL, "list01", 0, "I am a list", list);
+
+    psTime *time;
+    time = psTimeAlloc(PS_TIME_TAI);
+    time->sec = 1000;
+    time->nsec = 25;
+    time->leapsecond = true;
+    psMetadataAddTime(md, PS_LIST_TAIL, "time01", 0, "I am time", time);
+
+    psMetadataAddVector(md, PS_LIST_TAIL, "vector6", 0, "I am a vector", vec);
+
+    psFree(region);
+    psFree(list);
+    psFree(time);
+    psFree(newestMD);
+    psFree(vec);
+    psFree(newMD);
+    return md;
+}
+
