summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/roots/test-directive-code/dedent.rst64
-rw-r--r--tests/test_directive_code.py26
2 files changed, 90 insertions, 0 deletions
diff --git a/tests/roots/test-directive-code/dedent.rst b/tests/roots/test-directive-code/dedent.rst
new file mode 100644
index 000000000..f36e3e3ba
--- /dev/null
+++ b/tests/roots/test-directive-code/dedent.rst
@@ -0,0 +1,64 @@
+dedent option
+-------------
+
+.. code-block::
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+ReST has no fixed indent and only a change in indention is significant not the amount [1]_.
+Thus, the following code inside the code block is not indent even it looks so with respect to the previous block.
+
+.. code-block::
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Having an option "fixates" the indent to be 3 spaces, thus the code inside the code block is indented by 4 spaces.
+
+.. code-block::
+ :class: dummy
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+The code has 6 spaces indent, minus 4 spaces dedent should yield a 2 space indented code in the output.
+
+.. code-block::
+ :dedent: 4
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Dedenting by zero, should not strip any spaces and be a no-op.
+
+.. note::
+ This can be used as an alternative to ``:class: dummy`` above, to fixate the ReST indention of the block.
+
+.. code-block::
+ :dedent: 0
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+Dedent without argument should autostrip common whitespace at the beginning.
+
+.. code-block::
+ :dedent:
+
+ First line
+ Second line
+ Third line
+ Fourth line
+
+.. [1] https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#indentation
diff --git a/tests/test_directive_code.py b/tests/test_directive_code.py
index a011a31e8..95b6455d2 100644
--- a/tests/test_directive_code.py
+++ b/tests/test_directive_code.py
@@ -580,3 +580,29 @@ def test_linenothreshold(app, status, warning):
# literal include not using linenothreshold (no line numbers)
assert ('<span></span><span class="c1"># Very small literal include '
'(linenothreshold check)</span>' in html)
+
+@pytest.mark.sphinx('dummy', testroot='directive-code')
+def test_code_block_dedent(app, status, warning):
+ app.builder.build(['dedent'])
+ doctree = app.env.get_doctree('dedent')
+ codeblocks = list(doctree.traverse(nodes.literal_block))
+ # Note: comparison string should not have newlines at the beginning or end
+ text_0_indent = '''First line
+Second line
+ Third line
+Fourth line'''
+ text_2_indent = ''' First line
+ Second line
+ Third line
+ Fourth line'''
+ text_4_indent = ''' First line
+ Second line
+ Third line
+ Fourth line'''
+
+ assert codeblocks[0].astext() == text_0_indent
+ assert codeblocks[1].astext() == text_0_indent
+ assert codeblocks[2].astext() == text_4_indent
+ assert codeblocks[3].astext() == text_2_indent
+ assert codeblocks[4].astext() == text_4_indent
+ assert codeblocks[5].astext() == text_0_indent