#lang scheme
(require "../main.rkt"
rackunit)
(provide basic-tests)
(define (read-from-string str [ns '()])
(ssax:xml->sxml (open-input-string str) ns))
(define basic-tests
(test-suite "basic ssax tests"
(test-equal? "a plain tag"
(read-from-string "<a />")
`(*TOP* (a)))
(test-equal? "a default namespace"
(read-from-string "<a xmlns=\"gooble\" />")
`(*TOP* (gooble:a)))
(test-equal? "a default namespace applies to sub-elements"
(read-from-string "<a xmlns=\"gooble\" ><b /></a>")
`(*TOP* (gooble:a (gooble:b))))
(test-equal? "a non-default namespace has to be triggered explicitly"
(read-from-string "<a xmlns:ns=\"gooble\" ><b /></a>")
`(*TOP* (a (b))))
(test-equal? "here's how you use a non-default namespace"
(read-from-string "<ns:a xmlns:ns=\"gooble\" ><ns:b /></ns:a>")
`(*TOP* (gooble:a (gooble:b))))
(test-equal? "non-default namespace is non-default"
(read-from-string "<ns:a xmlns:ns=\"gooble\" ><b /></ns:a>")
`(*TOP* (gooble:a (b))))
(test-equal? "you can use the namespace argument to shorten the prefix tag"
(read-from-string "<ns:a xmlns:ns=\"gooble\" ><b /></ns:a>"
`((g . "gooble")))
`(*TOP* (@ (*NAMESPACES* (g "gooble")))
(g:a (b))))
(test-equal? "empty tags are indistinguishable from tags with empty strings"
(read-from-string "<a></a>")
`(*TOP* (a)))
(test-equal? "empty tag 2"
(read-from-string "<a />")
`(*TOP* (a)))
(test-equal? "by default, the SSAX reader discards ... whitespace-only strings?"
(read-from-string "<a>\n</a>")
`(*TOP* (a)))
(test-equal? "discard whitespace 2"
(read-from-string "<a>\nt\n</a>")
`(*TOP* (a "\nt\n")))
(test-exn "parsing empty string fails"
#rx"unexpected EOF"
(lambda () (ssax:xml->sxml (open-input-string "") '())))
(test-equal? "serialization 1"
(srl:sxml->xml `(*TOP* (p)))
"<p />")
(test-exn "serialization bad"
(lambda (e) #t)
(lambda () (srl:sxml->xml '(foo (@ (bar (13)))))))
(let ([temp (make-temporary-file)])
(test-not-exn "serialization accepts paths"
(lambda () (and (path? temp)
(not (string? temp))
(delete-file temp)
(srl:sxml->xml `(*TOP* (p)) temp)))))))