diff tests/mule-tests.el @ 361:7347b34c275b r21-1-10

Import from CVS: tag r21-1-10
author cvs
date Mon, 13 Aug 2007 10:58:40 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/mule-tests.el	Mon Aug 13 10:58:40 2007 +0200
@@ -0,0 +1,198 @@
+;; Copyright (C) 1999 Free Software Foundation, Inc.
+
+;; Author: Hrvoje Niksic <hniksic@xemacs.org>
+;; Maintainers: Hrvoje Niksic <hniksic@xemacs.org>,
+;;              Martin Buchholz <martin@xemacs.org>
+;; Created: 1999
+;; Keywords: tests
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Synched up with: Not in FSF.
+
+;;; Commentary:
+
+;; Test some Mule functionality (most of these remain to be written) .
+;; See test-harness.el for instructions on how to run these tests.
+
+;; This file will be (read)ed by a non-mule XEmacs, so don't use
+;; literal non-Latin1 characters.  Use (make-char) instead.
+
+;;-----------------------------------------------------------------
+;; Test whether all legal chars may be safely inserted to a buffer.
+;;-----------------------------------------------------------------
+
+(defun test-chars (&optional for-test-harness)
+  "Insert all characters in a buffer, to see if XEmacs will crash.
+This is done by creating a string with all the legal characters
+in [0, 2^19) range, inserting it into the buffer, and checking
+that the buffer's contents are equivalent to the string.
+
+If FOR-TEST-HARNESS is specified, a temporary buffer is used, and
+the Assert macro checks for correctness."
+  (let ((max (expt 2 (if (featurep 'mule) 19 8)))
+	(list nil)
+	(i 0))
+    (while (< i max)
+      (and (not for-test-harness)
+	   (zerop (% i 1000))
+	   (message "%d" i))
+      (and (int-char i)
+	   ;; Don't aset to a string directly because random string
+	   ;; access is O(n) under Mule.
+	   (setq list (cons (int-char i) list)))
+      (setq i (1+ i)))
+    (let ((string (apply #'string (nreverse list))))
+      (if for-test-harness
+	  ;; For use with test-harness, use Assert and a temporary
+	  ;; buffer.
+	  (with-temp-buffer
+	    (insert string)
+	    (Assert (equal (buffer-string) string)))
+	;; For use without test harness: use a normal buffer, so that
+	;; you can also test whether redisplay works.
+	(switch-to-buffer (get-buffer-create "test"))
+	(erase-buffer)
+	(buffer-disable-undo)
+	(insert string)
+	(assert (equal (buffer-string) string))))))
+
+;; It would be really *really* nice if test-harness allowed a way to
+;; run a test in byte-compiled mode only.  It's tedious to have
+;; time-consuming tests like this one run twice, once interpreted and
+;; once compiled, for no good reason.
+(test-chars t)
+
+(when (not (featurep 'mule))
+  ;; prevent non-mule errors and warnings - Ugh!
+  (defun make-char (&rest args) nil)
+  (defvar  file-name-coding-system)
+  )
+(when (featurep 'mule)
+  ;;---------------------------------------------------------------
+  ;; Test fillarray
+  ;;---------------------------------------------------------------
+  (macrolet
+      ((fillarray-test
+	(charset1 charset2)
+	(let ((char1 (make-char charset1 69))
+	      (char2 (make-char charset2 69)))
+	  `(let ((string (make-string 1000 ,char1)))
+	     (fillarray string ,char2)
+	     (Assert (eq (aref string 0) ,char2))
+	     (Assert (eq (aref string (1- (length string))) ,char2))
+	     (Assert (eq (length string) 1000))))))
+    (fillarray-test ascii latin-iso8859-1)
+    (fillarray-test ascii latin-iso8859-2)
+    (fillarray-test latin-iso8859-1 ascii)
+    (fillarray-test latin-iso8859-2 ascii))
+
+  ;; Test aset
+  (let ((string (string (make-char 'ascii 69) (make-char 'latin-iso8859-2 69))))
+    (aset string 0 (make-char 'latin-iso8859-2 42))
+    (Assert (eq (aref string 1) (make-char 'latin-iso8859-2 69))))
+
+  ;;---------------------------------------------------------------
+  ;; Test strings waxing and waning across the 8k BIG_STRING limit (see alloc.c)
+  ;;---------------------------------------------------------------
+  (defun charset-char-string (charset)
+    (let (lo hi string n)
+      (if (= (charset-chars charset) 94)
+	  (setq lo 33 hi 126)
+	(setq lo 32 hi 127))
+      (if (= (charset-dimension charset) 1)
+	  (progn
+	    (setq string (make-string (1+ (- hi lo)) ??))
+	    (setq n 0)
+	    (loop for j from lo to hi do
+	      (progn
+		(aset string n (make-char charset j))
+		(incf n)))
+	    string)
+	(progn
+	  (setq string (make-string (* (1+ (- hi lo)) (1+ (- hi lo))) ??))
+	  (setq n 0)
+	  (loop for j from lo to hi do
+	    (loop for k from lo to hi do
+	      (progn
+		(aset string n (make-char charset j k))
+		(incf n))))
+	  string))))
+
+  ;; The following two used to crash xemacs!
+  (Assert (charset-char-string 'japanese-jisx0208))
+  (aset (make-string 9003 ??) 1 (make-char 'latin-iso8859-1 77))
+
+  (let ((greek-string (charset-char-string 'greek-iso8859-7))
+	(string (make-string (* 96 60) ??)))
+    (loop for j from 0 below (length string) do
+      (aset string j (aref greek-string (mod j 96))))
+    (loop for k in '(0 1 58 59) do
+      (Assert (equal (substring string (* 96 k) (* 96 (1+ k))) greek-string))))
+
+  (let ((greek-string (charset-char-string 'greek-iso8859-7))
+	(string (make-string (* 96 60) ??)))
+   (loop for j from (1- (length string)) downto 0 do
+     (aset string j (aref greek-string (mod j 96))))
+   (loop for k in '(0 1 58 59) do
+     (Assert (equal (substring string (* 96 k) (* 96 (1+ k))) greek-string))))
+
+  (let ((ascii-string (charset-char-string 'ascii))
+	(string (make-string (* 94 60) (make-char 'greek-iso8859-7 57))))
+   (loop for j from 0 below (length string) do
+      (aset string j (aref ascii-string (mod j 94))))
+    (loop for k in '(0 1 58 59) do
+      (Assert (equal (substring string (* 94 k) (+ 94 (* 94 k))) ascii-string))))
+
+  (let ((ascii-string (charset-char-string 'ascii))
+	(string (make-string (* 94 60) (make-char 'greek-iso8859-7 57))))
+    (loop for j from (1- (length string)) downto 0 do
+      (aset string j (aref ascii-string (mod j 94))))
+    (loop for k in '(0 1 58 59) do
+      (Assert (equal (substring string (* 94 k) (* 94 (1+ k))) ascii-string))))
+
+  ;;---------------------------------------------------------------
+  ;; Test file-system character conversion (and, en passant, file ops)
+  ;;---------------------------------------------------------------
+  (let* ((scaron (make-char 'latin-iso8859-2 57))
+	 (latin2-string (make-string 4 scaron))
+	 (prefix (concat (file-name-as-directory (temp-directory)) latin2-string))
+	 (name1 (make-temp-name prefix))
+	 (name2 (make-temp-name prefix))
+	 (file-name-coding-system 'iso-8859-2))
+    ;; This is how you suppress output from `message', called by `write-region'
+    (flet ((append-message (&rest args) ()))
+      (Assert (not (equal name1 name2)))
+      (Assert (not (file-exists-p name1)))
+      (write-region (point-min) (point-max) name1)
+      (Assert (file-exists-p name1))
+      (when (fboundp 'make-symbolic-link)
+	(make-symbolic-link name1 name2)
+	(Assert (file-exists-p name2))
+	(Assert (equal (file-truename name2) name1))
+	(Assert (equal (file-truename name1) name1)))
+
+      (condition-case nil
+	  (progn
+	    (delete-file name1)
+	    (delete-file name2))
+	(file-error nil))))
+
+  ;; Add many more file operation tests here...
+
+  )