def test_app_cleans_up_images(self): testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'background_url_image.diag') urlopen_cache = {} def cleanup(): from blockdiag.utils import images urlopen_cache.update(images.urlopen_cache) try: tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, diagpath] app = BlockdiagApp() app.register_cleanup_handler(cleanup) # to get internal state app.run(args) self.assertTrue(urlopen_cache) # check images were cached for path in urlopen_cache.values(): self.assertFalse(os.path.exists(path)) # and removed finally finally: tmpdir.clean()
def test_app_cleans_up_plugins(self): testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'plugin_autoclass.diag') loaded_plugins = [] def cleanup(): from blockdiag import plugins loaded_plugins.extend(plugins.loaded_plugins) try: tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, diagpath] app = BlockdiagApp() app.register_cleanup_handler(cleanup) # to get internal state app.run(args) from blockdiag import plugins self.assertTrue(loaded_plugins) # check plugins were loaded self.assertFalse(plugins.loaded_plugins) # and unloaded finally finally: tmpdir.clean()
def svg_includes_source_code_tag_test(): from xml.etree import ElementTree testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'single_edge.diag') try: tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, diagpath] blockdiag.command.main(args) # compare embeded source code source_code = open(diagpath).read() tree = ElementTree.parse(tmpfile) desc = tree.find('{http://www.w3.org/2000/svg}desc') # strip spaces source_code = re.sub('\s+', ' ', source_code) embeded = re.sub('\s+', ' ', desc.text) assert source_code == embeded finally: tmpdir.clean()
def generate(mainfunc, filetype, source, options): try: tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) mainfunc(['--debug', '-T', filetype, '-o', tmpfile, source] + list(options)) finally: tmpdir.clean()
def stdin_test(): testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'single_edge.diag') try: stdin = sys.stdin sys.stdin = open(diagpath, 'r') tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, '-'] ret = blockdiag.command.main(args) assert ret == 0 finally: sys.stdin = stdin tmpdir.clean()
def ghostscript_not_found_test(): testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'background_url_image.diag') try: old_path = os.environ['PATH'] os.environ['PATH'] = '' tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, diagpath] ret = blockdiag.command.main(args) assert 'Could not convert image:' in sys.stderr.getvalue() assert ret == 0 finally: tmpdir.clean() os.environ['PATH'] = old_path
def svg_sanitizes_url_on_error_test(): testdir = os.path.dirname(__file__) diagpath = os.path.join(testdir, 'diagrams', 'background_url_local.diag') try: tmpdir = TemporaryDirectory() fd, tmpfile = tmpdir.mkstemp() os.close(fd) args = ['-T', 'SVG', '-o', tmpfile, diagpath] ret = blockdiag.command.main(args) tree = ElementTree.parse(tmpfile) images = tree.findall('{http://www.w3.org/2000/svg}image') valid_url, invalid_url = [ image.attrib.get('{http://www.w3.org/1999/xlink}href') for image in images ] assert valid_url assert not invalid_url assert 'unknown image type:' in sys.stderr.getvalue() assert ret == 0 finally: tmpdir.clean()
def setUp(self): self._tmpdir = TemporaryDirectory()
class TestRstDirectives(unittest.TestCase): def setUp(self): self._tmpdir = TemporaryDirectory() def tearDown(self): if "actdiag" in docutils._directives: del docutils._directives["actdiag"] self._tmpdir.clean() @property def tmpdir(self): return self._tmpdir.name def test_setup(self): directives.setup() options = directives.directive_options self.assertIn("actdiag", docutils._directives) self.assertEqual(directives.ActdiagDirective, docutils._directives["actdiag"]) self.assertEqual("PNG", options["format"]) self.assertEqual(False, options["antialias"]) self.assertEqual(None, options["fontpath"]) self.assertEqual(False, options["nodoctype"]) self.assertEqual(False, options["noviewbox"]) self.assertEqual(False, options["inline_svg"]) def test_setup_with_args(self): directives.setup( format="SVG", antialias=True, fontpath="/dev/null", nodoctype=True, noviewbox=True, inline_svg=True ) options = directives.directive_options self.assertIn("actdiag", docutils._directives) self.assertEqual(directives.ActdiagDirective, docutils._directives["actdiag"]) self.assertEqual("SVG", options["format"]) self.assertEqual(True, options["antialias"]) self.assertEqual("/dev/null", options["fontpath"]) self.assertEqual(True, options["nodoctype"]) self.assertEqual(True, options["noviewbox"]) self.assertEqual(True, options["inline_svg"]) @capture_stderr def test_cleanup(self): directives.setup(format="SVG", outputdir=self.tmpdir, noviewbox=False) text = ".. actdiag::\n" "\n" " plugin autoclass\n" " A -> B" publish_doctree(text) from blockdiag import plugins self.assertEqual([], plugins.loaded_plugins) def test_setup_fontpath1(self): with self.assertRaises(RuntimeError): directives.setup(format="SVG", fontpath=["dummy.ttf"], outputdir=self.tmpdir) text = ".. actdiag::\n" "\n" " A -> B" publish_doctree(text) def test_setup_fontpath2(self): with self.assertRaises(RuntimeError): directives.setup(format="SVG", fontpath="dummy.ttf", outputdir=self.tmpdir) text = ".. actdiag::\n" "\n" " A -> B" publish_doctree(text) def test_setup_nodoctype_is_true(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[-1])) svg = open(doctree[0]["uri"]).read() self.assertNotEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_setup_nodoctype_is_false(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=False) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]["uri"]).read() self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_setup_noviewbox_is_true(self): directives.setup(format="SVG", outputdir=self.tmpdir, noviewbox=True) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]["uri"]).read() self.assertRegexpMatches(svg, '<svg height="\d+" width="\d+" ') def test_setup_noviewbox_is_false(self): directives.setup(format="SVG", outputdir=self.tmpdir, noviewbox=False) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]["uri"]).read() self.assertRegexpMatches(svg, '<svg viewBox="0 0 \d+ \d+" ') def test_setup_inline_svg_is_true(self): directives.setup(format="SVG", outputdir=self.tmpdir, inline_svg=True) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual("html", doctree[0]["format"]) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", doctree[0][0][:49]) self.assertEqual(0, len(os.listdir(self.tmpdir))) def test_setup_inline_svg_is_false(self): directives.setup(format="SVG", outputdir=self.tmpdir, inline_svg=False) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(1, len(os.listdir(self.tmpdir))) @with_pil def test_setup_inline_svg_is_true_but_format_isnt_svg(self): directives.setup(format="PNG", outputdir=self.tmpdir, inline_svg=True) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_setup_inline_svg_is_true_and_width_option1(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. actdiag::\n" " :width: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="100" ') def test_setup_inline_svg_is_true_and_width_option2(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. actdiag::\n" " :width: 10000\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="10000" ') def test_setup_inline_svg_is_true_and_height_option1(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. actdiag::\n" " :height: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="100" width="\d+" ') def test_setup_inline_svg_is_true_and_height_option2(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. actdiag::\n" " :height: 10000\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="10000" width="\d+" ') def test_setup_inline_svg_is_true_and_width_and_height_option(self): directives.setup(format="SVG", outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. actdiag::\n" " :width: 200\n" " :height: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="100" width="200" ') def test_call_with_braces(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n\n { A -> B }" text = ".. actdiag::\n" "\n" " {" " A -> B" " }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_call_without_braces(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_alt_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :alt: hello world\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("hello world", doctree[0]["alt"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_align_option1(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :align: left\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("left", doctree[0]["align"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_align_option2(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :align: center\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("center", doctree[0]["align"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_align_option3(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :align: right\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("right", doctree[0]["align"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) @capture_stderr def test_align_option4(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :align: unknown\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) # clear stderr outputs (ignore ERROR) from io import StringIO sys.stderr = StringIO() def test_caption_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :caption: hello world\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual("hello world", doctree[0][1][0]) def test_caption_option_and_align_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :align: left\n" " :caption: hello world\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual("left", doctree[0]["align"]) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertNotIn("align", doctree[0][0]) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual("hello world", doctree[0][1][0]) @capture_stderr def test_maxwidth_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :maxwidth: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) self.assertEqual(nodes.system_message, type(doctree[1])) def test_width_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :width: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("100", doctree[0]["width"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_height_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :height: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual("100", doctree[0]["height"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_scale_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :scale: 50%\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(50, doctree[0]["scale"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_name_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :name: foo%\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(["foo%"], doctree[0]["names"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_class_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :class: bar%\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(["bar"], doctree[0]["classes"]) self.assertEqual(0, doctree[0]["uri"].index(self.tmpdir)) def test_figwidth_option1(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :caption: hello world\n" " :figwidth: 100\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual("100px", doctree[0]["width"]) def test_figwidth_option2(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :caption: hello world\n" " :figwidth: image\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual("256px", doctree[0]["width"]) def test_figclass_option(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :caption: hello world\n" " :figclass: baz\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(["baz"], doctree[0]["classes"]) def test_desctable(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :desctable:\n" "\n" " A [description = foo]" " B [description = bar]" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]["colwidth"]) self.assertEqual(50, doctree[1][0][1]["colwidth"]) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual("Name", thead[0][0][0][0]) self.assertEqual("Description", thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual("A", tbody[0][0][0][0]) self.assertEqual("foo", tbody[0][1][0][0]) self.assertEqual("B", tbody[1][0][0][0]) self.assertEqual("bar", tbody[1][1][0][0]) def test_desctable_option_without_description(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :desctable:\n" "\n" " A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_desctable_option_with_rest_markups(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ( ".. actdiag::\n" " :desctable:\n" "\n" ' A [description = "foo *bar* **baz**"]' ' B [description = "**foo** *bar* baz"]' ) doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]["colwidth"]) self.assertEqual(50, doctree[1][0][1]["colwidth"]) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual("Name", thead[0][0][0][0]) self.assertEqual("Description", thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual("A", tbody[0][0][0][0]) self.assertEqual(4, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual("foo ", str(tbody[0][1][0][0])) self.assertEqual(nodes.emphasis, type(tbody[0][1][0][1])) self.assertEqual(nodes.Text, type(tbody[0][1][0][1][0])) self.assertEqual("bar", tbody[0][1][0][1][0]) self.assertEqual(nodes.Text, type(tbody[0][1][0][2])) self.assertEqual(" ", str(tbody[0][1][0][2])) self.assertEqual(nodes.strong, type(tbody[0][1][0][3])) self.assertEqual(nodes.Text, type(tbody[0][1][0][3][0])) self.assertEqual("baz", str(tbody[0][1][0][3][0])) self.assertEqual("B", tbody[1][0][0][0]) self.assertEqual(4, len(tbody[1][1][0])) self.assertEqual(nodes.strong, type(tbody[1][1][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0][0])) self.assertEqual("foo", str(tbody[1][1][0][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][1])) self.assertEqual(" ", str(tbody[1][1][0][1])) self.assertEqual(nodes.emphasis, type(tbody[1][1][0][2])) self.assertEqual(nodes.Text, type(tbody[1][1][0][2][0])) self.assertEqual("bar", str(tbody[1][1][0][2][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][3])) self.assertEqual(" baz", str(tbody[1][1][0][3])) def test_desctable_option_with_numbered(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ".. actdiag::\n" " :desctable:\n" "\n" " A [numbered = 2]" " B [numbered = 1]" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]["colwidth"]) self.assertEqual(50, doctree[1][0][1]["colwidth"]) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual("No", thead[0][0][0][0]) self.assertEqual("Name", thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual("1", tbody[0][0][0][0]) self.assertEqual("B", tbody[0][1][0][0]) self.assertEqual("2", tbody[1][0][0][0]) self.assertEqual("A", tbody[1][1][0][0]) def test_desctable_option_with_numbered_and_description(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ( ".. actdiag::\n" " :desctable:\n" "\n" " A [description = foo, numbered = 2]" " B [description = bar, numbered = 1]" ) doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(5, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.colspec, type(doctree[1][0][2])) self.assertEqual(nodes.thead, type(doctree[1][0][3])) self.assertEqual(nodes.tbody, type(doctree[1][0][4])) # colspec self.assertEqual(25, doctree[1][0][0]["colwidth"]) self.assertEqual(50, doctree[1][0][1]["colwidth"]) self.assertEqual(50, doctree[1][0][2]["colwidth"]) # thead thead = doctree[1][0][3] self.assertEqual(3, len(thead[0])) self.assertEqual("No", thead[0][0][0][0]) self.assertEqual("Name", thead[0][1][0][0]) self.assertEqual("Description", thead[0][2][0][0]) # tbody tbody = doctree[1][0][4] self.assertEqual(2, len(tbody)) self.assertEqual("1", tbody[0][0][0][0]) self.assertEqual("B", tbody[0][1][0][0]) self.assertEqual(1, len(tbody[0][2])) self.assertEqual("bar", tbody[0][2][0][0]) self.assertEqual("2", tbody[1][0][0][0]) self.assertEqual("A", tbody[1][1][0][0]) self.assertEqual("foo", tbody[1][2][0][0]) def test_desctable_option_for_edges(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ( ".. actdiag::\n" " :desctable:\n" "\n" ' A -> B [description = "foo"]' ' C -> D [description = "bar"]' ' C [label = "label_C"]' ' D [label = "label_D"]' ) doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]["colwidth"]) self.assertEqual(50, doctree[1][0][1]["colwidth"]) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual("Name", thead[0][0][0][0]) self.assertEqual("Description", thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual("A -> B", tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual("foo", str(tbody[0][1][0][0])) self.assertEqual("label_C -> label_D", tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual("bar", str(tbody[1][1][0][0])) def test_desctable_option_for_nodes_and_edges(self): directives.setup(format="SVG", outputdir=self.tmpdir) text = ( ".. actdiag::\n" " :desctable:\n" "\n" ' A -> B [description = "foo"]' ' C -> D [description = "bar"]' ' C [label = "label_C", description = foo]' ' D [label = "label_D"]' ) doctree = publish_doctree(text) self.assertEqual(3, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(nodes.table, type(doctree[2])) # tgroup self.assertEqual(4, len(doctree[2][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][1])) self.assertEqual(nodes.thead, type(doctree[2][0][2])) self.assertEqual(nodes.tbody, type(doctree[2][0][3])) # colspec self.assertEqual(25, doctree[2][0][0]["colwidth"]) self.assertEqual(50, doctree[2][0][1]["colwidth"]) # thead thead = doctree[2][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual("Name", thead[0][0][0][0]) self.assertEqual("Description", thead[0][1][0][0]) # tbody tbody = doctree[2][0][3] self.assertEqual(2, len(tbody)) self.assertEqual("A -> B", tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual("foo", str(tbody[0][1][0][0])) self.assertEqual("label_C -> label_D", tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual("bar", str(tbody[1][1][0][0]))
class TestRstDirectives(unittest.TestCase): def setUp(self): self._tmpdir = TemporaryDirectory() def tearDown(self): if 'blockdiag' in docutils._directives: del docutils._directives['blockdiag'] self._tmpdir.clean() @property def tmpdir(self): return self._tmpdir.name def test_setup(self): directives.setup() options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('PNG', options['format']) self.assertEqual(False, options['antialias']) self.assertEqual(None, options['fontpath']) self.assertEqual(False, options['nodoctype']) self.assertEqual(False, options['noviewbox']) self.assertEqual(False, options['inline_svg']) def test_setup_with_args(self): directives.setup(format='SVG', antialias=True, fontpath='/dev/null', nodoctype=True, noviewbox=True, inline_svg=True) options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('SVG', options['format']) self.assertEqual(True, options['antialias']) self.assertEqual('/dev/null', options['fontpath']) self.assertEqual(True, options['nodoctype']) self.assertEqual(True, options['noviewbox']) self.assertEqual(True, options['inline_svg']) @capture_stderr def test_cleanup(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=False) text = (".. blockdiag::\n" "\n" " plugin autoclass\n" " A -> B") publish_doctree(text) from blockdiag import plugins self.assertEqual([], plugins.loaded_plugins) def test_setup_fontpath1(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath=['dummy.ttf'], outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") publish_doctree(text) def test_setup_fontpath2(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath='dummy.ttf', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") publish_doctree(text) def test_setup_nodoctype_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[-1])) svg = open(doctree[0]['uri']).read() self.assertEqual("<svg viewBox=\"0 0 ", svg[:18]) def test_setup_nodoctype_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertEqual( "<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_setup_noviewbox_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, r'<svg height="\d+" width="\d+" ') def test_setup_noviewbox_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, r'<svg viewBox="0 0 \d+ \d+" ') def test_setup_inline_svg_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual('html', doctree[0]['format']) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertEqual( "<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", doctree[0][0][:49]) self.assertEqual(0, len(os.listdir(self.tmpdir))) def test_setup_inline_svg_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(1, len(os.listdir(self.tmpdir))) @with_pil def test_setup_inline_svg_is_true_but_format_isnt_svg(self): directives.setup(format='PNG', outputdir=self.tmpdir, inline_svg=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_setup_inline_svg_is_true_with_multibytes(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = u(".. blockdiag::\n" "\n" " あ -> い") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_setup_inline_svg_is_true_and_width_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], r'<svg height="\d+" width="100" ') def test_setup_inline_svg_is_true_and_width_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 10000\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], r'<svg height="\d+" width="10000" ') def test_setup_inline_svg_is_true_and_height_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], r'<svg height="100" width="\d+" ') def test_setup_inline_svg_is_true_and_height_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :height: 10000\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], r'<svg height="10000" width="\d+" ') def test_setup_inline_svg_is_true_and_width_and_height_option(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 200\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="100" width="200" ') def test_call_with_brace(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " {" " A -> B" " }") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_call_without_braces(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_alt_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :alt: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: left\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('left', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: center\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('center', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option3(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: right\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('right', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) @capture_stderr def test_align_option4(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: unknown\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) # clear stderr outputs (ignore ERROR) from io import StringIO sys.stderr = StringIO() def test_caption_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual('hello world', doctree[0][1][0]) def test_caption_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: **hello** *world*\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(3, len(doctree[0][1])) self.assertEqual(nodes.strong, type(doctree[0][1][0])) self.assertEqual('hello', doctree[0][1][0][0]) self.assertEqual(nodes.Text, type(doctree[0][1][1])) self.assertEqual(' ', doctree[0][1][1][0]) self.assertEqual(nodes.emphasis, type(doctree[0][1][2])) self.assertEqual('world', doctree[0][1][2][0]) def test_caption_option_and_align_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: left\n" " :caption: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('left', doctree[0]['align']) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertNotIn('align', doctree[0][0]) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual('hello world', doctree[0][1][0]) @capture_stderr def test_maxwidth_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :maxwidth: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) self.assertEqual(nodes.system_message, type(doctree[1])) def test_width_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :width: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_height_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['height']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_scale_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :scale: 50%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(50, doctree[0]['scale']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_name_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :name: foo%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(['foo%'], doctree[0]['names']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_class_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :class: bar%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(['bar'], doctree[0]['classes']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_figwidth_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figwidth: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('100px', doctree[0]['width']) def test_figwidth_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figwidth: image\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('448px', doctree[0]['width']) def test_figclass_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figclass: baz\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(['baz'], doctree[0]['classes']) def test_desctable_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo]" " B [description = bar]" " group { A }") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_option_without_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_desctable_option_using_node_group(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo]" " B [description = bar]" " group { A }") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(1, len(doctree[1])) self.assertEqual(nodes.tgroup, type(doctree[1][0])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(0, len(doctree[1][0][0])) self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(0, len(doctree[1][0][1])) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(1, len(thead)) self.assertEqual(2, len(thead[0])) self.assertEqual(1, len(thead[0][0])) self.assertEqual(1, len(thead[0][0][0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual(1, len(thead[0][1])) self.assertEqual(1, len(thead[0][1][0])) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual(2, len(tbody[0])) self.assertEqual(1, len(tbody[0][0])) self.assertEqual(1, len(tbody[0][0][0])) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1])) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual(2, len(tbody[1])) self.assertEqual(1, len(tbody[1][0])) self.assertEqual(1, len(tbody[1][0][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1])) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_option_with_rest_markups(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = \"foo *bar* **baz**\"]" " B [description = \"**foo** *bar* baz\"]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(4, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo ', str(tbody[0][1][0][0])) self.assertEqual(nodes.emphasis, type(tbody[0][1][0][1])) self.assertEqual(nodes.Text, type(tbody[0][1][0][1][0])) self.assertEqual('bar', tbody[0][1][0][1][0]) self.assertEqual(nodes.Text, type(tbody[0][1][0][2])) self.assertEqual(' ', str(tbody[0][1][0][2])) self.assertEqual(nodes.strong, type(tbody[0][1][0][3])) self.assertEqual(nodes.Text, type(tbody[0][1][0][3][0])) self.assertEqual('baz', str(tbody[0][1][0][3][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(4, len(tbody[1][1][0])) self.assertEqual(nodes.strong, type(tbody[1][1][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0][0])) self.assertEqual('foo', str(tbody[1][1][0][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][1])) self.assertEqual(' ', str(tbody[1][1][0][1])) self.assertEqual(nodes.emphasis, type(tbody[1][1][0][2])) self.assertEqual(nodes.Text, type(tbody[1][1][0][2][0])) self.assertEqual('bar', str(tbody[1][1][0][2][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][3])) self.assertEqual(' baz', str(tbody[1][1][0][3])) def test_desctable_option_with_numbered(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [numbered = 2]" " B [numbered = 1]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) def test_desctable_option_with_numbered_and_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo, numbered = 2]" " B [description = bar, numbered = 1]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(5, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.colspec, type(doctree[1][0][2])) self.assertEqual(nodes.thead, type(doctree[1][0][3])) self.assertEqual(nodes.tbody, type(doctree[1][0][4])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) self.assertEqual(50, doctree[1][0][2]['colwidth']) # thead thead = doctree[1][0][3] self.assertEqual(3, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) self.assertEqual('Description', thead[0][2][0][0]) # tbody tbody = doctree[1][0][4] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual(1, len(tbody[0][2])) self.assertEqual('bar', tbody[0][2][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) self.assertEqual('foo', tbody[1][2][0][0]) def test_desctable_option_for_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B [description = \"foo\"]" " C -> D [description = \"bar\"]" " C [label = \"label_C\"]" " D [label = \"label_D\"]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0])) def test_desctable_option_for_nodes_and_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B [description = \"foo\"]" " C -> D [description = \"bar\"]" " C [label = \"label_C\", description = foo]" " D [label = \"label_D\"]") doctree = publish_doctree(text) self.assertEqual(3, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(nodes.table, type(doctree[2])) # tgroup self.assertEqual(4, len(doctree[2][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][1])) self.assertEqual(nodes.thead, type(doctree[2][0][2])) self.assertEqual(nodes.tbody, type(doctree[2][0][3])) # colspec self.assertEqual(25, doctree[2][0][0]['colwidth']) self.assertEqual(50, doctree[2][0][1]['colwidth']) # thead thead = doctree[2][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[2][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0])) @capture_stderr def test_broken_diagram(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A ->") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0]))
class TestRstDirectives(unittest.TestCase): def setUp(self): self._tmpdir = TemporaryDirectory() def tearDown(self): if 'blockdiag' in docutils._directives: del docutils._directives['blockdiag'] self._tmpdir.clean() @property def tmpdir(self): return self._tmpdir.name def test_setup(self): directives.setup() options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('PNG', options['format']) self.assertEqual(False, options['antialias']) self.assertEqual(None, options['fontpath']) self.assertEqual(False, options['nodoctype']) self.assertEqual(False, options['noviewbox']) self.assertEqual(False, options['inline_svg']) def test_setup_with_args(self): directives.setup(format='SVG', antialias=True, fontpath='/dev/null', nodoctype=True, noviewbox=True, inline_svg=True) options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('SVG', options['format']) self.assertEqual(True, options['antialias']) self.assertEqual('/dev/null', options['fontpath']) self.assertEqual(True, options['nodoctype']) self.assertEqual(True, options['noviewbox']) self.assertEqual(True, options['inline_svg']) @capture_stderr def test_cleanup(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=False) text = (".. blockdiag::\n" "\n" " plugin autoclass\n" " A -> B") publish_doctree(text) from blockdiag import plugins self.assertEqual([], plugins.loaded_plugins) def test_setup_fontpath1(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath=['dummy.ttf'], outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") publish_doctree(text) def test_setup_fontpath2(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath='dummy.ttf', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") publish_doctree(text) def test_setup_nodoctype_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[-1])) svg = open(doctree[0]['uri']).read() self.assertEqual("<svg viewBox=\"0 0 ", svg[:18]) def test_setup_nodoctype_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_setup_noviewbox_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, '<svg height="\d+" width="\d+" ') def test_setup_noviewbox_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, '<svg viewBox="0 0 \d+ \d+" ') def test_setup_inline_svg_is_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual('html', doctree[0]['format']) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", doctree[0][0][:49]) self.assertEqual(0, len(os.listdir(self.tmpdir))) def test_setup_inline_svg_is_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=False) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(1, len(os.listdir(self.tmpdir))) @with_pil def test_setup_inline_svg_is_true_but_format_isnt_svg(self): directives.setup(format='PNG', outputdir=self.tmpdir, inline_svg=True) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_setup_inline_svg_is_true_with_multibytes(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = u(".. blockdiag::\n" "\n" " あ -> い") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_setup_inline_svg_is_true_and_width_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="100" ') def test_setup_inline_svg_is_true_and_width_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 10000\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="10000" ') def test_setup_inline_svg_is_true_and_height_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="100" width="\d+" ') def test_setup_inline_svg_is_true_and_height_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :height: 10000\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="10000" width="\d+" ') def test_setup_inline_svg_is_true_and_width_and_height_option(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = (".. blockdiag::\n" " :width: 200\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="100" width="200" ') def test_call_with_brace(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " {" " A -> B" " }") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_call_without_braces(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_alt_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :alt: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: left\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('left', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: center\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('center', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_align_option3(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: right\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('right', doctree[0]['align']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) @capture_stderr def test_align_option4(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: unknown\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) # clear stderr outputs (ignore ERROR) from io import StringIO sys.stderr = StringIO() def test_caption_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual('hello world', doctree[0][1][0]) def test_caption_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: **hello** *world*\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(3, len(doctree[0][1])) self.assertEqual(nodes.strong, type(doctree[0][1][0])) self.assertEqual('hello', doctree[0][1][0][0]) self.assertEqual(nodes.Text, type(doctree[0][1][1])) self.assertEqual(' ', doctree[0][1][1][0]) self.assertEqual(nodes.emphasis, type(doctree[0][1][2])) self.assertEqual('world', doctree[0][1][2][0]) def test_caption_option_and_align_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :align: left\n" " :caption: hello world\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('left', doctree[0]['align']) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertNotIn('align', doctree[0][0]) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual('hello world', doctree[0][1][0]) @capture_stderr def test_maxwidth_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :maxwidth: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) self.assertEqual(nodes.system_message, type(doctree[1])) def test_width_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :width: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_height_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :height: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('100', doctree[0]['height']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_scale_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :scale: 50%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(50, doctree[0]['scale']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_name_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :name: foo%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(['foo%'], doctree[0]['names']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_class_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :class: bar%\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(['bar'], doctree[0]['classes']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_figwidth_option1(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figwidth: 100\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('100px', doctree[0]['width']) def test_figwidth_option2(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figwidth: image\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual('448px', doctree[0]['width']) def test_figclass_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :caption: hello world\n" " :figclass: baz\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(['baz'], doctree[0]['classes']) def test_desctable_option(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo]" " B [description = bar]" " group { A }") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_option_without_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_desctable_option_using_node_group(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo]" " B [description = bar]" " group { A }") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(1, len(doctree[1])) self.assertEqual(nodes.tgroup, type(doctree[1][0])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(0, len(doctree[1][0][0])) self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(0, len(doctree[1][0][1])) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(1, len(thead)) self.assertEqual(2, len(thead[0])) self.assertEqual(1, len(thead[0][0])) self.assertEqual(1, len(thead[0][0][0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual(1, len(thead[0][1])) self.assertEqual(1, len(thead[0][1][0])) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual(2, len(tbody[0])) self.assertEqual(1, len(tbody[0][0])) self.assertEqual(1, len(tbody[0][0][0])) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1])) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual(2, len(tbody[1])) self.assertEqual(1, len(tbody[1][0])) self.assertEqual(1, len(tbody[1][0][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1])) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_option_with_rest_markups(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = \"foo *bar* **baz**\"]" " B [description = \"**foo** *bar* baz\"]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(4, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo ', str(tbody[0][1][0][0])) self.assertEqual(nodes.emphasis, type(tbody[0][1][0][1])) self.assertEqual(nodes.Text, type(tbody[0][1][0][1][0])) self.assertEqual('bar', tbody[0][1][0][1][0]) self.assertEqual(nodes.Text, type(tbody[0][1][0][2])) self.assertEqual(' ', str(tbody[0][1][0][2])) self.assertEqual(nodes.strong, type(tbody[0][1][0][3])) self.assertEqual(nodes.Text, type(tbody[0][1][0][3][0])) self.assertEqual('baz', str(tbody[0][1][0][3][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(4, len(tbody[1][1][0])) self.assertEqual(nodes.strong, type(tbody[1][1][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0][0])) self.assertEqual('foo', str(tbody[1][1][0][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][1])) self.assertEqual(' ', str(tbody[1][1][0][1])) self.assertEqual(nodes.emphasis, type(tbody[1][1][0][2])) self.assertEqual(nodes.Text, type(tbody[1][1][0][2][0])) self.assertEqual('bar', str(tbody[1][1][0][2][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][3])) self.assertEqual(' baz', str(tbody[1][1][0][3])) def test_desctable_option_with_numbered(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [numbered = 2]" " B [numbered = 1]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) def test_desctable_option_with_numbered_and_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A [description = foo, numbered = 2]" " B [description = bar, numbered = 1]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(5, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.colspec, type(doctree[1][0][2])) self.assertEqual(nodes.thead, type(doctree[1][0][3])) self.assertEqual(nodes.tbody, type(doctree[1][0][4])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) self.assertEqual(50, doctree[1][0][2]['colwidth']) # thead thead = doctree[1][0][3] self.assertEqual(3, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) self.assertEqual('Description', thead[0][2][0][0]) # tbody tbody = doctree[1][0][4] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual(1, len(tbody[0][2])) self.assertEqual('bar', tbody[0][2][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) self.assertEqual('foo', tbody[1][2][0][0]) def test_desctable_option_for_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B [description = \"foo\"]" " C -> D [description = \"bar\"]" " C [label = \"label_C\"]" " D [label = \"label_D\"]") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0])) def test_desctable_option_for_nodes_and_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" " :desctable:\n" "\n" " A -> B [description = \"foo\"]" " C -> D [description = \"bar\"]" " C [label = \"label_C\", description = foo]" " D [label = \"label_D\"]") doctree = publish_doctree(text) self.assertEqual(3, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(nodes.table, type(doctree[2])) # tgroup self.assertEqual(4, len(doctree[2][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][1])) self.assertEqual(nodes.thead, type(doctree[2][0][2])) self.assertEqual(nodes.tbody, type(doctree[2][0][3])) # colspec self.assertEqual(25, doctree[2][0][0]['colwidth']) self.assertEqual(50, doctree[2][0][1]['colwidth']) # thead thead = doctree[2][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[2][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0])) @capture_stderr def test_broken_diagram(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = (".. blockdiag::\n" "\n" " A ->") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0]))
class TestRstDirectives(unittest.TestCase): def setUp(self): docutils.register_directive('blockdiag', directives.BlockdiagDirectiveBase) self._tmpdir = TemporaryDirectory() def tearDown(self): if 'blockdiag' in docutils._directives: del docutils._directives['blockdiag'] self._tmpdir.clean() @capture_stderr def test_without_args(self): text = ".. blockdiag::" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_block(self): text = (".. blockdiag::\n" "\n" " { A -> B }") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('{ A -> B }', doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_emptyblock(self): text = ".. blockdiag::\n\n \n" text = (".. blockdiag::\n" "\n" " ") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_filename(self): dirname = os.path.dirname(__file__) filename = os.path.join(dirname, '../diagrams/node_attribute.diag') text = ".. blockdiag:: %s" % filename doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual(io.open(filename, encoding='utf-8-sig').read(), doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_filename_not_exists(self): text = ".. blockdiag:: unknown.diag" doctree = publish_doctree(text) self.assertEqual(nodes.system_message, type(doctree[0])) @capture_stderr def test_both_block_and_filename(self): text = (".. blockdiag:: unknown.diag\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_full_options(self): text = (".. blockdiag::\n" " :alt: hello world\n" " :align: center\n" " :desctable:\n" " :width: 200\n" " :height: 100\n" " :scale: 50%\n" " :name: foo\n" " :class: bar\n" " :figwidth: 400\n" " :figclass: baz\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('A -> B', doctree[0]['code']) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual('center', doctree[0]['options']['align']) self.assertEqual(None, doctree[0]['options']['desctable']) self.assertEqual('200', doctree[0]['options']['width']) self.assertEqual('100', doctree[0]['options']['height']) self.assertEqual(50, doctree[0]['options']['scale']) self.assertEqual('hello world', doctree[0]['options']['alt']) self.assertEqual('foo', doctree[0]['options']['name']) self.assertEqual(['bar'], doctree[0]['options']['classes']) self.assertEqual('400px', doctree[0]['options']['figwidth']) self.assertEqual(['baz'], doctree[0]['options']['figclass']) @capture_stderr def test_maxwidth_option(self): text = (".. blockdiag::\n" " :maxwidth: 200\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('A -> B', doctree[0]['code']) self.assertEqual('200', doctree[0]['options']['width']) self.assertEqual(nodes.system_message, type(doctree[1]))
class TestRstDirectives(unittest.TestCase): def setUp(self): docutils.register_directive('blockdiag', directives.BlockdiagDirectiveBase) self._tmpdir = TemporaryDirectory() def tearDown(self): if 'blockdiag' in docutils._directives: del docutils._directives['blockdiag'] self._tmpdir.clean() @capture_stderr def test_without_args(self): text = ".. blockdiag::" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_block(self): text = (".. blockdiag::\n" "\n" " { A -> B }") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('{ A -> B }', doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_emptyblock(self): text = ".. blockdiag::\n\n \n" text = (".. blockdiag::\n" "\n" " ") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_filename(self): dirname = os.path.dirname(__file__) filename = os.path.join(dirname, '../diagrams/node_attribute.diag') text = ".. blockdiag:: %s" % filename doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual( io.open(filename, encoding='utf-8-sig').read(), doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_filename_not_exists(self): text = ".. blockdiag:: unknown.diag" doctree = publish_doctree(text) self.assertEqual(nodes.system_message, type(doctree[0])) @capture_stderr def test_both_block_and_filename(self): text = (".. blockdiag:: unknown.diag\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_full_options(self): text = (".. blockdiag::\n" " :alt: hello world\n" " :align: center\n" " :desctable:\n" " :width: 200\n" " :height: 100\n" " :scale: 50%\n" " :name: foo\n" " :class: bar\n" " :figwidth: 400\n" " :figclass: baz\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('A -> B', doctree[0]['code']) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual('center', doctree[0]['options']['align']) self.assertEqual(None, doctree[0]['options']['desctable']) self.assertEqual('200', doctree[0]['options']['width']) self.assertEqual('100', doctree[0]['options']['height']) self.assertEqual(50, doctree[0]['options']['scale']) self.assertEqual('hello world', doctree[0]['options']['alt']) self.assertEqual('foo', doctree[0]['options']['name']) self.assertEqual(['bar'], doctree[0]['options']['classes']) self.assertEqual('400px', doctree[0]['options']['figwidth']) self.assertEqual(['baz'], doctree[0]['options']['figclass']) @capture_stderr def test_maxwidth_option(self): text = (".. blockdiag::\n" " :maxwidth: 200\n" "\n" " A -> B") doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(blockdiag_node, type(doctree[0])) self.assertEqual('A -> B', doctree[0]['code']) self.assertEqual('200', doctree[0]['options']['width']) self.assertEqual(nodes.system_message, type(doctree[1]))
def setUp(self): docutils.register_directive('blockdiag', directives.BlockdiagDirectiveBase) self._tmpdir = TemporaryDirectory()
class TestRstDirectives(unittest.TestCase): def setUp(self): docutils.register_directive('blockdiag', directives.BlockdiagDirectiveBase) self._tmpdir = TemporaryDirectory() def tearDown(self): if 'blockdiag' in docutils._directives: del docutils._directives['blockdiag'] self._tmpdir.clean() @property def tmpdir(self): return self._tmpdir.name def test_setup(self): directives.setup() options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('PNG', options['format']) self.assertEqual(False, options['antialias']) self.assertEqual(None, options['fontpath']) self.assertEqual(False, options['nodoctype']) self.assertEqual(False, options['noviewbox']) self.assertEqual(False, options['inline_svg']) def test_setup_with_args(self): directives.setup(format='SVG', antialias=True, fontpath='/dev/null', nodoctype=True, noviewbox=True, inline_svg=True) options = directives.directive_options self.assertIn('blockdiag', docutils._directives) self.assertEqual(directives.BlockdiagDirective, docutils._directives['blockdiag']) self.assertEqual('SVG', options['format']) self.assertEqual(True, options['antialias']) self.assertEqual('/dev/null', options['fontpath']) self.assertEqual(True, options['nodoctype']) self.assertEqual(True, options['noviewbox']) self.assertEqual(True, options['inline_svg']) @capture_stderr def test_base_noargs(self): text = ".. blockdiag::" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_base_with_block(self): text = ".. blockdiag::\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(directives.blockdiag, type(doctree[0])) self.assertEqual('{ A -> B }', doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_base_with_emptyblock(self): text = ".. blockdiag::\n\n \n" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_base_with_filename(self): dirname = os.path.dirname(__file__) filename = os.path.join(dirname, 'diagrams/node_attribute.diag') text = ".. blockdiag:: %s" % filename doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(directives.blockdiag, type(doctree[0])) self.assertEqual(io.open(filename, encoding='utf-8-sig').read(), doctree[0]['code']) self.assertEqual(None, doctree[0]['alt']) self.assertEqual({}, doctree[0]['options']) @capture_stderr def test_base_with_filename_not_exists(self): text = ".. blockdiag:: unknown.diag" doctree = publish_doctree(text) self.assertEqual(nodes.system_message, type(doctree[0])) @capture_stderr def test_base_with_block_and_filename(self): text = ".. blockdiag:: unknown.diag\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.system_message, type(doctree[0])) def test_base_with_options(self): text = ".. blockdiag::\n :alt: hello world\n :desctable:\n" + \ " :width: 200\n :height: 100\n" + \ " :scale: 50%\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(directives.blockdiag, type(doctree[0])) self.assertEqual('{ A -> B }', doctree[0]['code']) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual(None, doctree[0]['options']['desctable']) self.assertEqual('200', doctree[0]['options']['width']) self.assertEqual('100', doctree[0]['options']['height']) self.assertEqual(50, doctree[0]['options']['scale']) self.assertEqual('hello world', doctree[0]['options']['alt']) def test_block(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_without_braces(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n\n A -> B" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_alt(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual('hello world', doctree[0]['alt']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_fontpath1(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath=['dummy.ttf'], outputdir=self.tmpdir) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" publish_doctree(text) def test_block_fontpath2(self): with self.assertRaises(RuntimeError): directives.setup(format='SVG', fontpath='dummy.ttf', outputdir=self.tmpdir) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" publish_doctree(text) def test_caption(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :caption: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.figure, type(doctree[0])) self.assertEqual(2, len(doctree[0])) self.assertEqual(nodes.image, type(doctree[0][0])) self.assertEqual(nodes.caption, type(doctree[0][1])) self.assertEqual(1, len(doctree[0][1])) self.assertEqual(nodes.Text, type(doctree[0][1][0])) self.assertEqual('hello world', doctree[0][1][0]) @capture_stderr def test_block_maxwidth(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :maxwidth: 100\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) self.assertEqual(nodes.system_message, type(doctree[1])) def test_block_width(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :width: 100\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual('100', doctree[0]['width']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_height(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :height: 100\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual('100', doctree[0]['height']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_scale(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :scale: 50%\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertFalse('alt' in doctree[0]) self.assertEqual(50, doctree[0]['scale']) self.assertEqual(0, doctree[0]['uri'].index(self.tmpdir)) def test_block_nodoctype_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=False) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_block_nodoctype_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[-1])) svg = open(doctree[0]['uri']).read() self.assertNotEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", svg[:49]) def test_block_noviewbox_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=False) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, '<svg viewBox="0 0 \d+ \d+" ') def test_block_noviewbox_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, noviewbox=True) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) svg = open(doctree[0]['uri']).read() self.assertRegexpMatches(svg, '<svg height="\d+" width="\d+" ') def test_block_inline_svg_false(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=False) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(1, len(os.listdir(self.tmpdir))) def test_block_inline_svg_true(self): directives.setup(format='SVG', outputdir=self.tmpdir, inline_svg=True) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual('html', doctree[0]['format']) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertEqual("<?xml version='1.0' encoding='UTF-8'?>\n" "<!DOCTYPE ", doctree[0][0][:49]) self.assertEqual(0, len(os.listdir(self.tmpdir))) @with_pil def test_block_inline_svg_true_but_nonsvg_format(self): directives.setup(format='PNG', outputdir=self.tmpdir, inline_svg=True) text = ".. blockdiag::\n :alt: hello world\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_block_inline_svg_true_with_multibytes(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = u(".. blockdiag::\n :alt: hello world\n\n { あ -> い }") publish_parts(source=text) def test_block_max_width_inline_svg(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. blockdiag::\n :width: 100\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="100" ') def test_block_width_inline_svg(self): directives.setup(format='SVG', outputdir=self.tmpdir, nodoctype=True, noviewbox=True, inline_svg=True) text = ".. blockdiag::\n :width: 100\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.raw, type(doctree[0])) self.assertEqual(nodes.Text, type(doctree[0][0])) self.assertRegexpMatches(doctree[0][0], '<svg height="\d+" width="100" ') def test_desctable_without_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n { A -> B }" doctree = publish_doctree(text) self.assertEqual(1, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) def test_desctable(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A [description = foo]; B [description = bar]; }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_using_node_group(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n { A -> B; group { A } }" text = ".. blockdiag::\n :desctable:\n\n" + \ " { A [description = foo]; B [description = bar]; " + \ " group { A } }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(1, len(doctree[1])) self.assertEqual(nodes.tgroup, type(doctree[1][0])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(0, len(doctree[1][0][0])) self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(0, len(doctree[1][0][1])) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(1, len(thead)) self.assertEqual(2, len(thead[0])) self.assertEqual(1, len(thead[0][0])) self.assertEqual(1, len(thead[0][0][0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual(1, len(thead[0][1])) self.assertEqual(1, len(thead[0][1][0])) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual(2, len(tbody[0])) self.assertEqual(1, len(tbody[0][0])) self.assertEqual(1, len(tbody[0][0][0])) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1])) self.assertEqual('foo', tbody[0][1][0][0]) self.assertEqual(2, len(tbody[1])) self.assertEqual(1, len(tbody[1][0])) self.assertEqual(1, len(tbody[1][0][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1])) self.assertEqual('bar', tbody[1][1][0][0]) def test_desctable_with_rest_markups(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A [description = \"foo *bar* **baz**\"]; " + \ " B [description = \"**foo** *bar* baz\"]; }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(50, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A', tbody[0][0][0][0]) self.assertEqual(4, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo ', str(tbody[0][1][0][0])) self.assertEqual(nodes.emphasis, type(tbody[0][1][0][1])) self.assertEqual(nodes.Text, type(tbody[0][1][0][1][0])) self.assertEqual('bar', tbody[0][1][0][1][0]) self.assertEqual(nodes.Text, type(tbody[0][1][0][2])) self.assertEqual(' ', str(tbody[0][1][0][2])) self.assertEqual(nodes.strong, type(tbody[0][1][0][3])) self.assertEqual(nodes.Text, type(tbody[0][1][0][3][0])) self.assertEqual('baz', str(tbody[0][1][0][3][0])) self.assertEqual('B', tbody[1][0][0][0]) self.assertEqual(4, len(tbody[1][1][0])) self.assertEqual(nodes.strong, type(tbody[1][1][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0][0])) self.assertEqual('foo', str(tbody[1][1][0][0][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][1])) self.assertEqual(' ', str(tbody[1][1][0][1])) self.assertEqual(nodes.emphasis, type(tbody[1][1][0][2])) self.assertEqual(nodes.Text, type(tbody[1][1][0][2][0])) self.assertEqual('bar', str(tbody[1][1][0][2][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][3])) self.assertEqual(' baz', str(tbody[1][1][0][3])) def test_desctable_with_numbered(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A [numbered = 2]; B [numbered = 1]; }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) def test_desctable_with_numbered_and_description(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A [description = foo, numbered = 2]; " + \ " B [description = bar, numbered = 1]; }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(5, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.colspec, type(doctree[1][0][2])) self.assertEqual(nodes.thead, type(doctree[1][0][3])) self.assertEqual(nodes.tbody, type(doctree[1][0][4])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) self.assertEqual(50, doctree[1][0][2]['colwidth']) # thead thead = doctree[1][0][3] self.assertEqual(3, len(thead[0])) self.assertEqual('No', thead[0][0][0][0]) self.assertEqual('Name', thead[0][1][0][0]) self.assertEqual('Description', thead[0][2][0][0]) # tbody tbody = doctree[1][0][4] self.assertEqual(2, len(tbody)) self.assertEqual('1', tbody[0][0][0][0]) self.assertEqual('B', tbody[0][1][0][0]) self.assertEqual(1, len(tbody[0][2])) self.assertEqual('bar', tbody[0][2][0][0]) self.assertEqual('2', tbody[1][0][0][0]) self.assertEqual('A', tbody[1][1][0][0]) self.assertEqual('foo', tbody[1][2][0][0]) def test_desctable_for_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A -> B [description = \"foo\"]; " + \ " C -> D [description = \"bar\"]; " + \ " C [label = \"label_C\"]; " + \ " D [label = \"label_D\"]; }" doctree = publish_doctree(text) self.assertEqual(2, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) # tgroup self.assertEqual(4, len(doctree[1][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][0])) self.assertEqual(nodes.colspec, type(doctree[1][0][1])) self.assertEqual(nodes.thead, type(doctree[1][0][2])) self.assertEqual(nodes.tbody, type(doctree[1][0][3])) # colspec self.assertEqual(25, doctree[1][0][0]['colwidth']) self.assertEqual(50, doctree[1][0][1]['colwidth']) # thead thead = doctree[1][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[1][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0])) def test_desctable_for_nodes_and_edges(self): directives.setup(format='SVG', outputdir=self.tmpdir) text = ".. blockdiag::\n :desctable:\n\n" + \ " { A -> B [description = \"foo\"]; " + \ " C -> D [description = \"bar\"]; " + \ " C [label = \"label_C\", description = foo]; " + \ " D [label = \"label_D\"]; }" doctree = publish_doctree(text) self.assertEqual(3, len(doctree)) self.assertEqual(nodes.image, type(doctree[0])) self.assertEqual(nodes.table, type(doctree[1])) self.assertEqual(nodes.table, type(doctree[2])) # tgroup self.assertEqual(4, len(doctree[2][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][0])) self.assertEqual(nodes.colspec, type(doctree[2][0][1])) self.assertEqual(nodes.thead, type(doctree[2][0][2])) self.assertEqual(nodes.tbody, type(doctree[2][0][3])) # colspec self.assertEqual(25, doctree[2][0][0]['colwidth']) self.assertEqual(50, doctree[2][0][1]['colwidth']) # thead thead = doctree[2][0][2] self.assertEqual(2, len(thead[0])) self.assertEqual('Name', thead[0][0][0][0]) self.assertEqual('Description', thead[0][1][0][0]) # tbody tbody = doctree[2][0][3] self.assertEqual(2, len(tbody)) self.assertEqual('A -> B', tbody[0][0][0][0]) self.assertEqual(1, len(tbody[0][1][0])) self.assertEqual(nodes.Text, type(tbody[0][1][0][0])) self.assertEqual('foo', str(tbody[0][1][0][0])) self.assertEqual('label_C -> label_D', tbody[1][0][0][0]) self.assertEqual(1, len(tbody[1][1][0])) self.assertEqual(nodes.Text, type(tbody[1][1][0][0])) self.assertEqual('bar', str(tbody[1][1][0][0]))