+ (assert (= (position #\a string :start 0 :end nil) 0))
+ (assert (= (position #\a string :start 0 :end 5) 0))
+ (assert (raises-error? (position #\a string :start 0 :end 6)))
+ (assert (raises-error? (position #\a string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (position #\a string :start 4 :end 2)))
+ (assert (raises-error? (position #\a string :start 6 :end 9)))
+ (assert (= (position-if #'alpha-char-p string :start 0 :end nil) 0))
+ (assert (= (position-if #'alpha-char-p string :start 0 :end 5) 0))
+ (assert (raises-error?
+ (position-if #'alpha-char-p string :start 0 :end 6)))
+ (assert (raises-error?
+ (position-if #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error?
+ (position-if #'alpha-char-p string :start 4 :end 2)))
+ (assert (raises-error?
+ (position-if #'alpha-char-p string :start 6 :end 9)))
+ (assert (eq (position-if-not #'alpha-char-p string :start 0 :end nil) nil))
+ (assert (eq (position-if-not #'alpha-char-p string :start 0 :end 5) nil))
+ (assert (raises-error?
+ (position-if-not #'alpha-char-p string :start 0 :end 6)))
+ (assert (raises-error?
+ (position-if-not #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error?
+ (position-if-not #'alpha-char-p string :start 4 :end 2)))
+ (assert (raises-error?
+ (position-if-not #'alpha-char-p string :start 6 :end 9))))
+
+;;; Function READ-FROM-STRING
+(sequence-bounding-indices-test
+ (format t "~&/Function READ-FROM-STRING")
+ (setf (subseq string 0 5) "(a b)")
+ (assert (equal (read-from-string string nil nil :start 0 :end 5) '(a b)))
+ (assert (equal (read-from-string string nil nil :start 0 :end nil) '(a b)))
+ (assert (raises-error? (read-from-string string nil nil :start 0 :end 6)))
+ (assert (raises-error? (read-from-string string nil nil :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (read-from-string string nil nil :start 4 :end 2)))
+ (assert (raises-error? (read-from-string string nil nil :start 6 :end 9))))
+
+;;; Function REDUCE
+(sequence-bounding-indices-test
+ (format t "~&/Function REDUCE")
+ (setf (subseq string 0 5) "abcde")
+ (assert (equal (reduce #'list* string :from-end t :start 0 :end nil)
+ '(#\a #\b #\c #\d . #\e)))
+ (assert (equal (reduce #'list* string :from-end t :start 0 :end 5)
+ '(#\a #\b #\c #\d . #\e)))
+ (assert (raises-error? (reduce #'list* string :start 0 :end 6)))
+ (assert (raises-error? (reduce #'list* string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (reduce #'list* string :start 4 :end 2)))
+ (assert (raises-error? (reduce #'list* string :start 6 :end 9))))
+
+;;; Function REMOVE, REMOVE-IF, REMOVE-IF-NOT, DELETE, DELETE-IF,
+;;; DELETE-IF-NOT
+(sequence-bounding-indices-test
+ (format t "~&/Function REMOVE, REMOVE-IF, REMOVE-IF-NOT, ...")
+ (assert (equal (remove #\a string :start 0 :end nil) ""))
+ (assert (equal (remove #\a string :start 0 :end 5) ""))
+ (assert (raises-error? (remove #\a string :start 0 :end 6)))
+ (assert (raises-error? (remove #\a string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (remove #\a string :start 4 :end 2)))
+ (assert (raises-error? (remove #\a string :start 6 :end 9)))
+ (assert (equal (remove-if #'alpha-char-p string :start 0 :end nil) ""))
+ (assert (equal (remove-if #'alpha-char-p string :start 0 :end 5) ""))
+ (assert (raises-error?
+ (remove-if #'alpha-char-p string :start 0 :end 6)))
+ (assert (raises-error?
+ (remove-if #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error?
+ (remove-if #'alpha-char-p string :start 4 :end 2)))
+ (assert (raises-error?
+ (remove-if #'alpha-char-p string :start 6 :end 9)))
+ (assert (equal (remove-if-not #'alpha-char-p string :start 0 :end nil)
+ "aaaaa"))
+ (assert (equal (remove-if-not #'alpha-char-p string :start 0 :end 5)
+ "aaaaa"))
+ (assert (raises-error?
+ (remove-if-not #'alpha-char-p string :start 0 :end 6)))
+ (assert (raises-error?
+ (remove-if-not #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error?
+ (remove-if-not #'alpha-char-p string :start 4 :end 2)))
+ (assert (raises-error?
+ (remove-if-not #'alpha-char-p string :start 6 :end 9))))
+(sequence-bounding-indices-test
+ (format t "~&/... DELETE, DELETE-IF, DELETE-IF-NOT")
+ (assert (equal (delete #\a string :start 0 :end nil) ""))
+ (reset)
+ (assert (equal (delete #\a string :start 0 :end 5) ""))
+ (reset)
+ (assert (raises-error? (delete #\a string :start 0 :end 6)))
+ (reset)
+ (assert (raises-error? (delete #\a string :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error? (delete #\a string :start 4 :end 2)))
+ (reset)
+ (assert (raises-error? (delete #\a string :start 6 :end 9)))
+ (reset)
+ (assert (equal (delete-if #'alpha-char-p string :start 0 :end nil) ""))
+ (reset)
+ (assert (equal (delete-if #'alpha-char-p string :start 0 :end 5) ""))
+ (reset)
+ (assert (raises-error?
+ (delete-if #'alpha-char-p string :start 0 :end 6)))
+ (reset)
+ (assert (raises-error?
+ (delete-if #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error?
+ (delete-if #'alpha-char-p string :start 4 :end 2)))
+ (reset)
+ (assert (raises-error?
+ (delete-if #'alpha-char-p string :start 6 :end 9)))
+ (reset)
+ (assert (equal (delete-if-not #'alpha-char-p string :start 0 :end nil)
+ "aaaaa"))
+ (reset)
+ (assert (equal (delete-if-not #'alpha-char-p string :start 0 :end 5)
+ "aaaaa"))
+ (reset)
+ (assert (raises-error?
+ (delete-if-not #'alpha-char-p string :start 0 :end 6)))
+ (reset)
+ (assert (raises-error?
+ (delete-if-not #'alpha-char-p string :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error?
+ (delete-if-not #'alpha-char-p string :start 4 :end 2)))
+ (reset)
+ (assert (raises-error?
+ (delete-if-not #'alpha-char-p string :start 6 :end 9))))
+
+;;; Function REMOVE-DUPLICATES, DELETE-DUPLICATES
+(sequence-bounding-indices-test
+ (format t "~&/Function REMOVE-DUPLICATES, DELETE-DUPLICATES")
+ (assert (string= (remove-duplicates string :start 0 :end 5) "a"))
+ (assert (string= (remove-duplicates string :start 0 :end nil) "a"))
+ (assert (raises-error? (remove-duplicates string :start 0 :end 6)))
+ (assert (raises-error? (remove-duplicates string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (remove-duplicates string :start 4 :end 2)))
+ (assert (raises-error? (remove-duplicates string :start 6 :end 9)))
+ (assert (string= (delete-duplicates string :start 0 :end 5) "a"))
+ (reset)
+ (assert (string= (delete-duplicates string :start 0 :end nil) "a"))
+ (reset)
+ (assert (raises-error? (delete-duplicates string :start 0 :end 6)))
+ (reset)
+ (assert (raises-error? (delete-duplicates string :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error? (delete-duplicates string :start 4 :end 2)))
+ (reset)
+ (assert (raises-error? (delete-duplicates string :start 6 :end 9))))
+
+;;; Function REPLACE
+(sequence-bounding-indices-test
+ (format t "~&/Function REPLACE")
+ (assert (string= (replace string "bbbbb" :start1 0 :end1 5) "bbbbb"))
+ (assert (string= (replace (copy-seq "ccccc")
+ string
+ :start2 0 :end2 nil) "bbbbb"))
+ (assert (raises-error? (replace string "ccccc" :start1 0 :end1 6)))
+ (assert (raises-error? (replace string "ccccc" :start2 (opaque-identity -1) :end2 5)))
+ (assert (raises-error? (replace string "ccccc" :start1 4 :end1 2)))
+ (assert (raises-error? (replace string "ccccc" :start1 6 :end1 9))))
+
+;;; Function SEARCH
+(sequence-bounding-indices-test
+ (format t "~&/Function SEARCH")
+ (assert (= (search "aa" string :start2 0 :end2 5) 0))
+ (assert (null (search string "aa" :start1 0 :end2 nil)))
+ (assert (raises-error? (search "aa" string :start2 0 :end2 6)))
+ (assert (raises-error? (search "aa" string :start2 (opaque-identity -1) :end2 5)))
+ (assert (raises-error? (search "aa" string :start2 4 :end2 2)))
+ (assert (raises-error? (search "aa" string :start2 6 :end2 9))))
+
+;;; Function STRING-UPCASE, STRING-DOWNCASE, STRING-CAPITALIZE,
+;;; NSTRING-UPCASE, NSTRING-DOWNCASE, NSTRING-CAPITALIZE
+(defmacro string-case-frob (fn)
+ `(progn
+ (assert (raises-error? (,fn string :start 0 :end 6)))
+ (assert (raises-error? (,fn string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (,fn string :start 4 :end 2)))
+ (assert (raises-error? (,fn string :start 6 :end 9)))))
+
+(sequence-bounding-indices-test
+ (format t "~&/Function STRING-UPCASE, STRING-DOWNCASE, STRING-CAPITALIZE, ...")
+ (string-case-frob string-upcase)
+ (string-case-frob string-downcase)
+ (string-case-frob string-capitalize)
+ (format t "~&/... NSTRING-UPCASE, NSTRING-DOWNCASE, NSTRING-CAPITALIZE")
+ (string-case-frob nstring-upcase)
+ (string-case-frob nstring-downcase)
+ (string-case-frob nstring-capitalize))
+
+;;; Function STRING=, STRING/=, STRING<, STRING>, STRING<=, STRING>=,
+;;; STRING-EQUAL, STRING-NOT-EQUAL, STRING-LESSP, STRING-GREATERP,
+;;; STRING-NOT-GREATERP, STRING-NOT-LESSP
+(defmacro string-predicate-frob (fn)
+ `(progn
+ (,fn string "abcde" :start1 0 :end1 5)
+ (,fn "fghij" string :start2 0 :end2 nil)
+ (assert (raises-error? (,fn string "klmno"
+ :start1 0 :end1 6)))
+ (assert (raises-error? (,fn "pqrst" string
+ :start2 (opaque-identity -1) :end2 5)))
+ (assert (raises-error? (,fn "uvwxy" string
+ :start1 4 :end1 2)))
+ (assert (raises-error? (,fn string "z" :start2 6 :end2 9)))))
+(sequence-bounding-indices-test
+ (format t "~&/Function STRING=, STRING/=, STRING<, STRING>, STRING<=, STRING>=, ...")
+ (string-predicate-frob string=)
+ (string-predicate-frob string/=)
+ (string-predicate-frob string<)
+ (string-predicate-frob string>)
+ (string-predicate-frob string<=)
+ (string-predicate-frob string>=))
+(sequence-bounding-indices-test
+ (format t "~&/... STRING-EQUAL, STRING-NOT-EQUAL, STRING-LESSP, ...")
+ (string-predicate-frob string-equal)
+ (string-predicate-frob string-not-equal)
+ (string-predicate-frob string-lessp))
+(sequence-bounding-indices-test
+ (format t "~&/... STRING-GREATERP, STRING-NOT-GREATERP, STRING-NOT-LESSP")
+ (string-predicate-frob string-greaterp)
+ (string-predicate-frob string-not-greaterp)
+ (string-predicate-frob string-not-lessp))
+
+;;; Function SUBSTITUTE, SUBSTITUTE-IF, SUBSTITUTE-IF-NOT,
+;;; NSUBSTITUTE, NSUBSTITUTE-IF, NSUBSTITUTE-IF-NOT
+(sequence-bounding-indices-test
+ (format t "~&/Function SUBSTITUTE, SUBSTITUTE-IF, SUBSTITUTE-IF-NOT, ...")
+ (assert (string= (substitute #\b #\a string :start 0 :end 5) "bbbbb"))
+ (assert (string= (substitute #\c #\a string :start 0 :end nil)
+ "ccccc"))
+ (assert (raises-error? (substitute #\b #\a string :start 0 :end 6)))
+ (assert (raises-error? (substitute #\b #\a string :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (substitute #\b #\a string :start 4 :end 2)))
+ (assert (raises-error? (substitute #\b #\a string :start 6 :end 9)))
+ (assert (string= (substitute-if #\b #'alpha-char-p string
+ :start 0 :end 5)
+ "bbbbb"))
+ (assert (string= (substitute-if #\c #'alpha-char-p string
+ :start 0 :end nil)
+ "ccccc"))
+ (assert (raises-error? (substitute-if #\b #'alpha-char-p string
+ :start 0 :end 6)))
+ (assert (raises-error? (substitute-if #\b #'alpha-char-p string
+ :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (substitute-if #\b #'alpha-char-p string
+ :start 4 :end 2)))
+ (assert (raises-error? (substitute-if #\b #'alpha-char-p string
+ :start 6 :end 9)))
+ (assert (string= (substitute-if-not #\b #'alpha-char-p string
+ :start 0 :end 5)
+ "aaaaa"))
+ (assert (string= (substitute-if-not #\c #'alpha-char-p string
+ :start 0 :end nil)
+ "aaaaa"))
+ (assert (raises-error? (substitute-if-not #\b #'alpha-char-p string
+ :start 0 :end 6)))
+ (assert (raises-error? (substitute-if-not #\b #'alpha-char-p string
+ :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (substitute-if-not #\b #'alpha-char-p string
+ :start 4 :end 2)))
+ (assert (raises-error? (substitute-if-not #\b #'alpha-char-p string
+ :start 6 :end 9))))
+(sequence-bounding-indices-test
+ (format t "~&/... NSUBSTITUTE, NSUBSTITUTE-IF, NSUBSTITUTE-IF-NOT")
+ (assert (string= (nsubstitute #\b #\a string :start 0 :end 5) "bbbbb"))
+ (reset)
+ (assert (string= (nsubstitute #\c #\a string :start 0 :end nil)
+ "ccccc"))
+ (reset)
+ (assert (raises-error? (nsubstitute #\b #\a string :start 0 :end 6)))
+ (reset)
+ (assert (raises-error? (nsubstitute #\b #\a string :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error? (nsubstitute #\b #\a string :start 4 :end 2)))
+ (reset)
+ (assert (raises-error? (nsubstitute #\b #\a string :start 6 :end 9)))
+ (reset)
+ (assert (string= (nsubstitute-if #\b #'alpha-char-p string
+ :start 0 :end 5)
+ "bbbbb"))
+ (reset)
+ (assert (string= (nsubstitute-if #\c #'alpha-char-p string
+ :start 0 :end nil)
+ "ccccc"))
+ (reset)
+ (assert (raises-error? (nsubstitute-if #\b #'alpha-char-p string
+ :start 0 :end 6)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if #\b #'alpha-char-p string
+ :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if #\b #'alpha-char-p string
+ :start 4 :end 2)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if #\b #'alpha-char-p string
+ :start 6 :end 9)))
+ (reset)
+ (assert (string= (nsubstitute-if-not #\b #'alpha-char-p string
+ :start 0 :end 5)
+ "aaaaa"))
+ (reset)
+ (assert (string= (nsubstitute-if-not #\c #'alpha-char-p string
+ :start 0 :end nil)
+ "aaaaa"))
+ (reset)
+ (assert (raises-error? (nsubstitute-if-not #\b #'alpha-char-p string
+ :start 0 :end 6)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if-not #\b #'alpha-char-p string
+ :start (opaque-identity -1) :end 5)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if-not #\b #'alpha-char-p string
+ :start 4 :end 2)))
+ (reset)
+ (assert (raises-error? (nsubstitute-if-not #\b #'alpha-char-p string
+ :start 6 :end 9))))
+;;; Function WRITE-STRING, WRITE-LINE
+(sequence-bounding-indices-test
+ (format t "~&/Function WRITE-STRING, WRITE-LINE")
+ (write-string string *standard-output* :start 0 :end 5)
+ (write-string string *standard-output* :start 0 :end nil)
+ (assert (raises-error? (write-string string *standard-output*
+ :start 0 :end 6)))
+ (assert (raises-error? (write-string string *standard-output*
+ :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (write-string string *standard-output*
+ :start 4 :end 2)))
+ (assert (raises-error? (write-string string *standard-output*
+ :start 6 :end 9)))
+ (write-line string *standard-output* :start 0 :end 5)
+ (write-line string *standard-output* :start 0 :end nil)
+ (assert (raises-error? (write-line string *standard-output*
+ :start 0 :end 6)))
+ (assert (raises-error? (write-line string *standard-output*
+ :start (opaque-identity -1) :end 5)))
+ (assert (raises-error? (write-line string *standard-output*
+ :start 4 :end 2)))
+ (assert (raises-error? (write-line string *standard-output*
+ :start 6 :end 9))))
+
+;;; Macro WITH-INPUT-FROM-STRING
+(sequence-bounding-indices-test
+ (format t "~&/Macro WITH-INPUT-FROM-STRING")
+ (with-input-from-string (s string :start 0 :end 5)
+ (assert (char= (read-char s) #\a)))
+ (with-input-from-string (s string :start 0 :end nil)
+ (assert (char= (read-char s) #\a)))
+ (assert (raises-error?
+ (with-input-from-string (s string :start 0 :end 6)
+ (read-char s))))
+ (assert (raises-error?
+ (with-input-from-string (s string :start (opaque-identity -1) :end 5)
+ (read-char s))))
+ (assert (raises-error?
+ (with-input-from-string (s string :start 4 :end 2)
+ (read-char s))))
+ (assert (raises-error?
+ (with-input-from-string (s string :start 6 :end 9)
+ (read-char s)))))