test-encodings.script 4.44 KB
Newer Older
1
;;; -*- Lisp -*-
2

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
(defparameter *lambda-string* nil)

(defun string-char-codes (s)
  (loop :for c :across s :collect (char-code c)))

(defun expected-char-codes (x)
  #-asdf-unicode '(#xCE #xBB)
  #+asdf-unicode
  (ecase x
    (:utf-8 '(955))
    ((:latin1 :latin-1) '(206 187))
    ((:latin2 :latin-2) '(206 357))
    ((:latin3 :latin-3) '(206 287))
    (:koi8-r '(1085 9577))
    (:default (expected-char-codes
               #+clozure ccl:*default-external-format*
               #+sbcl sb-impl::*default-external-format*
               #-(or clozure sbcl) (error "can't determine default external-format")))))

22 23
(defmacro with-encoding-test ((encoding &key (op 'asdf:load-source-op) (path "lambda")) def-test-system &body body)
  (let ((sys (second def-test-system)))
24 25
    `(progn
       (format t "~&Test ~A: should be ~A~%" ',sys ',encoding)
26
       (setf *lambda-string* nil)
27
       ,def-test-system
28
       (let ((c (asdf:find-component ',sys ',path)))
29 30
         ;; mlisp has an issue of :LATIN-2 vs :latin-2. Smooth things with string-equal.
         (assert-compare (string-equal (asdf:component-encoding c) ',encoding))
31 32 33
         (loop :for o :in (asdf:output-files (asdf::make-operation 'asdf:compile-op) c)
               :do (asdf::delete-file-if-exists o)))
       ,@(when op
34
           `((asdf:operate ',op ',(second def-test-system))))
35
       ,@body
36 37
       (eval `(assert-equal (string-char-codes ,*lambda-string*)
                            (expected-char-codes ',',encoding))))))
38

39 40 41
(with-encoding-test (:utf-8)
  (def-test-system :test-encoding-explicit-u8
    :components ((:file "lambda" :encoding :utf-8))))
42

43 44
#-asdf-unicode
(leave-test "No Unicode support to test on this lisp implementation" 0)
45

46 47
#+abcl
(leave-test "abcl is known to fail these tests. Go update asdf-encodings" 0)
48

49
;; NB: recent clozure can autodetect without asdf-encodings with :default (!)
50

51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
#+sbcl
(progn
  #+sbcl (setf sb-impl::*default-external-format* :latin-3)
  (with-encoding-test (:default)
    (def-test-system :test-encoding-explicit-default
      :components ((:file "lambda" :encoding :default))))
  (with-encoding-test (:default)
    (def-test-system :test-encoding-implicit-default
      :components ((:file "lambda")))))

;; Try to load asdf-encodings
(setf *central-registry*
      (list *asdf-directory* ;; be sure that *OUR* asdf is first of any possible ASDF
            ;; try finding asdf-encodings it right next to asdf.
            (subpathname *asdf-directory* "../asdf-encodings/")))
(unless (find-system :asdf-encodings nil)
  ;; try harder by enabling the user's source-registry
  (initialize-source-registry ""))
(unless (find-system :asdf-encodings nil)
  (leave-test "Couldn't find ASDF-ENCODINGS. Skipping the rest the test." 0))
;; Disable any user source registry.
(initialize-source-registry `(:source-registry :ignore-inherited-configuration))


(asdf:load-system :asdf-encodings)
#-lispworks
(with-encoding-test (:latin-2)
  (def-test-system :test-encoding-implicit-autodetect
    :components ((:file "lambda"))))
#+sbcl
(with-encoding-test (:koi8-r)
  (def-test-system :test-encoding-explicit-koi8-r
    :components ((:file "lambda" :encoding :koi8-r))))

(with-encoding-test (:utf-8)
  (def-test-system :test-file-encoding-u8
    :encoding :latin-1
    :components ((:file "lambda" :encoding :utf-8))))
(with-encoding-test (:latin-1)
  (def-test-system :test-file-encoding-l1
    :encoding :utf-8
    :components ((:file "lambda" :encoding :latin-1))))
(with-encoding-test (:utf-8 :op asdf:load-source-op)
  (def-test-system :test-system-encoding-u8
    :encoding :utf-8
    :components ((:file "lambda"))))
(with-encoding-test (:utf-8 :op asdf:load-op)
  (def-test-system :test-system-encoding-u8-load-op
    :encoding :utf-8
    :components ((:file "lambda"))))
(with-encoding-test (:latin-1)
  (def-test-system :test-system-encoding-l1
    :encoding :latin-1
    :components ((:file "lambda"))))
#-ecl-bytecmp
(with-encoding-test (:latin-1 :op asdf:load-op)
  (def-test-system :test-system-encoding-l1-load-op
    :encoding :latin-1
    :components ((:file "lambda"))))
(with-encoding-test (:utf-8 :path ("foo" "lambda"))
  (def-test-system :test-module-encoding-u8
    :encoding :latin-1
    :components
    ((:module "foo" :pathname "" :encoding :utf-8
      :components ((:file "lambda"))))))
(with-encoding-test (:latin-1 :path ("foo" "lambda"))
  (def-test-system :test-module-encoding-l1
    :encoding :utf-8
    :components
    ((:module "foo" :pathname "" :encoding :latin-1
      :components ((:file "lambda"))))))