# LAMMPS Documentation Utilities
#
# Copyright (C) 2015 Richard Berger
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
import unittest
import tempfile
import io
import os
from lammpsdoc import txt2html
class TestBasicFormatting(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_empty_string(self):
self.assertEqual(self.txt2html.convert(""), "\n"
"\n")
def test_single_paragraph(self):
self.assertEqual(self.txt2html.convert("Hello World!\n"), "\n"
"
Hello World!\n"
"
\n"
"\n")
def test_two_paragraphs(self):
s = self.txt2html.convert("Hello World!\n\nBye World!\n")
self.assertEqual(s, "\n"
"Hello World!\n"
"
\n"
"Bye World!\n"
"
\n"
"\n")
def test_line_concat(self):
s = self.txt2html.convert("Hello World!\\\nBye World!\n")
self.assertEqual(s, "\n"
"Hello World!Bye World!\n"
"
\n"
"\n")
def test_html_pass_through(self):
s = self.txt2html.convert("Raw HTML
\n")
self.assertEqual(s, "\n"
"Raw HTML
\n\n"
"\n")
def test_ignore_rst(self):
s = self.txt2html.convert("\n")
self.assertEqual("\n"
"\n", s)
def test_ignore_html_only_markup(self):
s = self.txt2html.convert("\n"
"Hello World!\n"
"\n")
self.assertEqual("\n"
"\n"
"Hello World!\n"
"\n\n"
"\n", s)
class TestMarkup(unittest.TestCase):
def setUp(self):
self.markup = txt2html.HTMLMarkup()
self.txt2html = txt2html.Txt2Html()
def test_bold(self):
self.assertEqual("bold", self.markup.convert("[bold]"))
def test_italic(self):
self.assertEqual("italic", self.markup.convert("{italic}"))
def test_escape_markup(self):
s = self.markup.convert("[bold] = \\[bold\\]\n"
"{italic} = \\{italic\\}\n")
self.assertEqual("bold = [bold]\n"
"italic = {italic}\n", s)
def test_link_markup(self):
self.assertEqual("Text", self.markup.convert('"Text"_link'))
def test_multiline_link_markup(self):
s = self.txt2html.convert('"Te\n'
'xt"_link')
self.assertEqual("\n"
"Te\n"
"xt\n"
"
\n"
"\n", s)
def test_ignore_punctuation_in_link(self):
self.assertEqual("Text.", self.markup.convert('"Text"_link.'))
self.assertEqual("Text,", self.markup.convert('"Text"_link,'))
self.assertEqual("Text;", self.markup.convert('"Text"_link;'))
self.assertEqual("Text:", self.markup.convert('"Text"_link:'))
self.assertEqual("Text?", self.markup.convert('"Text"_link?'))
self.assertEqual("Text!", self.markup.convert('"Text"_link!'))
self.assertEqual("Text(", self.markup.convert('"Text"_link('))
self.assertEqual("Text)", self.markup.convert('"Text"_link)'))
def test_replace_alias_link(self):
self.markup.add_link_alias("link", "replacement")
self.assertEqual("Text", self.markup.convert('"Text"_link'))
class TestFormatting(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_paragraph_formatting(self):
s = self.txt2html.convert("Hello :p\n")
self.assertEqual(s, "\n"
"Hello \n"
"
\n"
"\n")
def test_two_paragraphs_through_formatting(self):
text = "Hello :p\nBye :p\n"
p = list(self.txt2html.paragraphs(text))
s = self.txt2html.convert(text)
self.assertEqual(len(p), 2)
self.assertEqual(s, "\n"
"Hello \n"
"
\n"
"Bye \n"
"
\n"
"\n")
def test_break_formatting(self):
s = self.txt2html.convert("Hello :b\n")
self.assertEqual(s, "\n"
"Hello \n"
"
\n"
"\n")
def test_preformat_formatting(self):
s = self.txt2html.convert("Hello :pre\n")
self.assertEqual(s, "\n"
"Hello \n"
"\n"
"\n")
def test_center_formatting(self):
s = self.txt2html.convert("Hello :c\n")
self.assertEqual(s, "\n"
"Hello \n"
"\n"
"\n")
def test_header_formatting(self):
s = self.txt2html.convert("Level 1 :h1\n"
"Level 2 :h2\n"
"Level 3 :h3\n"
"Level 4 :h4\n"
"Level 5 :h5\n"
"Level 6 :h6\n")
self.assertEqual(s, "\n"
"Level 1 \n"
"
\n"
"Level 2 \n"
"
\n"
"Level 3 \n"
"
\n"
"Level 4 \n"
"
\n"
"Level 5 \n"
"
\n"
"Level 6 \n"
"
\n"
"\n")
def test_all_paragraphs(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :all(p)\n")
self.assertEqual("\n"
"one
\n"
"two
\n"
"three
\n"
"\n"
"\n", s)
def test_all_centered(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :all(c)\n")
self.assertEqual("\n"
"one\n"
"two\n"
"three \n"
"\n"
"\n", s)
def test_all_breaks(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :all(b)\n")
self.assertEqual("\n"
"one
\n"
"two
\n"
"three
\n"
"\n"
"\n", s)
def test_links_with_all_breaks(self):
s = self.txt2html.convert("\"one\"_link\n"
"\"two\"_link\n"
"\"three\"_link :all(b)\n")
self.assertEqual("\n"
"one
\n"
"two
\n"
"three
\n"
"\n"
"\n", s)
def test_two_similar_links(self):
s = self.txt2html.convert("\"one\"_linkA and \"one\"_linkAB\n")
self.assertEqual("\n"
"one and one\n"
"
\n"
"\n", s)
def test_all_breaks_in_paragraph(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :all(b),p\n")
self.assertEqual("\n"
"one
\n"
"two
\n"
"three
\n"
"
\n"
"\n", s)
def test_all_list_items(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :all(l)\n")
self.assertEqual("\n"
"one\n"
"two\n"
"three \n"
"\n"
"\n", s)
def test_two_commands(self):
s = self.txt2html.convert("one :ulb,l\n")
self.assertEqual("\n"
"- one \n"
"\n"
"\n", s)
class TestListFormatting(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_unordered_list(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :ul\n")
self.assertEqual(s, "\n"
"
- one\n"
"
- two\n"
"
- three \n"
"
\n"
"\n")
def test_ordered_list(self):
s = self.txt2html.convert("one\n"
"two\n"
"three :ol\n")
self.assertEqual(s, "\n"
"- one\n"
"
- two\n"
"
- three \n"
"
\n"
"\n")
def test_elementwise_ordered_list(self):
s = self.txt2html.convert("one :olb,l\n"
"two :l\n"
"three :ole,l\n")
self.assertEqual("\n"
"- one \n"
"\n"
"
- two \n"
"\n"
"
- three \n"
"
\n"
"\n", s)
def test_definition_list(self):
s = self.txt2html.convert("A\n"
"first\n"
"B\n"
"second :dl\n")
self.assertEqual(s, "\n"
"- A\n"
"
- first\n"
"
- B\n"
"
- second \n"
"
\n"
"\n")
def test_list_item(self):
s = self.txt2html.convert("one :l\n")
self.assertEqual(s, "\n"
" - one \n"
"\n"
"\n")
def test_definition_term(self):
s = self.txt2html.convert("one :dt\n")
self.assertEqual(s, "\n"
"
- one \n"
"\n"
"\n")
def test_definition_description(self):
s = self.txt2html.convert("one :dd\n")
self.assertEqual(s, "\n"
"
- one \n"
"\n"
"\n")
def test_unordered_list_begin(self):
s = self.txt2html.convert("one :ulb\n")
self.assertEqual(s, "\n"
"
one \n"
"\n"
"\n")
def test_unordered_list_end(self):
s = self.txt2html.convert("one :ule\n")
self.assertEqual(s, "\n"
"one \n"
"
\n"
"\n")
def test_ordered_list_begin(self):
s = self.txt2html.convert("one :olb\n")
self.assertEqual(s, "\n"
"one \n"
"\n"
"\n")
def test_ordered_list_end(self):
s = self.txt2html.convert("one :ole\n")
self.assertEqual(s, "\n"
"one \n"
"
\n"
"\n")
def test_definition_list_begin(self):
s = self.txt2html.convert("one :dlb\n")
self.assertEqual(s, "\n"
"one \n"
"\n"
"\n")
def test_definition_list_end(self):
s = self.txt2html.convert("one :dle\n")
self.assertEqual(s, "\n"
"one \n"
"
\n"
"\n")
class TestSpecialCommands(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_line(self):
s = self.txt2html.convert("one :line\n")
self.assertEqual(s, "\n"
"
one \n"
"\n"
"\n")
def test_image(self):
s = self.txt2html.convert("one :image(file)\n")
self.assertEqual(s, "\n"
"
one \n"
"\n"
"\n")
def test_image_with_link(self):
s = self.txt2html.convert("one :image(file,link)\n")
self.assertEqual(s, "\n"
"
one \n"
"\n"
"\n")
def test_named_link(self):
s = self.txt2html.convert("one :link(name)\n")
self.assertEqual(s, "\n"
"one \n"
"\n"
"\n")
def test_define_link_alias(self):
s = self.txt2html.convert("one :link(alias,value)\n"
"\"test\"_alias")
self.assertEqual(s, "\n"
"one \n"
"\n"
"test\n"
"
\n"
"\n")
def test_define_link_alias_later(self):
s = self.txt2html.convert("\"test\"_alias\n\n"
"one :link(alias,value)\n")
self.assertEqual(s, "\n"
"test\n"
"
\n"
"one \n"
"\n"
"\n")
class TestTableCommand(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_single_table_row(self):
s = self.txt2html.convert("a,b,c :tb")
self.assertEqual("\n"
"\n\n"
"\n", s)
def test_multiple_table_rows(self):
s = self.txt2html.convert("a,b,c,\nd,e,f,\ng,h,i :tb")
self.assertEqual("\n"
"\n"
"| a | b | c | |
\n"
"| d | e | f | |
\n"
"| g | h | i \n"
" |
\n\n"
"\n", s)
def test_fixed_table_columns(self):
s = self.txt2html.convert("a,b,c,d,\ne,f,g,h :tb(c=3)\n")
self.assertEqual("\n"
"\n"
"| a | b | c |
\n"
"| d | e | f |
\n"
"| g | h \n"
" |
\n\n"
"\n", s)
def test_change_cell_separator(self):
s = self.txt2html.convert("a:b:c :tb(s=:)\n")
self.assertEqual("\n"
"\n\n"
"\n", s)
def test_change_table_border(self):
s = self.txt2html.convert("a,b,c :tb(b=0)")
self.assertEqual("\n"
"\n\n"
"\n", s)
def test_change_cell_width(self):
s = self.txt2html.convert("a,b,c :tb(w=10)")
self.assertEqual("\n"
"\n\n"
"\n", s)
def test_change_table_width(self):
s = self.txt2html.convert("a,b,c :tb(w=10%)")
self.assertEqual("\n"
"\n\n"
"\n", s)
def test_change_table_alignment(self):
s = self.txt2html.convert("a :tb(a=l)\n"
"b :tb(a=c)\n"
"c :tb(a=r)\n")
self.assertEqual("\n"
"\n\n"
"\n\n"
"\n\n"
"\n", s)
def test_change_cell_alignment(self):
s = self.txt2html.convert("a :tb(ea=l)\n"
"b :tb(ea=c)\n"
"c :tb(ea=r)\n")
self.assertEqual("\n"
"\n\n"
"\n\n"
"\n\n"
"\n", s)
def test_change_cell_vertical_alignment(self):
s = self.txt2html.convert("a :tb(eva=t,ea=l)\n"
"b :tb(eva=m)\n"
"c :tb(eva=ba)\n"
"d :tb(eva=bo)\n")
self.assertEqual("\n"
"\n\n"
"\n\n"
"\n\n"
"\n\n"
"\n", s)
def test_custom_column_width(self):
s = self.txt2html.convert("a,b,c :tb(cw1=30)\n"
"a,b,c :tb(cw2=30%)\n")
self.assertEqual("\n"
"\n\n"
"\n\n"
"\n", s)
def test_custom_column_alignment(self):
s = self.txt2html.convert("a,b,c :tb(w=30,ca1=l)\n"
"a,b,c :tb(ca2=c)\n"
"a,b,c :tb(ca3=r)\n")
self.assertEqual("\n"
"\n\n"
"\n\n"
"\n\n"
"\n", s)
class TestTxt2HtmlCLI(unittest.TestCase):
def setUp(self):
self.out = io.StringIO()
self.err = io.StringIO()
self.app = txt2html.Txt2HtmlConverter()
def test_convert_single_file(self):
with tempfile.NamedTemporaryFile(mode='w+t') as f:
f.write('Hello World!\n')
f.flush()
args = [f.name]
self.app.run(args=args, out=self.out, err=self.err)
self.assertEqual("\n"
"Hello World!\n"
"
\n"
"\n", self.out.getvalue())
self.assertEqual("Converting " + f.name + " ...\n", self.err.getvalue())
def test_convert_multiple_files(self):
with tempfile.NamedTemporaryFile(mode='w+t') as f:
with tempfile.NamedTemporaryFile(mode='w+t') as g:
f.write('Hello World!\n')
f.flush()
g.write('Hello World!\n')
g.flush()
args = [f.name, g.name]
self.app.run(args=args, out=self.out, err=self.err)
self.assertEqual("", self.out.getvalue())
self.assertEqual("Converting " + f.name + " ...\n"
"Converting " + g.name + " ...\n", self.err.getvalue())
self.assertTrue(os.path.exists(f.name + ".html"))
self.assertTrue(os.path.exists(g.name + ".html"))
os.remove(f.name + ".html")
os.remove(g.name + ".html")
def test_break_flag(self):
with tempfile.NamedTemporaryFile(mode='w+t') as f:
f.write('Hello World!\n')
f.flush()
args = ["-b", f.name]
self.app.run(args=args, out=self.out, err=self.err)
self.assertEqual("\n"
"Hello World!\n"
"
\n"
"\n"
"\n", self.out.getvalue())
def test_skip_files(self):
with tempfile.NamedTemporaryFile(mode='w+t') as f:
with tempfile.NamedTemporaryFile(mode='w+t') as g:
f.write('Hello World!\n')
f.flush()
g.write('Hello World!\n')
g.flush()
args = ["-x", g.name, f.name, g.name]
self.app.run(args=args, out=self.out, err=self.err)
self.assertEqual("", self.out.getvalue())
self.assertEqual("Converting " + f.name + " ...\n", self.err.getvalue())
self.assertTrue(os.path.exists(f.name + ".html"))
self.assertFalse(os.path.exists(g.name + ".html"))
os.remove(f.name + ".html")
def test_create_title_option(self):
with tempfile.NamedTemporaryFile(mode='w+t') as f:
f.write('Hello World! :h1\n')
f.flush()
args = ["--generate-title", f.name]
self.app.run(args=args, out=self.out, err=self.err)
self.assertEqual("\n"
"\n"
"Hello World!\n"
"\n"
"Hello World! \n"
"
\n"
"\n", self.out.getvalue())
class TestMathMarkup(unittest.TestCase):
def setUp(self):
self.txt2html = txt2html.Txt2Html()
def test_detect_latex_equation(self):
s = self.txt2html.convert("\\begin\\{equation\\} T_\\{ij\\}(r_\\{ij\\}) = 1 - \\left( 1 +\n"
"\\frac\{s_\\{ij\} r_\\{ij\} \\}\\{2\\} \\right)\n"
"\\exp \\left( - s_\\{ij\\} r_\\{ij\\} \\right) \\end\\{equation\\}\n")
self.assertEqual("\n"
"\\begin{equation} T_{ij}(r_{ij}) = 1 - \\left( 1 +\n"
"\\frac{s_{ij} r_{ij} }{2} \\right)\n"
"\\exp \\left( - s_{ij} r_{ij} \\right) \\end{equation}\n"
"
\n"
"\n", s)
if __name__ == '__main__':
unittest.main()