create-emitter-tests.py 2.68 KB
Newer Older
Jesse Beder's avatar
Jesse Beder committed
1
2
3
4
5
6
7
import sys
import yaml
import hashlib

NS = 'Emitter'
EVENT_COUNT = 5

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
def encode_stream(line):
    for c in line:
        if c == '\n':
            yield '\\n'
        elif c == '"':
            yield '\\"'
        elif c == '\t':
            yield '\\t'
        elif ord(c) < 0x20:
            yield '\\x' + hex(ord(c))
        else:
            yield c

def encode(line):
    return ''.join(encode_stream(line))

def doc_start(implicit=False):
    if implicit:
        return {'emit': '', 'handle': 'DOC_START()'}
    else:
        return {'emit': 'YAML::DocStart', 'handle': 'DOC_START()'}

def doc_end(implicit=False):
    if implicit:
        return {'emit': '', 'handle': 'DOC_END()'}
    else:
        return {'emit': 'YAML::DocEnd', 'handle': 'DOC_END()'}

def scalar(value, tag='', anchor='', anchor_id=0):
    emit = []
    if tag:
        emit += ['YAML::VerbatimTag("%s")' % encode(tag)]
    if anchor:
        emit += ['YAML::Anchor("%s")' % encode(anchor)]
    emit += ['"%s"' % encode(value)]
    return {'emit': emit, 'handle': 'SCALAR("%s", %s, "%s")' % (encode(tag), anchor_id, encode(value))}

def gen_outlines():
    yield [doc_start(), scalar('foo\n'), doc_end()]
    yield [doc_start(True), scalar('foo\n'), doc_end()]
    yield [doc_start(), scalar('foo\n'), doc_end(True)]
    yield [doc_start(True), scalar('foo\n'), doc_end(True)]
Jesse Beder's avatar
Jesse Beder committed
50
51

def gen_events():
52
53
    for events in gen_outlines():
        yield events
Jesse Beder's avatar
Jesse Beder committed
54
55
56
57
58
59
60
61
62
63

def gen_tests():
    for events in gen_events():
        name = 'test' + hashlib.sha1(''.join(yaml.dump(event) for event in events)).hexdigest()[:20]
        yield {'name': name, 'events': events}
        

def create_emitter_tests(out):
    out.write('namespace %s {\n' % NS)

64
65
66
67
    tests = list(gen_tests())

    for test in tests:
        out.write('TEST %s(YAML::Emitter& out)\n' % test['name'])
Jesse Beder's avatar
Jesse Beder committed
68
69
70
        out.write('{\n')
        for event in test['events']:
            emit = event['emit']
71
72
73
74
            if isinstance(emit, list):
                for e in emit:
                    out.write('    out << %s;\n' % e)
            elif emit:
Jesse Beder's avatar
Jesse Beder committed
75
76
77
78
79
80
81
82
83
84
85
86
                out.write('    out << %s;\n' % emit)
        out.write('\n')
        out.write('    HANDLE(out.c_str());\n')
        for event in test['events']:
            handle = event['handle']
            if handle:
                out.write('    EXPECT_%s;\n' % handle)
        out.write('    DONE();\n')
        out.write('}\n')

    out.write('}\n')

87
88
89
90
91
92
    out.write('void RunGenEmitterTests(int& passed, int& total)\n')
    out.write('{\n')
    for test in tests:
        out.write('    RunGenEmitterTest(&Emitter::%s, %s, passed, total);\n' % (test['name'], encode(test['name'])))
    out.write('}\n')

Jesse Beder's avatar
Jesse Beder committed
93
94
if __name__ == '__main__':
    create_emitter_tests(sys.stdout)