Mercurial > emacs
comparison lisp/emacs-lisp/testcover-ses.el @ 47667:96b260e0ff3d
New major mode "SES" for spreadsheets.
New function (unsafep X) determines whether X is a safe Lisp form.
New support module testcover.el for coverage testing.
author | Jonathan Yavner <jyavner@member.fsf.org> |
---|---|
date | Sat, 28 Sep 2002 18:45:56 +0000 |
parents | |
children | 8bd940e52b6e |
comparison
equal
deleted
inserted
replaced
47666:537f1778caaf | 47667:96b260e0ff3d |
---|---|
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 "q" "")) | |
30 (y "ses-test.ses\r<")) | |
31 ;;Fiddle with the existing spreadsheet | |
32 (fset 'ses-exercise-example | |
33 (concat "" data-directory "ses-example.ses\r<" | |
34 x "10" | |
35 x "" | |
36 x "" | |
37 x "pses-center\r" | |
38 x "p\r" | |
39 x "\t\t" | |
40 x "\r A9 B9\r" | |
41 x "" | |
42 x "\r2\r" | |
43 x "" | |
44 x "50\r" | |
45 x "4" | |
46 x "" | |
47 x "" | |
48 x "(+ o\0" | |
49 x "-1o \r" | |
50 x "" | |
51 x)) | |
52 ;;Create a new spreadsheet | |
53 (fset 'ses-exercise-new | |
54 (concat y | |
55 x "\"%.8g\"\r" | |
56 x "2\r" | |
57 x "" | |
58 x "" | |
59 x "2" | |
60 x "\"Header\r" | |
61 x "(sqrt 1\r" | |
62 x "pses-center\r" | |
63 x "\t" | |
64 x "(+ A2 A3\r" | |
65 x "(* B2 A3\r" | |
66 x "2" | |
67 x "\rB3\r" | |
68 x "" | |
69 x)) | |
70 ;;Basic cell display | |
71 (fset 'ses-exercise-display | |
72 (concat y ":(revert-buffer t t)\r" | |
73 x "" | |
74 x "\"Very long\r" | |
75 x "w3\r" | |
76 x "w3\r" | |
77 x "(/ 1 0\r" | |
78 x "234567\r" | |
79 x "5w" | |
80 x "\t1\r" | |
81 x "" | |
82 x "234567\r" | |
83 x "\t" | |
84 x "" | |
85 x "345678\r" | |
86 x "3w" | |
87 x "\0>" | |
88 x "" | |
89 x "" | |
90 x "" | |
91 x "" | |
92 x "" | |
93 x "" | |
94 x "" | |
95 x "1\r" | |
96 x "" | |
97 x "" | |
98 x "\"1234567-1234567-1234567\r" | |
99 x "123\r" | |
100 x "2" | |
101 x "\"1234567-1234567-1234567\r" | |
102 x "123\r" | |
103 x "w8\r" | |
104 x "\"1234567\r" | |
105 x "w5\r" | |
106 x)) | |
107 ;;Cell formulas | |
108 (fset 'ses-exercise-formulas | |
109 (concat y ":(revert-buffer t t)\r" | |
110 x "\t\t" | |
111 x "\t" | |
112 x "(* B1 B2 D1\r" | |
113 x "(* B2 B3\r" | |
114 x "(apply '+ (ses-range B1 B3)\r" | |
115 x "(apply 'ses+ (ses-range B1 B3)\r" | |
116 x "(apply 'ses+ (ses-range A2 A3)\r" | |
117 x "(mapconcat'number-to-string(ses-range B2 B4) \"-\"\r" | |
118 x "(apply 'concat (reverse (ses-range A3 D3))\r" | |
119 x "(* (+ A2 A3) (ses+ B2 B3)\r" | |
120 x "" | |
121 x "2" | |
122 x "5\t" | |
123 x "(apply 'ses+ (ses-range E1 E2)\r" | |
124 x "(apply 'ses+ (ses-range A5 B5)\r" | |
125 x "(apply 'ses+ (ses-range E1 F1)\r" | |
126 x "(apply 'ses+ (ses-range D1 E1)\r" | |
127 x "\t" | |
128 x "(ses-average (ses-range A2 A5)\r" | |
129 x "(apply 'ses+ (ses-range A5 A6)\r" | |
130 x "k" | |
131 x "" | |
132 x "" | |
133 x "2" | |
134 x "3" | |
135 x "o" | |
136 x "2o" | |
137 x "3k" | |
138 x "(ses-average (ses-range B3 E3)\r" | |
139 x "k" | |
140 x "12345678\r" | |
141 x)) | |
142 ;;Recalculating and reconstructing | |
143 (fset 'ses-exercise-recalc | |
144 (concat y ":(revert-buffer t t)\r" | |
145 x "" | |
146 x "\t\t" | |
147 x "" | |
148 x "(/ 1 0\r" | |
149 x "" | |
150 x "\n" | |
151 x "" | |
152 x "\"%.6g\"\r" | |
153 x "" | |
154 x ">nw" | |
155 x "\0>xdelete-region\r" | |
156 x "" | |
157 x "8" | |
158 x "\0>xdelete-region\r" | |
159 x "" | |
160 x "" | |
161 x "k" | |
162 x "" | |
163 x "\"Very long\r" | |
164 x "" | |
165 x "\r\r" | |
166 x "" | |
167 x "o" | |
168 x "" | |
169 x "\"Very long2\r" | |
170 x "o" | |
171 x "" | |
172 x "\rC3\r" | |
173 x "\rC2\r" | |
174 x "\0" | |
175 x "\rC4\r" | |
176 x "\rC2\r" | |
177 x "\0" | |
178 x "" | |
179 x "xses-mode\r" | |
180 x "<" | |
181 x "2k" | |
182 x)) | |
183 ;;Header line | |
184 (fset 'ses-exercise-header-row | |
185 (concat y ":(revert-buffer t t)\r" | |
186 x "<" | |
187 x ">" | |
188 x "6<" | |
189 x ">" | |
190 x "7<" | |
191 x ">" | |
192 x "8<" | |
193 x "2<" | |
194 x ">" | |
195 x "3w" | |
196 x "10<" | |
197 x ">" | |
198 x "2" | |
199 x)) | |
200 ;;Detecting unsafe formulas and printers | |
201 (fset 'ses-exercise-unsafe | |
202 (concat y ":(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 "\0n" | |
206 x "(delete-file \"x\"\rn" | |
207 x "(delete-file \"ses-nothing\"\ry" | |
208 x "\0n" | |
209 x "(open-network-stream \"x\" nil \"localhost\" \"smtp\"\ry" | |
210 x "\0n" | |
211 x)) | |
212 ;;Inserting and deleting rows | |
213 (fset 'ses-exercise-rows | |
214 (concat y ":(revert-buffer t t)\r" | |
215 x "" | |
216 x "\"%s=\"\r" | |
217 x "20" | |
218 x "p\"%s+\"\r" | |
219 x "" | |
220 x "123456789\r" | |
221 x "\021" | |
222 x "" | |
223 x "" | |
224 x "(not B25\r" | |
225 x "k" | |
226 x "jA3\r" | |
227 x "19" | |
228 x "" | |
229 x "100" ;Make this approx your CPU speed in MHz | |
230 x)) | |
231 ;;Inserting and deleting columns | |
232 (fset 'ses-exercise-columns | |
233 (concat y ":(revert-buffer t t)\r" | |
234 x "\"%s@\"\r" | |
235 x "o" | |
236 x "" | |
237 x "o" | |
238 x "" | |
239 x "k" | |
240 x "w8\r" | |
241 x "p\"%.7s*\"\r" | |
242 x "o" | |
243 x "" | |
244 x "2o" | |
245 x "3k" | |
246 x "\"%.6g\"\r" | |
247 x "26o" | |
248 x "\026\t" | |
249 x "26o" | |
250 x "0\r" | |
251 x "26\t" | |
252 x "400" | |
253 x "50k" | |
254 x "\0D" | |
255 x)) | |
256 (fset 'ses-exercise-editing | |
257 (concat y ":(revert-buffer t t)\r" | |
258 x "1\r" | |
259 x "('x\r" | |
260 x "" | |
261 x "" | |
262 x "\r\r" | |
263 x "w9\r" | |
264 x "\r.5\r" | |
265 x "\r 10\r" | |
266 x "w12\r" | |
267 x "\r'\r" | |
268 x "\r\r" | |
269 x "jA4\r" | |
270 x "(+ A2 100\r" | |
271 x "3\r" | |
272 x "jB1\r" | |
273 x "(not A1\r" | |
274 x "\"Very long\r" | |
275 x "" | |
276 x "h" | |
277 x "H" | |
278 x "" | |
279 x ">\t" | |
280 x "" | |
281 x "" | |
282 x "2" | |
283 x "" | |
284 x "o" | |
285 x "h" | |
286 x "\0" | |
287 x "\"Also very long\r" | |
288 x "H" | |
289 x "\0'\r" | |
290 x "'Trial\r" | |
291 x "'qwerty\r" | |
292 x "(concat o<\0" | |
293 x "-1o\r" | |
294 x "(apply '+ o<\0-1o\r" | |
295 x "2" | |
296 x "-2" | |
297 x "-2" | |
298 x "2" | |
299 x "" | |
300 x "H" | |
301 x "\0" | |
302 x "\"Another long one\r" | |
303 x "H" | |
304 x "" | |
305 x "<" | |
306 x "" | |
307 x ">" | |
308 x "\0" | |
309 x)) | |
310 ;;Sorting of columns | |
311 (fset 'ses-exercise-sort-column | |
312 (concat y ":(revert-buffer t t)\r" | |
313 x "\"Very long\r" | |
314 x "99\r" | |
315 x "o13\r" | |
316 x "(+ A3 B3\r" | |
317 x "7\r8\r(* A4 B4\r" | |
318 x "\0A\r" | |
319 x "\0B\r" | |
320 x "\0C\r" | |
321 x "o" | |
322 x "\0C\r" | |
323 x)) | |
324 ;;Simple cell printers | |
325 (fset 'ses-exercise-cell-printers | |
326 (concat y ":(revert-buffer t t)\r" | |
327 x "\"4\t76\r" | |
328 x "\"4\n7\r" | |
329 x "p\"{%S}\"\r" | |
330 x "p(\"[%s]\")\r" | |
331 x "p(\"<%s>\")\r" | |
332 x "\0" | |
333 x "p\r" | |
334 x "pnil\r" | |
335 x "pses-dashfill\r" | |
336 x "48\r" | |
337 x "\t" | |
338 x "\0p\r" | |
339 x "p\r" | |
340 x "pses-dashfill\r" | |
341 x "\0pnil\r" | |
342 x "5\r" | |
343 x "pses-center\r" | |
344 x "\"%s\"\r" | |
345 x "w8\r" | |
346 x "p\r" | |
347 x "p\"%.7g@\"\r" | |
348 x "\r" | |
349 x "\"%.6g#\"\r" | |
350 x "\"%.6g.\"\r" | |
351 x "\"%.6g.\"\r" | |
352 x "pidentity\r" | |
353 x "6\r" | |
354 x "\"UPCASE\r" | |
355 x "pdowncase\r" | |
356 x "(* 3 4\r" | |
357 x "p(lambda (x) '(\"Hi\"))\r" | |
358 x "p(lambda (x) '(\"Bye\"))\r" | |
359 x)) | |
360 ;;Spanning cell printers | |
361 (fset 'ses-exercise-spanning-printers | |
362 (concat y ":(revert-buffer t t)\r" | |
363 x "p\"%.6g*\"\r" | |
364 x "pses-dashfill-span\r" | |
365 x "5\r" | |
366 x "pses-tildefill-span\r" | |
367 x "\"4\r" | |
368 x "p\"$%s\"\r" | |
369 x "p(\"$%s\")\r" | |
370 x "8\r" | |
371 x "p(\"!%s!\")\r" | |
372 x "\t\"12345678\r" | |
373 x "pses-dashfill-span\r" | |
374 x "\"23456789\r" | |
375 x "\t" | |
376 x "(not t\r" | |
377 x "w6\r" | |
378 x "\"5\r" | |
379 x "o" | |
380 x "k" | |
381 x "k" | |
382 x "\t" | |
383 x "" | |
384 x "o" | |
385 x "2k" | |
386 x "k" | |
387 x)) | |
388 ;;Cut/copy/paste - within same buffer | |
389 (fset 'ses-exercise-paste-1buf | |
390 (concat y ":(revert-buffer t t)\r" | |
391 x "\0w" | |
392 x "" | |
393 x "o" | |
394 x "\"middle\r" | |
395 x "\0" | |
396 x "w" | |
397 x "\0" | |
398 x "w" | |
399 x "" | |
400 x "" | |
401 x "2y" | |
402 x "y" | |
403 x "y" | |
404 x ">" | |
405 x "y" | |
406 x ">y" | |
407 x "<" | |
408 x "p\"<%s>\"\r" | |
409 x "pses-dashfill\r" | |
410 x "\0" | |
411 x "" | |
412 x "" | |
413 x "y" | |
414 x "\r\0w" | |
415 x "\r" | |
416 x "3(+ G2 H1\r" | |
417 x "\0w" | |
418 x ">" | |
419 x "" | |
420 x "8(ses-average (ses-range G2 H2)\r" | |
421 x "\0k" | |
422 x "7" | |
423 x "" | |
424 x "(ses-average (ses-range E7 E9)\r" | |
425 x "\0" | |
426 x "" | |
427 x "(ses-average (ses-range E7 F7)\r" | |
428 x "\0k" | |
429 x "" | |
430 x "(ses-average (ses-range D6 E6)\r" | |
431 x "\0k" | |
432 x "" | |
433 x "2" | |
434 x "\"Line A\r" | |
435 x "pses-tildefill-span\r" | |
436 x "\"Subline A(1)\r" | |
437 x "pses-dashfill-span\r" | |
438 x "\0w" | |
439 x "" | |
440 x "" | |
441 x "\0w" | |
442 x "" | |
443 x)) | |
444 ;;Cut/copy/paste - between two buffers | |
445 (fset 'ses-exercise-paste-2buf | |
446 (concat y ":(revert-buffer t t)\r" | |
447 x "o\"middle\r\0" | |
448 x "" | |
449 x "4bses-test.txt\r" | |
450 x " " | |
451 x "\"xxx\0" | |
452 x "wo" | |
453 x "" | |
454 x "" | |
455 x "o\"\0" | |
456 x "wo" | |
457 x "o123.45\0" | |
458 x "o" | |
459 x "o1 \0" | |
460 x "o" | |
461 x ">y" | |
462 x "o symb\0" | |
463 x "oy2y" | |
464 x "o1\t\0" | |
465 x "o" | |
466 x "w9\np\"<%s>\"\n" | |
467 x "o\n2\t\"3\nxxx\t5\n\0" | |
468 x "oy" | |
469 x)) | |
470 ;;Export text, import it back | |
471 (fset 'ses-exercise-import-export | |
472 (concat y ":(revert-buffer t t)\r" | |
473 x "\0xt" | |
474 x "4bses-test.txt\r" | |
475 x "\n-1o" | |
476 x "xTo-1o" | |
477 x "'crunch\r" | |
478 x "pses-center-span\r" | |
479 x "\0xT" | |
480 x "o\n-1o" | |
481 x "\0y" | |
482 x "\0xt" | |
483 x "\0y" | |
484 x "12345678\r" | |
485 x "'bunch\r" | |
486 x "\0xtxT" | |
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 | |
512 spreadsheet 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\n2") | |
556 (execute-kbd-macro [?j ?B ?9 ?\n ?C-@ ?C-f ?C-f cut]) | |
557 (progn (kill-new "x") (execute-kbd-macro ">n")) | |
558 (execute-kbd-macro "\0w"))) | |
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\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(2 1 1)" | |
594 "\n\n\n(ses-cell)(2 1 1)" | |
595 "\n\n\n(x)\n(2 1 1)" | |
596 "\n\n\n\n(ses-cell A2)\n(2 2 2)" | |
597 "\n\n\n\n(ses-cell B1)\n(2 2 2)" | |
598 "\n\n\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\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 | |
711 ;; testcover-ses.el ends here. |