{ "info": { "author": "Vasilkin Vladislav", "author_email": "volandtymim@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.6" ], "description": "# Ctestgen\n[Russian readme version](./README-ru.md)\n\nPython lib for generating C-programms and running them by your target-program.\nDesigned to assist in automated testing of programs working with C-programms.\n\n## Installation\n\n```shell\npip3 install ctestgen\n```\n\n## Example usage\n\n**Ctestgen** has two main use cases: C-programs generating and \nrunning target program with C-programs as input.\n\n### C-programs generating\n\nTo generating programs, you need to inherit abstract class `ctestgen.generator.TestGenerator`\nand reimplement method `_generate_programs()`, that returns c-programs abstract syntax trees.\nAbstract syntax tree describing in OOP style, more [here](docs/generator_api.md).\nMethod `run()` calls `_generate_programs()` and then stores programs in output dir, \nwhich is defined when creating a class object: `ExampleTestGenerator('example_generator_output')`.\n\nDescribe the class, that generating programs with sum function, that takes from 2 to 5 arguments. \nFull code [here](./examples/example_test_generator.py).\nGenerated code [here](./examples/example_generator_output).\n```python\nfrom ctestgen.generator import TestGenerator\nclass ExampleTestGenerator(TestGenerator):\n def _generate_programs(self):\n generated_programs = list()\n for i in range(2, 6):\n sum_arguments = [Int('num_' + str(arg_idx)) for arg_idx in range(i)]\n sum_function = Function('sum_' + str(i) + '_nums', Int, sum_arguments)\n sum_result = Int('sum')\n sum_body = CodeBlock(\n Assignment(VarDeclaration(sum_result), Add(sum_arguments)),\n Return(sum_result)\n )\n sum_function.set_body(sum_body)\n example_program = Program('sum_' + str(i))\n example_program.add_function(sum_function)\n generated_programs.append(example_program)\n return generated_programs\n\nexample_generator = ExampleTestGenerator('example_generator_output')\nexample_generator.run()\n```\nThis generates, as example `sum_3.c`.\n```c\nint sum_3_nums(int num_0, int num_1, int num_2) {\n int sum = num_0 + num_1 + num_2;\n return sum;\n}\n```\n\n**Generator** API documentation [here](docs/generator_api.md).\nIt contains wide OOP tools to describe desired C-programs.\n\n### Tests running\n\nTo running programs, you need to inherit abstract class `ctestgen.runner.TestRunner`\nand reimplement method `_on_test()`, that called on every program in defined directory.\n**TestRunner** designed to run target program with every file, that contained in the target directory \nand its subdirectories\nand have target file extensions, which defines in class object creation, by default it\\`s `.c`.\n\n**TestRunner** method `run()` describes testing pipeline, and class methods designed to override them in subclasses. \n\nTesting pipeline:\n - recursively collect test files in defined directory\n - call `_on_run_start(tests)`\n - for every dir, that contained test files, call `_on_testdir(test_dir, test_filenames)`\n - for every file in that dir, call `_on_test(test_dir, test_filename, env)`, \n that returns object of `TestRunResults` class, that contains run result (SUCCESS or FAIL) \n and output, that may be stored in corresponding files `success.txt` or `fail.txt`, \n which defines by argument `dump_results_to_files` in class object creation. \n - call `_on_run_finish(tests)`\n\n TestRunner collects metrics of successes and fails for every testset, and global metrics, \n that stores in file `metrics.txt`.\n\nIn most cases it\\`s enough to work with abstract class `ctestgen.runner.BasicTestRunner`, \nwhich takes target program arguments by argument `run_args` in class object creation.\nIn `_on_test(test_dir, test_filename, env)` it calls target program as subprocess, \nand pass results to method `_process_program_response(self, test_dir, test_filename, program_response)`.\nSo it\\`s enough to override this method in subclass.\n\nDescribe the class, that checking word *error* in target program output, test fails if it was found.\nFull code [here](./examples/example_test_runner.py).\n```python\nfrom ctestgen.runner import BasicTestRunner\nclass ExampleTestRunner(BasicTestRunner):\n def _process_program_response(self, test_dir, test_filename, program_response):\n if 'error' in program_response[0] or 'error' in program_response[1]:\n return TestRunResult(TestRunResult.ResultType.FAIL, program_response[0] + program_response[1])\n return TestRunResult(TestRunResult.ResultType.SUCCESS, program_response[0] + program_response[1])\n\nexample_runner = ExampleTestRunner(['tsar'],\n output_base_dir='runner_output',\n test_filename_extensions=['.c'],\n test_base_dir='example_generator_output',\n runner_name='example_runner')\nexample_runner.run()\n```\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/VolandTymim/ctestgen", "keywords": "python c code-generation code-generator autotesting", "license": "", "maintainer": "", "maintainer_email": "", "name": "ctestgen", "package_url": "https://pypi.org/project/ctestgen/", "platform": "", "project_url": "https://pypi.org/project/ctestgen/", "project_urls": { "Homepage": "https://github.com/VolandTymim/ctestgen" }, "release_url": "https://pypi.org/project/ctestgen/0.1.0/", "requires_dist": null, "requires_python": "", "summary": "https://github.com/VolandTymim/ctestgen", "version": "0.1.0" }, "last_serial": 4629852, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "97f1cc18566428a3e79493344692f126", "sha256": "ed0c43282857017ef2a3c622fde0e2868ca7b7fa612bdbc921326cee91dccbc6" }, "downloads": -1, "filename": "ctestgen-0.1.0-py3.6.egg", "has_sig": false, "md5_digest": "97f1cc18566428a3e79493344692f126", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 39553, "upload_time": "2018-12-23T17:49:50", "url": "https://files.pythonhosted.org/packages/79/14/1186b64341d06a6f901b8c8168600959819716e6197de5c52bdc088071f5/ctestgen-0.1.0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "d1f3050e548218a362f6b204cce96038", "sha256": "c8b1bad477ea342650dec08c48ac2f369054ae8799a79590f89f3c7d5701c123" }, "downloads": -1, "filename": "ctestgen-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d1f3050e548218a362f6b204cce96038", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17393, "upload_time": "2018-12-23T17:49:48", "url": "https://files.pythonhosted.org/packages/67/45/9f22f99f3d18ce506a6f7d36f6e412161a66397d74da96c1a069e995b8dc/ctestgen-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cdc00937da89563c00831952e12e876c", "sha256": "665d4c188b9eb93fde3d8a4029eb340a26386cd53edfae566d56171ae496c32c" }, "downloads": -1, "filename": "ctestgen-0.1.0.tar.gz", "has_sig": false, "md5_digest": "cdc00937da89563c00831952e12e876c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11591, "upload_time": "2018-12-23T17:49:51", "url": "https://files.pythonhosted.org/packages/88/c7/24c43c0742625c908f601ef74b699ba4bfe8799a6d0f09c0252d2ed4d775/ctestgen-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "97f1cc18566428a3e79493344692f126", "sha256": "ed0c43282857017ef2a3c622fde0e2868ca7b7fa612bdbc921326cee91dccbc6" }, "downloads": -1, "filename": "ctestgen-0.1.0-py3.6.egg", "has_sig": false, "md5_digest": "97f1cc18566428a3e79493344692f126", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 39553, "upload_time": "2018-12-23T17:49:50", "url": "https://files.pythonhosted.org/packages/79/14/1186b64341d06a6f901b8c8168600959819716e6197de5c52bdc088071f5/ctestgen-0.1.0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "d1f3050e548218a362f6b204cce96038", "sha256": "c8b1bad477ea342650dec08c48ac2f369054ae8799a79590f89f3c7d5701c123" }, "downloads": -1, "filename": "ctestgen-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "d1f3050e548218a362f6b204cce96038", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 17393, "upload_time": "2018-12-23T17:49:48", "url": "https://files.pythonhosted.org/packages/67/45/9f22f99f3d18ce506a6f7d36f6e412161a66397d74da96c1a069e995b8dc/ctestgen-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cdc00937da89563c00831952e12e876c", "sha256": "665d4c188b9eb93fde3d8a4029eb340a26386cd53edfae566d56171ae496c32c" }, "downloads": -1, "filename": "ctestgen-0.1.0.tar.gz", "has_sig": false, "md5_digest": "cdc00937da89563c00831952e12e876c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11591, "upload_time": "2018-12-23T17:49:51", "url": "https://files.pythonhosted.org/packages/88/c7/24c43c0742625c908f601ef74b699ba4bfe8799a6d0f09c0252d2ed4d775/ctestgen-0.1.0.tar.gz" } ] }