diff options
| author | Egor Tensin <egor@tensin.name> | 2026-06-06 21:45:45 +0200 |
|---|---|---|
| committer | Egor Tensin <egor@tensin.name> | 2026-06-06 21:45:45 +0200 |
| commit | fba834a617d2d2905cfc84595de100f8a5368c0a (patch) | |
| tree | 2b629a72dacfec75a6cf28a298ff309602cfff5d /algorithms/scripts/test.py | |
| parent | workflows/ci: remove on: pull_request (diff) | |
| download | sorting-algorithms-fba834a617d2d2905cfc84595de100f8a5368c0a.tar.gz sorting-algorithms-fba834a617d2d2905cfc84595de100f8a5368c0a.zip | |
sort out scripts into proper directories
Diffstat (limited to 'algorithms/scripts/test.py')
| -rwxr-xr-x | algorithms/scripts/test.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/algorithms/scripts/test.py b/algorithms/scripts/test.py new file mode 100755 index 0000000..ba7bf0a --- /dev/null +++ b/algorithms/scripts/test.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Sorting algorithms" project. +# For details, see https://github.com/egor-tensin/sorting-algorithms. +# Distributed under the MIT License. + +from array import array +import argparse +import sys + +from ..input_kind import InputKind +import ..registry as registry + + +_DEFAULT_INPUT_KIND = InputKind.AVERAGE +_DEFAULT_LENGTH = 100 + + +def test(algorithm, input_kind=_DEFAULT_INPUT_KIND, length=_DEFAULT_LENGTH): + if isinstance(algorithm, str): + algorithm = registry.get(algorithm) + xs = algorithm.gen_input(length, input_kind) + output = algorithm.function(xs) + if isinstance(output, array): + output = output.tolist() + print(output) + + +def _parse_non_negative_integer(s): + try: + n = int(s) + except ValueError: + raise argparse.ArgumentTypeError('must be a non-negative integer: ' + str(s)) + if n < 0: + raise argparse.ArgumentTypeError('must be a non-negative integer') + return n + + +def _parse_input_kind(s): + try: + return InputKind(s) + except ValueError: + raise argparse.ArgumentTypeError('invalid input kind: ' + str(s)) + + +def _format_algorithm(codename): + return '* {}: {}'.format(codename, registry.get(codename).display_name) + + +def _format_available_algorithms(): + descr = 'available algorithms (in the CODENAME: DISPLAY_NAME format):\n' + return descr + '\n'.join(map( + _format_algorithm, sorted(registry.get_codenames()))) + + +def _format_description(): + return _format_available_algorithms() + + +def _create_argument_parser(): + return argparse.ArgumentParser( + description=_format_description(), + formatter_class=argparse.RawDescriptionHelpFormatter) + + +def _parse_args(args=None): + if args is None: + args = sys.argv[1:] + parser = _create_argument_parser() + + parser.add_argument('algorithm', metavar='CODENAME', + choices=registry.get_codenames(), + help='algorithm codename') + parser.add_argument('--input', '-i', dest='input_kind', + choices=InputKind, + type=_parse_input_kind, + default=_DEFAULT_INPUT_KIND, + help='specify input kind') + parser.add_argument('--length', '-l', '-n', metavar='N', + type=_parse_non_negative_integer, + default=_DEFAULT_LENGTH, + help='set input length') + + return parser.parse_args(args) + + +def main(args=None): + test(**vars(_parse_args(args))) + + +if __name__ == '__main__': + main() |
