annotate tests/conftest.py @ 0:243401c49520

Initial commit.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 02 Jan 2017 12:30:49 -0800
parents
children 74b83e3d921e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import sys
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3 import yaml
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4 import pytest
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 from fontaine.document import (
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 FontaineSceneElement,
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7 TYPE_ACTION, TYPE_CHARACTER, TYPE_DIALOG, TYPE_PARENTHETICAL)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8 from fontaine.parser import FontaineParser, FontaineParserError
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 def pytest_addoption(parser):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 parser.addoption(
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13 '--log-debug',
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 action='store_true',
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 help="Sets the Fontaine logger to output debug info to stdout.")
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 def pytest_configure(config):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19 if config.getoption('--log-debug'):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20 hdl = logging.StreamHandler(stream=sys.stdout)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 logging.getLogger('fontaine').addHandler(hdl)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
22 logging.getLogger('fontaine').setLevel(logging.DEBUG)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
24
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
25 def pytest_collect_file(parent, path):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
26 if path.ext == '.yaml' and path.basename.startswith("test"):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
27 return FontaineScriptTestFile(path, parent)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28 return None
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
29
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
30
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31 def assert_scenes(actual, scenes):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
32 assert len(actual) == len(scenes)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
33 for a, e in zip(actual, scenes):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
34 assert_scene(a, e[0], e[1:])
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
36
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
37 def assert_scene(actual, header, paragraphs):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38 if header is not None:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
39 assert actual.header == header
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
40 assert len(actual.paragraphs) == len(paragraphs)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
41 for a, e in zip(actual.paragraphs, paragraphs):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42 assert_paragraph(a, e)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
43
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
44
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
45 def assert_paragraph(actual, expected):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
46 if isinstance(expected, str):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47 assert isinstance(actual, FontaineSceneElement)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48 assert actual.type == TYPE_ACTION
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 assert actual.text == expected
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 elif isinstance(expected, FontaineSceneElement):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 assert isinstance(actual, FontaineSceneElement)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 assert actual.type == expected.type
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53 assert actual.text == expected.text
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
54 else:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
55 raise NotImplementedError("Don't know what this is: %s" % expected)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
56
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
57
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
58 def _c(name):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
59 return FontaineSceneElement(TYPE_CHARACTER, name)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
60
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
61
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
62 def _p(text):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
63 return FontaineSceneElement(TYPE_PARENTHETICAL, text)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
64
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
65
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
66 def _d(text):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
67 return FontaineSceneElement(TYPE_DIALOG, text)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
68
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
69
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
70 class FontaineScriptTestFile(pytest.File):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
71 def collect(self):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
72 spec = yaml.load_all(self.fspath.open(encoding='utf8'))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
73 for i, item in enumerate(spec):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
74 name = '%s_%d' % (self.fspath.basename, i)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
75 if 'test_name' in item:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
76 name += '_%s' % item['test_name']
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
77 yield FontaineScriptTestItem(name, self, item)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
78
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
79
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
80 class FontaineScriptTestItem(pytest.Item):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
81 def __init__(self, name, parent, spec):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
82 super().__init__(name, parent)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
83 self.spec = spec
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
84
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
85 def reportinfo(self):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
86 return self.fspath, 0, "fontaine script test: %s" % self.name
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
87
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
88 def runtest(self):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
89 intext = self.spec.get('in')
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
90 expected = self.spec.get('out')
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
91 title = self.spec.get('title')
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
92 if intext is None or expected is None:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
93 raise Exception("No 'in' or 'out' specified.")
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
94
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
95 parser = FontaineParser()
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
96 doc = parser.parseString(intext)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
97 if title is not None:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
98 assert title == doc.title_values
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
99 assert_scenes(doc.scenes, make_scenes(expected))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
100
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
101 def repr_failure(self, excinfo):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
102 if isinstance(excinfo.value, FontaineParserError):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
103 return ('\n'.join(
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
104 ['Parser error:', str(excinfo.value)]))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
105 return super().repr_failure(excinfo)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
106
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
107
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
108 def make_scenes(spec):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
109 if not isinstance(spec, list):
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
110 raise Exception("Script specs must be lists.")
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
111
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
112 out = []
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
113 cur_header = None
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
114 cur_paras = []
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
115
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
116 for item in spec:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
117 token = item[:1]
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
118 if token == '.':
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
119 if cur_header or cur_paras:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
120 out.append([cur_header] + cur_paras)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
121 cur_header = item[1:]
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
122 elif token == '!':
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
123 cur_paras.append(item[1:])
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
124 elif token == '@':
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
125 cur_paras.append(_c(item[1:]))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
126 elif token == '=':
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
127 cur_paras.append(_d(item[1:]))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
128 elif token == '_':
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
129 cur_paras.append(_p(item[1:]))
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
130 else:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
131 raise Exception("Unknown token: %s" % token)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
132 if cur_header or cur_paras:
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
133 out.append([cur_header] + cur_paras)
243401c49520 Initial commit.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
134 return out