diff --git a/ansi-tests/syntax.lsp b/ansi-tests/syntax.lsp index f674f93b03208f370ff79caf35f22a0d724439ad..f5b7a534ffa838ded55b1e89f84e63ba5c1b1ad5 100644 --- a/ansi-tests/syntax.lsp +++ b/ansi-tests/syntax.lsp @@ -54,3 +54,139 @@ (if (not c) t (eval `(signals-error (read-from-string (string ,c)) reader-error)))) t) + +;;; Digits are alphabetic if >= the read base + +(def-syntax-test syntax.digits.alphabetic.1 + (loop for base from 2 to 9 + nconc + (let ((*read-base* base)) + (loop for digit-val from base to 9 + for c = (elt "0123456789" digit-val) + for s = (string c) + for val = (read-from-string s) + unless (and (symbolp val) + (string= s (symbol-name val))) + collect (list base digit-val c s val)))) + nil) + +;;; Reading escaped characters + +(def-syntax-test syntax.escaped.1 + (loop for c across +standard-chars+ + for s0 = (string c) + for s = (concatenate 'string "\\" s0) + for sym = (read-from-string s) + unless (and (symbolp sym) + (string= (symbol-name sym) s0)) + collect (list c s0 s sym)) + nil) + +(def-syntax-test syntax.escaped.2 + (let ((count 0)) + (loop for i from 0 below (min 65536 char-code-limit) + for c = (code-char i) + for s0 = (and c (string c)) + for s = (and c (concatenate 'string "\\" s0)) + for sym = (and c (read-from-string s)) + unless (and c + (symbolp sym) + (string= (symbol-name sym) s0)) + collect (progn + (when (> (incf count) 100) (loop-finish)) + (list i c s0 s sym)))) + nil) + +(def-syntax-test syntax.escaped.3 + (loop for i = (random (min char-code-limit (ash 1 24))) + for c = (code-char i) + for s0 = (and c (string c)) + for s = (and c (concatenate 'string "\\" s0)) + for sym = (and c (read-from-string s)) + repeat 1000 + unless (and c + (symbolp sym) + (string= (symbol-name sym) s0)) + collect (list i c s0 s sym)) + nil) + +(def-syntax-test syntax.escaped.4 + (loop for c across +standard-chars+ + for bad = (find c "\\|") + for s0 = (string c) + for s = (concatenate 'string "|" s0 "|") + for sym = (and (not bad) (read-from-string s)) + unless (or bad + (and (symbolp sym) + (string= (symbol-name sym) s0))) + collect (list c s0 s sym)) + nil) + +(def-syntax-test syntax.escaped.5 + (let ((count 0)) + (loop for i from 0 below (min 65536 char-code-limit) + for c = (code-char i) + for bad = (find c "\\|") + for s0 = (string c) + for s = (concatenate 'string "|" s0 "|") + for sym = (and (not bad) (read-from-string s)) + unless (or bad + (and (symbolp sym) + (string= (symbol-name sym) s0))) + collect (progn + (when (> (incf count) 100) (loop-finish)) + (list c s0 s sym)))) + nil) + +(def-syntax-test syntax.escaped.6 + (loop for i = (random (min char-code-limit (ash 1 24))) + for c = (code-char i) + for bad = (find c "\\|") + for s0 = (string c) + for s = (concatenate 'string "|" s0 "|") + for sym = (and (not bad) (read-from-string s)) + repeat 1000 + unless (or bad + (and (symbolp sym) + (string= (symbol-name sym) s0))) + collect (list c s0 s sym)) + nil) + +(def-syntax-test syntax.escape.whitespace.1 + (let ((names '("Tab" "Newline" "Linefeed" "Space" "Return" "Page" + "Rubout" "Backspace"))) + (loop for name in names + for c = (name-char name) + nconc + (when c + (let* ((s (concatenate 'string "\\" (string c))) + (val (read-from-string s))) + (unless (eql val (intern (string c))) + (list (list name c s val))))))) + nil) + +(def-syntax-test syntax.escape.whitespace.2 + (let ((names '("Tab" "Newline" "Linefeed" "Space" "Return" "Page"))) + (loop for name in names + for c = (name-char name) + nconc + (when c + (let* ((s (concatenate 'string "|" (string c) "|")) + (val (read-from-string s))) + (unless (eql val (intern (string c))) + (list (list name c s val))))))) + nil) + +(def-syntax-test syntax.multiple-escape.invalid.backspace + (let ((c (name-char "Backspace"))) + (or (not c) + (let ((s (concatenate 'string "|" (string c) "|"))) + (eval `(signals-error (read-from-string ',s) reader-error))))) + t) + +(def-syntax-test syntax.multiple-escape.invalid.rubout + (let ((c (name-char "Rubout"))) + (or (not c) + (let ((s (concatenate 'string "|" (string c) "|"))) + (eval `(signals-error (read-from-string ',s) reader-error))))) + t)