-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_generator.py
117 lines (95 loc) · 3.31 KB
/
test_generator.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env python3
from errors import ParseedBaseError
from transpiler import ParseedOutputGenerator, Writer
from lexer import Lexer
from parser import Parser
import os, struct
PARSER_CODE = """
struct Root_Struct {
Big_Endian big_endian,
Little_Endian little_endian,
}
BE struct Big_Endian {
Unsigned_Numbers unsigned_numbers,
Signed_Numbers signed_numbers,
Floating_Point_Numbers floating_point_numbers,
Strings strings,
}
LE struct Little_Endian {
Unsigned_Numbers unsigned_numbers,
Signed_Numbers signed_numbers,
Floating_Point_Numbers floating_point_numbers,
Strings strings,
}
struct Unsigned_Numbers {
uint8 one,
uint16 two,
uint24 three,
uint32 four,
uint40 five,
uint48 six,
uint64 seven,
uint128 eight,
}
struct Signed_Numbers {
int8 minus_one,
int16 minus_two,
int24 minus_three,
int32 minus_four,
int40 minus_five,
int48 minus_six,
int64 minus_seven,
int128 minus_eight,
}
struct Floating_Point_Numbers {
float one_dot_one,
double two_dot_two,
}
struct Strings {
string hello_world_null_byte,
string('a') hello_world_a_char_terminated,
string("test") hello_world_test_string_terminated,
string(1) hello_world_one_terminated,
}
struct Bytes {
bytes(0) test_zero_terminated,
bytes(\\x15) TEST_fifteen_terminated,
}
"""
def start_test_generator(generator_class: ParseedOutputGenerator, output_dir: str, output_name: str):
# errors
lexer = Lexer(PARSER_CODE, "-")
parser = Parser(lexer.run())
ast = parser.run()
writer = Writer()
generator_class(ast).generate(writer)
with open(output_dir + os.sep + output_name, "w") as f:
f.write(writer.generate_code())
generate_binary_test_file(output_dir)
def generate_binary_test_file(output_dir: str):
with open(output_dir + os.sep + "binary_test_file.bin", "wb") as f:
generate_numbers_binary_file(f, "big")
generate_numbers_binary_file(f, "little")
def generate_numbers_binary_file(f, endian: str):
# struct Unsigned_Numbers
for i in range(7):
f.write((i).to_bytes(i, byteorder=endian, signed=False))
f.write((7).to_bytes(8, byteorder=endian, signed=False))
f.write((8).to_bytes(16, byteorder=endian, signed=False))
# struct Signed_Numbers
for i in range(7):
f.write((-i).to_bytes(i, byteorder=endian, signed=True))
f.write((-7).to_bytes(8, byteorder=endian, signed=True))
f.write((-8).to_bytes(16, byteorder=endian, signed=True))
# struct Floating_Point_Numbers
endian_char = "<" if endian == "little" else ">"
f.write(struct.pack(endian_char + "f", 1.1))
f.write(struct.pack(endian_char + "d", 2.2))
# struct Strings
f.write(struct.pack(endian_char + str(len("Hello world\0")) + "s", b"Hello world\0"))
f.write(struct.pack(endian_char + str(len("Hello worlda")) + "s", b"Hello worlda"))
f.write(struct.pack(endian_char + str(len("Hello worldtest")) + "s", b"Hello worldtest"))
f.write(struct.pack(endian_char + str(len("Hello world\01")) + "s", b"Hello world\01"))
# struct Bytes
#f.write(struct.pack(endian_char + str(len("test\00")) + "s", b"test\00"))
#f.write(struct.pack(endian_char + str(len("TEST\00")) + "s", b"TEST\00"))