aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorPo Lu2022-06-08 20:33:42 +0800
committerPo Lu2022-06-08 20:34:13 +0800
commit0fd60451bc098b57bdcbddfa98cfa210a6b0ab78 (patch)
tree87391cefa7f0bc64460c72a66be10b7e1c0fa24e /test
parentefe9940567da259d871432cfda4cdf94542ac98e (diff)
downloademacs-0fd60451bc098b57bdcbddfa98cfa210a6b0ab78.tar.gz
emacs-0fd60451bc098b57bdcbddfa98cfa210a6b0ab78.zip
Allow running some DND tests interactively
* src/xselect.c (x_get_local_selection): Respect new variable. (syms_of_xselect): New variable `x-treat-local-requests-remotely'. * test/lisp/dnd-tests.el (x-begin-drag, gui-set-selection): Don't redefine these functions under X. (dnd-tests-verify-selection-data): Use `x-get-selection-internal' under X. (dnd-tests-extract-selection-data): New function. (dnd-tests-begin-text-drag): Update accordingly. (dnd-tests-begin-file-drag, dnd-tests-begin-drag-files): Temporarily skip these tests under X.
Diffstat (limited to 'test')
-rw-r--r--test/lisp/dnd-tests.el140
1 files changed, 87 insertions, 53 deletions
diff --git a/test/lisp/dnd-tests.el b/test/lisp/dnd-tests.el
index 1e5b1f823fb..c7e537e53f9 100644
--- a/test/lisp/dnd-tests.el
+++ b/test/lisp/dnd-tests.el
@@ -22,7 +22,9 @@
22;; Tests for stuff in dnd.el that doesn't require a window system. 22;; Tests for stuff in dnd.el that doesn't require a window system.
23 23
24;; The drag API tests only check the behavior of the simplified drag 24;; The drag API tests only check the behavior of the simplified drag
25;; APIs in dnd.el. Actual drags are not performed. 25;; APIs in dnd.el. Actual drags are not performed during the
26;; automated testing process (make check), but some of the tests can
27;; also be run under X.
26 28
27;;; Code: 29;;; Code:
28 30
@@ -35,51 +37,59 @@
35(defvar dnd-tests-selection-table nil 37(defvar dnd-tests-selection-table nil
36 "Alist of selection names to their values.") 38 "Alist of selection names to their values.")
37 39
38;; Substitute for x-begin-drag, which isn't present on all systems. 40(defvar x-treat-local-requests-remotely)
39(defalias 'x-begin-drag
40 (lambda (_targets &optional action frame &rest _)
41 ;; Verify that frame is either nil or a valid frame.
42 (when (and frame (not (frame-live-p frame)))
43 (signal 'wrong-type-argument frame))
44 ;; Verify that the action is valid and pretend the drag succeeded
45 ;; (by returning the action).
46 (cl-ecase action
47 ('XdndActionCopy action)
48 ('XdndActionMove action)
49 ('XdndActionLink action)
50 ;; These two are not technically valid, but x-begin-drag accepts
51 ;; them anyway.
52 ('XdndActionPrivate action)
53 ('XdndActionAsk 'XdndActionPrivate))))
54 41
55;; This doesn't work during tests. 42;; Define some replacements for functions used by the drag-and-drop
56(defalias 'gui-set-selection 43;; code on X when running under something else.
57 (lambda (type data) 44(unless (eq window-system 'x)
58 (or (gui--valid-simple-selection-p data) 45 ;; Substitute for x-begin-drag, which isn't present on all systems.
59 (and (vectorp data) 46 (defalias 'x-begin-drag
60 (let ((valid t)) 47 (lambda (_targets &optional action frame &rest _)
61 (dotimes (i (length data)) 48 ;; Verify that frame is either nil or a valid frame.
62 (or (gui--valid-simple-selection-p (aref data i)) 49 (when (and frame (not (frame-live-p frame)))
63 (setq valid nil))) 50 (signal 'wrong-type-argument frame))
64 valid)) 51 ;; Verify that the action is valid and pretend the drag succeeded
65 (signal 'error (list "invalid selection" data))) 52 ;; (by returning the action).
66 (setf (alist-get type dnd-tests-selection-table) data))) 53 (cl-ecase action
54 ('XdndActionCopy action)
55 ('XdndActionMove action)
56 ('XdndActionLink action)
57 ;; These two are not technically valid, but x-begin-drag accepts
58 ;; them anyway.
59 ('XdndActionPrivate action)
60 ('XdndActionAsk 'XdndActionPrivate))))
61
62 ;; This doesn't work during tests.
63 (defalias 'gui-set-selection
64 (lambda (type data)
65 (or (gui--valid-simple-selection-p data)
66 (and (vectorp data)
67 (let ((valid t))
68 (dotimes (i (length data))
69 (or (gui--valid-simple-selection-p (aref data i))
70 (setq valid nil)))
71 valid))
72 (signal 'error (list "invalid selection" data)))
73 (setf (alist-get type dnd-tests-selection-table) data))))
67 74
68(defun dnd-tests-verify-selection-data (type) 75(defun dnd-tests-verify-selection-data (type)
69 "Return the data of the drag-and-drop selection converted to TYPE." 76 "Return the data of the drag-and-drop selection converted to TYPE."
70 (let* ((basic-value (cdr (assq 'XdndSelection 77 (if (eq window-system 'x)
71 dnd-tests-selection-table))) 78 (let ((x-treat-local-requests-remotely t))
72 (local-value (if (stringp basic-value) 79 (x-get-selection-internal 'XdndSelection type))
73 (or (get-text-property 0 type basic-value) 80 (let* ((basic-value (cdr (assq 'XdndSelection
74 basic-value) 81 dnd-tests-selection-table)))
75 basic-value)) 82 (local-value (if (stringp basic-value)
76 (converter-list (cdr (assq type selection-converter-alist))) 83 (or (get-text-property 0 type basic-value)
77 (converter (if (consp converter-list) 84 basic-value)
78 (cdr converter-list) 85 basic-value))
79 converter-list))) 86 (converter-list (cdr (assq type selection-converter-alist)))
80 (if (and local-value converter) 87 (converter (if (consp converter-list)
81 (funcall converter 'XdndSelection type local-value) 88 (cdr converter-list)
82 (error "No selection converter or local value: %s" type)))) 89 converter-list)))
90 (if (and local-value converter)
91 (funcall converter 'XdndSelection type local-value)
92 (error "No selection converter or local value: %s" type)))))
83 93
84(defun dnd-tests-remote-accessible-p () 94(defun dnd-tests-remote-accessible-p ()
85 "Return if a test involving remote files can proceed." 95 "Return if a test involving remote files can proceed."
@@ -119,7 +129,26 @@ Return a list of its hostname, real path, and local path."
119 (+ beg 1 129 (+ beg 1
120 (string-to-number (match-string 5 netfile))))))))) 130 (string-to-number (match-string 5 netfile)))))))))
121 131
132(defun dnd-tests-extract-selection-data (selection expect-cons)
133 "Return the selection data in SELECTION.
134SELECTION can either be the value of `gui-get-selection', or the
135return value of a selection converter.
136
137If EXPECT-CONS, then expect SELECTION to be a cons (when not
138running under X).
139
140This function only tries to handle strings."
141 (when (and expect-cons (not (eq window-system 'x)))
142 (should (and (consp selection)
143 (stringp (cdr selection)))))
144 (if (stringp selection)
145 selection
146 (cdr selection)))
147
122(ert-deftest dnd-tests-begin-text-drag () 148(ert-deftest dnd-tests-begin-text-drag ()
149 ;; When running this test under X, please make sure to drop onto a
150 ;; program with reasonably correct behavior, such as dtpad, gedit,
151 ;; or Mozilla.
123 ;; ASCII Latin-1 UTF-8 152 ;; ASCII Latin-1 UTF-8
124 (let ((test-text "hello, everyone! sæl öllsömul! всем привет")) 153 (let ((test-text "hello, everyone! sæl öllsömul! всем привет"))
125 ;; Verify that dragging works. 154 ;; Verify that dragging works.
@@ -128,26 +157,29 @@ Return a list of its hostname, real path, and local path."
128 ;; Verify that the important data types are converted correctly. 157 ;; Verify that the important data types are converted correctly.
129 (let ((string-data (dnd-tests-verify-selection-data 'STRING))) 158 (let ((string-data (dnd-tests-verify-selection-data 'STRING)))
130 ;; Check that the Latin-1 target is converted correctly. 159 ;; Check that the Latin-1 target is converted correctly.
131 (should (equal (cdr string-data) 160 (should (equal (dnd-tests-extract-selection-data string-data t)
132 (encode-coding-string test-text 161 (encode-coding-string test-text
133 'iso-8859-1)))) 162 'iso-8859-1))))
134 ;; And that UTF8_STRING and the Xdnd UTF8 string are as well. 163 ;; And that UTF8_STRING and the Xdnd UTF8 string are as well.
135 (let ((string-data (dnd-tests-verify-selection-data 164 (let* ((string-data (dnd-tests-verify-selection-data
136 'UTF8_STRING)) 165 'UTF8_STRING))
137 (string-data-1 (cdr (dnd-tests-verify-selection-data 166 (string-data-1 (dnd-tests-verify-selection-data
138 'text/plain\;charset=utf-8)))) 167 'text/plain\;charset=utf-8))
139 (should (and (stringp (cdr string-data)) 168 (extracted-1 (dnd-tests-extract-selection-data string-data-1 t))
140 (stringp string-data-1))) 169 (extracted (dnd-tests-extract-selection-data string-data t)))
141 (should (equal (cdr string-data) string-data-1))) 170 (should (and (stringp extracted) (stringp extracted-1)))
171 (should (equal extracted extracted)))
142 ;; Now check text/plain. 172 ;; Now check text/plain.
143 (let ((string-data (dnd-tests-verify-selection-data 173 (let ((string-data (dnd-tests-verify-selection-data
144 'text/plain))) 174 'text/plain)))
145 (should (equal (cdr string-data) 175 (should (equal (dnd-tests-extract-selection-data string-data t)
146 (encode-coding-string test-text 'ascii)))))) 176 (encode-coding-string test-text 'ascii))))))
147 177
148(ert-deftest dnd-tests-begin-file-drag () 178(ert-deftest dnd-tests-begin-file-drag ()
149 ;; These tests also involve handling remote file names. 179 ;; These tests also involve handling remote file names.
150 (skip-unless (dnd-tests-remote-accessible-p)) 180 (skip-unless (and (dnd-tests-remote-accessible-p)
181 ;; TODO: make these tests work under X.
182 (not (eq window-system 'x))))
151 (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test") 183 (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test")
152 temporary-file-directory)) 184 temporary-file-directory))
153 (remote-temp-file (dnd-tests-make-temp-name))) 185 (remote-temp-file (dnd-tests-make-temp-name)))
@@ -210,7 +242,9 @@ Return a list of its hostname, real path, and local path."
210 (delete-file remote-temp-file)))) 242 (delete-file remote-temp-file))))
211 243
212(ert-deftest dnd-tests-begin-drag-files () 244(ert-deftest dnd-tests-begin-drag-files ()
213 (skip-unless (dnd-tests-remote-accessible-p)) 245 (skip-unless (and (dnd-tests-remote-accessible-p)
246 ;; TODO: make these tests work under X.
247 (not (eq window-system 'x))))
214 (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test") 248 (let ((normal-temp-file (expand-file-name (make-temp-name "dnd-test")
215 temporary-file-directory)) 249 temporary-file-directory))
216 (normal-temp-file-1 (expand-file-name (make-temp-name "dnd-test") 250 (normal-temp-file-1 (expand-file-name (make-temp-name "dnd-test")