-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate.py
75 lines (61 loc) · 2.22 KB
/
generate.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
#!/usr/bin/env python3
from collections import Counter
from hypothesis import given
from hypothesis import settings, HealthCheck, Phase, Verbosity
import hypothesis.strategies as st
from automata import regex_to_DFA
@st.composite
def positive(draw, dfa, max_size=None):
return dfa.generate(draw, True, max_size=max_size)
@st.composite
def negative(draw, dfa, max_size=None):
return dfa.generate(draw, False, max_size=max_size)
def test(dfa, test_only=None):
all_positive = []
@settings(suppress_health_check=HealthCheck.all())
@given(s=positive(dfa))
#@settings(phases=[Phase.generate, Phase.shrink])
def test_positive(s):
all_positive.append("".join(s))
assert dfa.accepts(s)
all_negative = []
@settings(suppress_health_check=HealthCheck.all())
@given(s=negative(dfa))
#@settings(phases=[Phase.generate, Phase.shrink])
def test_negative(s):
all_negative.append("".join(s))
assert not dfa.accepts(s)
if test_only != "negative":
print('Some positive test-cases:')
test_positive()
c = Counter(all_positive)
for k in sorted(c):
print("{}: {} times".format(k, c[k]))
print(len(all_positive), "test-case(s) generated")
print(len(set(all_positive)), "unique test-case(s)")
print(max(map(len, all_positive)), "max length")
print(sum(map(len, all_positive))/len(all_positive), "avg length")
print()
if test_only != "positive":
print('Some negative test-cases:')
test_negative()
c = Counter(all_negative)
for k in sorted(c):
print("{}: {} times".format(k, c[k]))
print(len(all_negative), "test-case(s) generated")
print(len(set(all_negative)), "unique test-case(s)")
print(max(map(len, all_negative)), "max length")
print(sum(map(len, all_negative))/len(all_negative), "avg length")
print()
if __name__ == '__main__':
while True:
regex = str(input())
if regex == 'EXIT':
exit()
while not regex:
regex = str(input("Please give valid regex: "))
dfa = regex_to_DFA(regex)
print("Testing DFA:")
print(dfa)
print()
test(dfa)