62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
import pytest
|
|
import cinema.test
|
|
import mgba.log
|
|
import os.path
|
|
import yaml
|
|
|
|
mgba.log.install_default(mgba.log.NullLogger())
|
|
|
|
def flatten(d):
|
|
l = []
|
|
for k, v in d.tests.items():
|
|
if v.tests:
|
|
l.extend(flatten(v))
|
|
else:
|
|
l.append(v)
|
|
l.sort()
|
|
return l
|
|
|
|
def pytest_generate_tests(metafunc):
|
|
if 'vtest' in metafunc.fixturenames:
|
|
tests = cinema.test.gather_tests(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'cinema'))
|
|
testList = flatten(tests)
|
|
params = []
|
|
for test in testList:
|
|
marks = []
|
|
xfail = test.settings.get('fail')
|
|
if xfail and bool(xfail):
|
|
marks = pytest.mark.xfail(reason=xfail if isinstance(xfail, str) else None)
|
|
params.append(pytest.param(test, id=test.name, marks=marks))
|
|
metafunc.parametrize('vtest', params, indirect=True)
|
|
|
|
@pytest.fixture
|
|
def vtest(request):
|
|
return request.param
|
|
|
|
def test_video(vtest, pytestconfig):
|
|
vtest.setup()
|
|
if pytestconfig.getoption('--rebaseline'):
|
|
vtest.generate_baseline()
|
|
else:
|
|
try:
|
|
vtest.test()
|
|
except IOError:
|
|
raise
|
|
if pytestconfig.getoption('--mark-succeeding') and 'fail' in vtest.settings:
|
|
# TODO: This can fail if an entire directory is marked as failing
|
|
settings = {}
|
|
try:
|
|
with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f:
|
|
settings = yaml.safe_load(f)
|
|
except IOError:
|
|
pass
|
|
if 'fail' in settings:
|
|
del settings['fail']
|
|
else:
|
|
settings['fail'] = False
|
|
if settings:
|
|
with open(os.path.join(vtest.path, 'manifest.yml'), 'w') as f:
|
|
yaml.dump(settings, f, default_flow_style=False)
|
|
else:
|
|
os.remove(os.path.join(vtest.path, 'manifest.yml'))
|