summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Pentchev <roam@ringlet.net>2019-01-02 20:24:59 +0200
committerPeter Pentchev <roam@ringlet.net>2019-01-02 20:39:29 +0200
commit9c107697ca33fd8cf680889d64bc00d771e06b01 (patch)
treef9e0be21ba91a3082ee4084f316abbb88f925fb3
parent9af1074fa2fd679b306ca587f8661cfcf4c5cd41 (diff)
Keep the tests data in JSON files.
Add a schema to validate them. Load the test data dynamically in generate.py. Load the test data dynamically in the test_run unit test.
-rw-r--r--python/tox.ini8
-rw-r--r--python/unit_tests/data/__init__.py2
-rw-r--r--python/unit_tests/data/data.py961
-rw-r--r--python/unit_tests/data/load.py80
-rw-r--r--python/unit_tests/test_run.py4
-rw-r--r--t/defs/schema/test-1.0.json176
-rw-r--r--t/defs/tests/01-get-values.json293
-rw-r--r--t/defs/tests/02-check-values.json258
-rw-r--r--t/defs/tests/03-list-all.json118
-rw-r--r--t/defs/tests/05-match-names.json81
-rw-r--r--t/defs/tests/06-get-default.json87
-rw-r--r--t/defs/tests/07-match-values.json166
-rw-r--r--t/defs/tests/11-no-default.json173
-rw-r--r--t/defs/tests/12-last-value.json239
-rw-r--r--t/defs/tools/encode.py105
-rwxr-xr-xt/defs/tools/generate.py (renamed from t/generate.py)3
16 files changed, 1786 insertions, 968 deletions
diff --git a/python/tox.ini b/python/tox.ini
index aec8bff..74e7195 100644
--- a/python/tox.ini
+++ b/python/tox.ini
@@ -7,7 +7,7 @@ basepython = python3
deps =
flake8
commands =
- flake8 confget unit_tests ../t/generate.py
+ flake8 confget unit_tests ../t/defs/tools/generate.py
[testenv:mypy2]
basepython = python3
@@ -26,7 +26,7 @@ deps =
setenv =
MYPYPATH={toxinidir}/stubs
commands =
- mypy --strict confget ../t/generate.py
+ mypy --strict confget ../t/defs/tools/generate.py
mypy --strict --allow-untyped-decorators unit_tests
[testenv:pylint]
@@ -36,7 +36,7 @@ deps =
pylint
pytest
commands =
- pylint --disable=useless-object-inheritance,duplicate-code confget unit_tests ../t/generate.py
+ pylint --disable=useless-object-inheritance,duplicate-code confget unit_tests ../t/defs/tools/generate.py
[testenv:unit_tests_2]
basepython = python2
@@ -66,7 +66,7 @@ deps =
whitelist_externals =
sh
commands =
- sh -c 'cd ../t && env PYTHONPATH={toxinidir} python generate.py'
+ sh -c 'cd ../t && env PYTHONPATH={toxinidir} python defs/tools/generate.py'
[testenv:prove_2]
basepython = python2
diff --git a/python/unit_tests/data/__init__.py b/python/unit_tests/data/__init__.py
index 6bdc1ee..062c737 100644
--- a/python/unit_tests/data/__init__.py
+++ b/python/unit_tests/data/__init__.py
@@ -3,5 +3,5 @@ Data structures and definitions for the confget unit tests.
"""
from .defs import CMDLINE_OPTIONS, XFORM, TestDef # noqa: F401
-from .data import TESTS # noqa: F401
+from .load import load_all_tests # noqa: F401
from .util import shell_escape # noqa: F401
diff --git a/python/unit_tests/data/data.py b/python/unit_tests/data/data.py
deleted file mode 100644
index 0fede7c..0000000
--- a/python/unit_tests/data/data.py
+++ /dev/null
@@ -1,961 +0,0 @@
-"""
-Test data for the confget unit tests.
-"""
-
-from . import defs
-
-
-TESTS = {
- '01-get-values': defs.TestFileDef(
- setenv={
- 'QUERY_STRING':
- 'key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3',
- 'Q1': 'key4&amp;key5=%09%09%20val%27ue5&key6',
- 'Q2': '',
- },
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='value1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'show_var_name': '',
- },
- keys=['key2'],
- output=defs.TestExactOutputDef(
- exact='key2=value2',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key3'],
- output=defs.TestExactOutputDef(
- exact="\t\t val'ue3",
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact="v'alu'e4",
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'c',
- },
- keys=['key5'],
- output=defs.TestExactOutputDef(
- exact='\t\t# value5',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key1', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='key1=value1 key2=value2 ',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'hide_var_name': '',
- },
- keys=['key6', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='value2 value6 ',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- },
- keys=['key7'],
- output=defs.TestExactOutputDef(
- exact='value7',
- ),
- ),
-
- defs.TestDef(
- args={
- 'section': 'b sect',
- },
- keys=['key7'],
- output=defs.TestExactOutputDef(
- exact='value7',
- ),
- stdin='t1.ini',
- ),
- defs.TestDef(
- args={
- 'section': 'b sect',
- },
- keys=['key77'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- stdin='t1.ini',
- ),
-
- defs.TestDef(
- args={},
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='value1',
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'show_var_name': '',
- },
- keys=['key2'],
- output=defs.TestExactOutputDef(
- exact='key2==value2&',
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={},
- keys=['key3'],
- output=defs.TestExactOutputDef(
- exact="\t\t val'ue3",
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'section': 'Q1',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'section': 'Q1',
- },
- keys=['key5'],
- output=defs.TestExactOutputDef(
- exact="\t\t val'ue5",
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'section': 'Q1',
- },
- keys=['key6'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'section': 'Q1',
- },
- keys=['key66'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'section': 'Q2',
- },
- keys=['key66'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- backend='http_get',
- setenv=True,
- ),
- ],
- ),
-
- '02-check-values': defs.TestFileDef(
- setenv={
- 'QUERY_STRING':
- 'key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3',
- 'Q1': 'key4&amp;key5=%09%09%20val%27ue5&key6',
- 'Q2': '',
- },
- tests=[
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key1'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key2'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key3'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'a',
- },
- keys=['key4'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'b sect',
- },
- keys=['key5'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'b sect',
- },
- keys=['key4'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'filename': 't1.ini',
- 'section': 'c',
- },
- keys=['key5'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
-
- defs.TestDef(
- args={
- 'check_only': '',
- },
- keys=['key1'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- },
- keys=['key2'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- },
- keys=['key3'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'section': 'Q1',
- },
- keys=['key4'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'section': 'Q1',
- },
- keys=['key6'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- },
- keys=['key6'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'section': 'Q1',
- },
- keys=['key1'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- backend='http_get',
- setenv=True,
- ),
- defs.TestDef(
- args={
- 'check_only': '',
- 'section': 'Q2',
- },
- keys=['key1'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- backend='http_get',
- setenv=True,
- ),
- ],
- ),
-
- '03-list-all': defs.TestFileDef(
- setenv={
- 'QUERY_STRING':
- 'key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3',
- 'Q1': 'key4&amp;key5=%09%09%20val%27ue5&key6',
- 'Q2': '',
- },
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'list_all': '',
- },
- keys=[],
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='4',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- 'list_all': '',
- 'show_var_name': '',
- },
- keys=[],
- xform='count-lines-eq',
- output=defs.TestExactOutputDef(
- exact='2',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'c',
- 'list_all': '',
- 'hide_var_name': '',
- },
- keys=[],
- xform='count-lines-non-eq',
- output=defs.TestExactOutputDef(
- exact='1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'd',
- 'list_all': '',
- },
- keys=[],
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='0',
- ),
- ),
-
- defs.TestDef(
- args={
- 'list_all': '',
- },
- keys=[],
- backend='http_get',
- setenv=True,
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='3',
- ),
- ),
- defs.TestDef(
- args={
- 'list_all': '',
- 'section': 'Q1',
- },
- keys=[],
- backend='http_get',
- setenv=True,
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='3',
- ),
- ),
- defs.TestDef(
- args={
- 'list_all': '',
- 'section': 'Q2',
- },
- keys=[],
- backend='http_get',
- setenv=True,
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='0',
- ),
- ),
- ],
- ),
-
- '05-match-names': defs.TestFileDef(
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_names': '',
- },
- keys=['*'],
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='4',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- 'match_var_names': '',
- 'show_var_name': '',
- },
- keys=['*'],
- xform='count-lines-eq',
- output=defs.TestExactOutputDef(
- exact='2',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_names': '',
- 'hide_var_name': '',
- },
- keys=['*ey2'],
- xform='count-lines-non-eq',
- output=defs.TestExactOutputDef(
- exact='1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'd',
- 'match_var_names': '',
- },
- keys=['*ey2'],
- xform='count-lines',
- output=defs.TestExactOutputDef(
- exact='0',
- ),
- ),
- ],
- ),
-
- '06-get-default': defs.TestFileDef(
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='value1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key6'],
- output=defs.TestExactOutputDef(
- exact='value6',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- },
- keys=['key1', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='key1=1 key2=2 ',
- ),
- ),
- ],
- ),
-
- '07-match-values': defs.TestFileDef(
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_values': 'value*',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='value1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_values': '*ue2',
- },
- keys=['key2'],
- output=defs.TestExactOutputDef(
- exact='value2',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_values': "*val'ue*",
- },
- keys=['key3'],
- output=defs.TestExactOutputDef(
- exact=" val'ue3",
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- 'match_var_values': '*alu*',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact="v'alu'e4",
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'c',
- },
- keys=['key5'],
- output=defs.TestExactOutputDef(
- exact=' # value5',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_values': '*alu*',
- },
- keys=['key1', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='key1=value1 key2=value2 ',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'a',
- 'match_var_values': '*7',
- },
- keys=['key6'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- 'check_only': '',
- 'match_var_values': '*7',
- },
- keys=['key7'],
- output=defs.TestExitOKOutputDef(
- success=True,
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': 'b sect',
- 'check_only': '',
- 'match_var_values': '*7',
- },
- keys=['key6'],
- output=defs.TestExitOKOutputDef(
- success=False,
- ),
- ),
- ],
- ),
-
- '11-no-default': defs.TestFileDef(
- tests=[
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='value1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- },
- keys=['key6'],
- output=defs.TestExactOutputDef(
- exact='value6',
- ),
- ),
-
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': '',
- 'section_specified': '',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': '',
- 'section_specified': '',
- },
- keys=['key4'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't1.ini',
- 'section': '',
- 'section_specified': '',
- },
- keys=['key6'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
-
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- },
- keys=['key1', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='key1=1 key2=2 ',
- ),
- ),
-
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- 'section': '',
- 'section_specified': '',
- },
- keys=['key1'],
- output=defs.TestExactOutputDef(
- exact='1',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't2.ini',
- 'section': '',
- 'section_specified': '',
- },
- keys=['key1', 'key2'],
- xform='newline-to-space',
- output=defs.TestExactOutputDef(
- exact='key1=1 key2=2 ',
- ),
- ),
- ],
- ),
-
- '12-last-value': defs.TestFileDef(
- tests=[
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='default',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- },
- keys=['defonly'],
- output=defs.TestExactOutputDef(
- exact='default',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- },
- keys=['aonly'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': '',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='default',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': '',
- },
- keys=['defonly'],
- output=defs.TestExactOutputDef(
- exact='default',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': '',
- },
- keys=['aonly'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='a',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- },
- keys=['defonly'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- },
- keys=['aonly'],
- output=defs.TestExactOutputDef(
- exact='a',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- 'section_override': '',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='a',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- 'section_override': '',
- },
- keys=['defonly'],
- output=defs.TestExactOutputDef(
- exact='default',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'section': 'a',
- 'section_override': '',
- },
- keys=['aonly'],
- output=defs.TestExactOutputDef(
- exact='a',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'match_var_values': 'def*',
- 'section': 'a',
- 'section_override': '',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='',
- ),
- ),
- defs.TestDef(
- args={
- 'filename': 't3.ini',
- 'match_var_values': 'a*',
- 'section': 'a',
- 'section_override': '',
- },
- keys=['both'],
- output=defs.TestExactOutputDef(
- exact='a',
- ),
- ),
- ],
- ),
-}
diff --git a/python/unit_tests/data/load.py b/python/unit_tests/data/load.py
new file mode 100644
index 0000000..70d8089
--- /dev/null
+++ b/python/unit_tests/data/load.py
@@ -0,0 +1,80 @@
+"""
+Load a test definition from a JSON file.
+"""
+# pylint: disable=consider-using-dict-comprehension
+
+import json
+import os
+
+from typing import Any, Dict
+
+from . import defs
+
+
+TESTING_USED = (defs, Any, Dict)
+
+
+def _load_test_v1(data, _version):
+ # type: (Dict[str, Any], Dict[str, int]) -> defs.TestFileDef
+ """ Load the tests from a v1.x test file. """
+ build = {
+ 'setenv': data.get('setenv', {}),
+ 'tests': [],
+ }
+
+ for test in data['tests']:
+ raw = dict([
+ (key, value) for key, value in test.items()
+ if key in ('args', 'keys', 'xform', 'backend', 'setenv', 'stdin')
+ ])
+
+ if 'exact' in test['output']:
+ raw['output'] = defs.TestExactOutputDef(
+ exact=test['output']['exact'])
+ elif 'exit' in test['output']:
+ raw['output'] = defs.TestExitOKOutputDef(
+ success=test['output']['exit'])
+ else:
+ raise ValueError('test output: ' + repr(test['output']))
+
+ build['tests'].append(defs.TestDef(**raw))
+
+ return defs.TestFileDef(**build)
+
+
+_PARSERS = {
+ 1: _load_test_v1,
+}
+
+
+def load_test(fname):
+ # type: (str) -> defs.TestFileDef
+ """ Load a single test file into a TestFileDef object. """
+ with open(fname, mode='r') as testf:
+ data = json.load(testf)
+
+ version = {
+ 'major': data['format']['version']['major'],
+ 'minor': data['format']['version']['minor'],
+ }
+ assert isinstance(version['major'], int)
+ assert isinstance(version['minor'], int)
+
+ parser = _PARSERS.get(version['major'], None)
+ if parser is not None:
+ return parser(data, version)
+ raise NotImplementedError(
+ 'Unsupported test file format version {major}.{minor} for {fname}'
+ .format(major=version['major'], minor=version['minor'], fname=fname))
+
+
+def load_all_tests(testdir):
+ # type: (str) -> Dict[str, defs.TestFileDef]
+ """ Load all the tests in the defs/tests/ subdirectory. """
+ tdir = testdir + '/defs/tests/'
+ filenames = sorted(fname for fname in os.listdir(tdir)
+ if fname.endswith('.json'))
+ return dict([
+ (os.path.splitext(fname)[0], load_test(tdir + fname))
+ for fname in filenames
+ ])
diff --git a/python/unit_tests/test_run.py b/python/unit_tests/test_run.py
index 6c10656..e0d9f8b 100644
--- a/python/unit_tests/test_run.py
+++ b/python/unit_tests/test_run.py
@@ -30,6 +30,8 @@ except ImportError:
pass
+TESTS = tdata.load_all_tests(os.environ['TESTDIR'])
+
FULL_TEST_DATA = sorted(itertools.chain(*[
[
(
@@ -40,7 +42,7 @@ FULL_TEST_DATA = sorted(itertools.chain(*[
)
for idx, test in enumerate(tfile[1].tests)
]
- for tfile in tdata.TESTS.items()
+ for tfile in TESTS.items()
]))
SKIP_ARGS = set(['check_only'])
diff --git a/t/defs/schema/test-1.0.json b/t/defs/schema/test-1.0.json
new file mode 100644
index 0000000..065fe1f
--- /dev/null
+++ b/t/defs/schema/test-1.0.json
@@ -0,0 +1,176 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "$id": "https://devel.ringlet.net/textproc/confget/schema/test-1.0.json",
+ "title": "confget test definition",
+ "description": "A definition of a test file for the confget test suite",
+ "definitions": {
+ "format": {
+ "type": "object",
+ "properties": {
+ "version": {
+ "type": "object",
+ "properties": {
+ "major": {
+ "type": "integer",
+ "const": 1
+ },
+ "minor": {
+ "type": "integer",
+ "const": 0
+ }
+ },
+ "required": ["major", "minor"],
+ "additionalProperties": false
+ }
+ },
+ "required": ["version"],
+ "additionalProperties": false
+ },
+
+ "setenv": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+
+ "test_def": {
+ "type": "object",
+ "properties": {
+ "args": {
+ "$ref": "#/definitions/test_def_args"
+ },
+ "keys": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "xform": {
+ "type": "string",
+ "enum": [
+ "",
+ "count-lines",
+ "count-lines-eq",
+ "count-lines-non-eq",
+ "newline-to-space"
+ ]
+ },
+ "backend": {
+ "type": "string",
+ "enum": ["http_get", "ini"]
+ },
+ "setenv": {
+ "type": "boolean"
+ },
+ "stdin": {
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "type": "string",
+ "pattern": "^[0-9a-z_-]+\\.ini$"
+ }
+ ]
+ },
+ "output": {
+ "oneOf": [
+ {
+ "$ref": "#/definitions/output_exact"
+ },
+ {
+ "$ref": "#/definitions/output_exit_ok"
+ }
+ ]
+ }
+ },
+ "required": ["args", "keys", "output"],
+ "additionalProperties": false
+ },
+
+ "test_def_args": {
+ "type": "object",
+ "properties": {
+ "check_only": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "filename": {
+ "type": "string"
+ },
+ "hide_var_name": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "list_all": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "match_var_names": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "match_var_values": {
+ "type": "string"
+ },
+ "section": {
+ "type": "string"
+ },
+ "section_override": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "section_specified": {
+ "type": "string",
+ "maxLength": 0
+ },
+ "show_var_name": {
+ "type": "string",
+ "maxLength": 0
+ }
+ },
+ "additionalProperties": false
+ },
+
+ "output_exact": {
+ "type": "object",
+ "properties": {
+ "exact": {
+ "type": "string"
+ }
+ },
+ "required": ["exact"],
+ "additionalProperties": false
+ },
+
+ "output_exit_ok": {
+ "type": "object",
+ "properties": {
+ "exit": {
+ "type": "boolean"
+ }
+ },
+ "required": ["exit"],
+ "additionalProperties": false
+ }
+ },
+
+ "type": "object",
+ "properties": {
+ "format": {
+ "$ref": "#/definitions/format"
+ },
+ "setenv": {
+ "$ref": "#/definitions/setenv"
+ },
+ "tests": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/test_def"
+ }
+ }
+ },
+ "required": ["format", "tests"],
+ "additionalProperties": false
+}
diff --git a/t/defs/tests/01-get-values.json b/t/defs/tests/01-get-values.json
new file mode 100644
index 0000000..eb89340
--- /dev/null
+++ b/t/defs/tests/01-get-values.json
@@ -0,0 +1,293 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {
+ "QUERY_STRING": "key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3",
+ "Q1": "key4&amp;key5=%09%09%20val%27ue5&key6",
+ "Q2": ""
+ },
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "show_var_name": ""
+ },
+ "keys": [
+ "key2"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "key2=value2"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key3"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "\t\t val'ue3"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "v'alu'e4"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "c"
+ },
+ "keys": [
+ "key5"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "\t\t# value5"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key1",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "key1=value1 key2=value2 "
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "hide_var_name": ""
+ },
+ "keys": [
+ "key6",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "value2 value6 "
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect"
+ },
+ "keys": [
+ "key7"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value7"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "b sect"
+ },
+ "keys": [
+ "key7"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value7"
+ },
+ "setenv": false,
+ "stdin": "t1.ini"
+ },
+ {
+ "args": {
+ "section": "b sect"
+ },
+ "keys": [
+ "key77"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": "t1.ini"
+ },
+ {
+ "args": {},
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": "value1"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "show_var_name": ""
+ },
+ "keys": [
+ "key2"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": "key2==value2&"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {},
+ "keys": [
+ "key3"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": "\t\t val'ue3"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "Q1"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": ""
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "Q1"
+ },
+ "keys": [
+ "key5"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": "\t\t val'ue5"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "Q1"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": ""
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "Q1"
+ },
+ "keys": [
+ "key66"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": ""
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "section": "Q2"
+ },
+ "keys": [
+ "key66"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exact": ""
+ },
+ "setenv": true,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/02-check-values.json b/t/defs/tests/02-check-values.json
new file mode 100644
index 0000000..1772d80
--- /dev/null
+++ b/t/defs/tests/02-check-values.json
@@ -0,0 +1,258 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {
+ "QUERY_STRING": "key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3",
+ "Q1": "key4&amp;key5=%09%09%20val%27ue5&key6",
+ "Q2": ""
+ },
+ "tests": [
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key2"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key3"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "a"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": false
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "b sect"
+ },
+ "keys": [
+ "key5"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": false
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "b sect"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "filename": "t1.ini",
+ "section": "c"
+ },
+ "keys": [
+ "key5"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": ""
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": true
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": ""
+ },
+ "keys": [
+ "key2"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": true
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": ""
+ },
+ "keys": [
+ "key3"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": true
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "section": "Q1"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": true
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "section": "Q1"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": true
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": ""
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": false
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "section": "Q1"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": false
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "check_only": "",
+ "section": "Q2"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "http_get",
+ "output": {
+ "exit": false
+ },
+ "setenv": true,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/03-list-all.json b/t/defs/tests/03-list-all.json
new file mode 100644
index 0000000..b85b867
--- /dev/null
+++ b/t/defs/tests/03-list-all.json
@@ -0,0 +1,118 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {
+ "QUERY_STRING": "key1=value1&key2=%3Dvalue2%26&amp;key3=%09%09%20val%27ue3",
+ "Q1": "key4&amp;key5=%09%09%20val%27ue5&key6",
+ "Q2": ""
+ },
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "list_all": ""
+ },
+ "keys": [],
+ "xform": "count-lines",
+ "backend": "ini",
+ "output": {
+ "exact": "4"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect",
+ "list_all": "",
+ "show_var_name": ""
+ },
+ "keys": [],
+ "xform": "count-lines-eq",
+ "backend": "ini",
+ "output": {
+ "exact": "2"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "c",
+ "list_all": "",
+ "hide_var_name": ""
+ },
+ "keys": [],
+ "xform": "count-lines-non-eq",
+ "backend": "ini",
+ "output": {
+ "exact": "1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "d",
+ "list_all": ""
+ },
+ "keys": [],
+ "xform": "count-lines",
+ "backend": "ini",
+ "output": {
+ "exact": "0"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "list_all": ""
+ },
+ "keys": [],
+ "xform": "count-lines",
+ "backend": "http_get",
+ "output": {
+ "exact": "3"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "list_all": "",
+ "section": "Q1"
+ },
+ "keys": [],
+ "xform": "count-lines",
+ "backend": "http_get",
+ "output": {
+ "exact": "3"
+ },
+ "setenv": true,
+ "stdin": null
+ },
+ {
+ "args": {
+ "list_all": "",
+ "section": "Q2"
+ },
+ "keys": [],
+ "xform": "count-lines",
+ "backend": "http_get",
+ "output": {
+ "exact": "0"
+ },
+ "setenv": true,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/05-match-names.json b/t/defs/tests/05-match-names.json
new file mode 100644
index 0000000..7dd76c2
--- /dev/null
+++ b/t/defs/tests/05-match-names.json
@@ -0,0 +1,81 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {},
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_names": ""
+ },
+ "keys": [
+ "*"
+ ],
+ "xform": "count-lines",
+ "backend": "ini",
+ "output": {
+ "exact": "4"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect",
+ "match_var_names": "",
+ "show_var_name": ""
+ },
+ "keys": [
+ "*"
+ ],
+ "xform": "count-lines-eq",
+ "backend": "ini",
+ "output": {
+ "exact": "2"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_names": "",
+ "hide_var_name": ""
+ },
+ "keys": [
+ "*ey2"
+ ],
+ "xform": "count-lines-non-eq",
+ "backend": "ini",
+ "output": {
+ "exact": "1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "d",
+ "match_var_names": ""
+ },
+ "keys": [
+ "*ey2"
+ ],
+ "xform": "count-lines",
+ "backend": "ini",
+ "output": {
+ "exact": "0"
+ },
+ "setenv": false,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/06-get-default.json b/t/defs/tests/06-get-default.json
new file mode 100644
index 0000000..d20f812
--- /dev/null
+++ b/t/defs/tests/06-get-default.json
@@ -0,0 +1,87 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {},
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value6"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini"
+ },
+ "keys": [
+ "key1",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "key1=1 key2=2 "
+ },
+ "setenv": false,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/07-match-values.json b/t/defs/tests/07-match-values.json
new file mode 100644
index 0000000..96c6e2a
--- /dev/null
+++ b/t/defs/tests/07-match-values.json
@@ -0,0 +1,166 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {},
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_values": "value*"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_values": "*ue2"
+ },
+ "keys": [
+ "key2"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value2"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_values": "*val'ue*"
+ },
+ "keys": [
+ "key3"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "\t\t val'ue3"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect",
+ "match_var_values": "*alu*"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "v'alu'e4"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "c"
+ },
+ "keys": [
+ "key5"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "\t\t# value5"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_values": "*alu*"
+ },
+ "keys": [
+ "key1",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "key1=value1 key2=value2 "
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "a",
+ "match_var_values": "*7"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect",
+ "check_only": "",
+ "match_var_values": "*7"
+ },
+ "keys": [
+ "key7"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": true
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "b sect",
+ "check_only": "",
+ "match_var_values": "*7"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exit": false
+ },
+ "setenv": false,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/11-no-default.json b/t/defs/tests/11-no-default.json
new file mode 100644
index 0000000..492043f
--- /dev/null
+++ b/t/defs/tests/11-no-default.json
@@ -0,0 +1,173 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {},
+ "tests": [
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini"
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "value6"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "",
+ "section_specified": ""
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "",
+ "section_specified": ""
+ },
+ "keys": [
+ "key4"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t1.ini",
+ "section": "",
+ "section_specified": ""
+ },
+ "keys": [
+ "key6"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini"
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini"
+ },
+ "keys": [
+ "key1",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "key1=1 key2=2 "
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini",
+ "section": "",
+ "section_specified": ""
+ },
+ "keys": [
+ "key1"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "1"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t2.ini",
+ "section": "",
+ "section_specified": ""
+ },
+ "keys": [
+ "key1",
+ "key2"
+ ],
+ "xform": "newline-to-space",
+ "backend": "ini",
+ "output": {
+ "exact": "key1=1 key2=2 "
+ },
+ "setenv": false,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tests/12-last-value.json b/t/defs/tests/12-last-value.json
new file mode 100644
index 0000000..3005780
--- /dev/null
+++ b/t/defs/tests/12-last-value.json
@@ -0,0 +1,239 @@
+{
+ "format": {
+ "version": {
+ "major": 1,
+ "minor": 0
+ }
+ },
+ "setenv": {},
+ "tests": [
+ {
+ "args": {
+ "filename": "t3.ini"
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "default"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini"
+ },
+ "keys": [
+ "defonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "default"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini"
+ },
+ "keys": [
+ "aonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": ""
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "default"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": ""
+ },
+ "keys": [
+ "defonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "default"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": ""
+ },
+ "keys": [
+ "aonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a"
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "a"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a"
+ },
+ "keys": [
+ "defonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a"
+ },
+ "keys": [
+ "aonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "a"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a",
+ "section_override": ""
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "a"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a",
+ "section_override": ""
+ },
+ "keys": [
+ "defonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "default"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "section": "a",
+ "section_override": ""
+ },
+ "keys": [
+ "aonly"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "a"
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "match_var_values": "def*",
+ "section": "a",
+ "section_override": ""
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": ""
+ },
+ "setenv": false,
+ "stdin": null
+ },
+ {
+ "args": {
+ "filename": "t3.ini",
+ "match_var_values": "a*",
+ "section": "a",
+ "section_override": ""
+ },
+ "keys": [
+ "both"
+ ],
+ "xform": "",
+ "backend": "ini",
+ "output": {
+ "exact": "a"
+ },
+ "setenv": false,
+ "stdin": null
+ }
+ ]
+}
diff --git a/t/defs/tools/encode.py b/t/defs/tools/encode.py
new file mode 100644
index 0000000..32e961a
--- /dev/null
+++ b/t/defs/tools/encode.py
@@ -0,0 +1,105 @@
+#!/usr/bin/python3
+#
+# Copyright (c) 2019 Peter Pentchev <roam@ringlet.net>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+"""
+Encode a Python confget test data structure into a JSON file.
+"""
+
+import json
+
+from typing import Any, Dict
+
+from unit_tests.data import data as t_data
+from unit_tests.data import defs as t_defs
+
+
+class TestEncoder(json.JSONEncoder):
+ """ Encode the confget test data into serializable objects. """
+
+ def encode_test_file_def(self, obj: t_defs.TestFileDef) -> Dict[str, Any]:
+ """ Encode a full TestFileDef object. """
+ return {
+ 'format': {
+ 'version': {
+ 'major': 1,
+ 'minor': 0,
+ },
+ },
+ 'setenv': obj.setenv,
+ 'tests': [self.default(test) for test in obj.tests],
+ }
+
+ def encode_test_def(self, obj: t_defs.TestDef) -> Dict[str, Any]:
+ """ Encode a single test definition. """
+ return {
+ 'args': obj.args,
+ 'keys': obj.keys,
+ 'xform': obj.xform,
+ 'backend': obj.backend,
+ 'output': self.default(obj.output),
+ 'setenv': obj.setenv,
+ 'stdin': obj.stdin,
+ }
+
+ def encode_exact_output_def(self, obj: t_defs.TestExactOutputDef
+ ) -> Dict[str, str]:
+ """ Encode an exact output requirement. """
+ return {
+ 'exact': obj.exact,
+ }
+
+ def encode_exit_ok_output_def(self, obj: t_defs.TestExitOKOutputDef
+ ) -> Dict[str, bool]:
+ """ Encode an exit code requirement. """
+ return {
+ 'exit': obj.success,
+ }
+
+ SERIALIZERS = {
+ t_defs.TestFileDef: encode_test_file_def,
+ t_defs.TestDef: encode_test_def,
+ t_defs.TestExactOutputDef: encode_exact_output_def,
+ t_defs.TestExitOKOutputDef: encode_exit_ok_output_def,
+ }
+
+ def default(self, obj: Any) -> Any:
+ """ Meow. """
+ method = self.SERIALIZERS.get(type(obj), None)
+ if method is not None:
+ return method(self, obj)
+ return super(TestEncoder, self).default(obj)
+
+
+def main() -> None:
+ """ Main function: encode, output. """
+ for name, tdef in sorted(t_data.TESTS.items()):
+ print(f'--- {name} ---')
+ with open(f'output/{name}.json', mode='w') as outf:
+ print(json.dumps(tdef, indent=2, cls=TestEncoder), file=outf)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/t/generate.py b/t/defs/tools/generate.py
index 7e33ac0..45dd99a 100755
--- a/t/generate.py
+++ b/t/defs/tools/generate.py
@@ -89,7 +89,8 @@ def add_cmdline_options(cmdline: List[str], test: t_data.defs.TestDef
def main() -> None:
""" Main function: generate the test files. """
- for fname, data in sorted(t_data.TESTS.items()):
+ tests = t_data.load_all_tests('.')
+ for fname, data in sorted(tests.items()):
print(f'Generating {fname}.t with {len(data.tests)} tests')
with open(f'{fname}.t', mode='w') as testf:
print(PRELUDE.format(count=len(data.tests)), file=testf)