diff options
Diffstat (limited to 'src/test.el')
-rw-r--r-- | src/test.el | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/src/test.el b/src/test.el new file mode 100644 index 0000000..dc021ae --- /dev/null +++ b/src/test.el @@ -0,0 +1,540 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Test-cases + +(load-file (concat (file-name-directory load-file-name) "../zencoding-mode.el")) + +(zencoding-defparameter *zencoding-test-cases* nil) + +(defun zencoding-test-cases (&rest args) + (let ((cmd (car args))) + (flet + ((run-cases + (fn cases) + (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)))))) + (cond ((eql cmd 'assign) + (let ((name (cadr args)) + (fn (caddr args)) + (defs (cadddr args))) + (let ((place (assoc name *zencoding-test-cases*))) + (if place + (setf (cdr place) (cons fn defs)) + (setq *zencoding-test-cases* + (cons (cons name (cons fn defs)) *zencoding-test-cases*)))))) + (t + (loop for test in (reverse *zencoding-test-cases*) do + (let ((name (symbol-name (car test))) + (fn (cadr test)) + (cases (cddr test))) + (let ((res (run-cases fn cases))) + (if (not (eql res 'fail)) + (princ (concat " [PASS] | \"" name "\" " + (number-to-string (length cases)) " tests.\n"))))))))))) + +(defmacro define-zencoding-transform-test-case (name fn &rest tests) + `(zencoding-test-cases 'assign ',name + ,fn + ',(loop for x on tests by #'cddr collect + (cons (car x) + (zencoding-join-string (cadr x) + "\n"))))) + +(defmacro define-zencoding-transform-html-test-case (name &rest tests) + `(define-zencoding-transform-test-case ,name + 'zencoding-html-transform + ,@tests)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; XML-abbrev tests + +(define-zencoding-transform-html-test-case Tags + "a" ("<a href=\"\"></a>") + "a.x" ("<a class=\"x\" href=\"\"></a>") + "a#q.x" ("<a id=\"q\" class=\"x\" href=\"\"></a>") + "a#q.x.y.z" ("<a id=\"q\" class=\"x y z\" href=\"\"></a>") + "#q" ("<div id=\"q\">" + "</div>") + ".x" ("<div class=\"x\">" + "</div>") + "#q.x" ("<div id=\"q\" class=\"x\">" + "</div>") + "#q.x.y.z" ("<div id=\"q\" class=\"x y z\">" + "</div>")) + +(define-zencoding-transform-html-test-case Empty-tags + "a/" ("<a href=\"\"/>") + "a/.x" ("<a class=\"x\" href=\"\"/>") + "a/#q.x" ("<a id=\"q\" class=\"x\" href=\"\"/>") + "a/#q.x.y.z" ("<a id=\"q\" class=\"x y z\" href=\"\"/>")) + +(define-zencoding-transform-html-test-case Self-closing-tags + "input type=text" ("<input type=\"text\" name=\"\" value=\"\"/>") + "img" ("<img src=\"\" alt=\"\"/>") + "img>metadata/*2" ("<img src=\"\" alt=\"\">" + " <metadata/>" + " <metadata/>" + "</img>")) + +(define-zencoding-transform-html-test-case Siblings + "a+b" ("<a href=\"\"></a>" + "<b></b>") + "a+b+c" ("<a href=\"\"></a>" + "<b></b>" + "<c></c>") + "a.x+b" ("<a class=\"x\" href=\"\"></a>" + "<b></b>") + "a#q.x+b" ("<a id=\"q\" class=\"x\" href=\"\"></a>" + "<b></b>") + "a#q.x.y.z+b" ("<a id=\"q\" class=\"x y z\" href=\"\"></a>" + "<b></b>") + "a#q.x.y.z+b#p.l.m.n" ("<a id=\"q\" class=\"x y z\" href=\"\"></a>" + "<b id=\"p\" class=\"l m n\"></b>")) + +(define-zencoding-transform-html-test-case Tag-expansion + "table+" ("<table>" + " <tr>" + " <td></td>" + " </tr>" + "</table>") + "dl+" ("<dl>" + " <dt></dt>" + " <dd></dd>" + "</dl>") + "ul+" ("<ul>" + " <li></li>" + "</ul>") + "ul++ol+" ("<ul>" + " <li></li>" + "</ul>" + "<ol>" + " <li></li>" + "</ol>") + "ul#q.x.y m=l+" ("<ul id=\"q\" class=\"x y\" m=\"l\">" + " <li></li>" + "</ul>")) + +(define-zencoding-transform-html-test-case Parent-child + "a>b" ("<a href=\"\"><b></b></a>") + "a>b>c" ("<a href=\"\"><b><c></c></b></a>") + "a.x>b" ("<a class=\"x\" href=\"\"><b></b></a>") + "a#q.x>b" ("<a id=\"q\" class=\"x\" href=\"\"><b></b></a>") + "a#q.x.y.z>b" ("<a id=\"q\" class=\"x y z\" href=\"\"><b></b></a>") + "a#q.x.y.z>b#p.l.m.n" ("<a id=\"q\" class=\"x y z\" href=\"\"><b id=\"p\" class=\"l m n\"></b></a>") + "#q>.x" ("<div id=\"q\">" + " <div class=\"x\">" + " </div>" + "</div>") + "a>b+c" ("<a href=\"\">" + " <b></b>" + " <c></c>" + "</a>") + "a>b+c>d" ("<a href=\"\">" + " <b></b>" + " <c><d></d></c>" + "</a>")) + +(define-zencoding-transform-html-test-case Climb-up + "a>b>c^d" ("<a href=\"\">" + " <b><c></c></b>" + " <d></d>" + "</a>") + "a>b>c^^d" ("<a href=\"\"><b><c></c></b></a>" + "<d></d>") + "a*2>b*2>c^d" ("<a href=\"\">" + " <b><c></c></b>" + " <b><c></c></b>" + " <d></d>" + "</a>" + "<a href=\"\">" + " <b><c></c></b>" + " <b><c></c></b>" + " <d></d>" + "</a>") + + "div+a>p>span{foo}+em>b^^^p" + ("<div>" + "</div>" + "<a href=\"\">" + " <p>" + " <span>foo</span>" + " <em><b></b></em>" + " </p>" + "</a>" + "<p></p>") + + "div+div>p>span+em^blockquote{foo}" + ("<div>" + "</div>" + "<div>" + " <p>" + " <span></span>" + " <em></em>" + " </p>" + " <blockquote>" + " foo" + " </blockquote>" + "</div>")) + +(define-zencoding-transform-html-test-case Multiplication + "a*1" ("<a href=\"\"></a>") + "a*2" ("<a href=\"\"></a>" + "<a href=\"\"></a>") + "a/*2" ("<a href=\"\"/>" + "<a href=\"\"/>") + "a*2+b*2" ("<a href=\"\"></a>" + "<a href=\"\"></a>" + "<b></b>" + "<b></b>") + "a*2>b*2" ("<a href=\"\">" + " <b></b>" + " <b></b>" + "</a>" + "<a href=\"\">" + " <b></b>" + " <b></b>" + "</a>") + "a>b*2" ("<a href=\"\">" + " <b></b>" + " <b></b>" + "</a>") + "a#q.x>b#q.x*2" ("<a id=\"q\" class=\"x\" href=\"\">" + " <b id=\"q\" class=\"x\"></b>" + " <b id=\"q\" class=\"x\"></b>" + "</a>") + "a#q.x>b/#q.x*2" ("<a id=\"q\" class=\"x\" href=\"\">" + " <b id=\"q\" class=\"x\"/>" + " <b id=\"q\" class=\"x\"/>" + "</a>")) + +(define-zencoding-transform-html-test-case Numbering + "a.$x*3" ("<a class=\"1x\" href=\"\"></a>" + "<a class=\"2x\" href=\"\"></a>" + "<a class=\"3x\" href=\"\"></a>") + "ul>li.item$*3" ("<ul>" + " <li class=\"item1\"></li>" + " <li class=\"item2\"></li>" + " <li class=\"item3\"></li>" + "</ul>") + "ul>li.item$$$*3" ("<ul>" + " <li class=\"item001\"></li>" + " <li class=\"item002\"></li>" + " <li class=\"item003\"></li>" + "</ul>") + "ul>li.item$@-*2" ("<ul>" + " <li class=\"item2\"></li>" + " <li class=\"item1\"></li>" + "</ul>") + "ul>li.item$@-1000*2" ("<ul>" + " <li class=\"item1001\"></li>" + " <li class=\"item1000\"></li>" + "</ul>") + "a.$*2>b.$$@-*3" ("<a class=\"1\" href=\"\">" + " <b class=\"03\"></b>" + " <b class=\"02\"></b>" + " <b class=\"01\"></b>" + "</a>" + "<a class=\"2\" href=\"\">" + " <b class=\"03\"></b>" + " <b class=\"02\"></b>" + " <b class=\"01\"></b>" + "</a>") + + "(div>(a#id$$*2)+b.c$@-3+c#d$)*2" + ("<div>" + " <a id=\"id01\" href=\"\"></a>" + " <a id=\"id02\" href=\"\"></a>" + " <b class=\"c4\"></b>" + " <c id=\"d1\"></c>" + "</div>" + "<div>" + " <a id=\"id01\" href=\"\"></a>" + " <a id=\"id02\" href=\"\"></a>" + " <b class=\"c3\"></b>" + " <c id=\"d2\"></c>" + "</div>") + + "a:b$$$-c$$@-:d$@-3-e$$@100/#b.c$*3" + ("<a:b001-c03:d5-e100 id=\"b\" class=\"c1\"/>" + "<a:b002-c02:d4-e101 id=\"b\" class=\"c2\"/>" + "<a:b003-c01:d3-e102 id=\"b\" class=\"c3\"/>") + + "ul>li.item${name: item$ price: $\\$}*3" + ("<ul>" + " <li class=\"item1\">name: item1 price: 1$</li>" + " <li class=\"item2\">name: item2 price: 2$</li>" + " <li class=\"item3\">name: item3 price: 3$</li>" + "</ul>")) + +(define-zencoding-transform-html-test-case Properties + "a x" ("<a href=\"\" x=\"\"></a>") + "a x=" ("<a href=\"\" x=\"\"></a>") + "a x=\"\"" ("<a href=\"\" x=\"\"></a>") + "a x=y" ("<a href=\"\" x=\"y\"></a>") + "a x=\"y\"" ("<a href=\"\" x=\"y\"></a>") + "a x=\"()\"" ("<a href=\"\" x=\"()\"></a>") + "a x m" ("<a href=\"\" x=\"\" m=\"\"></a>") + "a x= m=\"\"" ("<a href=\"\" x=\"\" m=\"\"></a>") + "a x=y m=l" ("<a href=\"\" x=\"y\" m=\"l\"></a>") + "a/ x=y m=l" ("<a href=\"\" x=\"y\" m=\"l\"/>") + "a#foo x=y m=l" ("<a id=\"foo\" href=\"\" x=\"y\" m=\"l\"></a>") + "a.foo x=y m=l" ("<a class=\"foo\" href=\"\" x=\"y\" m=\"l\"></a>") + "a#foo.bar.mu x=y m=l" ("<a id=\"foo\" class=\"bar mu\" href=\"\" x=\"y\" m=\"l\"></a>") + "a/#foo.bar.mu x=y m=l" ("<a id=\"foo\" class=\"bar mu\" href=\"\" x=\"y\" m=\"l\"/>") + "a x=y+b" ("<a href=\"\" x=\"y\"></a>" + "<b></b>") + "a x=y+b x=y" ("<a href=\"\" x=\"y\"></a>" + "<b x=\"y\"></b>") + "a x=y>b" ("<a href=\"\" x=\"y\"><b></b></a>") + "a x=y>b x=y" ("<a href=\"\" x=\"y\"><b x=\"y\"></b></a>") + "a x=y>b x=y+c x=y" ("<a href=\"\" x=\"y\">" + " <b x=\"y\"></b>" + " <c x=\"y\"></c>" + "</a>")) + +(define-zencoding-transform-html-test-case Parentheses + "(a)" ("<a href=\"\"></a>") + "(a)+(b)" ("<a href=\"\"></a>" + "<b></b>") + "a>(b)" ("<a href=\"\"><b></b></a>") + "(a>b)>c" ("<a href=\"\"><b></b></a>") + "(a>b)+c" ("<a href=\"\"><b></b></a>" + "<c></c>") + "z+(a>b)+c+k" ("<z></z>" + "<a href=\"\"><b></b></a>" + "<c></c>" + "<k></k>") + "(a)*2" ("<a href=\"\"></a>" + "<a href=\"\"></a>") + "((a)*2)" ("<a href=\"\"></a>" + "<a href=\"\"></a>") + "((a))*2" ("<a href=\"\"></a>" + "<a href=\"\"></a>") + "(a>b)*2" ("<a href=\"\"><b></b></a>" + "<a href=\"\"><b></b></a>") + "(a+b)*2" ("<a href=\"\"></a>" + "<b></b>" + "<a href=\"\"></a>" + "<b></b>")) + +(define-zencoding-transform-html-test-case Text + "a{Click me}" ("<a href=\"\">Click me</a>") + "a>{Click me}*3" ("<a href=\"\">" + " Click me" + " Click me" + " Click me" + "</a>") + "a{click}+b{here}" ("<a href=\"\">click</a>" + "<b>here</b>") + "a>{click}+b{here}" ("<a href=\"\">" + " click" + " <b>here</b>" + "</a>") + + "p>{Click }+a{here}+{ to continue}" + ("<p>" + " Click " + " <a href=\"\">here</a>" + " to continue" + "</p>") + + "p{Click }+a{here}+{ to continue}" + ("<p>Click </p>" + "<a href=\"\">here</a>" + " to continue") + + "xxx#id.cls p=1{txt}" + ("<xxx id=\"id\" class=\"cls\" p=\"1\">txt</xxx>")) + + +(define-zencoding-transform-html-test-case Filter-comment + "a.b|c" ("<!-- .b -->" + "<a class=\"b\" href=\"\"></a>" + "<!-- /.b -->") + "#a>.b|c" ("<!-- #a -->" + "<div id=\"a\">" + " <!-- .b -->" + " <div class=\"b\">" + " </div>" + " <!-- /.b -->" + "</div>" + "<!-- /#a -->")) + +(define-zencoding-transform-html-test-case Filter-HAML + "a|haml" ("%a") + "a#q.x.y.z|haml" ("%a#q.x.y.z") + "a#q.x x=y m=l|haml" ("%a#q.x{:x => \"y\", :m => \"l\"}") + "div|haml" ("%div") + "div.footer|haml" (".footer") + ".footer|haml" (".footer") + + "p>{This is haml}*2+a href=#+br|haml" + ("%p" + " This is haml" + " This is haml" + " %a{:href => \"#\"}" + " %br")) + +(define-zencoding-transform-html-test-case Filter-Hiccup + "a|hic" ("[:a]") + "a#q.x.y.z|hic" ("[:a#q.x.y.z]") + "a#q.x x=y m=l|hic" ("[:a#q.x {:x \"y\", :m \"l\"}]") + ".footer|hic" ("[:div.footer]") + "p>a href=#+br|hic" ("[:p" + " [:a {:href \"#\"}]" + " [:br]]") + + "#q>(a*2>b{x})+p>{m}+b|hic" + ("[:div#q" + " [:a [:b \"x\"]]" + " [:a [:b \"x\"]]" + " [:p" + " \"m\"" + " [:b]]]")) + +(define-zencoding-transform-html-test-case Filter-escape + "script src="|e" ("<script src=\"&quot;\">" + "</script>")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; CSS-abbrev tests + +(defmacro define-zencoding-unit-test-case (name fn &rest tests) + `(zencoding-test-cases 'assign ',name + ,fn + ',(loop for x on tests by #'cddr collect + (cons (car x) (cadr x))))) + +(define-zencoding-unit-test-case CSS-toknize + #'zencoding-css-toknize + "" ("") + "abc" ("abc") + "abc+" ("abc+") + "abc+cde" ("abc" "cde") + "abc++cde" ("abc+" "cde") + "abc+cde+" ("abc" "cde+") + "abc++cde+" ("abc+" "cde+") + "ab:c+0p0x#aa+p0+cde+" ("ab:c+0p0x#aa" "p0" "cde+") + "ab+#0+p+#c+x++cde+" ("ab+#0" "p+#c" "x+" "cde+") + "abc def" ("abc def") + "-abc+-xyz" ("-abc" "-xyz") + "-abc+-10" ("-abc+-10")) + +(define-zencoding-unit-test-case CSS-parse-arg-number + #'zencoding-css-arg-number + "" (error "expected css number arguments") + "0" (("0" "px") . "") + "0-1-2" (("0" "px") . "1-2") + "-100" (("-100" "px") . "") + "-10e-20" (("-10" "em") . "-20") + "35p#a" (("35" "%") . "#a") + " 0p" (("0" "%") . "")) + +(define-zencoding-unit-test-case CSS-parse-arg-color + #'zencoding-css-arg-color + "" (error "expected css color argument") + "abc" (error "expected css color argument") + "#x" (error "expected css color argument") + "#a" ("#aaa" . "") + "#09" ("#090909" . "") + "#3D5-2" ("#3D5" . "-2") + "#1a2B-3" ("#1a2B1a" . "-3") + "#1A2b3x" ("#1A2b31" . "x") + "#1a2B3Cx" ("#1a2B3C" . "x") + "#1A2B3C4D-2" ("#1A2B3C" . "4D-2") + " #abc" ("#abc" . "")) + +(define-zencoding-unit-test-case CSS-parse-arg-something + #'zencoding-css-arg-something + "" (error "expected css argument") + "abc" ("abc" . "") + "abc def" ("abc" . " def") + "url(http://abc.com) auto" ("url(http://abc.com)" . " auto")) + +(define-zencoding-unit-test-case CSS-parse-args + #'zencoding-css-parse-args + "" nil + "1-2--3-4" (("1" "px") ("2" "px") ("-3" "px") ("4" "px")) + "-10-2p-30#abc" (("-10" "px") ("2" "%") ("-30" "px") "#abc") + "1p2x3-4e5x" (("1" "%") ("2" "ex") ("3" "px") ("4" "em") ("5" "ex")) + "#abc#de#f-3" ("#abc" "#dedede" "#fff" ("-3" "px"))) + +(define-zencoding-unit-test-case CSS-split-vendor-prefixes + #'zencoding-css-split-vendor-prefixes + "" ("" nil) + "-abc" ("abc" auto) + "-wmso-abc" ("abc" (119 109 115 111))) + +(define-zencoding-unit-test-case CSS-exprs + #'zencoding-css-expr + "" (("" nil nil)) + "cl:l+ov:h+bg+" (("cl:l" nil nil) ("ov:h" nil nil) ("bg+" nil nil)) + "m10-auto!" (("m" nil t ("10" "px") "auto")) + "bg++c!" (("bg+" nil nil) ("c" nil t)) + "m+0-10-10--20!+p0-0" (("m+" nil t ("0" "px") ("10" "px") ("10" "px") ("-20" "px")) + ("p" nil nil ("0" "px") ("0" "px"))) + "bg+#abc#bc#c-3!" (("bg+" nil t "#abc" "#bcbcbc" "#ccc" ("-3" "px")))) + +(defmacro define-zencoding-transform-css-test-case (name &rest tests) + `(define-zencoding-transform-test-case ,name + 'zencoding-css-transform + ,@tests)) + +(define-zencoding-transform-css-test-case CSS-transform + ;; supplying values with units + "m10" ("margin: 10px;") + "m1.5" ("margin: 1.5em;") + "m1.5ex" ("margin: 1.5ex;") + "m1.5x" ("margin: 1.5ex;") + "m10foo" ("margin: 10foo;") + "m10ex20em" ("margin: 10ex 20em;") + "m10x20e" ("margin: 10ex 20em;") + "m10x-5" ("margin: 10ex -5px;") + ;; Color values + "c#3" ("color: #333;") + "bd5#0rgb" ("border: 5px rgb(0,0,0);") + "bd5#20rgb" ("border: 5px rgb(32,32,32);") + "bd5#0s" ("border: 5px #000 solid;") + "bd5#2rgbs" ("border: 5px rgb(34,34,34) solid;") + ;; Unitless property + "lh2" ("line-height: 2;") + "fw400" ("font-weight: 400;") + ;; + "m0+p0-1p2e3x" ("margin: 0px;" + "padding: 0px 1% 2em 3ex;") + "p!+m10e!+f" ("padding: !important;" + "margin: 10em !important;" + "font: ;") + "fs" ("font-style: italic;") + "xxxxxx 0 auto 0e auto!" ("xxxxxx: 0px auto 0em auto !important;") + "p auto+m auto+bg+#F00 x.jpg 10 10 repeat-x" + ("padding: auto;" + "margin: auto;" + "background: #F00 url(x.jpg) 10px 10px repeat-x;") + "-bdrs" ("-webkit-border-radius: ;" + "-moz-border-radius: ;" + "border-radius: ;") + "-super-foo" ("-webkit-super-foo: ;" + "-moz-super-foo: ;" + "-ms-super-foo: ;" + "-o-super-foo: ;" + "super-foo: ;") + "-wm-trf" ("-webkit-transform: ;" + "-moz-transform: ;" + "transform: ;") + "@m print 1" ("@media print {" + " 1px" + "}") + "@i http://github.com/smihica/index.css" + ("@import url(http://github.com/smihica/index.css);") + ) + +;; start +(zencoding-test-cases)
\ No newline at end of file |