;;; redisplay-testsuite.el --- Test suite for redisplay.
-;; Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+;; Copyright (C) 2009-2016 Free Software Foundation, Inc.
;; Author: Chong Yidong <cyd@stupidchicken.com>
;; Keywords: internal
(propertize "XXX\n" 'face 'highlight)
"\n Test: ")
(test-insert-overlay "XXX\n" 'mouse-face 'highlight)
+ (insert "\n\n"))
+
+(defun test-redisplay-3 ()
+ (insert "Test 3: Overlay with strings and images:\n\n")
+ (let ((img-data "#define x_width 8
+#define x_height 8
+static unsigned char x_bits[] = {0xff, 0x81, 0xbd, 0xa5, 0xa5, 0xbd, 0x81, 0xff };"))
+ ;; Control
+ (insert " Expected: AB"
+ (propertize "X" 'display `(image :data ,img-data :type xbm))
+ "CD\n")
+
+ ;; Overlay with before, after, and image display string.
+ (insert " Result 1: ")
+ (let ((opoint (point)))
+ (insert "AXD\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'before-string "B")
+ (overlay-put ov 'after-string "C")
+ (overlay-put ov 'display
+ `(image :data ,img-data :type xbm))))
+
+ ;; Overlay with before and after string, and image text prop.
+ (insert " Result 2: ")
+ (let ((opoint (point)))
+ (insert "AXD\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'before-string "B")
+ (overlay-put ov 'after-string "C")
+ (put-text-property (1+ opoint) (+ 2 opoint) 'display
+ `(image :data ,img-data :type xbm))))
+
+ ;; Overlays with adjacent before and after strings, and image text
+ ;; prop.
+ (insert " Result 3: ")
+ (let ((opoint (point)))
+ (insert "AXD\n")
+ (let ((ov1 (make-overlay opoint (1+ opoint)))
+ (ov2 (make-overlay (+ 2 opoint) (+ 3 opoint))))
+ (overlay-put ov1 'after-string "B")
+ (overlay-put ov2 'before-string "C")
+ (put-text-property (1+ opoint) (+ 2 opoint) 'display
+ `(image :data ,img-data :type xbm))))
+
+ ;; Three overlays.
+ (insert " Result 4: ")
+ (let ((opoint (point)))
+ (insert "AXD\n\n")
+ (let ((ov1 (make-overlay opoint (1+ opoint)))
+ (ov2 (make-overlay (+ 2 opoint) (+ 3 opoint)))
+ (ov3 (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov1 'after-string "B")
+ (overlay-put ov2 'before-string "C")
+ (overlay-put ov3 'display `(image :data ,img-data :type xbm))))))
+
+(defun test-redisplay-4 ()
+ (insert "Test 4: Overlay strings and invisibility:\n\n")
+ ;; Before and after strings with non-nil `invisibility'.
+ (insert " Expected: ABC\n")
+ (insert " Result: ")
+ (let ((opoint (point)))
+ (insert "ABC\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'before-string
+ (propertize "XX" 'invisible
+ 'test-redisplay--simple-invis))
+ (overlay-put ov 'after-string
+ (propertize "XX" 'invisible
+ 'test-redisplay--simple-invis))))
+
+ ;; Before and after strings bogus `invisibility' property (value is
+ ;; not listed in `buffer-invisibility-spec').
+ (insert "\n Expected: ABC")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "B\n")
+ (let ((ov (make-overlay opoint (1+ opoint))))
+ (overlay-put ov 'before-string
+ (propertize "A" 'invisible 'bogus-invis-spec))
+ (overlay-put ov 'after-string
+ (propertize "C" 'invisible 'bogus-invis-spec))))
+
+ ;; Before/after string with ellipsis `invisibility' property.
+ (insert "\n Expected: ...B...")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "B\n")
+ (let ((ov (make-overlay opoint (1+ opoint))))
+ (overlay-put ov 'before-string
+ (propertize "A" 'invisible 'test-redisplay--ellipsis-invis))
+ (overlay-put ov 'after-string
+ (propertize "C" 'invisible 'test-redisplay--ellipsis-invis))))
+
+ ;; Before/after string with partial ellipsis `invisibility' property.
+ (insert "\n Expected: A...ABC...C")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "B\n")
+ (let ((ov (make-overlay opoint (1+ opoint)))
+ (a "AAA")
+ (c "CCC"))
+ (put-text-property 1 2 'invisible 'test-redisplay--ellipsis-invis a)
+ (put-text-property 1 2 'invisible 'test-redisplay--ellipsis-invis c)
+ (overlay-put ov 'before-string a)
+ (overlay-put ov 'after-string c)))
+
+ ;; Display string with `invisibility' property.
+ (insert "\n Expected: ABC")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "AYBC\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'display
+ (propertize "XX" 'invisible
+ 'test-redisplay--simple-invis))))
+ ;; Display string with bogus `invisibility' property.
+ (insert "\n Expected: ABC")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "AXC\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'display
+ (propertize "B" 'invisible 'bogus-invis-spec))))
+ ;; Display string with ellipsis `invisibility' property.
+ (insert "\n Expected: A...C")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "AXC\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint))))
+ (overlay-put ov 'display
+ (propertize "B" 'invisible
+ 'test-redisplay--ellipsis-invis))))
+ ;; Display string with partial `invisibility' property.
+ (insert "\n Expected: A...C")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "X\n")
+ (let ((ov (make-overlay opoint (1+ opoint)))
+ (str "ABC"))
+ (put-text-property 1 2 'invisible 'test-redisplay--ellipsis-invis str)
+ (overlay-put ov 'display str)))
+ ;; Overlay string over invisible text and non-default face.
+ (insert "\n Expected: ..." (propertize "ABC" 'face 'highlight) "XYZ")
+ (insert "\n Result: ")
+ (insert (propertize "foo" 'invisible 'test-redisplay--ellipsis-invis))
+ (let ((ov (make-overlay (point) (point))))
+ (overlay-put ov 'invisible t)
+ (overlay-put ov 'window (selected-window))
+ (overlay-put ov 'after-string
+ (propertize "ABC" 'face 'highlight)))
+ (insert "XYZ\n")
+ ;; Overlay strings with partial `invisibility' property and with a
+ ;; display property on the before-string.
+ (insert "\n Expected: ..."
+ (propertize "DEF" 'display '(image :type xpm :file "close.xpm"))
+ (propertize "ABC" 'face 'highlight) "XYZ")
+ (insert "\n Result: ")
+ (insert (propertize "foo" 'invisible 'test-redisplay--ellipsis-invis))
+ (let ((ov (make-overlay (point) (point))))
+ (overlay-put ov 'invisible t)
+ (overlay-put ov 'window (selected-window))
+ (overlay-put ov 'after-string
+ (propertize "ABC" 'face 'highlight))
+ (overlay-put ov 'before-string
+ (propertize "DEF"
+ 'display '(image :type xpm :file "close.xpm"))))
+ (insert "XYZ\n")
+
+ ;; Overlay string with 2 adjacent and different invisible
+ ;; properties. This caused an infloop before Emacs 25.
+ (insert "\n Expected: ABC")
+ (insert "\n Result: ")
+ (let ((opoint (point)))
+ (insert "ABC\n")
+ (let ((ov (make-overlay (1+ opoint) (+ 2 opoint)))
+ (str (concat (propertize "X"
+ 'invisible 'test-redisplay--simple-invis)
+ (propertize "Y"
+ 'invisible 'test-redisplay--simple-invis2))))
+ (overlay-put ov 'after-string str)))
+
(insert "\n"))
+
(defun test-redisplay ()
(interactive)
- (pop-to-buffer (generate-new-buffer "*Redisplay Test*"))
- (test-redisplay-1)
- (test-redisplay-2)
- (goto-char (point-min)))
+ (let ((buf (get-buffer "*Redisplay Test*")))
+ (if buf
+ (kill-buffer buf))
+ (switch-to-buffer (get-buffer-create "*Redisplay Test*"))
+ (erase-buffer)
+ (setq buffer-invisibility-spec
+ '(test-redisplay--simple-invis
+ test-redisplay--simple-invis2
+ (test-redisplay--ellipsis-invis . t)))
+ (test-redisplay-1)
+ (test-redisplay-2)
+ (test-redisplay-3)
+ (test-redisplay-4)
+ (goto-char (point-min))))
-;; arch-tag: fcee53c8-024f-403d-9154-61ae3ce0bfb8