1 ;;;; miscellaneous tests of STRING-related stuff
3 ;;;; This software is part of the SBCL system. See the README file for
6 ;;;; While most of SBCL is derived from the CMU CL system, the test
7 ;;;; files (like this one) were written from scratch after the fork
10 ;;;; This software is in the public domain and is provided with
11 ;;;; absolutely no warranty. See the COPYING and CREDITS files for
12 ;;;; more information.
14 (in-package "CL-USER")
16 ;;; basic non-destructive case operations
17 (with-test (:name
(string-upcase string-downcase string-capitalize
:smoke
))
18 (assert (string= (string-upcase "This is a test.") "THIS IS A TEST."))
19 (assert (string= (string-downcase "This is a test.") "this is a test."))
20 (assert (string= (string-capitalize "This is a test.") "This Is A Test."))
21 (assert (string= (string-upcase "Is this 900-Sex-hott, please?" :start
3)
22 "Is THIS 900-SEX-HOTT, PLEASE?"))
23 (assert (string= (string-downcase "Is this 900-Sex-hott, please?"
25 "Is this 900-sex-hott, please?"))
26 (assert (string= (string-capitalize "Is this 900-Sex-hott, please?")
27 "Is This 900-Sex-Hott, Please?")))
29 ;;; The non-destructive case operations accept string designators, not
32 (with-test (:name
(string-upcase string-downcase string-capitalize
:designators
))
33 (assert (string= (string-upcase '|String designator|
) "STRING DESIGNATOR"))
34 (assert (string= (string-downcase #\S
) "s"))
35 (assert (string= (string-downcase #\.
) "."))
36 (assert (string= (string-capitalize 'ya-str-desig
:end
5) "Ya-StR-DESIG")))
38 ;;; basic destructive case operations
39 (with-test (:name
(nstring-upcase nstring-downcase nstring-capitalize
:smoke
))
40 (let ((nstring (make-array 5 :element-type
'character
:fill-pointer
0)))
41 (vector-push-extend #\c nstring
)
42 (vector-push-extend #\a nstring
)
43 (vector-push-extend #\t nstring
)
44 (nstring-upcase nstring
)
45 (assert (string= nstring
"CAT"))
46 (setf (fill-pointer nstring
) 2)
47 (nstring-downcase nstring
:start
1)
48 (setf (fill-pointer nstring
) 3)
49 (assert (string= nstring
"CaT"))
50 (nstring-capitalize nstring
)
51 (assert (string= nstring
"Cat"))))
53 ;;; (VECTOR NIL)s are strings. Tests for that and issues uncovered in
55 (with-test (:name
(vector nil
))
56 (assert (typep (make-array 1 :element-type nil
) 'string
))
57 (assert (not (typep (make-array 2 :element-type nil
) 'base-string
)))
58 (assert (typep (make-string 3 :element-type nil
) 'simple-string
))
59 (assert (not (typep (make-string 4 :element-type nil
) 'simple-base-string
)))
61 (assert (subtypep (class-of (make-array 1 :element-type nil
))
62 (find-class 'string
)))
63 (assert (subtypep (class-of (make-array 2 :element-type nil
:fill-pointer
1))
64 (find-class 'string
)))
66 (assert (string= "" (make-array 0 :element-type nil
)))
67 (assert (string/= "a" (make-array 0 :element-type nil
)))
68 (assert (string= "" (make-array 5 :element-type nil
:fill-pointer
0)))
70 (assert (= (sxhash "")
71 (sxhash (make-array 0 :element-type nil
))
72 (sxhash (make-array 5 :element-type nil
:fill-pointer
0))
73 (sxhash (make-string 0 :element-type nil
))))
74 (assert (subtypep (type-of (make-array 2 :element-type nil
)) 'simple-string
))
75 (assert (subtypep (type-of (make-array 4 :element-type nil
:fill-pointer t
))
78 (assert (eq (intern "") (intern (make-array 0 :element-type nil
))))
79 (assert (eq (intern "")
80 (intern (make-array 5 :element-type nil
:fill-pointer
0)))))
82 (with-test (:name
(make-string :element-type t type-error
))
83 (multiple-value-bind (fun failure-p warnings
)
84 (checked-compile '(lambda () (make-string 5 :element-type t
))
85 :allow-failure t
:allow-warnings t
)
87 (assert (= 1 (length warnings
)))
88 (assert-error (funcall fun
) type-error
)))
91 (with-test (:name
(string<= base-string
:optimized
))
92 (assert (= (funcall (lambda (a)
93 (declare (optimize (speed 3) (safety 1)
96 (string<= (coerce "e99mo7yAJ6oU4" 'base-string
)
97 (coerce "aaABAAbaa" 'base-string
)
103 (with-test (:name
(string-trim 1))
104 (flet ((make-test (string left right both
)
105 (macrolet ((check (fun wanted
)
106 `(let ((result (,fun
" " string
)))
107 (assert (equal result
,wanted
))
108 (when (equal string
,wanted
)
109 ;; Check that the original string is
110 ;; returned when no changes are needed. Not
111 ;; required by the spec, but a desireable
112 ;; feature for performance.
113 (assert (eql result string
))))))
114 ;; Check the functional implementations
116 (declare (notinline string-left-trim string-right-trim
118 (check string-left-trim left
)
119 (check string-right-trim right
)
120 (check string-trim both
))
121 ;; Check the transforms
123 (declare (type simple-string string
))
124 (check string-left-trim left
)
125 (check string-right-trim right
)
126 (check string-trim both
)))))
127 (make-test "x " "x " "x" "x")
128 (make-test " x" "x" " x" "x")
129 (make-test " x " "x " " x" "x")
130 (make-test " x x " "x x " " x x" "x x")))
133 ;;; Trimming should respect fill-pointers
134 (with-test (:name
(string-trim :fill-pointer
))
135 (let* ((s (make-array 9 :initial-contents
"abcdabadd" :element-type
136 'character
:fill-pointer
7))
137 (s2 (string-left-trim "ab" s
))
138 (s3 (string-right-trim "ab" s
)))
139 (assert (equal "abcdaba" s
))
140 (assert (equal "cdaba" s2
))
141 (assert (equal "abcd" s3
))))
143 ;;; Trimming should replace displacement offsets
144 (with-test (:name
(string-trim :displaced
))
145 (let* ((etype 'base-char
)
147 (make-array '(6) :initial-contents
"abcaeb" :element-type etype
))
149 (make-array '(3) :element-type etype
:displaced-to s0
:displaced-index-offset
1)))
150 (assert (equal "bc" (string-right-trim "ab" s
)))
151 (assert (equal "bca" s
))
152 (assert (equal "abcaeb" s0
))))
154 (with-test (:name
(string-trim :nothing-to-do
))
155 ;; Trimming non-simple-strings when there is nothing to do
156 (let ((a (make-array 10 :element-type
'character
:initial-contents
"abcde00000" :fill-pointer
5)))
157 (assert (equal "abcde" (string-right-trim "Z" a
))))
159 ;; Trimming non-strings when there is nothing to do.
160 (string-right-trim " " #\a))
162 (with-test (:name
:nil-vector-access
)
163 (let ((nil-vector (make-array 10 :element-type nil
)))
164 (assert-error (write-to-string nil-vector
)
165 sb-kernel
:nil-array-accessed-error
)
166 (flet ((test (accessor)
168 (funcall (checked-compile
170 (,accessor
(make-array 10 :element-type nil
) 0))))
171 sb-kernel
:nil-array-accessed-error
)
173 (funcall (checked-compile `(lambda (x) (,accessor x
0)))
175 sb-kernel
:nil-array-accessed-error
)))
179 (test 'row-major-aref
))))
181 (with-test (:name
:nil-array-access
)
182 (let ((nil-array (make-array '(10 10) :element-type nil
)))
183 (assert-error (write-to-string nil-array
)
184 sb-kernel
:nil-array-accessed-error
)
185 (flet ((test (accessor args
)
187 (funcall (checked-compile
189 (,accessor
(make-array '(10 10) :element-type nil
)
190 ,@(make-list args
:initial-element
0)))))
191 sb-kernel
:nil-array-accessed-error
)
193 (funcall (checked-compile
195 (,accessor x
,@(make-list args
:initial-element
0))))
197 sb-kernel
:nil-array-accessed-error
)))
199 (test 'row-major-aref
1))))
201 (with-test (:name
(string-equal :two-arg
))
202 (flet ((check (function expected
)
204 (checked-compile `(lambda (x y
) (,function x y
)))
206 (make-array 1 :element-type
'character
208 :displaced-index-offset
1))
210 (check 'string-equal t
)
211 (check 'string-not-equal nil
)))