;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Test-cases (load-file (concat (file-name-directory load-file-name) "../emmet-mode.el")) (emmet-defparameter *emmet-test-cases* nil) (defun emmet-run-test-case (name fn cases) (let ((res (loop for c in cases for i to (1- (length cases)) do (let ((expected (cdr c)) (actual (funcall fn (car c)))) (when (not (equal expected actual)) (princ (concat "*** [FAIL] | \"" name "\" " (number-to-string i) "\n\n" (format "%s" (car c)) "\t=>\n\n" "Expected\n" (format "%s" expected) "\n\nActual\n" (format "%s" actual) "\n\n")) (return 'fail)))))) (if (not (eql res 'fail)) (princ (concat " [PASS] | \"" name "\" " (number-to-string (length cases)) " tests.\n"))))) (defun emmet-test-cases (&rest args) (let ((cmd (car args))) (cond ((eql cmd 'assign) (let ((name (cadr args)) (fn (caddr args)) (defs (cadddr args))) (let ((place (assoc name *emmet-test-cases*))) (if place (setf (cdr place) (cons fn defs)) (setq *emmet-test-cases* (cons (cons name (cons fn defs)) *emmet-test-cases*)))))) (t (loop for test in (reverse *emmet-test-cases*) do (let ((name (symbol-name (car test))) (fn (cadr test)) (cases (cddr test))) (emmet-run-test-case name fn cases))))))) (defmacro define-emmet-transform-test-case (name fn &rest tests) `(emmet-test-cases 'assign ',name ,fn ',(loop for x on tests by #'cddr collect (cons (car x) (emmet-join-string (cadr x) "\n"))))) (defmacro define-emmet-transform-html-test-case (name &rest tests) `(define-emmet-transform-test-case ,name 'emmet-html-transform ,@tests)) (defmacro define-emmet-unit-test-case (name fn &rest tests) `(emmet-test-cases 'assign ',name ,fn ',(loop for x on tests by #'cddr collect (cons (car x) (cadr x))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; XML-abbrev tests (define-emmet-transform-html-test-case Tags "a" ("") "a.x" ("") "a#q.x" ("") "a#q.x.y.z" ("") "#q" ("
") ".x" ("") "#q.x" ("") "#q.x.y.z" ("")) (define-emmet-transform-html-test-case Empty-tags "a/" ("") "a/.x" ("") "a/#q.x" ("") "a/#q.x.y.z" ("")) (define-emmet-transform-html-test-case Self-closing-tags "input type=text" ("") "img" ("" " |
" " foo" " " "
" "" "") "div+div>p>span+em^blockquote{foo}" ("" "" " " " " "
" "foo" "
" " Click " " here" " to continue" "
") "p{Click }+a{here}+{ to continue}" ("Click
" "here" " to continue") "xxx#id.cls[p=1]{txt}" ("