From 68fe1102e43acf47d53cb6d77d3c74704c20cb6c Mon Sep 17 00:00:00 2001 From: boyska Date: Sat, 3 Oct 2020 16:43:27 +0200 Subject: [PATCH] aggiunge test random --- banana/bananalib.py | 13 ++++++++----- banana/cli.py | 27 +++++++++++++++++++++++++-- tests/test_banana.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 7 deletions(-) diff --git a/banana/bananalib.py b/banana/bananalib.py index 4b0466b..a3b05eb 100644 --- a/banana/bananalib.py +++ b/banana/bananalib.py @@ -1,6 +1,9 @@ """Main module.""" +import logging import random +log = logging.getLogger("bananalib") + class Codec: def __init__(self, dictstart=0, shiftend=0, minlength=0, dictionary=None): @@ -61,18 +64,18 @@ class Codec: return True - def random(self, minlength=6): - + def random(self, minlength=6, prng=random.Random()): numdict = len(self.dictionary) word = "" + if minlength < 1: + return "" + curr_dict = (numdict - 1 + self.dictstart + self.shiftend) % numdict final_dict = (numdict - 1 + self.dictstart) % numdict - print("final", final_dict) while curr_dict != final_dict or len(word) < minlength: - word = random.choice(self.dictionary[curr_dict]) + word + word = prng.choice(self.dictionary[curr_dict]) + word curr_dict = (curr_dict - 1) % numdict - print("curr", curr_dict) return word diff --git a/banana/cli.py b/banana/cli.py index 2185933..220f974 100644 --- a/banana/cli.py +++ b/banana/cli.py @@ -1,5 +1,7 @@ """Console script for banana.""" import argparse +import logging +import random import sys import banana @@ -10,6 +12,10 @@ def get_codec(args): return banana.BananaCodec() if args.ananas: return banana.AnanasCodec() + if args.ribes: + return banana.RibesCodec() + if args.avocado: + return banana.AvocadoCodec() kwargs = {} if args.dictionary: kwargs["dictionary"] = args.dictionary @@ -40,16 +46,31 @@ def main_check(args): def main_random(args): - print(get_codec(args).random(minlength=args.minlength)) + codec = get_codec(args) + kwargs = dict(minlength=args.minlength) + if args.seed: + kwargs["prng"] = random.Random(args.seed) + print(codec.random(**kwargs)) + + +def colon_separated_list(s): + return s.split(":") def main(): parser = argparse.ArgumentParser(description="Convert dec number to banana") + parser.add_argument( + "--log-level", choices=["DEBUG", "INFO", "WARN", "ERROR"], default="WARN" + ) parser.add_argument("--ananas", action="store_true") parser.add_argument("--avocado", action="store_true") parser.add_argument("--banana", action="store_true") parser.add_argument("--ribes", action="store_true") - parser.add_argument("--dictionary", help="Set dictionary", type=list, nargs="+") + parser.add_argument( + "--dictionary", + help="Set dictionary in colon-separated list", + type=colon_separated_list, + ) parser.add_argument( "--dictstart", help="Set starting dictionary", type=int, default=0 ) @@ -72,6 +93,7 @@ def main(): rand = sub.add_parser("random", help="Generate random banana") rand.add_argument("--minlength", help="Set minimum length", type=int, default=6) + rand.add_argument("--seed", type=int, default=None) rand.set_defaults(func=main_random) args = parser.parse_args() @@ -79,6 +101,7 @@ def main(): print("You need to select one subcommand. \nUse --help", file=sys.stderr) # parser.print_help() sys.exit(1) + logging.basicConfig(level=args.log_level) args.func(args) diff --git a/tests/test_banana.py b/tests/test_banana.py index 1cd0531..e72bb51 100644 --- a/tests/test_banana.py +++ b/tests/test_banana.py @@ -1,6 +1,8 @@ #!/usr/bin/env python """Tests for `banana` package.""" +import random + import pytest from banana import AnanasCodec, AvocadoCodec, BananaCodec, RibesCodec @@ -174,3 +176,45 @@ def test_answer_to_life_the_universe_and_everything(): banana = banana_codec.decode("banana") assert banana != 42 assert banana == 2485 + + +def test_random_len_0(): + assert banana_codec.random(minlength=0) == "" + assert ananas_codec.random(minlength=0) == "" + assert avocado_codec.random(minlength=0) == "" + assert ribes_codec.random(minlength=0) == "" + + +def test_banana_random_minlength_even(): + for l in (0, 2, 4, 6, 8, 10, 12): + assert len(banana_codec.random(minlength=l)) == l + assert len(ananas_codec.random(minlength=l)) == l + + +def test_banana_random_minlength_odd(): + for l in (1, 3, 5, 7, 9): + assert len(banana_codec.random(minlength=l)) == l + 1 + assert len(ananas_codec.random(minlength=l)) == l + 1 + + +def test_ribes_random_minlength_even(): + for l in (2, 4, 6, 8, 10, 12): + assert len(ribes_codec.random(minlength=l)) == l + 1 + assert len(avocado_codec.random(minlength=l)) == l + 1 + + +def test_ribes_random_minlength_odd(): + for l in (1, 3, 5, 7, 9): + assert len(ribes_codec.random(minlength=l)) == l + assert len(avocado_codec.random(minlength=l)) == l + + +def test_random_coherence_please(): + for codec in (ribes_codec, ananas_codec, avocado_codec, banana_codec): + for seed in range(30): + word = codec.random(prng=random.Random(seed)) + assert codec.is_valid(word), "%s (seed %d) non valido per %s" % ( + word, + seed, + codec.__class__.__name__, + )