aboutsummaryrefslogtreecommitdiff
path: root/vendor/librune/test
diff options
context:
space:
mode:
authorThomas Voss <mail@thomasvoss.com> 2024-01-21 03:03:58 +0100
committerThomas Voss <mail@thomasvoss.com> 2024-01-21 03:03:58 +0100
commit4f93f935dc7a981ca073a322425c3f5929ffb644 (patch)
tree4460586408ec7fdfcecf3ba4584f0435067125a6 /vendor/librune/test
parent72ea25a4d73e3e026366d4165f5bc4ec9e7418cb (diff)
Support line- & column-based match locations
Diffstat (limited to 'vendor/librune/test')
-rw-r--r--vendor/librune/test/gbrk.c85
-rwxr-xr-xvendor/librune/test/tests38
2 files changed, 123 insertions, 0 deletions
diff --git a/vendor/librune/test/gbrk.c b/vendor/librune/test/gbrk.c
new file mode 100644
index 0000000..ad32fdd
--- /dev/null
+++ b/vendor/librune/test/gbrk.c
@@ -0,0 +1,85 @@
+#define _POSIX_C_SOURCE 200809L
+#include <err.h>
+#include <locale.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <gbrk.h>
+#include <rune.h>
+#include <utf8.h>
+
+#define die(...) err(EXIT_FAILURE, __VA_ARGS__)
+
+static void test(char *);
+
+int
+main(int argc, char **argv)
+{
+ char *line = NULL;
+ size_t n;
+ ssize_t nr;
+ FILE *fp;
+
+ setlocale(LC_ALL, "");
+
+ if (argc != 2) {
+ fprintf(stderr, "%s: file\n", *argv);
+ exit(EXIT_FAILURE);
+ }
+
+ if (!(fp = fopen(argv[1], "r")))
+ die("fopen");
+
+ while ((nr = getline(&line, &n, fp)) > 0) {
+ line[nr - 1] = 0;
+ test(line);
+ }
+
+ if (nr == -1 && ferror(fp))
+ die("getline");
+
+ fclose(fp);
+ free(line);
+ return EXIT_SUCCESS;
+}
+
+void
+test(char *raw)
+{
+ int n;
+ rune ch;
+ char8_t *p, *buf;
+ const char8_t *s;
+ size_t bufsiz = 4096;
+ struct grapheme graph;
+
+ if (!(buf = malloc(bufsiz)))
+ die("malloc");
+
+ p = buf;
+ while (sscanf(raw, "%" SCNxRUNE "%n", &ch, &n)) {
+ rune sep;
+ p += rtou8(p, ch, bufsiz - (p - buf));
+ raw += n;
+ raw += u8tor(&sep, (char8_t *)raw);
+ if (!sep)
+ break;
+ }
+ *p = 0;
+
+ s = buf;
+ while (u8gnext(&graph, &s, &bufsiz) && *graph.p) {
+ rune ch;
+ const char8_t *p;
+
+ while (u8next(&ch, &graph.p, &graph.len) && ch) {
+ printf("%04" PRIXRUNE "%s", ch, graph.len > 0 ? "×" : "");
+ p = graph.p;
+ }
+ if (bufsiz && *p)
+ fputs("÷", stdout);
+ }
+
+ putchar('\n');
+ free(buf);
+}
diff --git a/vendor/librune/test/tests b/vendor/librune/test/tests
new file mode 100755
index 0000000..e728773
--- /dev/null
+++ b/vendor/librune/test/tests
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+report()
+{
+ case $1 in
+ 0) printf 'All tests passed\n' >&2 ;;
+ 1) printf '1 test failed\n' >&2 ;;
+ *) printf '%d tests failed\n' $1 >&2
+ esac
+}
+
+readonly src=../data/GraphemeBreakTest.txt
+
+set -e
+cd "${0%/*}"
+find ../lib -name '*.c' -exec cc -I../include -o gbrk gbrk.c {} +
+trap 'rm -f gbrk' EXIT
+
+n=$(
+ ./gbrk $src \
+ | diff -y --suppress-common-lines $src - \
+ | tee failures \
+ | wc -l
+)
+test $n -eq 0 && rm failures
+
+if test -t 2
+then
+ case $n in
+ 0) printf '\033[0;32m' ;;
+ *) printf '\033[0;31m'
+ esac
+
+ report $n
+ printf '\033[0m' >&2
+else
+ report $n
+fi