mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
isolate_tests.py: Parse Sphinx block parameters correctly
This commit is contained in:
parent
a96114b3c5
commit
0311b955c2
@ -38,19 +38,34 @@ def extract_test_cases(path):
|
|||||||
# Look for `pragma solidity`, `contract`, `library` or `interface`
|
# Look for `pragma solidity`, `contract`, `library` or `interface`
|
||||||
# and abort a line not indented properly.
|
# and abort a line not indented properly.
|
||||||
def extract_docs_cases(path):
|
def extract_docs_cases(path):
|
||||||
inside = False
|
insideBlock = False
|
||||||
|
insideBlockParameters = False
|
||||||
|
pastBlockParameters = False
|
||||||
extractedLines = []
|
extractedLines = []
|
||||||
tests = []
|
tests = []
|
||||||
|
|
||||||
# Collect all snippets of indented blocks
|
# Collect all snippets of indented blocks
|
||||||
for l in open(path, mode='r', errors='ignore', encoding='utf8', newline='').read().splitlines():
|
for l in open(path, mode='r', errors='ignore', encoding='utf8', newline='').read().splitlines():
|
||||||
if l != '':
|
if l != '':
|
||||||
if not inside and l.startswith(' '):
|
if not insideBlock and l.startswith(' '):
|
||||||
# start new test
|
# start new test
|
||||||
extractedLines += ['']
|
extractedLines += ['']
|
||||||
inside = l.startswith(' ')
|
insideBlockParameters = False
|
||||||
if inside:
|
pastBlockParameters = False
|
||||||
extractedLines[-1] += l + '\n'
|
insideBlock = l.startswith(' ')
|
||||||
|
if insideBlock:
|
||||||
|
if not pastBlockParameters:
|
||||||
|
# NOTE: For simplicity this allows blank lines between block parameters even
|
||||||
|
# though Sphinx does not. This does not matter since the first non-empty line in
|
||||||
|
# a Solidity file cannot start with a colon anyway.
|
||||||
|
if not l.strip().startswith(':') and (l != '' or not insideBlockParameters):
|
||||||
|
insideBlockParameters = False
|
||||||
|
pastBlockParameters = True
|
||||||
|
else:
|
||||||
|
insideBlockParameters = True
|
||||||
|
|
||||||
|
if not insideBlockParameters:
|
||||||
|
extractedLines[-1] += l + '\n'
|
||||||
|
|
||||||
codeStart = "(// SPDX-License-Identifier:|pragma solidity|contract.*{|library.*{|interface.*{)"
|
codeStart = "(// SPDX-License-Identifier:|pragma solidity|contract.*{|library.*{|interface.*{)"
|
||||||
|
|
||||||
|
22
test/scripts/fixtures/code_block.rst
Normal file
22
test/scripts/fixtures/code_block.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
Some text
|
||||||
|
|
||||||
|
|
||||||
|
.. code-block:: solidity
|
||||||
|
|
||||||
|
// SPDX-License-Identifier: GPL-3.0
|
||||||
|
pragma solidity >=0.7.0 <0.9.0;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function foo() public view {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
|
||||||
|
A Warning.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
contract C {}
|
||||||
|
|
||||||
|
More text.
|
48
test/scripts/fixtures/code_block_with_directives.rst
Normal file
48
test/scripts/fixtures/code_block_with_directives.rst
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
A normal block with parameters.
|
||||||
|
|
||||||
|
.. code-block:: solidity
|
||||||
|
:force:
|
||||||
|
:language: Solidity
|
||||||
|
|
||||||
|
// SPDX-License-Identifier: GPL-3.0
|
||||||
|
pragma solidity >=0.7.0 <0.9.0;
|
||||||
|
|
||||||
|
contract C {
|
||||||
|
function foo() public view {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.. warning::
|
||||||
|
A Warning.
|
||||||
|
|
||||||
|
.. code-block:: solidity
|
||||||
|
|
||||||
|
uint constant x = 42;
|
||||||
|
|
||||||
|
Text.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
contract C {}
|
||||||
|
|
||||||
|
A block with blank lines between block parameters.
|
||||||
|
Sphinx will treat the second one as a part of the code.
|
||||||
|
|
||||||
|
.. code-block:: solidity
|
||||||
|
:force:
|
||||||
|
|
||||||
|
:language: Solidity
|
||||||
|
|
||||||
|
contract D {}
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
Block with parameters indented less than code.
|
||||||
|
Sphinx does not complain about these.
|
||||||
|
|
||||||
|
.. code-block:: solidity
|
||||||
|
:force:
|
||||||
|
:linenos:
|
||||||
|
|
||||||
|
contract E {}
|
||||||
|
|
||||||
|
More text.
|
62
test/scripts/test_isolate_tests.py
Normal file
62
test/scripts/test_isolate_tests.py
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from unittest_helpers import FIXTURE_DIR, load_fixture
|
||||||
|
|
||||||
|
# NOTE: This test file file only works with scripts/ added to PYTHONPATH so pylint can't find the imports
|
||||||
|
# pragma pylint: disable=import-error
|
||||||
|
from isolate_tests import extract_docs_cases
|
||||||
|
# pragma pylint: enable=import-error
|
||||||
|
|
||||||
|
|
||||||
|
CODE_BLOCK_RST_PATH = FIXTURE_DIR / 'code_block.rst'
|
||||||
|
CODE_BLOCK_RST_CONTENT = load_fixture(CODE_BLOCK_RST_PATH)
|
||||||
|
CODE_BLOCK_WITH_DIRECTIVES_RST_PATH = FIXTURE_DIR / 'code_block_with_directives.rst'
|
||||||
|
CODE_BLOCK_WITH_DIRECTIVES_RST_CONTENT = load_fixture(CODE_BLOCK_WITH_DIRECTIVES_RST_PATH)
|
||||||
|
|
||||||
|
|
||||||
|
class TestExtractDocsCases(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.maxDiff = 10000
|
||||||
|
|
||||||
|
def test_solidity_block(self):
|
||||||
|
expected_cases = [
|
||||||
|
" // SPDX-License-Identifier: GPL-3.0\n"
|
||||||
|
" pragma solidity >=0.7.0 <0.9.0;\n"
|
||||||
|
"\n"
|
||||||
|
" contract C {\n"
|
||||||
|
" function foo() public view {}\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
"\n",
|
||||||
|
|
||||||
|
" contract C {}\n"
|
||||||
|
"\n",
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(extract_docs_cases(CODE_BLOCK_RST_PATH), expected_cases)
|
||||||
|
|
||||||
|
def test_solidity_block_with_directives(self):
|
||||||
|
expected_cases = [
|
||||||
|
" // SPDX-License-Identifier: GPL-3.0\n"
|
||||||
|
" pragma solidity >=0.7.0 <0.9.0;\n"
|
||||||
|
"\n"
|
||||||
|
" contract C {\n"
|
||||||
|
" function foo() public view {}\n"
|
||||||
|
" }\n"
|
||||||
|
"\n"
|
||||||
|
"\n",
|
||||||
|
|
||||||
|
" contract C {}\n"
|
||||||
|
"\n",
|
||||||
|
|
||||||
|
" contract D {}\n"
|
||||||
|
" :linenos:\n"
|
||||||
|
"\n",
|
||||||
|
|
||||||
|
" contract E {}\n"
|
||||||
|
"\n",
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(extract_docs_cases(CODE_BLOCK_WITH_DIRECTIVES_RST_PATH), expected_cases)
|
Loading…
Reference in New Issue
Block a user