summaryrefslogtreecommitdiff
path: root/tests/tst_pr29.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tst_pr29.c')
-rw-r--r--tests/tst_pr29.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/tests/tst_pr29.c b/tests/tst_pr29.c
new file mode 100644
index 0000000..e01441b
--- /dev/null
+++ b/tests/tst_pr29.c
@@ -0,0 +1,145 @@
+/* tst_pr29.c --- Self tests for pr29_*().
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Simon Josefsson
+ *
+ * This file is part of GNU Libidn.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+
+#include <pr29.h>
+
+#include "utils.h"
+
+struct tv
+{
+ const char *name;
+ size_t inlen;
+ uint32_t in[100];
+ int rc;
+};
+
+static const struct tv tv[] = {
+ {
+ "Problem Sequence A",
+ 3,
+ {0x1100, 0x0300, 0x1161, 0},
+ PR29_PROBLEM},
+ {
+ "Test Case",
+ 3,
+ {0x0B47, 0x0300, 0x0B3E, 0},
+ PR29_PROBLEM},
+ {
+ "Instability Example",
+ 3,
+ {0x1100, 0x0300, 0x1161, 0x0323, 0},
+ PR29_PROBLEM},
+ {
+ "Not a problem sequence 1",
+ 3,
+ {0x1100, 0x1161, 0x0300, 0},
+ PR29_SUCCESS},
+ {
+ "Not a problem sequence 2",
+ 3,
+ {0x0300, 0x1100, 0x1161, 0},
+ PR29_SUCCESS},
+ {
+ "Not a problem sequence 3",
+ 3,
+ {0x1161, 0x1100, 0x0300, 0},
+ PR29_SUCCESS},
+ {
+ "Not a problem sequence 4",
+ 3,
+ {0x1161, 0x0300, 0x1100, 0},
+ PR29_SUCCESS},
+ {
+ "Not a problem sequence 5",
+ 3,
+ {0x1100, 0x00AA, 0x1161, 0},
+ PR29_SUCCESS}
+};
+
+void
+doit (void)
+{
+ size_t i;
+ int rc;
+
+ for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
+ {
+ if (debug)
+ printf ("PR29 entry %d: %s\n", i, tv[i].name);
+
+ if (debug)
+ {
+ printf ("in:\n");
+ ucs4print (tv[i].in, tv[i].inlen);
+ }
+
+ rc = pr29_4 (tv[i].in, tv[i].inlen);
+ if (rc != tv[i].rc)
+ {
+ fail ("PR29 entry %d failed (expected %d): %d\n", i, tv[i].rc, rc);
+ if (debug)
+ printf ("FATAL\n");
+ continue;
+ }
+
+ rc = pr29_4z (tv[i].in);
+ if (rc != tv[i].rc)
+ {
+ fail ("PR29 entry %d failed (expected %d): %d\n", i, tv[i].rc, rc);
+ if (debug)
+ printf ("FATAL\n");
+ continue;
+ }
+
+ {
+ char *p;
+ size_t items_read, items_written;
+
+ p = stringprep_ucs4_to_utf8 (tv[i].in, (ssize_t) tv[i].inlen,
+ &items_read, &items_written);
+ if (p == NULL)
+ fail ("FAIL: stringprep_ucs4_to_utf8(tv[%d]) == NULL\n", i);
+ if (debug)
+ hexprint (p, strlen (p));
+
+ rc = pr29_8z (p);
+ free (p);
+ if (rc != tv[i].rc)
+ {
+ fail ("PR29 entry %d failed (expected %d): %d\n", i, tv[i].rc, rc);
+ if (debug)
+ printf ("FATAL\n");
+ continue;
+ }
+ }
+
+ if (debug)
+ printf ("OK\n");
+ }
+}