Extract jabber-xml-parse-next-stanza, and test it

Move the functionality of reading the next complete stanza into a
separate function, and add some test cases for it.  I'd like to get rid
of jabber-xml-skip-tag-forward at some point, so a good first step
towards that should be moving calls to it into a function that's easy to
test in isolation.
This commit is contained in:
Magnus Henoch 2016-01-24 13:52:22 +00:00
parent d4d7782741
commit 98dc8e429b
4 changed files with 31 additions and 5 deletions

View File

@ -899,10 +899,7 @@ DATA is any sexp."
(while (search-forward-regexp " \\w+=''" nil t)
(replace-match "")))
(setq xml-data (and (catch 'unfinished
(jabber-xml-skip-tag-forward)
(> (point) (point-min)))
(xml-parse-region (point-min) (point))))
(setq xml-data (jabber-xml-parse-next-stanza))
while xml-data
do

View File

@ -133,6 +133,17 @@ enough for us."
(t
(throw 'unfinished nil))))
(defun jabber-xml-parse-next-stanza ()
"Parse the first XML stanza in the current buffer.
Parse and return the first complete XML element in the buffer,
leaving point at the end of it. If there is no complete XML
element, return `nil'."
(and (catch 'unfinished
(goto-char (point-min))
(jabber-xml-skip-tag-forward)
(> (point) (point-min)))
(xml-parse-region (point-min) (point))))
(defsubst jabber-xml-node-name (node)
"Return the tag associated with NODE.
The tag is a lower-case symbol."

View File

@ -2,5 +2,5 @@
# check" or "make distcheck" to work with earlier versions.
LOG_COMPILER = env top_builddir=$(top_builddir) $(EMACS) -batch -L $(top_builddir) -L $(top_srcdir) -L $(srcdir) -l
TESTS = load-all.el skip-tag-forward.el history.el jabberd.el nick-change-fail.el
TESTS += caps-hash.el
TESTS += caps-hash.el parse-next-stanza.el
dist_noinst_DATA = $(TESTS)

View File

@ -0,0 +1,18 @@
;; Tests for jabber-xml-parse-next-stanza
(require 'jabber-xml)
(defun parse-it (text)
(with-temp-buffer
(insert text)
(jabber-xml-parse-next-stanza)))
(unless (equal
(parse-it "<presence from='foo@example.com/resource' type='unavailable' to='bar@example.com'/>")
'((presence ((from . "foo@example.com/resource") (type . "unavailable") (to . "bar@example.com")))))
(error "Testcase 1 failed"))
(unless (equal
(parse-it "<presence from='foo@example.com/resource' ")
nil)
(error "Testcase 2 failed"))