SILE = require("core.sile")
SILE.backend = "dummy"
SILE.init()
SILE.utilities.error = error
describe("#XML #inputter", function ()
local inputter = SILE.inputters.xml()
describe("should parse", function ()
it("commands with content", function()
local t = inputter:parse([[<foo>bar</foo>]])[1][1]
assert.is.equal("foo", t.command)
assert.is.equal("bar", t[1])
end)
it("commands without content", function()
local t = inputter:parse([[<foo><bar /> baz</foo>]])[1][1]
assert.is.equal("foo", t.command)
assert.is.equal("bar", t[1].command)
assert.is.equal(" baz", t[2])
assert.is.equal(nil, t[1][1])
end)
it("commands with arg", function()
local t = inputter:parse([[<foo baz="qiz">bar</foo>]])[1][1]
assert.is.equal("foo", t.command)
assert.is.equal("qiz", t.options.baz)
assert.is.equal("bar", t[1])
end)
it("commands with multiple args", function()
local t = inputter:parse([[<foo baz="qiz" qiz="baz">bar</foo>]])[1][1]
assert.is.equal("foo", t.command)
assert.is.equal("qiz", t.options.baz)
assert.is.equal("baz", t.options.qiz)
assert.is.equal("bar", t[1])
end)
end)
describe("should reject", function ()
it("commands with bad characters", function()
assert.has_error(function() inputter:parse([[<" />]]) end,
"not well-formed (invalid token)")
assert.has_error(function() inputter:parse([[<' />]]) end,
[[not well-formed (invalid token)]])
assert.has_error(function() inputter:parse([[<"o></"o>]]) end,
[[not well-formed (invalid token)]])
end)
it("commands with unclosed content", function()
assert.has_error(function() inputter:parse([[<foo>bar]]) end,
[[no element found]])
end)
it("mismatched environments", function()
assert.has_error(function() inputter:parse([[<foo><bar>baz</foo></bar>]]) end,
[[mismatched tag]])
end)
end)
end)