2019-05-20 18:52:28 +02:00
|
|
|
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 {
|
2019-06-11 11:05:57 +02:00
|
|
|
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())
|
2019-06-11 21:17:06 +02:00
|
|
|
|
2019-06-11 11:05:57 +02:00
|
|
|
assert.are_same(
|
2019-06-11 21:17:06 +02:00
|
|
|
pandoc.List:new(attr_from_list.attributes),
|
2019-06-11 11:05:57 +02:00
|
|
|
attributes_list
|
|
|
|
)
|
2019-06-11 21:17:06 +02:00
|
|
|
|
|
|
|
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)
|
2019-06-11 11:05:57 +02:00
|
|
|
assert.are_same(
|
2019-06-11 21:17:06 +02:00
|
|
|
assoc_list_from_table,
|
2019-06-11 11:05:57 +02:00
|
|
|
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),
|
2019-06-11 19:39:42 +02:00
|
|
|
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),
|
2019-06-11 11:05:57 +02:00
|
|
|
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)
|
|
|
|
},
|
|
|
|
},
|
2019-06-12 18:58:38 +02:00
|
|
|
|
|
|
|
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),
|
|
|
|
},
|
|
|
|
|
2019-05-20 18:52:28 +02:00
|
|
|
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)
|
|
|
|
},
|
2019-08-15 22:53:02 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
2019-05-20 18:52:28 +02:00
|
|
|
}
|