;;; xml-parse-tests.el --- Test suite for XML parsing. ;; Copyright (C) 2012 Free Software Foundation, Inc. ;; Author: Chong Yidong ;; Keywords: internal ;; Human-Keywords: internal ;; This file is part of GNU Emacs. ;; GNU Emacs 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 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs 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. If not, see . ;;; Commentary: ;; Type M-x test-xml-parse RET to generate the test buffer. ;;; Code: (require 'xml) (defvar xml-parse-tests--data `(;; General entity substitution ("]>&ent;;" . ((foo ((a . "b")) (bar nil "AbC;")))) ("&amp;&apos;'<>"" . ((foo () "&''<>\""))) ;; Parameter entity substitution ("]>&ent;;" . ((foo ((a . "b")) (bar nil "AbC;")))) ;; Tricky parameter entity substitution (like XML spec Appendix D) ("' > %xx; ]>A&ent;C" . ((foo () "AbC"))) ;; Bug#7172 (" ]>" . ((foo ()))) ;; Entities referencing entities, in character data ("]>&abc;" . ((foo () "aBc"))) ;; Entities referencing entities, in attribute values ("]>1" . ((foo ((a . "-aBc-")) "1"))) ;; Character references must be treated as character data ("AT&T;" . ((foo () "AT&T;"))) ("&amp;" . ((foo () "&"))) ("&amp;" . ((foo () "&"))) ;; Unusual but valid XML names [5] ("<ÀÖØö.3·-‿⁀󯿿>abc" . ((,(intern "ÀÖØö.3·-‿⁀󯿿") () "abc"))) ("<:>abc" . ((,(intern ":") () "abc")))) "Alist of XML strings and their expected parse trees.") (defvar xml-parse-tests--bad-data '(;; XML bomb in content "]>&lol2;" ;; XML bomb in attribute value "]>!" ;; Non-terminating DTD "" "asdf" "asdf&abc;" ;; Invalid XML names "<0foo>abc" "<‿foo>abc" "abc") "List of XML strings that should signal an error in the parser") (ert-deftest xml-parse-tests () "Test XML parsing." (with-temp-buffer (dolist (test xml-parse-tests--data) (erase-buffer) (insert (car test)) (should (equal (cdr test) (xml-parse-region)))) (let ((xml-entity-expansion-limit 50)) (dolist (test xml-parse-tests--bad-data) (erase-buffer) (insert test) (should-error (xml-parse-region)))))) ;; Local Variables: ;; no-byte-compile: t ;; End: ;;; xml-parse-tests.el ends here.