mgba-ps3/src/platform/python/test_cinema.py
2020-06-16 18:18:34 -07:00

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'))