Skip to content

Commit

Permalink
add missing reverse-string tests, exercism#364
Browse files Browse the repository at this point in the history
  • Loading branch information
kmarker1101 committed Jun 16, 2024
1 parent 787cfaa commit 6e6a64e
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
26 changes: 25 additions & 1 deletion exercises/practice/reverse-string/.meta/example.el
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
9 changes: 9 additions & 0 deletions exercises/practice/reverse-string/reverse-string-test.el
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 6e6a64e

Please sign in to comment.