;; test the formatter
(use gauche.test)
(use text.tree)
;;------------------------------------------------
(test-start "formatter")
(use wiliki.format)
(test-module 'wiliki.format)
;;------------------------------------------------
(test-section "scanner")
;; test line scanner
(define (scan string)
(call-with-input-string string
(lambda (p)
(port-map identity
(with-module wiliki.format
(make-line-scanner p))))))
(test* "normal" '()
(scan ""))
(test* "normal" '("a" "b" "c" "d")
(scan "a\nb\nc\nd\n"))
(test* "normal" '("" "b" "c" "d")
(scan "\nb\nc\nd"))
(test* "comment" '("b" "c" "d")
(scan ";;a\nb\nc\nd\n"))
(test* "comment" '("a" "c" "d")
(scan "a\n;;b\nc\nd\n"))
(test* "comment" '("a")
(scan "a\n;;b\n;;c\n;;d\n"))
(test* "line continuation" '("ab" "cd")
(scan "a\n~b\nc\n~d\n"))
(test* "line continuation" '("a" "cd")
(scan "a\n~\nc\n~d\n"))
(test* "line continuation" '("a" "b" "cd")
(scan "~a\nb\nc\n~d\n"))
(test* "line continuation+comment" '("acd")
(scan "a\n;;b\n~c\n~d\n"))
(test* "line continuation+comment" '("abd")
(scan "a\n~b\n;;c\n~d\n"))
(test* "line continuation+comment" '("ab")
(scan "a\n~b\n;;c\n;;d\n"))
(test* "line continuation+comment" '("bd")
(scan ";;a\n~b\n;;c\n~d\n"))
(test* "verbatim" '("a" "{{{" "~b" ";;c" "}}}" "d")
(scan "a\n{{{\n~b\n;;c\n}}}\n~d\n"))
(test* "verbatim" '("{{{" "~b" ";;c" "}}}")
(scan "{{{\n~b\n;;c\n}}}\n"))
(test* "verbatim" '("{{{" "}}}")
(scan "{{{\n}}}\n"))
(test* "verbatim" '("a}}}")
(scan "a\n~}}}\n"))
(test* "verbatim" '("a")
(scan "a\n;;}}}\n"))
(test* "verbatim" '("a" "}}}")
(scan "a\n;;b\n}}}\n"))
;;------------------------------------------------
;; Preparation of contents parsing
;; compare method
;; we assume the result is well-formed, and use ssax to parse the
;; output.
(use sxml.ssax)
(define-macro (tf label expected-sxml code)
`(test ,label ,expected-sxml
(lambda ()
(cadr ;; remove (*TOP* ...)
(call-with-input-string
(tree->string ,code)
(cut ssax:xml->sxml <> '()))))))
(define (page . lines)
(string-join lines "\n" 'suffix))
(define-macro (tp label expected-sxml page)
`(tf ,label ,expected-sxml
(list "
. (tp "ul & ol" '(result (ul (li "A\n" (ol (li "a\n") (li "b\n")))) (ol (li "B\n" (ul (li "c\n") (li "d\n"))))) (page "- A" "## a" "## b" "" "# B" "-- c" "-- d")) (tp "ul & ol" '(result (ul (li "A\n" (ol (li "a\n")) (ul (li "b\n")))) (ol (li "B\n" (ul (li "c\n")) (ol (li "d\n"))))) (page "- A" "## a" "-- b" "# B" "-- c" "## d")) (tp "ul, ol and other blocks" '(result (pre " aaa\n") (ul (li "A\n" (ol (li "a\naa\n")) (ul (li "b\nbb\n")))) (ol (ol (ol (li "c\ncc\n"))) (ul (li "d\ndd\n")))) (page " aaa" "- A" "## a" "aa" "-- b" "bb" "" "### c" "cc" "-- d" "dd")) (tp "ul, ol and verb" '(result (ul (li "A\n" (pre "abba\nbaab\n") "AA\n") (li "B\n" (pre "cddc\ndccd\n"))) (pre "eee\n")) (page "- A" "{{{" "abba" "baab" "}}}" "AA" "- B" "{{{" "cddc" "dccd" "}}}" "" "{{{" "eee" "}}}")) ;;------------------------------------------------ (test-section "block elements (dl)") (tp "dl" '(result (p "aaa\n") (dl (dt "BBB\n") (dd (p "bbb\n")) (dt "ccc\n") (dd (p "CCC\n") (pre " ddd\n") (p "eee\n")) (dt "fff\n") (dd (p "\nggg\n"))) (p "hhh\n")) (page "aaa" ":BBB:bbb" ":ccc:CCC" " ddd" "eee" ":fff:" "ggg" "" "hhh")) (tp "dl & inline" '(result (dl (dt (a (@ (href "http://foo")) "http://foo")) (dd (p "aaa\nbb" (em "bbb"))))) (page ":http://foo:aaa" "bb''bbb''")) (tp "dl & other list" '(result (ul (ul (li "aaa\n" (dl (dt "bbb\n") (dd (p "ccc\n") (ul (li "ddd\n" (ol (li "eee\n"))))))))) (ol (li "fff\n" (dl (dt "ggg\n") (dd (p)))))) (page "-- aaa" ":bbb:ccc" "--- ddd" "#### eee" "# fff" ":ggg:")) (tp "dl & other list" '(result (ul (li "a\n" (dl (dt "b\n") (dd (p)))) (li "c\n"))) (page "- a" ":b:" "- c")) (tp "dl & other list" '(result (ul (ul (li "a\n" (dl (dt "b\n") (dd (p)))) (li "c\n")))) (page "-- a" ":b:" "-- c")) ;; NB: the last "iii" should be enclosed by
. (tp "dl & other blocks" '(result (pre " aaa\n") (dl (dt "bbb\n") (dd (p "ccc\nccc\n") (pre " ddd\n") (pre "eee\nfff\n") (pre "ggg\nhhh\n") (p "iii\n")))) (page " aaa" ":bbb:ccc" "ccc" " ddd" "{{{" "eee" "fff" "}}}" "{{{" "ggg" "hhh" "}}}" "iii")) ;;------------------------------------------------ (test-section "block elements (blockquote)") (tp "blockquote" '(result (p "aaa\n") (blockquote (p "bbb\nccc\n")) (p "ddd\n")) (page "aaa" "<<<" "bbb" "ccc" ">>>" "ddd")) (tp "unclosed blockquote" '(result (blockquote (p "aaa\n"))) (page "<<<" "aaa")) (tp "stray closing blockquote" '(result (p "aaa\n>>>\n")) (page "aaa" ">>>")) (tp "paragraph in blockquote" '(result (blockquote (p "aaa\n") (p "bbb\n") (pre " ccc\n"))) (page "<<<" "aaa" "" "bbb" " ccc" ">>>")) (tp "nested blockquote" '(result (p "aaa\n") (blockquote (p "bbb\n") (blockquote (blockquote (p "ccc\n")) (p "ddd\n")) (p "eee\n")) (p "fff\n")) (page "aaa" "<<<" "bbb" "<<<" "<<<" "ccc" ">>>" "ddd" ">>>" "eee" ">>>" "fff")) (tp "blockquote & lists" '(result (ul (li (blockquote (ul (li "aaa\n"))) "bbb\n") (li (blockquote (p "ccc\n") (ol (li "ddd\n"))))) (ol (li "eee\n"))) (page "- " "<<<" "- aaa" ">>>" "bbb" "- " "<<<" "ccc" "# ddd" ">>>" "# eee")) (tp "blockquote & dl" '(result (blockquote (dl (dt "aaa\n") (dd (p) (blockquote (p "bbb\n") (p "ccc\n")) (p "ddd\n")) (dt "eee\n") (dd (p))) (p "fff\n"))) (page "<<<" ":aaa:" "<<<" "bbb" "" "ccc" ">>>" "ddd" ":eee:" "" "fff")) ;;------------------------------------------------ (test-section "block elements (table)") (tp "basic table" '(result (table (@ (class "inbody") (cellspacing "0") (border "1")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "a\n") (td (@ (class "inbody")) "b\n") (td (@ (class "inbody")) "c\n")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "d\n") (td (@ (class "inbody")) "e\n") (td (@ (class "inbody")) "f\n"))) (table (@ (class "inbody") (cellspacing "0") (border "1")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "g\n") (td (@ (class "inbody")) "h\n") (td (@ (class "inbody")) "i\n")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "j\n") (td (@ (class "inbody")) "k\n") (td (@ (class "inbody")) "l\n")))) (page "||a||b||c||" "||d||e||f||" "" "||g||h||i||" "||j||k||l||") ) (tp "table & other block elements" '(result (blockquote (table (@ (class "inbody") (cellspacing "0") (border "1")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "a\n"))) (ul (li "b\n")) (p "c\n") (table (@ (class "inbody") (cellspacing "0") (border "1")) (tr (@ (class "inbody")) (td (@ (class "inbody")) "d\n"))))) (page "<<<" "||a||" "- b" "" "c" "||d||" ">>>")) ;;------------------------------------------------ (test-section "block elements (hr)") (tp "hr" '(result (p "aa\nbb\n") (hr) (p "cc\ndd\n")) (page "aa" "bb" "----" "cc" "dd")) (tp "hr&pre" '(result (pre " aa\n bb\n") (hr) (pre " cc\n dd\n")) (page " aa" " bb" "----" " cc" " dd")) (tp "hr&list" '(result (ul (li "aa\n")) (hr) (p"cc\ndd\n")) (page "- aa" "----" "cc" "dd")) ;;------------------------------------------------ (test-section "block elements (headings)") (define (hid . lis) (wiliki:calculate-heading-id lis)) (tp "headings" `(result (h2 (@ (id ,(hid "aa"))) "aa\n") (h3 (@ (id ,(hid "bb" "aa"))) "bb\n") (h4 (@ (id ,(hid "cc" "bb" "aa"))) "cc\n") (h5 (@ (id ,(hid "dd" "cc" "bb" "aa"))) "dd\n") (h6 (@ (id ,(hid "ee" "dd" "cc" "bb" "aa"))) "ee\n")) (page "* aa" "** bb" "*** cc" "**** dd" "***** ee")) (tp "headings (id)" `(result (h2 (@ (id ,(hid "aa"))) "aa\n") (h5 (@ (id ,(hid "bb" "aa"))) "bb\n") (h3 (@ (id ,(hid "cc" "aa"))) "cc\n") (h5 (@ (id ,(hid "bb" "cc" "aa"))) "bb\n") (h2 (@ (id ,(hid "bb"))) "bb\n") (h3 (@ (id ,(hid "cc" "bb"))) "cc\n")) (page "* aa" "**** bb" "** cc" "**** bb" "* bb" "** cc")) (tp "headings&list, pre" `(result (p "aaa\n") (h2 (@ (id ,(hid "aa"))) "aa\n") (ul (li "bb\n")) (h3 (@ (id ,(hid "cc" "aa"))) "cc\n") (pre " dd\n") (h4 (@ (id ,(hid "ee" "cc" "aa"))) "ee\n")) (page "aaa" "* aa" "- bb" "** cc" " dd" "*** ee")) ;;------------------------------------------------ (test-section "wikiname") ;; default handler (tp "wikiname" `(result (p "[[aa]]\n")) (page "[[aa]]")) (tp "wikiname" `(result (p "bb[[aa]]\n")) (page "bb[[aa]]")) (tp "wikiname" `(result (p "bb[[aa\n")) (page "bb[[aa")) (tp "wikiname" `(result (p "bb[[aa[[cc\n")) (page "bb[[aa[[cc")) (tp "wikiname" `(result (p "bb[[[[cc\n")) (page "bb[[[[cc")) (tp "wikiname" `(result (p "bb[[[[cc]]\n")) (page "bb[[[[cc]]")) (test-end)