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