From 6e6a64eedb632a2841ba2d89471ca6b88fa82dbc Mon Sep 17 00:00:00 2001 From: Kevin Marker Date: Sun, 16 Jun 2024 10:20:32 -0500 Subject: [PATCH] add missing reverse-string tests, #364 --- .../practice/reverse-string/.meta/example.el | 26 ++++++++++++++++++- .../reverse-string/reverse-string-test.el | 9 +++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/exercises/practice/reverse-string/.meta/example.el b/exercises/practice/reverse-string/.meta/example.el index 73fab7ac..f096d50f 100644 --- a/exercises/practice/reverse-string/.meta/example.el +++ b/exercises/practice/reverse-string/.meta/example.el @@ -4,9 +4,33 @@ ;;; Code: +(require 'cl-lib) +(require 'ucs-normalize) + +(defun combining-mark-p (char) + (let ((category (get-char-code-property char 'general-category))) + (or (string= category "Mn") ; Nonspacing_Mark + (string= category "Mc") ; Spacing_Mark + (string= category "Me")))) ; Enclosing_Mark + +(defun split-grapheme-clusters (str) + (let ((clusters '()) + (i 0) + (len (length str))) + (while (< i len) + (let ((start i) + (char (aref str i))) + (setq i (1+ i)) + (while (and (< i len) + (combining-mark-p (aref str i))) + (setq i (1+ i))) + (push (substring str start i) clusters))) + (nreverse clusters))) (defun reverse-string (value) - (reverse value)) + (let* ((decomposed (ucs-normalize-NFD-string value)) + (clusters (split-grapheme-clusters decomposed))) + (apply #'concat (reverse clusters)))) (provide 'reverse-string) diff --git a/exercises/practice/reverse-string/reverse-string-test.el b/exercises/practice/reverse-string/reverse-string-test.el index dc0535e4..41e4093c 100644 --- a/exercises/practice/reverse-string/reverse-string-test.el +++ b/exercises/practice/reverse-string/reverse-string-test.el @@ -32,6 +32,15 @@ (ert-deftest an-even-sized-word () (should (string= (reverse-string "drawer") "reward"))) +(ert-deftest wide-characters () + (should (string= (reverse-string "子猫") "猫子"))) + +(ert-deftest grapheme-cluster-with-pre-combined-form () + (should (string= (reverse-string "Würstchenstand") "dnatsnehctsrüW"))) + +(ert-deftest grapheme-cluster () + (should (string= (reverse-string "ผู้เขียนโปรแกรม") "มรกแรปโนยขีเผู้"))) + (provide 'reverse-string-test) ;;; reverse-string-test.el ends here