1import pytest 2import cinema.test 3import mgba.log 4import os.path 5import yaml 6 7mgba.log.install_default(mgba.log.NullLogger()) 8 9def flatten(d): 10 l = [] 11 for k, v in d.tests.items(): 12 if v.tests: 13 l.extend(flatten(v)) 14 else: 15 l.append(v) 16 l.sort() 17 return l 18 19def pytest_generate_tests(metafunc): 20 if 'vtest' in metafunc.fixturenames: 21 tests = cinema.test.gather_tests(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'cinema')) 22 testList = flatten(tests) 23 params = [] 24 for test in testList: 25 marks = [] 26 xfail = test.settings.get('fail') 27 if xfail: 28 marks = pytest.mark.xfail(reason=xfail if isinstance(xfail, str) else None) 29 params.append(pytest.param(test, id=test.name, marks=marks)) 30 metafunc.parametrize('vtest', params, indirect=True) 31 32@pytest.fixture 33def vtest(request): 34 return request.param 35 36def test_video(vtest, pytestconfig): 37 vtest.setup() 38 if pytestconfig.getoption('--rebaseline'): 39 vtest.generate_baseline() 40 else: 41 try: 42 vtest.test() 43 except IOError: 44 raise 45 if pytestconfig.getoption('--mark-succeeding') and 'fail' in vtest.settings: 46 # TODO: This can fail if an entire directory is marked as failing 47 settings = {} 48 try: 49 with open(os.path.join(vtest.path, 'manifest.yml'), 'r') as f: 50 settings = yaml.safe_load(f) 51 except IOError: 52 pass 53 if 'fail' in settings: 54 del settings['fail'] 55 else: 56 settings['fail'] = False 57 if settings: 58 with open(os.path.join(vtest.path, 'manifest.yml'), 'w') as f: 59 yaml.dump(settings, f, default_flow_style=False) 60 else: 61 os.remove(os.path.join(vtest.path, 'manifest.yml')) 62