diff options
Diffstat (limited to 'vendor/librune/test')
| -rw-r--r-- | vendor/librune/test/gbrk.c | 85 | ||||
| -rwxr-xr-x | vendor/librune/test/tests | 38 | 
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 |