Index: /trunk/psLib/test/types/Makefile.am
===================================================================
--- /trunk/psLib/test/types/Makefile.am	(revision 7915)
+++ /trunk/psLib/test/types/Makefile.am	(revision 7916)
@@ -26,5 +26,6 @@
 	tst_psMetadataIO  \
 	tst_psPixels \
-	tst_psArguments
+	tst_psArguments \
+	tap_psMetadataIterator
 
 
@@ -49,4 +50,7 @@
 tst_psPixels_SOURCES = tst_psPixels.c
 tst_psArguments_SOURCES = tst_psArguments.c
+
+tap_psMetadataIterator_CPPFLAGS   = $(AM_CPPFLAGS) -I$(top_srcdir)/test/tap/src
+tap_psMetadataIterator_LDFLAGS    = $(AM_LDFLAGS) $(top_builddir)/test/tap/src/libtap.la
 
 check_DATA = \
Index: /trunk/psLib/test/types/tap_psMetadataIterator.c
===================================================================
--- /trunk/psLib/test/types/tap_psMetadataIterator.c	(revision 7916)
+++ /trunk/psLib/test/types/tap_psMetadataIterator.c	(revision 7916)
@@ -0,0 +1,123 @@
+#include <stdio.h>
+#include <pslib.h>
+#include "tap.h"
+
+
+#define NAME1 "SIMPLE"
+#define COMMENT1 "Basic FITS?"
+#define FLAG1 0
+#define VALUE1 "TRUE"
+
+#define NAME2 "COMMENT"
+#define COMMENT2 "This is a    "
+#define FLAG2 PS_META_DUPLICATE_OK
+#define VALUE2 ""
+
+#define NAME3 "FILENAME"
+#define COMMENT3 "File name"
+#define FLAG3 0
+#define VALUE3 "abcdefg123456.fits"
+
+#define NAME4 "COMMENT"
+#define COMMENT4 "   comment   "
+#define FLAG4 PS_META_DUPLICATE_OK
+#define VALUE4 ""
+
+#define NAME5 "DATE-OBS"
+#define COMMENT5 "Observing date, UTC"
+#define FLAG5 0
+#define VALUE5 "1978-11-29"
+
+#define NAME6 "COMMENT"
+#define COMMENT6 "    block"
+#define FLAG6 PS_META_DUPLICATE_OK
+#define VALUE6 ""
+
+#define NAME7 "COMMENT"
+#define COMMENT7 "This is another comment"
+#define FLAG7 PS_META_DUPLICATE_OK
+#define VALUE7 ""
+
+#define MULTI_NAME "COMMENT"
+#define MULTI_NAME1 NAME2
+#define MULTI_NAME2 NAME4
+#define MULTI_NAME3 NAME6
+#define MULTI_NAME4 NAME7
+#define MULTI_COMMENT1 COMMENT2
+#define MULTI_COMMENT2 COMMENT4
+#define MULTI_COMMENT3 COMMENT6
+#define MULTI_COMMENT4 COMMENT7
+
+psMetadata *mdGenerate(void)
+{
+    psMetadata *md = psMetadataAlloc();
+
+    // Something like a FITS header
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME1, FLAG1, COMMENT1, VALUE1);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME2, FLAG2, COMMENT2, VALUE2);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME3, FLAG3, COMMENT3, VALUE3);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME4, FLAG4, COMMENT4, VALUE4);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME5, FLAG5, COMMENT5, VALUE5);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME6, FLAG6, COMMENT6, VALUE6);
+    psMetadataAddStr(md, PS_LIST_TAIL, NAME7, FLAG7, COMMENT7, VALUE7);
+
+    return md;
+}
+
+#define TEST_ITERATION(NAME, COMMENT, VALUE) \
+item = psMetadataGetAndIncrement(iter); \
+ok(item, "item = %x", item); \
+skip_start(!item, 3, "Skipping 3 tests because psMetadataGetAndIncrement failed"); \
+ok(strcmp(item->name, NAME) == 0, "item->name = %s", item->name); \
+ok(strcmp(item->comment, COMMENT) == 0, "item->comment = %s", item->comment); \
+ok(strcmp(item->data.V, VALUE) == 0, "item->data.V = %s", item->data.V); \
+skip_end();
+
+
+int main (void)
+{
+    plan_tests(42);
+
+    diag("psMetadataIterator tests");
+
+    // No regular expressions
+    {
+        psMetadata *md = mdGenerate();
+        psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, NULL);
+        ok(iter, "iter = %x", iter);
+        skip_start(!iter, 28, "Skipping 28 tests because psMetadataIteratorAlloc failed");
+        psMetadataItem *item;
+
+        TEST_ITERATION(NAME1, COMMENT1, VALUE1);
+        TEST_ITERATION(NAME2, COMMENT2, VALUE2);
+        TEST_ITERATION(NAME3, COMMENT3, VALUE3);
+        TEST_ITERATION(NAME4, COMMENT4, VALUE4);
+        TEST_ITERATION(NAME5, COMMENT5, VALUE5);
+        TEST_ITERATION(NAME6, COMMENT6, VALUE6);
+        TEST_ITERATION(NAME7, COMMENT7, VALUE7);
+
+        skip_end();
+        psFree(iter);
+        psFree(md);
+    }
+
+    // With regular expressions
+    {
+        psMetadata *md = mdGenerate();
+        psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, "^" MULTI_NAME "$");
+        ok(iter, "iter = %x", iter);
+        skip_start(!iter, 12, "Skipping 12 tests because psMetadataIteratorAlloc failed");
+        psMetadataItem *item;
+
+        TEST_ITERATION(MULTI_NAME1, MULTI_COMMENT1, "");
+        TEST_ITERATION(MULTI_NAME2, MULTI_COMMENT2, "");
+        TEST_ITERATION(MULTI_NAME3, MULTI_COMMENT3, "");
+        TEST_ITERATION(MULTI_NAME4, MULTI_COMMENT4, "");
+
+        skip_end();
+        psFree(iter);
+        psFree(md);
+    }
+
+    return exit_status();
+}
