1import os
2from io import StringIO
3
4import pytest
5
6from pygments.formatters import HtmlFormatter
7from pygments.lexers import PythonLexer
8
9
10TESTDIR = os.path.dirname(os.path.abspath(__file__))
11EXPECTED_OUTPUT_DIR = os.path.join(TESTDIR, "html_linenos_expected_output")
12CODE = list(PythonLexer().get_tokens("# a\n# b\n# c"))
13
14
15def single_line(text):
16    return "".join(l.strip() for l in text.splitlines())
17
18
19# Note: option `anchorlinenos` is currently ignored for `linenos=inline`
20@pytest.mark.parametrize("linenos", ["inline", "table"])
21@pytest.mark.parametrize("noclasses", ["False", "True"])
22@pytest.mark.parametrize("linenostep", ["1", "2"])
23@pytest.mark.parametrize("linenostart", ["1", "8"])
24@pytest.mark.parametrize("linenospecial", ["0", "3"])
25@pytest.mark.parametrize("anchorlinenos", ["False", "True"])
26def test_linenos_elements(
27    linenos, noclasses, linenostep, linenostart, linenospecial, anchorlinenos
28):
29    options = dict(
30        linenos=linenos,
31        noclasses=noclasses,
32        linenostep=linenostep,
33        linenostart=linenostart,
34        linenospecial=linenospecial,
35        anchorlinenos=anchorlinenos,
36    )
37
38    output = StringIO()
39    fmt = HtmlFormatter(**options)
40    fmt.format(CODE, output)
41    html = output.getvalue()
42
43    filename_parts = []
44    filename_parts.append(linenos)
45    filename_parts.append("nocls" if noclasses == "True" else "cls")
46    filename_parts.append("step_" + linenostep)
47    filename_parts.append("start_" + linenostart)
48    filename_parts.append("special_" + linenospecial)
49    filename_parts.append("anchor" if anchorlinenos == "True" else "noanchor")
50    expected_html_filename = "_".join(filename_parts) + ".html"
51
52    with open(os.path.join(EXPECTED_OUTPUT_DIR, expected_html_filename)) as f:
53        expected_html = f.read()
54
55    assert single_line(html) == single_line(expected_html)
56