]> code.delx.au - gnu-emacs/blob - lisp/emacs-lisp/tcover-ses.el
(normal-splash-screen, fancy-splash-screens-1): Add a reference to the Lisp
[gnu-emacs] / lisp / emacs-lisp / tcover-ses.el
1 ;;;; testcover-ses.el -- Example use of `testcover' to test "SES"
2
3 ;; Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
4
5 ;; Author: Jonathan Yavner <jyavner@engineer.com>
6 ;; Maintainer: Jonathan Yavner <jyavner@engineer.com>
7 ;; Keywords: spreadsheet lisp utility
8
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
10 ;; it under the terms of the GNU General Public License as published by
11 ;; the Free Software Foundation; either version 2, or (at your option)
12 ;; any later version.
13
14 ;; GNU Emacs is distributed in the hope that it will be useful,
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 ;; GNU General Public License for more details.
18
19 ;; You should have received a copy of the GNU General Public License
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
21 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 ;; Boston, MA 02110-1301, USA.
23
24 (require 'testcover)
25
26 (defvar ses-initial-global-parameters)
27 (defvar ses-mode-map)
28
29 ;;;Here are some macros that exercise SES. Set `pause' to t if you want the
30 ;;;macros to pause after each step.
31 (let* ((pause nil)
32 (x (if pause "\18q" ""))
33 (y "\18\ 6ses-test.ses\r\e<"))
34 ;;Fiddle with the existing spreadsheet
35 (fset 'ses-exercise-example
36 (concat "\18\ 6" data-directory "ses-example.ses\r\e<"
37 x "\1510\ e"
38 x "\v"
39 x "\1f"
40 x "\10\10\ 6pses-center\r"
41 x "\ 6p\r"
42 x "\15\10\t\t"
43 x "\r\ 2 A9 B9\r"
44 x "\15\ e\ 2\ 2\ 2"
45 x "\r\ 1\v2\r"
46 x "\ e\ e\ 6"
47 x "50\r"
48 x "\154\1f"
49 x "\ 3\e\f"
50 x "\1f"
51 x "(+ \18o\ e\ e\ 6\0\ 6\ 6"
52 x "\15-1\18o\ 3\12 \ 3\13\r\ 2"
53 x "\1f"
54 x))
55 ;;Create a new spreadsheet
56 (fset 'ses-exercise-new
57 (concat y
58 x "\ 3\10\"%.8g\"\r"
59 x "2\r"
60 x "\ f"
61 x "\10"
62 x "\152\ f"
63 x "\"Header\r"
64 x "(sqrt 1\r\ 2"
65 x "pses-center\r\ 6"
66 x "\t"
67 x "\10(+ A2 A3\r"
68 x "\ 6(* B2 A3\r"
69 x "\152\ 3\e\b"
70 x "\r\7f\7f\7fB3\r"
71 x "\18\13"
72 x))
73 ;;Basic cell display
74 (fset 'ses-exercise-display
75 (concat y "\e:(revert-buffer t t)\r"
76 x "\ 5"
77 x "\"Very long\r\ 2"
78 x "w3\r"
79 x "w3\r"
80 x "(/ 1 0\r\ 2"
81 x "234567\r\ 2"
82 x "\155w"
83 x "\t1\r\ 2"
84 x "\ 2\ 3\ 3"
85 x "\ 6234567\r\ 2"
86 x "\t\ 4\ 2"
87 x "\ 2\ 3\ 3"
88 x "345678\r\ 2"
89 x "\153w"
90 x "\0\e>"
91 x "\ 3\ 3"
92 x "\18\18"
93 x "\ 5"
94 x "\18\18\ 1"
95 x "\ 5"
96 x "\ 6\ 5"
97 x "\ 3\ 3"
98 x "1\r\ 2"
99 x "\ 3\ 3\ 6"
100 x "\ 5"
101 x "\ 2\ 2\ 2\"1234567-1234567-1234567\r\ 2"
102 x "123\r\ 2"
103 x "\152\ f"
104 x "\ e\"1234567-1234567-1234567\r\ 2"
105 x "123\r\ 2"
106 x "\ 6\ 6w8\r"
107 x "\ 2\ 2\"1234567\r"
108 x "\ e\ 2w5\r"
109 x))
110 ;;Cell formulas
111 (fset 'ses-exercise-formulas
112 (concat y "\e:(revert-buffer t t)\r"
113 x "\t\t"
114 x "\t"
115 x "(* B1 B2 D1\r\ 2"
116 x "(* B2 B3\r\ 2"
117 x "\ e(apply '+ (ses-range B1 B3)\r\ 2"
118 x "(apply 'ses+ (ses-range B1 B3)\r\ 2"
119 x "\ e(apply 'ses+ (ses-range A2 A3)\r\ 2"
120 x "\ e(mapconcat'number-to-string(ses-range B2 B4) \"-\"\r\ 2"
121 x "\ 2(apply 'concat (reverse (ses-range A3 D3))\r\ 2"
122 x "\ 2(* (+ A2 A3) (ses+ B2 B3)\r\ 2"
123 x "\ e"
124 x "\152\ f"
125 x "\155\t"
126 x "\10(apply 'ses+ (ses-range E1 E2)\r\ 2"
127 x "\10(apply 'ses+ (ses-range A5 B5)\r\ 2"
128 x "\10(apply 'ses+ (ses-range E1 F1)\r\ 2"
129 x "\10(apply 'ses+ (ses-range D1 E1)\r\ 2"
130 x "\t"
131 x "(ses-average (ses-range A2 A5)\r\ 2"
132 x "\ e(apply 'ses+ (ses-range A5 A6)\r\ 2"
133 x "\ 2\ 2\ek"
134 x "\ e\ e\v"
135 x "\10\10\10\ f"
136 x "\ e\152\ f"
137 x "\10\153\v"
138 x "\ 2\ 2\ 2\eo"
139 x "\ 6\152\eo"
140 x "\ 2\153\ek"
141 x "\ 6(ses-average (ses-range B3 E3)\r\ 2"
142 x "\ 2\ek"
143 x "\ e\1012345678\r\ 2"
144 x))
145 ;;Recalculating and reconstructing
146 (fset 'ses-exercise-recalc
147 (concat y "\e:(revert-buffer t t)\r"
148 x "\ 3\e\f"
149 x "\t\t"
150 x "\ 3\ 3"
151 x "(/ 1 0\r\ 2"
152 x "\ 3\ 3"
153 x "\n"
154 x "\ 3\ 3"
155 x "\ 3\10\"%.6g\"\r"
156 x "\ 3\e\f"
157 x "\e>\18nw\ 6\ 6\ 6"
158 x "\0\e>\exdelete-region\r"
159 x "\ 3\e\f"
160 x "\158\ e"
161 x "\0\e>\exdelete-region\r"
162 x "\ 3\e\f"
163 x "\ 3\ e"
164 x "\ e\v\ 2\ek"
165 x "\ 3\f"
166 x "\ 2\"Very long\r"
167 x "\10\ 3\14"
168 x "\ 2\r\r"
169 x "\ e\ 3\14"
170 x "\ 6\eo"
171 x "\ 6\ 3\14"
172 x "\ 2\ 2\"Very long2\r"
173 x "\ 2\eo\ 6"
174 x "\ 3\14"
175 x "\r\7f\7f\7fC3\r"
176 x "\ e\r\7f\7f\7fC2\r"
177 x "\10\0\ e\ 6\ 3\ 3"
178 x "\r\7f\7fC4\r"
179 x "\ e\ e\r\7f\7f\7fC2\r"
180 x "\ 6\0\ 2\10\10"
181 x "\ 3\ 3"
182 x "\exses-mode\r"
183 x "\e<\ f"
184 x "\152\ek"
185 x))
186 ;;Header line
187 (fset 'ses-exercise-header-row
188 (concat y "\e:(revert-buffer t t)\r"
189 x "\18<"
190 x "\18>"
191 x "\156\18<"
192 x "\18>"
193 x "\157\18<"
194 x "\18>"
195 x "\158\18<"
196 x "\152\18<"
197 x "\18>"
198 x "\ 6\153w\ 2"
199 x "\1510\18<"
200 x "\18>"
201 x "\152\v"
202 x))
203 ;;Detecting unsafe formulas and printers
204 (fset 'ses-exercise-unsafe
205 (concat y "\e:(revert-buffer t t)\r"
206 x "p(lambda (x) (delete-file x))\rn"
207 x "p(lambda (x) (delete-file \"ses-nothing\"))\ry"
208 x "\0\ 6\17\19n"
209 x "\ e(delete-file \"x\"\rn"
210 x "(delete-file \"ses-nothing\"\ry\ 2"
211 x "\0\ 6\17\19n"
212 x "(open-network-stream \"x\" nil \"localhost\" \"smtp\"\ry\ 2"
213 x "\0\ 6\17\19n"
214 x))
215 ;;Inserting and deleting rows
216 (fset 'ses-exercise-rows
217 (concat y "\e:(revert-buffer t t)\r"
218 x "\ e\ 6"
219 x "\ 3\10\"%s=\"\r"
220 x "\1520\ f"
221 x "\ep\"%s+\"\r"
222 x "\ e\ f"
223 x "123456789\r\ 2"
224 x "\0\1521\ e\ 6"
225 x "\ 3\ 3"
226 x "\e\f"
227 x "\10\10(not B25\r\ 2"
228 x "\ e\ek"
229 x "jA3\r"
230 x "\1519\v"
231 x "\10\ 6\v"
232 x "\15100\ f" ;Make this approx your CPU speed in MHz
233 x))
234 ;;Inserting and deleting columns
235 (fset 'ses-exercise-columns
236 (concat y "\e:(revert-buffer t t)\r"
237 x "\ 3\10\"%s@\"\r"
238 x "\eo"
239 x "\ f"
240 x "\eo"
241 x "\v"
242 x "\ek"
243 x "w8\r"
244 x "\ep\"%.7s*\"\r"
245 x "\eo"
246 x "\ 6"
247 x "\152\eo"
248 x "\153\ek"
249 x "\ 3\10\"%.6g\"\r"
250 x "\1526\eo"
251 x "\0\1526\t"
252 x "\1526\eo"
253 x "\ 3\e\b0\r"
254 x "\1526\t"
255 x "\15400\ 2"
256 x "\1550\ek"
257 x "\0\ e\ e\ 6\ 6\ 3\e\13D"
258 x))
259 (fset 'ses-exercise-editing
260 (concat y "\e:(revert-buffer t t)\r"
261 x "\ e\ e\ e1\r\ 2"
262 x "\ 6(\ 2'\ 6x\r\ 2"
263 x "\ 2\10\10\10\ f"
264 x "\1f"
265 x "\r\r"
266 x "w9\r"
267 x "\ e\r\ 2.5\r"
268 x "\ e\ 6\r\ 2 10\r"
269 x "w12\r"
270 x "\r\ 1'\r"
271 x "\r\ 1\ 4\r"
272 x "jA4\r"
273 x "(+ A2 100\r\ 2"
274 x "\10\103\r\ 2"
275 x "jB1\r"
276 x "(not A1\r\ 2"
277 x "\ 2\"Very long\r\ 2"
278 x "\ 3\ 3"
279 x "\eh"
280 x "\eH"
281 x "\ 3\ 3"
282 x "\e>\t"
283 x "\10\10\ 4"
284 x "\10\ 4"
285 x "\ 6\ 6\152\7f"
286 x "\10\7f"
287 x "\eo"
288 x "\eh"
289 x "\0\ f\ 6"
290 x "\"Also very long\r\ 2"
291 x "\ e\ 6\eH"
292 x "\0'\r\ 2"
293 x "'Trial\r\ 2"
294 x "\ e\ 2'qwerty\r\ 2"
295 x "\ 6(concat \18o\e<\0\ e\ e"
296 x "\15-1\18o\ 3\12\r\ 2"
297 x "(apply '+ \18o\e<\0\ e\ 6\15-1\18o\ 3\13\r\ 2"
298 x "\10\152\7f"
299 x "\15-2\7f"
300 x "\15-2\ 4"
301 x "\152\ 4"
302 x "\ 2\10\10\v"
303 x "\ e\ 6\eH"
304 x "\ 2\10\0\ f"
305 x "\"Another long one\r\ 2"
306 x "\ e\ e\ 6\eH"
307 x "\ 1\10\ 5"
308 x "\ 3\ 3\e<"
309 x "\ e\ 5"
310 x "\e>\10\ f"
311 x "\0\ 5\ 6\ 5"
312 x))
313 ;;Sorting of columns
314 (fset 'ses-exercise-sort-column
315 (concat y "\e:(revert-buffer t t)\r"
316 x "\"Very long\r"
317 x "\ 699\r"
318 x "\ 6\eo13\r"
319 x "(+ A3 B3\r"
320 x "7\r8\r(* A4 B4\r"
321 x "\0\10\10\10\ 3\e\13A\r"
322 x "\ e\0\10\10\10\ 3\e\13B\r"
323 x "\10\10\ 6\0\ e\ e\ 6\ 6\ 3\e\13C\r"
324 x "\ 6\eo\10\ f"
325 x "\ 2\0\ e\ e\ e\15\ 3\e\13C\r"
326 x))
327 ;;Simple cell printers
328 (fset 'ses-exercise-cell-printers
329 (concat y "\e:(revert-buffer t t)\r"
330 x "\ 6\"4\11\t76\r\ 2"
331 x "\"4\11\n7\r\ 2"
332 x "p\"{%S}\"\r"
333 x "p(\"[%s]\")\r"
334 x "p(\"<%s>\")\r"
335 x "\ 2\0\ 6\ 6"
336 x "p\r"
337 x "pnil\r"
338 x "pses-dashfill\r"
339 x "48\r\ 2"
340 x "\t"
341 x "\ 2\0\ 6p\r"
342 x "\ 6p\r"
343 x "pses-dashfill\r"
344 x "\ 2\0\ 6\ 6pnil\r"
345 x "5\r\ 2"
346 x "pses-center\r"
347 x "\ 3\10\"%s\"\r"
348 x "w8\r"
349 x "\ep\r"
350 x "\ep\"%.7g@\"\r"
351 x "\ 3\10\r"
352 x "\ 3\10\"%.6g#\"\r"
353 x "\ 3\10\"%.6g.\"\r"
354 x "\ 3\10\"%.6g.\"\r"
355 x "\epidentity\r"
356 x "6\r\ 2"
357 x "\ e\"UPCASE\r\ 2"
358 x "\epdowncase\r"
359 x "(* 3 4\r\ 2"
360 x "p(lambda\11 (x)\11 '(\"Hi\"))\r"
361 x "p(lambda\11 (x)\11 '(\"Bye\"))\r"
362 x))
363 ;;Spanning cell printers
364 (fset 'ses-exercise-spanning-printers
365 (concat y "\e:(revert-buffer t t)\r"
366 x "\ep\"%.6g*\"\r"
367 x "pses-dashfill-span\r"
368 x "5\r\ 2"
369 x "pses-tildefill-span\r"
370 x "\"4\r\ 2"
371 x "\ep\"$%s\"\r"
372 x "\ep(\"$%s\")\r"
373 x "8\r\ 2"
374 x "\ep(\"!%s!\")\r"
375 x "\t\"12345678\r\ 2"
376 x "pses-dashfill-span\r"
377 x "\"23456789\r\ 2"
378 x "\t"
379 x "(not t\r\ 2"
380 x "\ 2w6\r"
381 x "\"5\r\ 2"
382 x "\ e\ 6\eo"
383 x "\ek"
384 x "\ek"
385 x "\t"
386 x "\ 2\10\ 3\ 3"
387 x "\eo"
388 x "\ e\152\ek"
389 x "\ 2\ 2\ek"
390 x))
391 ;;Cut/copy/paste - within same buffer
392 (fset 'ses-exercise-paste-1buf
393 (concat y "\e:(revert-buffer t t)\r"
394 x "\ e\0\ 6\ew"
395 x "\ 3\ 3\10\ 6\19"
396 x "\ e\eo"
397 x "\"middle\r\ 2"
398 x "\0\ 6\ e\ 6"
399 x "\ew"
400 x "\10\0\ 6"
401 x "\ew"
402 x "\ 3\ 3\ 6\ e"
403 x "\19"
404 x "\152\19y"
405 x "\ 6\15\19y"
406 x "\10\10\ 6\15\19y"
407 x "\e>"
408 x "\19y"
409 x "\e>\19y"
410 x "\e<"
411 x "p\"<%s>\"\r"
412 x "\ 6pses-dashfill\r"
413 x "\ 2\0\ 6\ 6\ 6\ e\ e\ e"
414 x "\17"
415 x "\1f"
416 x "\15\19y"
417 x "\r\0\ 2\ 2\ 2\ew"
418 x "\r\ 6\19"
419 x "\153\10(+ G2 H1\r"
420 x "\0\ 2\ew"
421 x "\ 3\ 3\e>\ 2"
422 x "\19"
423 x "\ 2\158\10(ses-average (ses-range G2 H2)\r\ 2"
424 x "\0\ 6\17\ek"
425 x "\157\ e"
426 x "\19"
427 x "\10\ 2(ses-average (ses-range E7 E9)\r\ 2"
428 x "\0\ 6\17\v"
429 x "\ e\19"
430 x "\ 2\ 2\10(ses-average (ses-range E7 F7)\r\ 2"
431 x "\0\ 6\17\ek"
432 x "\ 6\19"
433 x "\ 2\ 2\10(ses-average (ses-range D6 E6)\r\ 2"
434 x "\0\ 6\17\ek"
435 x "\ 6\19"
436 x "\ 1\152\ f"
437 x "\"Line A\r\ 2"
438 x "pses-tildefill-span\r"
439 x "\ e\ 6\"Subline A(1)\r\ 2"
440 x "pses-dashfill-span\r"
441 x "\ 2\10\0\ e\ e\ e\ew\ 3\ 3"
442 x "\ 1\10\10\10\10\10\10"
443 x "\19"
444 x "\0\ e\ 6\ 6\ew\ 3\ 3"
445 x "\ 6\19"
446 x))
447 ;;Cut/copy/paste - between two buffers
448 (fset 'ses-exercise-paste-2buf
449 (concat y "\e:(revert-buffer t t)\r"
450 x "\ 6\ e\eo\"middle\r\ 2\0\ 6\ e\ 6"
451 x "\17"
452 x "\184bses-test.txt\r"
453 x " \ 1\19"
454 x "\ 5\"xxx\0\ 2\ 2\ 2\ 2"
455 x "\ew\18o"
456 x "\1f"
457 x "\19"
458 x "\18o\ 5\"\0\ 2\ 2\ 2\ 2\ 2"
459 x "\ew\18o\19"
460 x "\18o123.45\0\ 2\ 2\ 2\ 2\ 2\ 2"
461 x "\17\18o\19"
462 x "\18o1 \ 2\ 2\0\ 6\ 6\ 6\ 6\ 6\ 6\ 6"
463 x "\17\18o\19"
464 x "\e>\19y"
465 x "\ 6\18o symb\0\ 2\ 2\ 2\ 2"
466 x "\17\18o\15\19\ey\152\ey"
467 x "\18o1\t\0\ 2\ 2"
468 x "\17\18o\ 2\19"
469 x "w9\n\ep\"<%s>\"\n"
470 x "\18o\n2\t\"3\nxxx\t5\n\0\10\10"
471 x "\17\18o\19y"
472 x))
473 ;;Export text, import it back
474 (fset 'ses-exercise-import-export
475 (concat y "\e:(revert-buffer t t)\r"
476 x "\ e\ e\ 6\0\ 6xt"
477 x "\184bses-test.txt\r"
478 x "\n\19\15-1\18o"
479 x "xT\18o\19\15-1\18o"
480 x "\ 3\ 3\ 6'crunch\r\ 2"
481 x "\10\10\10pses-center-span\r"
482 x "\0\ e\ e\ e\ exT"
483 x "\18o\n\19\15-1\18o"
484 x "\0\19y"
485 x "\ 6\0\ 2\10\10xt"
486 x "\ e\ e\0\15\19y"
487 x "12345678\r\ 2"
488 x "\ 6\ 6'bunch\r"
489 x "\0\10\10xtxT"
490 x)))
491
492 (defun ses-exercise-macros ()
493 "Executes all SES coverage-test macros."
494 (dolist (x '(ses-exercise-example
495 ses-exercise-new
496 ses-exercise-display
497 ses-exercise-formulas
498 ses-exercise-recalc
499 ses-exercise-header-row
500 ses-exercise-unsafe
501 ses-exercise-rows
502 ses-exercise-columns
503 ses-exercise-editing
504 ses-exercise-sort-column
505 ses-exercise-cell-printers
506 ses-exercise-spanning-printers
507 ses-exercise-paste-1buf
508 ses-exercise-paste-2buf
509 ses-exercise-import-export))
510 (message "<Testing %s>" x)
511 (execute-kbd-macro x)))
512
513 (defun ses-exercise-signals ()
514 "Exercise code paths that lead to error signals, other than those for
515 spreadsheet files with invalid formatting."
516 (message "<Checking for expected errors>")
517 (switch-to-buffer "ses-test.ses")
518 (deactivate-mark)
519 (ses-jump 'A1)
520 (ses-set-curcell)
521 (dolist (x '((ses-column-widths 14)
522 (ses-column-printers "%s")
523 (ses-column-printers ["%s" "%s" "%s"]) ;Should be two
524 (ses-column-widths [14])
525 (ses-delete-column -99)
526 (ses-delete-column 2)
527 (ses-delete-row -1)
528 (ses-goto-data 'hogwash)
529 (ses-header-row -56)
530 (ses-header-row 99)
531 (ses-insert-column -14)
532 (ses-insert-row 0)
533 (ses-jump 'B8) ;Covered by preceding cell
534 (ses-printer-validate '("%s" t))
535 (ses-printer-validate '([47]))
536 (ses-read-header-row -1)
537 (ses-read-header-row 32767)
538 (ses-relocate-all 0 0 -1 1)
539 (ses-relocate-all 0 0 1 -1)
540 (ses-select (ses-range A1 A2) 'x (ses-range B1 B1))
541 (ses-set-cell 0 0 'hogwash nil)
542 (ses-set-column-width 0 0)
543 (ses-yank-cells #("a\nb"
544 0 1 (ses (A1 nil nil))
545 2 3 (ses (A3 nil nil)))
546 nil)
547 (ses-yank-cells #("ab"
548 0 1 (ses (A1 nil nil))
549 1 2 (ses (A2 nil nil)))
550 nil)
551 (ses-yank-pop nil)
552 (ses-yank-tsf "1\t2\n3" nil)
553 (let ((curcell nil)) (ses-check-curcell))
554 (let ((curcell 'A1)) (ses-check-curcell 'needrange))
555 (let ((curcell '(A1 . A2))) (ses-check-curcell 'end))
556 (let ((curcell '(A1 . A2))) (ses-sort-column "B"))
557 (let ((curcell '(C1 . D2))) (ses-sort-column "B"))
558 (execute-kbd-macro "jB10\n\152\ 4")
559 (execute-kbd-macro [?j ?B ?9 ?\n ?\C-@ ?\C-f ?\C-f cut])
560 (progn (kill-new "x") (execute-kbd-macro "\e>\19n"))
561 (execute-kbd-macro "\ 2\0\ew")))
562 (condition-case nil
563 (progn
564 (eval x)
565 (signal 'singularity-error nil)) ;Shouldn't get here
566 (singularity-error (error "No error from %s?" x))
567 (error nil)))
568 ;;Test quit-handling in ses-update-cells. Cant' use `eval' here.
569 (let ((inhibit-quit t))
570 (setq quit-flag t)
571 (condition-case nil
572 (progn
573 (ses-update-cells '(A1))
574 (signal 'singularity-error nil))
575 (singularity-error (error "Quit failure in ses-update-cells"))
576 (error nil))
577 (setq quit-flag nil)))
578
579 (defun ses-exercise-invalid-spreadsheets ()
580 "Execute code paths that detect invalid spreadsheet files."
581 ;;Detect invalid spreadsheets
582 (let ((p&d "\n\n\f\n(ses-cell A1 nil nil nil nil)\n\n")
583 (cw "(ses-column-widths [7])\n")
584 (cp "(ses-column-printers [ses-center])\n")
585 (dp "(ses-default-printer \"%.7g\")\n")
586 (hr "(ses-header-row 0)\n")
587 (p11 "(2 1 1)")
588 (igp ses-initial-global-parameters))
589 (dolist (x (list "(1)"
590 "(x 2 3)"
591 "(1 x 3)"
592 "(1 -1 0)"
593 "(1 2 x)"
594 "(1 2 -1)"
595 "(3 1 1)"
596 "\n\n\f(2 1 1)"
597 "\n\n\f\n(ses-cell)(2 1 1)"
598 "\n\n\f\n(x)\n(2 1 1)"
599 "\n\n\n\f\n(ses-cell A2)\n(2 2 2)"
600 "\n\n\n\f\n(ses-cell B1)\n(2 2 2)"
601 "\n\n\f\n(ses-cell A1 nil nil nil nil)\n(2 1 1)"
602 (concat p&d "(x)\n(x)\n(x)\n(x)\n" p11)
603 (concat p&d "(ses-column-widths)(x)\n(x)\n(x)\n" p11)
604 (concat p&d cw "(x)\n(x)\n(x)\n(2 1 1)")
605 (concat p&d cw "(ses-column-printers)(x)\n(x)\n" p11)
606 (concat p&d cw cp "(x)\n(x)\n" p11)
607 (concat p&d cw cp "(ses-default-printer)(x)\n" p11)
608 (concat p&d cw cp dp "(x)\n" p11)
609 (concat p&d cw cp dp "(ses-header-row)" p11)
610 (concat p&d cw cp dp hr p11)
611 (concat p&d cw cp dp "\n" hr igp)))
612 (condition-case nil
613 (with-temp-buffer
614 (insert x)
615 (ses-load)
616 (signal 'singularity-error nil)) ;Shouldn't get here
617 (singularity-error (error "%S is an invalid spreadsheet!" x))
618 (error nil)))))
619
620 (defun ses-exercise-startup ()
621 "Prepare for coverage tests"
622 ;;Clean up from any previous runs
623 (condition-case nil (kill-buffer "ses-example.ses") (error nil))
624 (condition-case nil (kill-buffer "ses-test.ses") (error nil))
625 (condition-case nil (delete-file "ses-test.ses") (file-error nil))
626 (delete-other-windows) ;Needed for "\C-xo" in ses-exercise-editing
627 (setq ses-mode-map nil) ;Force rebuild
628 (testcover-unmark-all "ses.el")
629 ;;Enable
630 (let ((testcover-1value-functions
631 ;;forward-line always returns 0, for us.
632 ;;remove-text-properties always returns t for us.
633 ;;ses-recalculate-cell returns the same " " any time curcell is a cons
634 ;;Macros ses-dorange and ses-dotimes-msg generate code that always
635 ;; returns nil
636 (append '(forward-line remove-text-properties ses-recalculate-cell
637 ses-dorange ses-dotimes-msg)
638 testcover-1value-functions))
639 (testcover-constants
640 ;;These maps get initialized, then never changed again
641 (append '(ses-mode-map ses-mode-print-map ses-mode-edit-map)
642 testcover-constants)))
643 (testcover-start "ses.el" t))
644 (require 'unsafep)) ;In case user has safe-functions = t!
645
646
647 ;;;#########################################################################
648 (defun ses-exercise ()
649 "Executes all SES coverage tests and displays the results."
650 (interactive)
651 (ses-exercise-startup)
652 ;;Run the keyboard-macro tests
653 (let ((safe-functions nil)
654 (ses-initial-size '(1 . 1))
655 (ses-initial-column-width 7)
656 (ses-initial-default-printer "%.7g")
657 (ses-after-entry-functions '(forward-char))
658 (ses-mode-hook nil))
659 (ses-exercise-macros)
660 (ses-exercise-signals)
661 (ses-exercise-invalid-spreadsheets)
662 ;;Upgrade of old-style spreadsheet
663 (with-temp-buffer
664 (insert " \n\n\f\n(ses-cell A1 nil nil nil nil)\n\n(ses-column-widths [7])\n(ses-column-printers [nil])\n(ses-default-printer \"%.7g\")\n\n( ;Global parameters (these are read first)\n 1 ;SES file-format\n 1 ;numrows\n 1 ;numcols\n)\n\n")
665 (ses-load))
666 ;;ses-vector-delete is always called from buffer-undo-list with the same
667 ;;symbol as argument. We'll give it a different one here.
668 (let ((x [1 2 3]))
669 (ses-vector-delete 'x 0 0))
670 ;;ses-create-header-string behaves differently in a non-window environment
671 ;;but we always test under windows.
672 (let ((window-system (not window-system)))
673 (scroll-left 7)
674 (ses-create-header-string))
675 ;;Test for nonstandard after-entry functions
676 (let ((ses-after-entry-functions '(forward-line))
677 ses-mode-hook)
678 (ses-read-cell 0 0 1)
679 (ses-read-symbol 0 0 t)))
680 ;;Tests with unsafep disabled
681 (let ((safe-functions t)
682 ses-mode-hook)
683 (message "<Checking safe-functions = t>")
684 (kill-buffer "ses-example.ses")
685 (find-file "ses-example.ses"))
686 ;;Checks for nonstandard default values for new spreadsheets
687 (let (ses-mode-hook)
688 (dolist (x '(("%.6g" 8 (2 . 2))
689 ("%.8g" 6 (3 . 3))))
690 (let ((ses-initial-size (nth 2 x))
691 (ses-initial-column-width (nth 1 x))
692 (ses-initial-default-printer (nth 0 x)))
693 (with-temp-buffer
694 (set-buffer-modified-p t)
695 (ses-mode)))))
696 ;;Test error-handling in command hook, outside a macro.
697 ;;This will ring the bell.
698 (let (curcell-overlay)
699 (ses-command-hook))
700 ;;Due to use of run-with-timer, ses-command-hook sometimes gets called
701 ;;after we switch to another buffer.
702 (switch-to-buffer "*scratch*")
703 (ses-command-hook)
704 ;;Print results
705 (message "<Marking source code>")
706 (testcover-mark-all "ses.el")
707 (testcover-next-mark)
708 ;;Cleanup
709 (delete-other-windows)
710 (kill-buffer "ses-test.txt")
711 ;;Could do this here: (testcover-end "ses.el")
712 (message "Done"))
713
714 ;;; arch-tag: 87052ba4-5cf8-46cf-9375-fe245f3360b8
715 ;; testcover-ses.el ends here.