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"))))))