2712d3e869
Traversal methods are updated to use the new Walk module such that sequences with nested Inline (or Block) elements are traversed in the order in which they appear in the linearized document. Fixes: #5667
212 lines
6.8 KiB
Lua
212 lines
6.8 KiB
Lua
local tasty = require 'tasty'
|
|
|
|
local test = tasty.test_case
|
|
local group = tasty.test_group
|
|
local assert = tasty.assert
|
|
|
|
function os_is_windows ()
|
|
return package.config:sub(1,1) == '\\'
|
|
end
|
|
|
|
return {
|
|
group 'Attr' {
|
|
group 'Constructor' {
|
|
test('returns null-Attr if no arguments are given', function ()
|
|
local attr = pandoc.Attr()
|
|
assert.are_equal(attr.identifier, '')
|
|
assert.are_same(attr.classes, {})
|
|
assert.are_same(attr.attributes, {})
|
|
end),
|
|
test(
|
|
'accepts string-indexed table or list of pairs as attributes',
|
|
function ()
|
|
local attributes_list = pandoc.List:new {{'one', '1'}, {'two', '2'}}
|
|
local attr_from_list = pandoc.Attr('', {}, attributes_list:clone())
|
|
|
|
assert.are_same(
|
|
pandoc.List:new(attr_from_list.attributes),
|
|
attributes_list
|
|
)
|
|
|
|
local attributes_table = {one = '1', two = '2'}
|
|
local attr_from_table = pandoc.Attr('', {}, attributes_table)
|
|
|
|
local assoc_list_from_table =
|
|
pandoc.List:new(attr_from_table.attributes)
|
|
-- won't work in general, but does in this special case
|
|
table.sort(assoc_list_from_table, function(x, y) return x[1]<y[1] end)
|
|
assert.are_same(
|
|
assoc_list_from_table,
|
|
attributes_list
|
|
)
|
|
end
|
|
)
|
|
},
|
|
group 'AttributeList' {
|
|
test('allows access via fields', function ()
|
|
local attributes = pandoc.Attr('', {}, {{'a', '1'}, {'b', '2'}}).attributes
|
|
assert.are_equal(attributes.a, '1')
|
|
assert.are_equal(attributes.b, '2')
|
|
end),
|
|
test('allows access to pairs via numerical indexing', function ()
|
|
local attributes = pandoc.Attr('', {}, {{'a', '1'}, {'b', '2'}}).attributes
|
|
assert.are_same(attributes[1], {'a', '1'})
|
|
assert.are_same(attributes[2], {'b', '2'})
|
|
end),
|
|
test('adds entries by field name', function ()
|
|
local attributes = pandoc.Attr('',{}, {{'c', '1'}, {'d', '2'}}).attributes
|
|
attributes.e = '3'
|
|
assert.are_same(
|
|
-- checking the full AttributeList would "duplicate" entries
|
|
setmetatable(attributes, nil),
|
|
{{'c', '1'}, {'d', '2'}, {'e', '3'}}
|
|
)
|
|
end),
|
|
test('deletes entries by field name', function ()
|
|
local attributes = pandoc.Attr('',{}, {a = '1', b = '2'}).attributes
|
|
attributes.a = nil
|
|
assert.is_nil(attributes.a)
|
|
local assoc_list = setmetatable(attributes, nil)
|
|
assert.are_same(assoc_list, {{'b', '2'}})
|
|
end),
|
|
test('remains unchanged if deleted key did not exist', function ()
|
|
local assoc_list = pandoc.List:new {{'alpha', 'x'}, {'beta', 'y'}}
|
|
local attributes = pandoc.Attr('', {}, assoc_list:clone()).attributes
|
|
attributes.a = nil
|
|
assert.are_same(pandoc.List:new(attributes), assoc_list)
|
|
end),
|
|
test('gives key-value pairs when iterated-over', function ()
|
|
local attributes = {width = '11', height = '22', name = 'test'}
|
|
local attr = pandoc.Attr('', {}, attributes)
|
|
local count = 0
|
|
for k, v in pairs(attr.attributes) do
|
|
assert.are_equal(attributes[k], v)
|
|
count = count + 1
|
|
end
|
|
assert.are_equal(count, 3)
|
|
end)
|
|
},
|
|
},
|
|
|
|
group 'clone' {
|
|
test('clones Attr', function ()
|
|
local attr = pandoc.Attr('test', {'my-class'}, {foo = 'bar'})
|
|
local cloned = attr:clone()
|
|
attr.identifier = ''
|
|
attr.classes = {}
|
|
attr.attributes = {}
|
|
assert.are_same(cloned.identifier, 'test')
|
|
assert.are_same(cloned.classes, {'my-class'})
|
|
assert.are_same(cloned.attributes.foo, 'bar')
|
|
end),
|
|
test('clones ListAttributes', function ()
|
|
local la = pandoc.ListAttributes(2, pandoc.DefaultStyle, pandoc.Period)
|
|
local cloned = la:clone()
|
|
la.start = 9
|
|
assert.are_same(cloned.start, 2)
|
|
end),
|
|
test('clones Para', function ()
|
|
local para = pandoc.Para {pandoc.Str 'Hello'}
|
|
local cloned = para:clone()
|
|
para.content[1].text = 'bye'
|
|
assert.are_same(cloned, pandoc.Para {pandoc.Str 'Hello'})
|
|
end),
|
|
test('clones Str', function ()
|
|
local str = pandoc.Str 'Hello'
|
|
local cloned = str:clone()
|
|
str.text = 'bye'
|
|
assert.are_same(cloned.text, 'Hello')
|
|
end),
|
|
test('clones Citation', function ()
|
|
local cite = pandoc.Citation('leibniz', pandoc.AuthorInText)
|
|
local cloned = cite:clone()
|
|
cite.id = 'newton'
|
|
assert.are_same(cloned.id, 'leibniz')
|
|
end),
|
|
},
|
|
|
|
group 'pipe' {
|
|
test('external string processing', function ()
|
|
if os_is_windows() then
|
|
local pipe_result = pandoc.pipe('find', {'hi'}, 'hi')
|
|
assert.are_equal('hi', pipe_result:match '%a+')
|
|
else
|
|
local pipe_result = pandoc.pipe('tr', {'a', 'b'}, 'abc')
|
|
assert.are_equal('bbc', pipe_result:match '%a+')
|
|
end
|
|
end),
|
|
test('failing pipe', function ()
|
|
if os_is_windows() then
|
|
local success, err = pcall(pandoc.pipe, 'find', {'/a'}, 'hi')
|
|
assert.is_falsy(success)
|
|
assert.are_equal('find', err.command)
|
|
assert.is_truthy(err.error_code ~= 0)
|
|
else
|
|
local success, err = pcall(pandoc.pipe, 'false', {}, 'abc')
|
|
assert.is_falsy(success)
|
|
assert.are_equal('false', err.command)
|
|
assert.are_equal(1, err.error_code)
|
|
assert.are_equal('', err.output)
|
|
end
|
|
end)
|
|
},
|
|
|
|
group 'read' {
|
|
test('Markdown', function ()
|
|
local valid_markdown = '*Hello*, World!\n'
|
|
local expected = pandoc.Pandoc({
|
|
pandoc.Para {
|
|
pandoc.Emph { pandoc.Str 'Hello' },
|
|
pandoc.Str ',',
|
|
pandoc.Space(),
|
|
pandoc.Str 'World!'
|
|
}
|
|
})
|
|
assert.are_same(expected, pandoc.read(valid_markdown))
|
|
end),
|
|
test('failing read', function ()
|
|
assert.error_matches(
|
|
function () pandoc.read('foo', 'nosuchreader') end,
|
|
'Unknown reader: nosuchreader'
|
|
)
|
|
end)
|
|
},
|
|
|
|
group 'walk_block' {
|
|
test('block walking order', function ()
|
|
local acc = {}
|
|
local nested_nums = pandoc.Div {
|
|
pandoc.Para{pandoc.Str'1'},
|
|
pandoc.Div{
|
|
pandoc.Para{pandoc.Str'2'},
|
|
pandoc.Para{pandoc.Str'3'}
|
|
},
|
|
pandoc.Para{pandoc.Str'4'}
|
|
}
|
|
pandoc.walk_block(
|
|
nested_nums,
|
|
{Para = function (p) table.insert(acc, p.content[1].text) end}
|
|
)
|
|
assert.are_equal('1234', table.concat(acc))
|
|
end)
|
|
},
|
|
|
|
group 'walk_inline' {
|
|
test('inline walking order', function ()
|
|
local acc = {}
|
|
local nested_nums = pandoc.Span {
|
|
pandoc.Str'1',
|
|
pandoc.Emph {
|
|
pandoc.Str'2',
|
|
pandoc.Str'3'
|
|
},
|
|
pandoc.Str'4'
|
|
}
|
|
pandoc.walk_inline(
|
|
nested_nums,
|
|
{Str = function (s) table.insert(acc, s.text) end}
|
|
)
|
|
assert.are_equal('1234', table.concat(acc))
|
|
end)
|
|
}
|
|
}
|