forked from alibaba/TinyNeuralNetwork
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodegen_test.py
66 lines (52 loc) · 1.64 KB
/
codegen_test.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
import re
import unittest
import torch
import torch.nn as nn
from tinynn.graph.tracer import fetch_modules, gen_module_constrctor_line
def collect_testcases():
modules = fetch_modules()
usages = []
for mod in modules:
name = mod.__name__
if mod.__doc__ is not None:
instances = re.findall(rf'nn\.{name}\(.*\)', mod.__doc__)
usages.extend(list(set(instances)))
if len(instances) == 0:
print(f'{name} is skipped (no instances found)')
else:
print(f'{name} is skipped (doc missing)')
results = []
for usage in usages:
try:
m = eval(usage)
except Exception:
continue
results.append((usage, m))
return results
class TestModelMeta(type):
@classmethod
def __prepare__(mcls, name, bases):
d = dict()
test_cases = collect_testcases()
counter = dict()
for usage, test_mod in test_cases:
cls = type(test_mod)
count = counter.get(cls, 0)
count += 1
test_name = f'test_{cls.__name__}_{count}'
d[test_name] = mcls.build_model_test(usage, test_mod)
counter[cls] = count
return d
@classmethod
def build_model_test(cls, usage, test_mod):
def f(self):
line, _ = gen_module_constrctor_line(test_mod)
try:
eval(line)
except Exception:
self.fail(f'Cannot restore from {usage}, got {line}')
return f
class TestModel(unittest.TestCase, metaclass=TestModelMeta):
pass
if __name__ == '__main__':
unittest.main()