Changeset 7953 for lang/elisp

Show
Ignore:
Timestamp:
03/14/08 18:10:30 (9 months ago)
Author:
lieutar
Message:

lang/elisp/escm/trunk: I fixed a problem in my test framework that aborts testing when the test contains errors.

Location:
lang/elisp/escm/trunk
Files:
1 added
1 removed
10 modified
1 moved

Legend:

Unmodified
Added
Removed
  • lang/elisp/escm/trunk/DEVELOPPERSTOOLS.el

    r7843 r7953  
    22  (unless (member  dir load-path ) 
    33    (setq load-path (cons dir load-path)))) 
    4  
    5  
    6  
    7  
  • lang/elisp/escm/trunk/escm-arity.el

    r7950 r7953  
    4848                (progn (setq fields  (cons head fields)) 
    4949                       (setq argspec tail)) 
    50               (throw 'error "wrong type argument" 'synbolp head))) 
     50              (signal 'error `("wrong type argument" 'synbolp ,head)))) 
    5151        (progn (setq fields (cons argspec fields)) 
    5252               (setq at-least t) 
  • lang/elisp/escm/trunk/escm-cbos.el

    r7950 r7953  
    3030;;; 
    3131(require 'escm-util) 
     32 
     33(escm-util::define-signals 
     34 '(escm-cbos::error 
     35   "" 
     36   (escm-cbos::error::no-such-method "No such method"))) 
    3237 
    3338(defconst escm-cbos::class-vmt    nil) 
     
    7277 
    7378(defmacro escm-cbos::define-method (class name args &rest body) 
    74   "defines method of escm-cbos objects." 
     79  "defines method of escm-cbos objects."   
    7580  `(progn 
    7681     ,(when t;;(not (fboundp 'name)) 
     
    8994  (put (get 'escm-cbos::class-vmt ',class) ',name nil)) 
    9095 
    91 (defsubst escm-cbos::find-method (sym name) 
     96(defsubst escm-cbos::find-method1 (sym name) 
    9297  "" 
    9398  (let ((meth  nil) 
     
    101106    meth)) 
    102107 
     108(defun escm-cbos::find-method (class method-name) 
     109  (let ((ilist (escm-cbos::inheritance-list class))) 
     110    (escm-cbos::find-method1 'ilist method-name))) 
     111 
    103112(defsubst escm-cbos::run-method (name obj args) 
    104113  "" 
    105114  (let* ((class (escm-cbos::get-class obj)) 
    106115         (ilist (symbol-value (get 'escm-cbos::class-vmt class))) 
    107          (meth  (escm-cbos::find-method 'ilist name))) 
     116         (meth  (escm-cbos::find-method1 'ilist name))) 
    108117    (if meth (apply meth (cons ilist (cons name (cons obj args)))) 
    109       (throw 'escm-cbos::error::no-such-method  
    110              (list "no such method" class name))))) 
     118      (signal 'escm-cbos::error::no-such-method  
     119              (list class name))))) 
     120 
     121 
    111122 
    112123(defun escm-cbos::expand-method (args body) 
     
    118129              (cond ((eq 'super (car x)) 
    119130                     `(apply 
    120                        (or (escm-cbos::find-method '*ilist* *method-name*) 
    121                            (throw 'escm-cbos::error::no-such-method 
    122                                   (format ""))) 
    123                        (list *ilist* *method-name* ,@(cdr x)))) 
    124                     (t (throw 'error "panic!!"))) x)) 
     131                       (or (escm-cbos::find-method '*ilist* *method-name*) 
     132                           (signal 'escm-cbos::error::no-such-method 
     133                                   ())) 
     134                       (list *ilist* *method-name* ,@(cdr x)))) 
     135                    (t (signal 'error '("panic!!")))) x)) 
    125136        body 
    126137        (lambda (n) (not (or (eq 'super (car n)))))))) 
     
    129140  "Creates object with buffer." 
    130141  (let ((new (make-vector 
    131               (+ 1 (length (escm-cbos::get-fields-of name)) (or buflen 0)) nil))) 
     142              (+ 1 (length (escm-cbos::get-fields-of name)) 
     143                 (or buflen 0)) nil))) 
    132144    (aset new 0 name) 
    133145    new)) 
     
    189201 
    190202 
     203 
     204 
     205 
    191206(escm-cbos::register-class 'escm-cbos::Object nil nil) 
    192207 
     
    205220  (format "* object : %s *" (escm-cbos::get-class self))) 
    206221 
     222 
     223 
     224 
     225 
     226 
     227 
     228 
    207229(provide 'escm-cbos) 
    208230;;; escm-cbos.el ends here. 
  • lang/elisp/escm/trunk/escm-compile.el

    r7843 r7953  
    3131              (escm-iproc::merge ret (escm-compile arg-context  x)) 
    3232              (escm-iproc::merge ret (escm-icode '((pusha)))))  tail) 
    33     (escm-iproc::merge ret (escm-compile (escm-context::set-func? context t)  head)) 
    34     (escm-iproc::merge ret (escm-icode `((,(if (escm-context::get-tailp context) 
    35                                                'tcall 
    36                                              'call))))))) 
     33    (escm-iproc::merge ret (escm-compile 
     34                            (escm-context::set-func? context t)  head)) 
     35    (escm-iproc::merge ret 
     36                       (escm-icode `((,(if (escm-context::get-tailp context) 
     37                                           'tcall 
     38                                         'call))))))) 
    3739 
    3840(defsubst escm-compile-if (sexp) 
  • lang/elisp/escm/trunk/escm-env.el

    r7950 r7953  
    22(require 'escm-cbos) 
    33(require 'escm-test) 
     4(require 'escm-errors) 
    45 
    56(defconst escm-env::class-diagram nil " 
     
    8485      (let ((parent (escm-env::get-parent self))) 
    8586        (if parent (escm-env::gref parent) 
    86           (throw 'escm-env::unbound "unbound symbol" sym)))))) 
     87          (signal 'escm-void-variable  (list "unbound symbol" sym))))))) 
    8788 
    8889(escm-cbos::define-method escm-fixed-env escm-env::gset! (self sym val) 
     
    9192      (let ((parent (escm-env::get-parent self))) 
    9293        (if parent (escm-env::gset! parent sym val) 
    93           (throw 'escm-env::unbound  "unbound symbol" sym)))))) 
     94          (signal 'escm-void-variable  (list "unbound symbol" sym))))))) 
    9495 
    9596;; test code for escm-test 
     
    112113                                   (escm-env::make-setter  f 'f 'a 123))) t) 
    113114    (escm-test "make referer" 
    114                (eq (eval 
    115                     (escm-test::p "referer" (escm-env::make-referer f 'f 'a))) 
     115               (eq (eval (escm-test::p "referer" 
     116                                      (escm-env::make-referer f 'f 'a))) 
    116117                   123)))) 
    117118;; (escm-test::run 'escm 'fixed-env) 
     119 
    118120 
    119121;;;-------------;;; 
     
    138140(defsubst escm-dynamic-env::add-field (self sym) 
    139141  "" 
    140    
    141142  (put (escm-env::get-dic self) 
    142143       sym 
     
    157158      (if parent 
    158159          (escm-env::gset! parent sym val) 
    159         (throw 'escm-env::unbound (format "unbound symbol : %s")))))) 
    160  
    161 (escm-cbos::define-method escm-dynamic-env escm-env::gref  (self sym) 
     160        (signal 'escm-void-variable (list )))))) 
     161 
     162 
     163(defsubst escm-dynamic-env::gref (self sym) 
    162164  (if (escm-env::member? self sym) 
    163165      (get (escm-dynamic-env::get-valdic self) sym) 
     
    165167      (if parent 
    166168          (escm-env::gref parent sym) 
    167         (throw 'escm-env::unbound (format "unbound symbol : %s")))))) 
     169        (signal 'escm-void-variable (list)))))) 
     170 
     171(escm-cbos::define-method escm-dynamic-env escm-env::gref (self sym) 
     172  (escm-dynamic-env::gref self sym)) 
    168173 
    169174;; test code for escm-dynamic-env 
     
    178183    (escm-test "gref  0"     (eq 1 (escm-env::gref e 'a))) 
    179184    (escm-test "gset! 1"     (escm-env::gset! f 'b 2) t) 
    180     (escm-test "gref  1"     (eq 2 (escm-env::gref  e 'b))) 
     185    (escm-test "gref  1"     (eq 2 (escm-test::p 
     186                                    "2 =" (escm-env::gref  e 'b)))) 
    181187    (escm-test "gset! 2"     (escm-env::gset! g 'a 3) t) 
    182188    (escm-test "gref  2"     (and (eq 1 (escm-env::gref e 'a)) 
    183189                                  (eq 3 (escm-env::gref g 'a)))) 
     190    (escm-test::p "f" f) 
    184191    (escm-test "make setter" 
    185192               (eval (escm-test::p "setter" 
    186                                    (escm-env::make-setter  f 'f 'a 123))) t) 
    187  
     193                                   (escm-env::make-setter f 'f 'a 123))) t) 
    188194    (escm-test "make referer" 
    189                (eq (eval 
    190                     (escm-test::p "referer" (escm-env::make-referer f 'f 'a))) 
     195               (eq (eval (escm-test::p "referer" 
     196                                      (escm-env::make-referer f 'f 'a))) 
    191197                   123)) 
    192198)) 
     199 
    193200;; (escm-test::run 'escm 'dynamic-env) 
    194  
    195201 
    196202;;; 
     
    206212      (let ((retval (condition-case *err* (symbol-value 'sym) 
    207213                      (error (condition-case *err* (symbol-function 'sym) 
    208                                (error (throw 'escm::unbound ""))))))) 
     214                               (error (signal 'escm-void-variable 
     215                                              (list "")))))))) 
    209216        (let ((retval (if (functionp retval) 
    210217                          (escm-proc::wrap-elisp retval) 
     
    219226      (let ((retval (condition-case *err* (symbol-function 'sym) 
    220227                      (error (condition-case *err* (symbol-value 'sym) 
    221                                (error (throw 'escm::unbound ""))))))) 
     228                               (error (signal 'escm-void-variable 
     229                                              (list "")))))))) 
    222230        (let ((retval (if (functionp retval) 
    223231                          (escm-proc::wrap-elisp retval) 
  • lang/elisp/escm/trunk/escm-icode.el

    r7843 r7953  
    8686  (cond ((escm-iblock-p          node) node) 
    8787        ((escm-iblock-contents-p node) (escm-iblock::new (list node))) 
    88         (t (throw 'error "wrong type argument: escm-iblock-p or escm-iblock-contents-p")))) 
     88        (t (signal 'wrong-type-argument 
     89                   (list 
     90                    "wrong type argument" 
     91                    'escm-iblock-p 
     92                    'escm-iblock-contents-p))))) 
    8993 
    9094(defsubst escm-iblock::add-contents (self content) 
    9195  "" 
    92   (when (escm-iblock::get-has-jump self) (throw 'error "")) 
     96  (when (escm-iblock::get-has-jump self) (signal 'error ())) 
    9397  (escm-iblock::set-has-jump self (escm-iblock-contents::has-jump content)) 
    9498  (escm-iblock::set-body  self (append (escm-iblock::get-body self) 
     
    105109           (escm-iblock::add-contents self node)) 
    106110          (t 
    107            (throw 'error ""))) 
     111           (signal 'error ()))) 
    108112    self)) 
    109113 
  • lang/elisp/escm/trunk/escm-test.el

    r7951 r7953  
    2828(require 'escm-util.minimal) 
    2929 
    30  
    31 (defconst escm-test::tests () 
    32   "symbol for plist of tests.") 
     30(defconst escm-test::tests () "symbol for plist of tests.") 
    3331 
    3432(defface  escm-test::ok-face 
     
    6765  (format "%S" (cdr trace))) 
    6866 
    69  
    70  
    71  
    72 (defun escm-test::record-errors (cont debugger-args) 
    73   (throw cont 
    74          (format "%S\nbacktrace:%s" 
    75                  debugger-args 
    76                  (let ((drop  t) 
    77                        (depth 0) 
    78                        (trace t) 
    79                        (all  "")) 
    80                    (while trace 
    81                      (unless (eq trace t) 
    82                        (if drop 
    83                            (if (eq (cadr trace) 'escm-test::record-errors) 
    84                                (setq drop nil)) 
    85                          (setq all 
    86                                (concat 
    87                                 all 
    88                                 "\n" 
    89                                 (escm-test::build-traced-line trace))))) 
    90                      (setq trace (backtrace-frame depth)) 
    91                      (setq depth (1+ depth)) 
    92                      (when (and (eq    (cadr trace) 'catch) 
    93                                 (equal (caddr trace) ''escm-test->eval)) 
    94                        (setq trace nil))) 
    95                    all)))) 
     67(defun escm-test::backtrace1 (cont debugger-args skip) 
     68  (format "%S\nbacktrace:%s" 
     69          debugger-args 
     70          (let ((drop  t) 
     71                (depth 0) 
     72                (trace t) 
     73                (skip (or skip 0)) 
     74                (all  "")) 
     75            (while trace 
     76              (unless (eq trace t) 
     77                (if drop 
     78                    (if (eq (cadr trace) 'escm-test::backtrace) 
     79                        (setq drop nil)) 
     80                  (if (> 1 skip) 
     81                      (setq all 
     82                            (concat 
     83                             all 
     84                             "\n" 
     85                             (escm-test::build-traced-line 
     86                              trace))) 
     87                    (setq skip (1- skip))))) 
     88              (setq trace (backtrace-frame depth)) 
     89              (setq depth (1+ depth)) 
     90              (when (and (eq    (cadr  trace) 'catch) 
     91                         (equal (caddr trace) (list 'quote cont))) 
     92                (setq trace nil))) 
     93            all))) 
     94 
     95(defun escm-test::backtrace (cont debugger-args &optional skip) 
     96  "" 
     97  (let* ((old-local-map (current-local-map)) 
     98         (tmp-map (make-keymap)) 
     99         (len     (length (cadr tmp-map))) 
     100         (tbl     (make-vector len (lambda () 
     101                                     (interactive) 
     102                                     (message "Continue ...") 
     103                                     (run-with-timer 0.125 nil 
     104                                                     'exit-recursive-edit)))) 
     105         (pos     1)) 
     106    (aset tbl 0 t) 
     107    (setcar (cdr tmp-map) tbl) 
     108    (use-local-map tmp-map) 
     109    (message "\"escm-test\" caught an error. Push any key...") 
     110    (recursive-edit) 
     111    (use-local-map old-local-map) 
     112    (throw cont (escm-test::backtrace1 cont debugger-args skip)))) 
     113 
     114(when nil ;;;; 
     115 
     116  (progn 
     117    (escm-test::define-test escm-test fail2 
     118      (escm-test ok-0 t) 
     119      (escm-test arith-0 (/ 0 0)) 
     120      (escm-test ok 1 t) 
     121      (escm-test arith-1 (/ 1 0)) 
     122      ) 
     123    (escm-test::run 'escm-test 'fail2 )) 
     124 
     125);;;; 
     126 
     127(defsubst escm-test::assert1 (name x) 
     128  "" 
     129  (let ((result (let ((debugger (lambda (&rest args) 
     130                                  (escm-test::backtrace 'escm-test->eval 
     131                                                        args 
     132                                                        1)))) 
     133                  (catch 'escm-test->eval (eval (cons 'progn x)))))) 
     134    (setq report 
     135          (cons (if (eq result t) 
     136                    `(:ok ,name) 
     137                  (progn (setq failed (1+ failed)) 
     138                         `(:failed ,name ,(or result "failed")))) 
     139                report)))) 
    96140 
    97141(defmacro escm-test (name &rest x) 
    98142  "" 
    99   `(let ((err (let ((debugger (lambda (&rest args) 
    100                                 (escm-test::record-errors 'escm-test->eval 
    101                                                           args)))) 
    102                 (let ((result (catch 'escm-test->eval (eval (progn ,@x))))) 
    103                   (if (eq result t) nil (or result "failed")))))) 
    104      (setq report 
    105            (cons (if err (progn (setq failed (1+ failed)) 
    106                                 (list ',name err))  ',name) 
    107                         report)))) 
     143  `(escm-test::assert1 ',name ',x)) 
    108144 
    109145(defun escm-test::run-test::debugger (&rest debugger-args) 
    110146  (setq failed (1+ failed)) 
    111   (escm-test::record-errors 'escm-test::run-test->eval 
    112                             debugger-args)) 
     147  (escm-test::backtrace 'escm-test::run-test->eval 
     148                            debugger-args 
     149                            1)) 
    113150 
    114151(defun escm-test::run-test (reporter project name all) 
     
    122159                              all 
    123160                              '(nil)))))) 
    124     (if err (setq report (cons (list "*** FATAL ERROR ***" err) report))) 
     161    (if err (setq report 
     162                  (cons (list :failed "*** FATAL ERROR ***" err) report))) 
    125163    (apply reporter (list project name failed (reverse report))))) 
    126164 
    127165 
    128 (when nil ;;;; 
    129  
    130   (progn 
    131     (escm-test::define-test escm-test fail2 
    132       (/ 2 0)) 
    133     (escm-test::run 'escm-test 'fail2)) 
    134  
    135   (progn 
    136     (escm-test::define-test escm-test fail 
    137       (escm-test zero    (progn (/ 1 0))) 
    138       (escm-test success  t) 
    139       (escm-test unreach  t)) 
    140     (escm-test::run 'escm-test 'fail)) 
    141  
    142 );;;; 
     166 
     167(defconst escm-test::report-mode-map 
     168  (let ((m (make-keymap))) 
     169    (define-key m "q" 'top-level) 
     170    m)) 
     171 
     172 
     173(defun escm-test::report-mode () 
     174  (use-local-map escm-test::report-mode-map)) 
     175 
    143176 
    144177(defmacro escm-test::define-test (project name &rest body) 
     
    154187(defun escm-test::report-single (project name failed report) 
    155188  "Reports result of a test." 
    156   (escm-util::popup  "*escm-test*" 
    157     (insert 
    158      (mapconcat 
    159       (lambda (r) 
    160         (if (listp r) 
    161             (if (eq :print (car r)) 
    162                 (concat (escm-util::text-with-properties 
    163                          (format "%s :" (cadr r)) 'face 'escm-test::print-face) 
    164                         (format "%S" (cddr r))) 
    165               (concat (escm-util::text-with-properties 
    166                        (format "%s :"    (car r)) 'face 'escm-test::faild-face) 
    167                       (format " %s" (cadr r)))) 
    168            (escm-util::text-with-properties 
    169                 (format "%s ... ok!" r) 'face 'escm-test::ok-face))) 
    170       report 
    171       "\n"))) 
    172   (when (= failed 0) (message "all tests successful."))) 
     189  (save-window-excursion 
     190    (escm-util::popup  "*escm-test*" 
     191      (escm-test::report-mode) 
     192      (insert 
     193       (mapconcat 
     194        (lambda (r) 
     195          (case (car r) 
     196            ((:ok) 
     197             (escm-util::stext 
     198              `(face escm-test::ok-face ,(format "%s ... ok!" (cadr r))))) 
     199            ((:print) 
     200           (escm-util::stext 
     201            `(face escm-test::print-face ,(format "%s :" (cadr r))) 
     202            (format "%S" (cddr r)))) 
     203            ((:failed) 
     204             (escm-util::stext 
     205              `(face escm-test::faild-face ,(format "%s :" (cadr r))) 
     206              (format " %s" (caddr r)))))) 
     207        report 
     208        "\n"))) 
     209    (if (= failed 0) 
     210        (message "all tests successful.") 
     211      (message (format "The test has %d or more errors." failed))) 
     212    (save-excursion (recursive-edit)))) 
    173213 
    174214(defun escm-test::project-alist () 
     
    188228 
    189229 
    190 (defun escm-test::run (project &optional name) 
     230(defun escm-test::run (project &optional name reporter) 
    191231  "Runs all tests what belongs the PROJECT." 
    192232  (interactive 
     
    201241    (if name 
    202242        (progn 
    203           (escm-test::run-test 'escm-test::report-single project name 
     243          (escm-test::run-test (or reporter 
     244                                   (function escm-test::report-single)) 
     245                               project 
     246                               name 
    204247                               (cdr (assoc name alist)))) 
    205248      (let ((result ()) 
     
    239282                         "all tests successful."))) 
    240283          (cons failed result)))))) 
    241 ;;;(call-interactively 'escm-test::run 'escm)  
    242  
    243284 
    244285(provide 'escm-test) 
  • lang/elisp/escm/trunk/escm-util.el

    r7950 r7953  
    3939            ((listp fun) (cadr       fun)) 
    4040            (t           (aref       fun 0))) 
    41     (throw 'error (format "wrong type argument: functionp %S" fun)))) 
     41    (signal 'wrong-type-argument 
     42            (list "wrong type argument" 'functionp fun)))) 
    4243 
    4344 
     
    8889          (nthcdr (+ n (or len 1))  list))) 
    8990 
     91(defun escm-util::define-signals (spec &optional parents) 
     92  "" 
     93  (let ((sym      (car  spec)) 
     94        (mess     (cadr spec)) 
     95        (children (cddr spec))) 
     96    (put sym 'error-conditions (cons 'error (cons sym parents))) 
     97    (put sym 'error-message    mess) 
     98    (mapcar (lambda (child) 
     99              (escm-util::define-signals child (cons sym parents))) 
     100            children))) 
     101 
    90102 
    91103(provide 'escm-util) 
  • lang/elisp/escm/trunk/escm-util.file.el

    r7383 r7953  
    1717  "extracts basename from file-path. 
    1818If you give number as second argument, it removes suffixes." 
    19   (when (string-match "/$" path) (setq path (substring path 0 (1- (length path))))) 
     19  (when (string-match "/$" path) 
     20    (setq path (substring path 0 (1- (length path))))) 
    2021  (string-match "\\([^/]*/\\)*\\(.*\\)" path) 
    2122  (let* ((basename (match-string 2 path)) 
  • lang/elisp/escm/trunk/escm-util.minimal.el

    r7843 r7953  
    7676    retval)) 
    7777 
     78 
    7879(provide 'escm-util.minimal) 
  • lang/elisp/escm/trunk/escm-vm.el

    r7841 r7953  
    1515        (regs   ()) 
    1616        (vminit ())) 
     17 
    1718   `(,@(mapcar (lambda (p) 
    1819                 (let* ((n           (car p)) 
    1920                        (v           (cdr p)) 
    20                         (set         (intern (format "escm-vm::set-%s-stack"   n))) 
    21                         (get         (intern (format "escm-vm::get-%s-stack"   n))) 
    22                         (push        (intern (format "escm-vm::push-%s"        n))) 
    23                         (pop         (intern (format "escm-vm::pop-%s"         n)))