diff options
author | Peter Pentchev <roam@ringlet.net> | 2019-01-02 20:24:59 +0200 |
---|---|---|
committer | Peter Pentchev <roam@ringlet.net> | 2019-01-02 20:39:29 +0200 |
commit | 9c107697ca33fd8cf680889d64bc00d771e06b01 (patch) | |
tree | f9e0be21ba91a3082ee4084f316abbb88f925fb3 | |
parent | 9af1074fa2fd679b306ca587f8661cfcf4c5cd41 (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.ini | 8 | ||||
-rw-r--r-- | python/unit_tests/data/__init__.py | 2 | ||||
-rw-r--r-- | python/unit_tests/data/data.py | 961 | ||||
-rw-r--r-- | python/unit_tests/data/load.py | 80 | ||||
-rw-r--r-- | python/unit_tests/test_run.py | 4 | ||||
-rw-r--r-- | t/defs/schema/test-1.0.json | 176 | ||||
-rw-r--r-- | t/defs/tests/01-get-values.json | 293 | ||||
-rw-r--r-- | t/defs/tests/02-check-values.json | 258 | ||||
-rw-r--r-- | t/defs/tests/03-list-all.json | 118 | ||||
-rw-r--r-- | t/defs/tests/05-match-names.json | 81 | ||||
-rw-r--r-- | t/defs/tests/06-get-default.json | 87 | ||||
-rw-r--r-- | t/defs/tests/07-match-values.json | 166 | ||||
-rw-r--r-- | t/defs/tests/11-no-default.json | 173 | ||||
-rw-r--r-- | t/defs/tests/12-last-value.json | 239 | ||||
-rw-r--r-- | t/defs/tools/encode.py | 105 | ||||
-rwxr-xr-x | t/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&key3=%09%09%20val%27ue3', - 'Q1': 'key4&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&key3=%09%09%20val%27ue3', - 'Q1': 'key4&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&key3=%09%09%20val%27ue3', - 'Q1': 'key4&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&key3=%09%09%20val%27ue3", + "Q1": "key4&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&key3=%09%09%20val%27ue3", + "Q1": "key4&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&key3=%09%09%20val%27ue3", + "Q1": "key4&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) |