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