require 'helper'
describe PandocRuby do
before do
@file = File.join(File.dirname(__FILE__), 'files', 'test.md')
@file2 = File.join(File.dirname(__FILE__), 'files', 'test2.md')
@string = '# Test String'
@converter = PandocRuby.new(@string, :t => :rst)
end
after do
PandocRuby.pandoc_path = 'pandoc'
end
it 'calls bare pandoc when passed no options' do
converter = PandocRuby.new(@string)
converter.expects(:execute).with('pandoc').returns(true)
assert converter.convert
end
it 'converts with altered pandoc_path' do
path = '/usr/bin/env pandoc'
PandocRuby.pandoc_path = path
converter = PandocRuby.new(@string)
converter.expects(:execute).with(path).returns(true)
assert converter.convert
end
it 'converts input passed as a string' do
assert_equal "
Test String
\n",
PandocRuby.new(@string).to_html
end
it 'converts single element array input as array of file paths' do
assert PandocRuby.new([@file]).to_html.match(/This is a Title/)
end
it 'converts multiple element array input as array of file paths' do
assert PandocRuby.new([@file, @file2]).to_html.match(/This is a Title/)
assert PandocRuby.new([@file, @file2]).to_html.match(/A Second Title/)
end
it 'converts multiple element array input as array of file paths to a binary output format' do
assert PandocRuby.new([@file, @file2]).to_epub.match(/com.apple.ibooks/)
end
it 'accepts short options' do
@converter.expects(:execute).with('pandoc -t rst').returns(true)
assert @converter.convert
end
it 'accepts long options' do
converter = PandocRuby.new(@string, :to => :rst)
converter.expects(:execute).with('pandoc --to rst').returns(true)
assert converter.convert
end
it 'accepts a variety of options in initializer' do
converter = PandocRuby.new(@string, :s, {
:f => :markdown, :to => :rst
}, 'no-wrap')
converter \
.expects(:execute) \
.with('pandoc -s -f markdown --to rst --no-wrap') \
.returns(true)
assert converter.convert
end
it 'accepts a variety of options in convert' do
converter = PandocRuby.new(@string)
converter \
.expects(:execute) \
.with('pandoc -s -f markdown --to rst --no-wrap') \
.returns(true)
assert converter.convert(:s, { :f => :markdown, :to => :rst }, 'no-wrap')
end
it 'converts underscore symbol args to hyphenated long options' do
converter = PandocRuby.new(@string, {
:email_obfuscation => :javascript
}, :table_of_contents)
converter \
.expects(:execute) \
.with('pandoc --email-obfuscation javascript --table-of-contents') \
.returns(true)
assert converter.convert
end
it 'uses second arg as option' do
converter = PandocRuby.new(@string, 'toc')
converter.expects(:execute).with('pandoc --toc').returns(true)
assert converter.convert
end
it 'passes command line options without modification' do
converter = PandocRuby.new(
@string,
'+RTS', '-M512M', '-RTS', '--to=markdown', '--no-wrap'
)
converter.expects(:execute).with(
'pandoc +RTS -M512M -RTS --to=markdown --no-wrap'
).returns(true)
assert converter.convert
end
it 'supports reader extensions' do
assert_equal(
PandocRuby.convert(
"Line 1\n# Heading",
:from => 'markdown_strict',
:to => 'html'
),
"Line 1
\nHeading
\n"
)
assert_equal(
PandocRuby.convert(
"Line 1\n# Heading",
:from => 'markdown_strict+blank_before_header',
:to => 'html'
),
"Line 1 # Heading
\n"
)
end
it 'supports writer extensions' do
assert_equal(
PandocRuby.convert(
"example\n",
:from => 'html',
:to => 'markdown'
),
"~example~\n"
)
assert_equal(
PandocRuby.convert(
"example\n",
:from => 'html',
:to => 'markdown-subscript'
),
"example\n"
)
end
it 'supports output filenames without spaces' do
Tempfile.create('example') do |file|
PandocRuby.convert(
'# Example',
:from => 'markdown',
:to => 'html',
:output => file.path
)
file.rewind
assert_equal("Example
\n", file.read)
end
end
it 'supports output filenames without spaces' do
Tempfile.create('example with spaces') do |file|
PandocRuby.convert(
'# Example',
:from => 'markdown',
:to => 'html',
:output => file.path
)
file.rewind
assert_equal("Example
\n", file.read)
end
end
it 'raises RuntimeError from pandoc executable error' do
assert_raises(RuntimeError) do
PandocRuby.new('# hello', 'badopt').to_html5
end
end
PandocRuby::READERS.each_key do |r|
it "converts from #{r} with PandocRuby.#{r}" do
converter = PandocRuby.send(r, @string)
converter.expects(:execute).with("pandoc --from #{r}").returns(true)
assert converter.convert
end
end
PandocRuby::STRING_WRITERS.each_key do |w|
it "converts to #{w} with to_#{w}" do
converter = PandocRuby.new(@string)
converter \
.expects(:execute) \
.with("pandoc --no-wrap --to #{w}") \
.returns(true)
assert converter.send("to_#{w}", :no_wrap)
end
end
PandocRuby::BINARY_WRITERS.each_key do |w|
it "converts to #{w} with to_#{w}" do
converter = PandocRuby.new(@string)
converter \
.expects(:execute) \
.with(regexp_matches(/^pandoc --no-wrap --to #{w} --output /)) \
.returns(true)
assert converter.send("to_#{w}", :no_wrap)
end
end
it 'works with strings' do
converter = PandocRuby.new('## this is a title')
assert_match(/h2/, converter.convert)
end
it 'accepts blank strings' do
converter = PandocRuby.new('')
assert_match("\n", converter.convert)
end
it 'accepts nil and treats like a blank string' do
converter = PandocRuby.new(nil)
assert_match("\n", converter.convert)
end
it 'aliases to_s' do
assert_equal @converter.convert, @converter.to_s
end
it 'has convert class method' do
assert_equal @converter.convert, PandocRuby.convert(@string, :t => :rst)
end
it 'runs more than 400 times without error' do
begin
400.times do
PandocRuby.convert(@string)
end
assert true
rescue Errno::EMFILE, Errno::EAGAIN => e
flunk e
end
end
it 'gracefully times out when pandoc hangs due to malformed input' do
skip(%(
Pandoc no longer times out with test file. Determine how to test.
))
file = File.join(File.dirname(__FILE__), 'files', 'bomb.tex')
contents = File.read(file)
assert_raises(RuntimeError) do
PandocRuby.convert(
contents, :from => :latex, :to => :html, :timeout => 1
)
end
end
it 'has reader and writer constants' do
assert_equal(
PandocRuby::READERS,
'commonmark' => 'CommonMark Markdown',
'creole' => 'Creole 1.0',
'csv' => 'CSV table',
'docbook' => 'DocBook',
'docx' => 'Word docx',
'dokuwiki' => 'DokuWiki markup',
'epub' => 'EPUB',
'fb2' => 'FictionBook2 e-book',
'gfm' => 'GitHub-Flavored Markdown',
'haddock' => 'Haddock markup',
'html' => 'HTML',
'ipynb' => 'Jupyter notebook',
'jats' => 'JATS XML',
'jira' => 'Jira wiki markup',
'json' => 'JSON version of native AST',
'latex' => 'LaTex',
'man' => 'roff man',
'markdown' => "Pandoc's Markdown",
'markdown_mmd' => 'MultiMarkdown',
'markdown_phpextra' => 'PHP Markdown Extra',
'markdown_strict' => 'original unextended Markdown',
'mediawiki' => 'MediaWiki markup',
'muse' => 'Muse',
'native' => 'native Haskell',
'odt' => 'ODT',
'opml' => 'OPML',
'org' => 'Emacs Org mode',
'rst' => 'reStructuredText',
't2t' => 'txt2tags',
'textile' => 'Textile',
'tikiwiki' => 'TikiWiki markup',
'twiki' => 'TWiki markup',
'vimwiki' => 'Vimwiki'
)
assert_equal(
PandocRuby::STRING_WRITERS,
'asciidoc' => 'AsciiDoc',
'asciidoctor' => 'AsciiDoctor',
'beamer' => 'LaTeX beamer slide show',
'commonmark' => 'CommonMark Markdown',
'context' => 'ConTeXt',
'docbook' => 'DocBook 4',
'docbook4' => 'DocBook 4',
'docbook5' => 'DocBook 5',
'dokuwiki' => 'DokuWiki markup',
'fb2' => 'FictionBook2 e-book',
'gfm' => 'GitHub-Flavored Markdown',
'haddock' => 'Haddock markup',
'html' => 'HTML, i.e. HTML5/XHTML polyglot markup',
'html5' => 'HTML, i.e. HTML5/XHTML polyglot markup',
'html4' => 'XHTML 1.0 Transitional',
'icml' => 'InDesign ICML',
'ipynb' => 'Jupyter notebook',
'jats_archiving' => 'JATS XML, Archiving and Interchange Tag Set',
'jats_articleauthoring' => 'JATS XML, Article Authoring Tag Set',
'jats_publishing' => 'JATS XML, Journal Publishing Tag Set',
'jats' => 'alias for jats_archiving',
'jira' => 'Jira wiki markup',
'json' => 'JSON version of native AST',
'latex' => 'LaTex',
'man' => 'roff man',
'markdown' => "Pandoc's Markdown",
'markdown_mmd' => 'MultiMarkdown',
'markdown_phpextra' => 'PHP Markdown Extra',
'markdown_strict' => 'original unextended Markdown',
'mediawiki' => 'MediaWiki markup',
'ms' => 'roff ms',
'muse' => 'Muse',
'native' => 'native Haskell',
'opml' => 'OPML',
'opendocument' => 'OpenDocument',
'org' => 'Emacs Org mode',
'pdf' => 'PDF',
'plain' => 'plain text',
'pptx' => 'PowerPoint slide show',
'rst' => 'reStructuredText',
'rtf' => 'Rich Text Format',
'texinfo' => 'GNU Texinfo',
'textile' => 'Textile',
'slideous' => 'Slideous HTML and JavaScript slide show',
'slidy' => 'Slidy HTML and JavaScript slide show',
'dzslides' => 'DZSlides HTML5 + JavaScript slide show',
'revealjs' => 'reveal.js HTML5 + JavaScript slide show',
's5' => 'S5 HTML and JavaScript slide show',
'tei' => 'TEI Simple',
'xwiki' => 'XWiki markup',
'zimwiki' => 'ZimWiki markup'
)
assert_equal(
PandocRuby::BINARY_WRITERS,
'odt' => 'OpenOffice text document',
'docx' => 'Word docx',
'epub' => 'EPUB v2',
'epub2' => 'EPUB v2',
'epub3' => 'EPUB v3'
)
assert_equal(
PandocRuby::WRITERS,
PandocRuby::STRING_WRITERS.merge(PandocRuby::BINARY_WRITERS)
)
end
end