123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499 |
- ;;;_ org-html/tests.el --- Tests for org-html
- ;;;_. Headers
- ;;;_ , License
- ;; Copyright (C) 2010 Tom Breton (Tehom)
- ;; Author: Tom Breton (Tehom) <tehom@panix.com>
- ;; Keywords: lisp, maint, internal
- ;; This file is free software; you can redistribute it and/or modify
- ;; it under the terms of the GNU General Public License as published by
- ;; the Free Software Foundation; either version 2, or (at your option)
- ;; any later version.
- ;; This file is distributed in the hope that it will be useful,
- ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
- ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;; GNU General Public License for more details.
- ;; You should have received a copy of the GNU General Public License
- ;; along with GNU Emacs; see the file COPYING. If not, write to
- ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- ;; Boston, MA 02111-1307, USA.
- ;;;_ , Commentary:
- ;;
- ;;;_ , Requires
- (require 'org-html)
- ;;;_. Body
- ;;;_ , org-id testhelp
- ;;This would go into org-id/testhelp.el if there were such a file
- (defconst org-id:thd:usual-id-locations
- (org-id-alist-to-hash
- '(
- ("file1" "id-1-in-file1")
- ("file1" "id-2-in-file1")
- ("file2" "id-1-in-file2")))
-
- "A stable id-locations table for testing purposes" )
- ;;;_ . Validation
- (emt:deftest-3 org-id:thd:usual-id-locations
- (nil
- (progn
- (emt:doc "Operation: Look up one of the keys we inserted.")
- (emt:doc "Response: It has the value we gave it.")
- (assert
- (equal
- (gethash "id-1-in-file1" org-id:thd:usual-id-locations)
- "file1")))))
- ;;;_ , Config
- ;;;_ . org-html:thd:isolation
- (defconst org-html:thd:isolation
- ;;Can't hope to capture all the org configuration any time soon,
- ;;but let's set it up to some degree.
- ;;It is generally better for this to remain constant than to try to
- ;;sync this with new versions. To change it is effectively to
- ;;write new tests.
- '(let
- (
- (org-export-html-inline-image-extensions
- '("png" "jpeg" "jpg" "gif"))
- (org-html-cvt-link-fn nil)
- (org-export-first-hook nil)
- (org-par-open t)
- (org-url-encoding-use-url-hexify nil)
- ;;To control the org-id lookups
- (org-id-locations
- org-id:thd:usual-id-locations)
- ;;To control `org-default-export-plist'
- (org-export-inbuffer-options-extra nil)
-
- ;;To control `org-infile-export-plist'. Set up for minimal
- ;;export so we can more easily handle examples. When
- ;;specific behavior is to be tested, locally bind the
- ;;controlling variable(s), don't change them here.
- (org-export-html-link-up "")
- (org-export-html-link-home "")
- (org-export-default-language "en")
- (org-export-page-keywords "")
- (org-export-page-description "")
- (org-display-custom-times nil)
- (org-export-headline-levels 100)
- (org-export-with-section-numbers nil)
- (org-export-section-number-format '((("1" ".")) . ""))
- (org-export-with-toc nil)
- (org-export-preserve-breaks nil)
- (org-export-with-archived-trees nil)
- (org-export-with-emphasize nil)
- (org-export-with-sub-superscripts nil)
- (org-export-with-special-strings nil)
- (org-export-with-footnotes nil)
- (org-export-with-drawers nil)
- (org-export-with-tags nil)
- (org-export-with-todo-keywords nil)
- (org-export-with-priority nil)
- (org-export-with-TeX-macros nil)
- (org-export-with-LaTeX-fragments nil)
- (org-export-latex-listings nil)
- (org-export-skip-text-before-1st-heading nil)
- (org-export-with-fixed-width nil)
- (org-export-with-timestamps nil)
- (org-export-author-info nil)
- (org-export-email-info nil)
- (org-export-creator-info nil)
- (org-export-time-stamp-file nil)
- (org-export-with-tables nil)
- (org-export-highlight-first-table-line nil)
- (org-export-html-style-include-default nil)
- (org-export-html-style-include-scripts nil)
- (org-export-html-style "")
- (org-export-html-style-extra "")
- (org-agenda-export-html-style "")
- (org-export-html-link-org-files-as-html nil)
- (org-export-html-inline-images nil)
- (org-export-html-extension "html")
- (org-export-html-xml-declaration
- '(("html" . "<?xml version=\"1.0\" encoding=\"%s\"?>")
- ("php" . "<?php echo \"<?xml version=\\\"1.0\\\" encoding=\\\"%s\\\" ?>\"; ?>")))
- (org-export-html-table-tag
- "<table border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\">")
- (org-export-html-expand nil)
- (org-export-html-with-timestamp nil)
- (org-export-publishing-directory nil)
- (org-export-html-preamble nil)
- (org-export-html-postamble nil)
- (org-export-html-auto-preamble nil)
- (org-export-html-auto-postamble nil)
- (user-full-name "Emtest user")
- (user-mail-address "emtest-user@localhost.localdomain")
- (org-export-select-tags '("export"))
- (org-export-exclude-tags '("noexport"))
- (org-export-latex-image-default-option nil)
- (org-export-plist-vars
- '(
- (:link-up nil org-export-html-link-up)
- (:link-home nil org-export-html-link-home)
- (:language nil org-export-default-language)
- (:keywords nil org-export-page-keywords)
- (:description nil org-export-page-description)
- (:customtime nil org-display-custom-times)
- (:headline-levels "H" org-export-headline-levels)
- (:section-numbers "num" org-export-with-section-numbers)
- (:section-number-format nil org-export-section-number-format)
- (:table-of-contents "toc" org-export-with-toc)
- (:preserve-breaks "\\n" org-export-preserve-breaks)
- (:archived-trees nil org-export-with-archived-trees)
- (:emphasize "*" org-export-with-emphasize)
- (:sub-superscript "^" org-export-with-sub-superscripts)
- (:special-strings "-" org-export-with-special-strings)
- (:footnotes "f" org-export-with-footnotes)
- (:drawers "d" org-export-with-drawers)
- (:tags "tags" org-export-with-tags)
- (:todo-keywords "todo" org-export-with-todo-keywords)
- (:priority "pri" org-export-with-priority)
- (:TeX-macros "TeX" org-export-with-TeX-macros)
- (:LaTeX-fragments "LaTeX" org-export-with-LaTeX-fragments)
- (:latex-listings nil org-export-latex-listings)
- (:skip-before-1st-heading "skip" org-export-skip-text-before-1st-heading)
- (:fixed-width ":" org-export-with-fixed-width)
- (:timestamps "<" org-export-with-timestamps)
- (:author-info "author" org-export-author-info)
- (:email-info "email" org-export-email-info)
- (:creator-info "creator" org-export-creator-info)
- (:time-stamp-file "timestamp" org-export-time-stamp-file)
- (:tables "|" org-export-with-tables)
- (:table-auto-headline nil org-export-highlight-first-table-line)
- (:style-include-default nil org-export-html-style-include-default)
- (:style-include-scripts nil org-export-html-style-include-scripts)
- (:style nil org-export-html-style)
- (:style-extra nil org-export-html-style-extra)
- (:agenda-style nil org-agenda-export-html-style)
- (:convert-org-links nil org-export-html-link-org-files-as-html)
- (:inline-images nil org-export-html-inline-images)
- (:html-extension nil org-export-html-extension)
- (:xml-declaration nil org-export-html-xml-declaration)
- (:html-table-tag nil org-export-html-table-tag)
- (:expand-quoted-html "@" org-export-html-expand)
- (:timestamp nil org-export-html-with-timestamp)
- (:publishing-directory nil org-export-publishing-directory)
- (:preamble nil org-export-html-preamble)
- (:postamble nil org-export-html-postamble)
- (:auto-preamble nil org-export-html-auto-preamble)
- (:auto-postamble nil org-export-html-auto-postamble)
- (:author nil user-full-name)
- (:email nil user-mail-address)
- (:select-tags nil org-export-select-tags)
- (:exclude-tags nil org-export-exclude-tags)
- (:latex-image-options nil org-export-latex-image-default-option)))
- ))
- "Isolation let-form for org-html tests.
- Isolation let-forms are intended to be included by
- `:surrounders'. They provide a known configuration and keep
- tests from altering the outside state." )
- ;;;_ , Examples
- (defconst org-html:thd:examples
- (emt:eg:define+ ;;xmp:tqu804919ze0
- ((project org)
- (library html)
- (subsection link-examples))
- (group
- ((name only-path))
- ;;No src-text because this arglist wouldn't be generated by
- ;;org-export-as-html, though it might be created by custom link
- ;;types.
- (item ((type arglist))
- '("" "foo" nil "desc" nil nil))
- (item ((type link-text))
- "<a href=\"foo\">desc</a>"))
- (group
- ((name only-fragment))
- ;;No src-text, same reason
- (item ((type arglist))
- '("" "" "bar" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"#bar\">desc</a>"))
- (group
- ((name all-3-parts))
- (item ((type src-text))
- "[[http:foo#bar][desc]]")
- (item ((type arglist))
- '("http" "foo" "bar" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"http:foo#bar\">desc</a>"))
- ;;Filename has to be absolute to trigger substitution.
- (group
- ((name subst-in-filename))
- (item ((type src-text))
- "[[file:/foo/unfoo/.././baz][desc]]")
- (item ((type arglist))
- '("file" "/foo/unfoo/.././baz" "" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"file:/foo/baz\">desc</a>"))
- (group
- ((name type=file))
- (item ((type src-text))
- "[[file:foo.txt][desc]]")
- (item ((type arglist))
- '("file" "foo.txt" "" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"file:foo.txt\">desc</a>"))
- ;;We control what location id finds by controlling
- ;;`org-id-locations' in `org-html:thd:isolation'
- (group
- ((name type=id))
- (item ((type src-text))
- "[[id:id-1-in-file1][desc]]")
- (item ((type arglist))
- '("" "file1" "id-1-in-file1" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"file1#id-1-in-file1\">desc</a>"))
- (group
- ((name type=ftp))
- (item ((type src-text))
- "[[ftp:foo.com][desc]]")
- (item ((type arglist))
- '("ftp" "foo.com" "" "desc" nil nil))
- (item ((type link-text))
- "<a href=\"ftp:foo.com\">desc</a>"))
- ;;Punt coderef, internal logic is too hairy, would have to control
- ;;`org-export-get-coderef-format'.
- ;;Punt custom links, would have to make a controlled
- ;;`org-link-protocols', which means identifying and binding every
- ;;variable that `org-add-link-type' alters, then binding
- ;;`org-link-protocols' to empty list, then calling
- ;;`org-add-link-type' (possibly for id as well)
- (group
- ((name convertable))
- (item ((type src-text))
- "[[file:foo.org][desc]]")
- (item ((type arglist))
- '("file" "foo.org" nil "desc" nil nil))
- (group
- ((type link-text))
- (item ((subname old-conversion))
- "<a href=\"http:foo.html\">desc</a>")
- (item ((subname new-conversion))
- "<a href=\"xform:transformed-foo.org\">desc</a>")
- (item ((subname no-conversion))
- "<a href=\"file:foo.org\">desc</a>")))
- ))
- ;;;_ , Helpers
- (defun org-html:th:cvt-fn (opt-plist type path)
- "Trivial URL transformer"
- (declare (ignored opt-plist))
- (list
- "xform"
- (concat "transformed-" path)))
- (defun org-html:th:check-link-matches (expected)
- "Build a link text and check it against expected text.
- Sensitive to emt:eg narrowing."
-
- (assert
- (equal
- (apply #'org-html-make-link
- '(:html-extension "html")
- (emt:eg (type arglist)))
- expected)
- t))
- ;;;_ , org-html-make-link
- (emt:deftest-3
- ((of 'org-html-make-link)
- (:surrounders
- (list
- org-html:thd:isolation
- '(emt:eg:with org-html:thd:examples
- ((project org)
- (library html)
- (subsection link-examples))))))
-
- (nil
- (emt:eg:map name name
- (unless
- (eq name 'convertable)
- (emt:doc "Proves: Example arglist gives the expected result.")
- (org-html:th:check-link-matches
- (emt:eg (type link-text))))))
-
- (nil
- (emt:eg:narrow ((name convertable))
- (let
- (
- (org-export-html-link-org-files-as-html t)
- (org-html-cvt-link-fn nil))
- (emt:doc "Proves: Old org->html conversion works.")
- (org-html:th:check-link-matches
- (emt:eg (type link-text) (subname old-conversion))))))
-
- (nil
- (emt:eg:narrow ((name convertable))
- (let
- (
- (org-export-html-link-org-files-as-html nil)
- (org-html-cvt-link-fn #'org-html:th:cvt-fn))
- (emt:doc "Proves: New file->url conversion works.")
- (org-html:th:check-link-matches
- (emt:eg (type link-text) (subname new-conversion))))))
-
- (nil
- (emt:eg:narrow ((name convertable))
- (let
- (
- (org-export-html-link-org-files-as-html t)
- (org-html-cvt-link-fn #'org-html:th:cvt-fn))
- (emt:doc "Proves: New conversion has precedence over old.")
- (org-html:th:check-link-matches
- (emt:eg (type link-text) (subname new-conversion))))))
-
- ;;Add tests for making images - but it's nearly direct.
- )
- ;;;_ , Helpers
- (defun org-html:th:build-source (type path fragment &optional desc
- descp attr may-inline-p)
- ""
- (declare (ignored descp attr may-inline-p))
- (concat
- "[["type":"
- (org-link-escape path)
- (if fragment
- (cond
- ((string= type "file")(concat "::" fragment))
- ((string= type "http")(concat "#" fragment))))
- "]["desc"]]"))
- ;;;_ . org-html:th:strip-whitepadding
- (defun org-html:th:strip-whitepadding (str)
- ""
-
- (with-temp-buffer
- (insert str)
- (goto-char (point-min))
- (while (search-forward "\n" nil t)
- (replace-match ""))
- (goto-char (point-min))
- (while (search-forward "<p>" nil t)
- (replace-match ""))
- (goto-char (point-min))
- (while (search-forward "</p>" nil t)
- (replace-match ""))
- (buffer-string)))
- ;;;_ , Examples
- (defconst org-html:stripwhite:thd:examples
- (emt:eg:define+ ;;xmp:khpjmfi0aze0
- ((project org)(library html)
- (subsection org-html:th:strip-whitepadding)
- (type string)
- (role before))
- (item ((name 0))
- "\na\nb")
- (item ((name 1))
- "\n<p>ab")
- (item ((name 2))
- "\n</p>a\nb")))
- ;;;_ , Tests
- (emt:deftest-3 org-html:th:strip-whitepadding
- (nil
- (emt:eg:with org-html:stripwhite:thd:examples
- ((project org)(library html)
- (subsection org-html:th:strip-whitepadding))
- (emt:eg:map name name
- (emt:doc
- "Check: The stripped string matches what's expected.")
- (assert
- (string=
- (org-html:th:strip-whitepadding (emt:eg))
- "ab"))))))
- ;;;_ , org-export-as-html
- (emt:deftest-3
- ((of 'org-export-as-html)
- (:surrounders
- (list
- org-html:thd:isolation
- ;;Re-use the link examples.
- '(emt:eg:with org-html:thd:examples
- ((project org)(library html))))))
- (nil
- (emt:eg:narrow ((subsection link-examples))
- (emt:eg:map name name
- (when
- (and
- (not (eq name 'convertable))
- ;;Dormant for id because it wants to find filename
- ;;relative to `org-current-export-file', but for
- ;;buffer export there is none.
- (not (eq name 'type=id))
- (emt:eg:boundp '(type src-text)))
- (emt:doc
- "Situation: the only thing in the buffer is that link")
- (with-buffer-containing-object
- (:string
- (emt:eg (type src-text)))
- (org-mode)
- ;;This calculation has to be done outside the assert
- ;;or it will be done twice.
- (emt:doc "Operation: export the buffer as HTML.")
- (let
- ((result
- (org-html:th:strip-whitepadding
- (org-export-region-as-html
- (point-min)
- (point-max)
- t
- 'string))))
- (emt:doc
- "Proves: Example arglist gives the expected result.")
- (assert
- (string=
- result
- (emt:eg (type link-text)))
- t)))))))
- ;;Could also use testpoints to test that we feed the link-builder
- ;;functions as expected.
- ;;Could also make example files and convert them.
- )
- ;;;_. Footers
- ;;;_ , Provides
- (provide 'org-html/tests)
- ;;;_ * Local emacs vars.
- ;;;_ + Local variables:
- ;;;_ + mode: allout
- ;;;_ + End:
- ;;;_ , End
- ;;; org-html/tests.el ends here
|