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