aboutsummaryrefslogtreecommitdiff
path: root/tests/introspect/visualize.test.py
blob: a1e2ef5b68f2df26fb1e7fc8efed83bacccad713 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""Tests for the visualize dispatcher in :mod:`edify.introspect.visualize`."""

import pytest

from edify import RegexBuilder
from edify.elements.types.leaves import DigitElement
from edify.errors.introspect import (
    UnsupportedVisualizationEngineError,
    UnsupportedVisualizationFormatError,
)
from edify.introspect.visualize import visualize_elements


def _digit_regex():
    return RegexBuilder().digit().to_regex()


def test_default_format_and_engine_produce_ascii_railroad_output():
    output = visualize_elements((DigitElement(),))
    assert "| START |" in output
    assert "| digit |" in output
    assert "| END |" in output


def test_explicit_ascii_format_and_engine_produce_ascii_railroad_output():
    output = visualize_elements((DigitElement(),), format="ascii", engine="ascii")
    assert "| digit |" in output


def test_ascii_format_with_wrong_engine_raises_engine_error():
    with pytest.raises(UnsupportedVisualizationEngineError):
        visualize_elements((DigitElement(),), format="ascii", engine="graphviz")


def test_svg_format_with_graphviz_engine_produces_svg_output():
    regex = _digit_regex()
    output = visualize_elements(regex.elements, format="svg", engine="graphviz")
    assert "</svg>" in output


def test_svg_format_with_wrong_engine_raises_engine_error():
    with pytest.raises(UnsupportedVisualizationEngineError):
        visualize_elements((DigitElement(),), format="svg", engine="ascii")


def test_unknown_format_raises_format_error():
    with pytest.raises(UnsupportedVisualizationFormatError):
        visualize_elements((DigitElement(),), format="pdf")


def test_unknown_format_error_names_the_received_format_in_message():
    with pytest.raises(UnsupportedVisualizationFormatError) as excinfo:
        visualize_elements((DigitElement(),), format="mermaid")
    assert "'mermaid'" in str(excinfo.value)


def test_engine_error_names_both_format_and_engine_in_message():
    with pytest.raises(UnsupportedVisualizationEngineError) as excinfo:
        visualize_elements((DigitElement(),), format="ascii", engine="mermaid")
    message = str(excinfo.value)
    assert "'ascii'" in message
    assert "'mermaid'" in message


def test_regex_visualize_end_to_end_defaults_to_ascii():
    regex = _digit_regex()
    output = regex.visualize()
    assert "| digit |" in output


def test_regex_visualize_svg_end_to_end():
    regex = _digit_regex()
    output = regex.visualize(format="svg", engine="graphviz")
    assert "</svg>" in output


def test_regex_visualize_rejects_unknown_format_end_to_end():
    regex = _digit_regex()
    with pytest.raises(UnsupportedVisualizationFormatError):
        regex.visualize(format="dot")


def test_regex_visualize_rejects_engine_mismatch_end_to_end():
    regex = _digit_regex()
    with pytest.raises(UnsupportedVisualizationEngineError):
        regex.visualize(format="svg", engine="ascii")


def test_empty_elements_still_render_start_and_end():
    output = visualize_elements(())
    assert "START" in output
    assert "END" in output