X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=tests%2Fstring.pure.lisp;h=89e98066c94daf1cff3700ee4f4f748d5a1e4b0e;hb=19d37e39d4e0bfc943749d111c1ba2cbed805939;hp=15e7afd1cee2f982b699bb787f9d051404571b3f;hpb=4898ef32c639b1c7f4ee13a5ba566ce6debd03e6;p=sbcl.git diff --git a/tests/string.pure.lisp b/tests/string.pure.lisp index 15e7afd..89e9806 100644 --- a/tests/string.pure.lisp +++ b/tests/string.pure.lisp @@ -87,3 +87,61 @@ :start1 a)) 9) 9)) + +;; String trimming. + +(flet ((make-test (string left right both) + (macrolet ((check (fun wanted) + `(let ((result (,fun " " string))) + (assert (equal result ,wanted)) + (when (equal string ,wanted) + ;; Check that the original string is + ;; returned when no changes are needed. Not + ;; required by the spec, but a desireable + ;; feature for performance. + (assert (eql result string)))))) + ;; Check the functional implementations + (locally + (declare (notinline string-left-trim string-right-trim + string-trim)) + (check string-left-trim left) + (check string-right-trim right) + (check string-trim both)) + ;; Check the transforms + (locally + (declare (type simple-string string)) + (check string-left-trim left) + (check string-right-trim right) + (check string-trim both))))) + (make-test "x " "x " "x" "x") + (make-test " x" "x" " x" "x") + (make-test " x " "x " " x" "x") + (make-test " x x " "x x " " x x" "x x")) + + +;;; Trimming should respect fill-pointers +(let* ((s (make-array 9 :initial-contents "abcdabadd" :element-type + 'character :fill-pointer 7)) + (s2 (string-left-trim "ab" s)) + (s3 (string-right-trim "ab" s))) + (assert (equal "abcdaba" s)) + (assert (equal "cdaba" s2)) + (assert (equal "abcd" s3))) + +;;; Trimming should replace displacement offsets +(let* ((etype 'base-char) + (s0 + (make-array '(6) :initial-contents "abcaeb" :element-type etype)) + (s + (make-array '(3) :element-type etype :displaced-to s0 :displaced-index-offset 1))) + (assert (equal "bc" (string-right-trim "ab" s))) + (assert (equal "bca" s)) + (assert (equal "abcaeb" s0))) + +;;; Trimming non-simple-strings when there is nothing to do +(let ((a (make-array 10 :element-type 'character :initial-contents "abcde00000" :fill-pointer 5))) + (assert (equal "abcde" (string-right-trim "Z" a)))) + +;;; Trimming non-strings when there is nothing to do. +(string-right-trim " " #\a) +