(add-tests-with-string-output "string-set! errors" ; first with a fixed index ; [(let ((t 1)) (and (begin (set! t (fxadd1 t)) t) t)) => "2\n"] [(let ((f (if (boolean? (lambda () 12)) (lambda () 13) (lambda () 14)))) (f)) => "14\n"] [(let ([f 12]) (let ([g (lambda () f)]) (g))) => "12\n"] [(fx< 1 2) => "#t\n"] [(let ([f (lambda (x y) (fx< x y))]) (f 10 10)) => "#f\n"] [(fx< 10 10) => "#f\n"] [(fx< 10 2) => "#f\n"] [(fx<= 1 2) => "#t\n"] [(fx<= 10 10) => "#t\n"] [(fx<= 10 2) => "#f\n"] #;[(let ([f (lambda (s i c) (unless (string? s) (error 'string-set!1 "not a string ~s" s)) (unless (fixnum? i) (error 'string-set!2 "invalid index ~s" i)) (if (fx< i ($string-length s)) #f (error 's1 "")) (unless (fx>= i 0) (error 'string-set!3 "index ~s is out of range for ~s" i s)) (unless (and (fx< i (string-length s)) (fx>= i 0)) (error 'string-set!3 "index ~s is out of range for ~s" i s)) (unless (char? c) (error 'string-set!4 "not a char ~s" c)) ($string-set! s i c) 12)]) (let ([x ($string #\a #\b #\c)] [y #\a]) (f x 8 y))) => ""] [(let ([x 12]) (string-set! x 0 #\a)) => ""] [(let ([x (string #\a #\b #\c)] [y 12]) (string-set! x 0 y)) => ""] [(let ([x (string #\a #\b #\c)] [y 12]) (string-set! x 8 y)) => ""] [(let ([x (string #\a #\b #\c)] [y #\a]) (string-set! x 8 y)) => ""] [(let ([x (string #\a #\b #\c)]) (string-set! x 8 #\a)) => ""] [(let ([x (string #\a #\b #\c)] [y #\a]) (string-set! x -1 y)) => ""] ; next the general case ;;; 6 kinds of errors: ;;; string is either: ;;; lex-non-string, run-non-string, lex-string, valid ;;; index is either: ;;; lex-invalid, runtime-non-fixnum, runtime-above, runtime-below, valid ;;; char is either: ;;; lex-invalid, runtime-non-char, valid. ;;; that's 4x5x3 = 60 tests! ;;; If we skip over the lexical string check, (since I don't do it), ;;; we have: 2x5x3 = 30 tests. [(let ([s (string #\a #\b #\c)] [i 1] [c #\X]) (string-set! s i c) s) => "\"aXc\"\n"] [(let ([s (string #\a #\b #\c)] [i 1]) (string-set! s i #\X) s) => "\"aXc\"\n"] [(let ([s (string #\a #\b #\c)] [i 1] [c 'X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i 1] [c #\X]) (string-set! s 1 c) s) => "\"aXc\"\n"] [(let ([s (string #\a #\b #\c)] [i 1]) (string-set! s 1 #\X) s) => "\"aXc\"\n"] [(let ([s (string #\a #\b #\c)] [i 1] [c 'X]) (string-set! s 1 c) s) => ""] [(let ([s (string #\a #\b #\c)] [i 3] [c #\X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i 3]) (string-set! s i #\X) s) => ""] [(let ([s (string #\a #\b #\c)] [i 3] [c 'X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i -10] [c #\X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i -11]) (string-set! s i #\X) s) => ""] [(let ([s (string #\a #\b #\c)] [i -1] [c 'X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i 'foo] [c #\X]) (string-set! s i c) s) => ""] [(let ([s (string #\a #\b #\c)] [i 'foo]) (string-set! s i #\X) s) => ""] [(let ([s (string #\a #\b #\c)] [i 'foo] [c 'X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1] [c #\X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1]) (string-set! s i #\X) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1] [c 'X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1] [c #\X]) (string-set! s 1 c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1]) (string-set! s 1 #\X) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 1] [c 'X]) (string-set! s 1 c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 3] [c #\X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 3]) (string-set! s i #\X) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 3] [c 'X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i -10] [c #\X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i -11]) (string-set! s i #\X) s) => ""] [(let ([s '(string #\a #\b #\c)] [i -1] [c 'X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 'foo] [c #\X]) (string-set! s i c) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 'foo]) (string-set! s i #\X) s) => ""] [(let ([s '(string #\a #\b #\c)] [i 'foo] [c 'X]) (string-set! s i c) s) => ""] ) #!eof (add-tests-with-string-output "string errors" [(let ([f (lambda (a b c) (string a b c))]) (f #\a #\b #\c)) => "\"abc\"\n"] [(let ([f (lambda (a b c) (string a b c))]) (f #\a 12 #\c)) => ""] [(let ([f string]) (f #\a #\b #\c)) => "\"abc\"\n"] [(let ([f string]) (f #\a #\b 'x)) => ""] [(string #\a #\b #\c) => "\"abc\"\n"] [(string #\a #\b #t) => ""] )