From 6ebaad27d92a5bb47fdf9618df12d3b4120f664e Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 4 Nov 2019 02:39:01 +0100 Subject: Added basic test generator --- .gitignore | 1 + Makefile | 2 +- generate.py | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- header.h | 2 ++ main.c | 2 ++ 5 files changed, 93 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index e3dcb7b..4c16688 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ ft_printf_test *.ghc *.dSYM result.log +generated.c diff --git a/Makefile b/Makefile index 5cdda12..7a8f2a4 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ RM = rm -f MAKE = make -j4 SRC = main.c helper.c tests/pft_tests.c tests/moulitest_tests.c tests/printf_tester_tests.c \ - tests/printf_tests_tests.c + tests/printf_tests_tests.c generated.c OBJ = $(SRC:.c=.o) run: all diff --git a/generate.py b/generate.py index 6ac04b0..f119874 100644 --- a/generate.py +++ b/generate.py @@ -1,17 +1,98 @@ import os import sys import argparse +import string +from random import randrange, choice, shuffle +INT_MIN = -2147483648 +INT_MAX = 2147483647 +UINT_MAX = 4294967295 +CHAR_MIN = -128 +CHAR_MAX = 127 + +ULONG_INT_MAX = 18446744073709551616 + +chars = (list(string.ascii_lowercase) + list(string.ascii_uppercase) + + list(string.punctuation) + list(string.digits)) +chars.remove("\"") +chars.remove("\\") +chars.extend([r"\t", r"\n", r"\r", r"\v", r"\f", "\\\\"]) + def parse_args(): parser = argparse.ArgumentParser(prog="ft_printf_test generator", description="A random test generator") - parser.add_argument("-n", help="number of tests to generate", type=int) - parser.add_argument("-q", "--quiet", - help="decrease vebosity", action="store_true") - parser.add_argument("-c", "--no-clear", help="disable terminal clear before output") - parser.add_argument("-f", "--output-file", help="output file name", default="tests/generated.c")) + parser.add_argument("-n", help="number of tests to generate", type=int, default=100) return vars(parser.parse_args(sys.argv[1:])) +def random_string(n): + b = "".join([choice(chars) for _ in range(randrange(n))]) + return b + +def random_flags(): + flags = "" + possible = "#0- +'" + for _ in range(randrange(len(possible))): + flags += choice(possible) + return flags + +def random_width(): + r = randrange(100) + if r < 5: + return "*" + elif r < 10: + return "" + return str(randrange(200)) + +def random_precision(): + r = randrange(100) + if r < 5: + return ".*" + elif r < 10: + return "" + elif r < 12: + return "." + return "." + str(randrange(200)) + +def generate_args(): + a = [] + b = [] + fmt_str ="diuxXcsp%" + for _ in range(15): + t = fmt_str[randrange(len(fmt_str))] + a.append(f"%{random_flags()}{random_width()}{random_precision()}{t}") + b.append({ + 'c': randrange(CHAR_MIN, CHAR_MAX + 1), + 's': "\"" + random_string(10) + "\"", + 'd': randrange(INT_MIN, INT_MAX + 1), + 'i': randrange(INT_MIN, INT_MAX + 1), + 'u': randrange(UINT_MAX), + 'x': randrange(UINT_MAX), + 'X': randrange(UINT_MAX), + 'p': str(randrange(ULONG_INT_MAX)) + "lu", + '%': None + }[t]) + return a, b + + +def generate_printf(): + a, b = generate_args() + s = "\"" + s2 = "" + for x, y in zip(a, b): + s += x + if x[-1] != '%': + s2 += "," + str(y) + + return f"ASSERT_PRINTF({s}\" {s2});" + + if __name__ == "__main__": - pass + options = parse_args() + with open("generated.c", "w") as file: + file.write("#include \"header.h\"\n\nvoid generated_test(void)\n{\n\t") + + for _ in range(options["n"]): + file.write(generate_printf() + "\n\t") + + file.write("}\n") diff --git a/header.h b/header.h index edf761a..094086e 100644 --- a/header.h +++ b/header.h @@ -17,6 +17,8 @@ int user_ret; char *origin_buf; char *user_buf; +void generated_test(void); + int ft_printf(const char *format, ...); void print_buf_ko(char *msg); diff --git a/main.c b/main.c index 5356a9a..2b322c2 100644 --- a/main.c +++ b/main.c @@ -56,5 +56,7 @@ int main(int argc, char **argv) test_printf_tester(); test_printf_tests_test(); + + generated_test(); return 0; } -- cgit