aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2019-11-04 02:39:01 +0100
committerCharles <sircharlesaze@gmail.com>2019-11-04 03:27:58 +0100
commit6ebaad27d92a5bb47fdf9618df12d3b4120f664e (patch)
treee390fc03fe2475c158becc313b7ed431d9bae61c
parentc667f5a6edc3a7f394d53f8e4c163cc19305dbad (diff)
downloadft_printf_test-6ebaad27d92a5bb47fdf9618df12d3b4120f664e.tar.gz
ft_printf_test-6ebaad27d92a5bb47fdf9618df12d3b4120f664e.tar.bz2
ft_printf_test-6ebaad27d92a5bb47fdf9618df12d3b4120f664e.zip
Added basic test generator
-rw-r--r--.gitignore1
-rw-r--r--Makefile2
-rw-r--r--generate.py93
-rw-r--r--header.h2
-rw-r--r--main.c2
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;
}