From fcc0f4b2633c04f44520285a65822b0a6e5b2109 Mon Sep 17 00:00:00 2001 From: Vivianne Langdon Date: Sun, 3 Mar 2024 23:16:43 -0500 Subject: [PATCH] Add failing unit tests, seems stream is not 100% --- hall.scm | 3 +- tests/test-graphemes-stream.scm | 54 +++++++++++++++++++++++++++++++++ uniseg/graphemes/stream.scm | 9 ++++-- 3 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 tests/test-graphemes-stream.scm diff --git a/hall.scm b/hall.scm index b366452..c2c0bb0 100644 --- a/hall.scm +++ b/hall.scm @@ -31,7 +31,8 @@ (tests ((directory "tests" ((scheme-file "test-eastasian-locale") - (scheme-file "test-uniseg"))))) + (scheme-file "test-uniseg") + (scheme-file "test-graphemes-stream"))))) (programs ((directory "scripts" diff --git a/tests/test-graphemes-stream.scm b/tests/test-graphemes-stream.scm new file mode 100644 index 0000000..9b7a037 --- /dev/null +++ b/tests/test-graphemes-stream.scm @@ -0,0 +1,54 @@ +(define-module (tests test-graphemes-stream) + #:use-module (uniseg graphemes stream) + #:use-module (srfi srfi-41) + #:use-module (srfi srfi-64)) + +(test-begin "tests-graphemes-stream") + +;; silly double-em dash +(define stream (string->grapheme-stream "Trans 🏳️‍⚧️ rights are human rights⸺and that's a promise!")) + +(define* (advance-stream! #:optional (times 1)) + (for-each + (λ (_) + (set! stream (stream-cdr stream))) + (make-list times))) + +(advance-stream! 6) + +(define trans-flag-grapheme (stream-car stream)) + +(test-equal "Trans flag stream is correct" + "🏳️‍⚧️" (grapheme-string trans-flag-grapheme)) + +(test-equal "Trans flag is width 2" + 2 (grapheme-width trans-flag-grapheme)) + +(advance-stream! 2) + +(define r-grapheme (stream-car stream)) + +(test-equal "r in rights is in correct place" + "r" (grapheme-string r-grapheme)) + +(test-equal "r is width 1" + 1 (grapheme-width r-grapheme)) + +(advance-stream! 23) + +(define double-em-dash-grapheme (stream-car stream)) + +(test-equal "double-em-dash is in right place" + "⸺" (grapheme-string double-em-dash-grapheme)) + +(test-equal "double-em-dash is double-width" + 2 (grapheme-width double-em-dash-grapheme)) + +(advance-stream!) + +(define a-grapheme (stream-car stream)) + +(test-equal "advancing one goes to the a" + "a" (grapheme-string a-grapheme)) + +(test-end "tests-graphemes-stream") diff --git a/uniseg/graphemes/stream.scm b/uniseg/graphemes/stream.scm index 31ea2ed..882c32d 100644 --- a/uniseg/graphemes/stream.scm +++ b/uniseg/graphemes/stream.scm @@ -8,19 +8,22 @@ #:export (make-grapheme grapheme? grapheme-glyphs + grapheme-string grapheme-width - grapheme-sentence-end? - grapheme-word-end? string->grapheme-stream input->grapheme-stream)) -;; TODO: uniseg also does word and sentence boundaries. These state machines could be implemented if we wanted to. +;; TODO: the golang uniseg also does word and sentence boundaries. These state machines could be implemented if we wanted to. (define-immutable-record-type (make-grapheme glyphs width) grapheme? (glyphs grapheme-glyphs) (width grapheme-width)) +(define (grapheme-string grapheme) + "Given a grapheme, construct a string representing it." + (list->string (grapheme-glyphs grapheme))) + (define (string->grapheme-stream str) "Given a string, create a (lazy) stream of graphemes." (with-input-from-string str