Write regression_diff(before, after). Match traces by 'task_id'. Return {'regressions': [...], 'fixes': [...]} where regressions are task ids successful in before but not in after, and fixes are the reverse. Both lists sorted; only consider task ids present in both runs. Standard library only.
from unittest import TestCase
from exercise import regression_diff
class Evaluate(TestCase):
def test_detects_regression(self):
before = [{'task_id': 't1', 'success': True}]
after = [{'task_id': 't1', 'success': False}]
self.assertEqual(regression_diff(before, after)['regressions'], ['t1'])
def test_detects_fix(self):
before = [{'task_id': 't1', 'success': False}]
after = [{'task_id': 't1', 'success': True}]
self.assertEqual(regression_diff(before, after)['fixes'], ['t1'])
def test_unchanged_has_no_diff(self):
before = [{'task_id': 't1', 'success': True}]
after = [{'task_id': 't1', 'success': True}]
self.assertEqual(regression_diff(before, after), {'regressions': [], 'fixes': []})
def regression_diff(before, after):
b = {t['task_id']: bool(t.get('success')) for t in before}
a = {t['task_id']: bool(t.get('success')) for t in after}
common = b.keys() & a.keys()
regressions = sorted(tid for tid in common if b[tid] and not a[tid])
fixes = sorted(tid for tid in common if not b[tid] and a[tid])
return {'regressions': regressions, 'fixes': fixes}