From 558739a0cd1941c5286ce0290912cb9a43336dce Mon Sep 17 00:00:00 2001 From: Rob Hallam <0504004h@student.gla.ac.uk> Date: Fri, 19 Jul 2024 11:36:56 +0100 Subject: [PATCH] feat: add __init__, TestOverlapConsolidation suite --- test/__init__.py | 1 + test/test_consolidate.py | 72 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 test/__init__.py create mode 100644 test/test_consolidate.py diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..7cc3e35 --- /dev/null +++ b/test/__init__.py @@ -0,0 +1 @@ +"""Test cases for highlight generator""" diff --git a/test/test_consolidate.py b/test/test_consolidate.py new file mode 100644 index 0000000..91089db --- /dev/null +++ b/test/test_consolidate.py @@ -0,0 +1,72 @@ +"""Test consolidators + +Consolidators work on a List of Faetures, and Features a constructed from Interval objects. +As such, we need to mock an Interval object and a Feature object to test the consolidators. +""" +import unittest +from pipeline.consolidators import OverlapConsolidator + + +class TestOverlapConsolidation(unittest.TestCase): + """overlap consolidator only uses Interval .start and .end attributes, so we can mock them here""" + class MockInterval(): + """Mock interval object for overlap testing -- only has start and end attributes""" + def __init__(self, start, end): + self.start = start + self.end = end + class MockFeature(): + """Mock feature object for overlap testing -- only has interval attribute""" + def __init__(self, interval): + self.interval = interval + + def setUp(self): + """Set up test data""" + self.empty_features = [] + self.fakepath = "/tmp/fakepath" + self.featureA = self.MockFeature(interval=self.MockInterval(start=0, end=10)) + self.featureB = self.MockFeature(interval=self.MockInterval(start=5, end=15)) + self.populated_features = [self.featureA, self.featureB] + + def test_init(self): + # test empty features + with self.assertRaises(ValueError): + OverlapConsolidator(self.empty_features) + # test populated features + consolidator = OverlapConsolidator(features=self.populated_features) + self.assertEqual(consolidator.features, self.populated_features) + + def test_consolidate(self): + # 4 features for overlap test: ABCD, overlap A-B, C-D + self.featureA = self.MockFeature(interval=self.MockInterval(start=0, end=10)) + self.featureB = self.MockFeature(interval=self.MockInterval(start=5, end=15)) + self.featureC = self.MockFeature(interval=self.MockInterval(start=20, end=30)) + self.featureD = self.MockFeature(interval=self.MockInterval(start=25, end=35)) + self.overlapping_features = [self.featureA, self.featureB, self.featureC, self.featureD] + consolidator = OverlapConsolidator(features=self.overlapping_features) + consolidator.consolidate() + # check that A-B and C-D have been merged + self.assertEqual(len(consolidator.features), 2) + + # 4 features for no overlap test + self.feature1 = self.MockFeature(interval=self.MockInterval(start=0, end=10)) + self.feature2 = self.MockFeature(interval=self.MockInterval(start=15, end=25)) + self.feature3 = self.MockFeature(interval=self.MockInterval(start=30, end=40)) + self.feature4 = self.MockFeature(interval=self.MockInterval(start=45, end=55)) + self.non_overlapping_features = [self.feature1, self.feature2, self.feature3, self.feature4] + consolidator = OverlapConsolidator(features=self.non_overlapping_features) + consolidator.consolidate() + # check that no features have been merged + self.assertEqual(len(consolidator.features), 4) + + # 3 features for overlap test: ABC, overlap A-B, B-C + self.featureA = self.MockFeature(interval=self.MockInterval(start=0, end=10)) + self.featureB = self.MockFeature(interval=self.MockInterval(start=5, end=15)) + self.featureC = self.MockFeature(interval=self.MockInterval(start=12, end=20)) + self.overlapping_features = [self.featureA, self.featureB, self.featureC] + consolidator = OverlapConsolidator(features=self.overlapping_features) + consolidator.consolidate() + # check that A-B and B-C have been merged + self.assertEqual(len(consolidator.features), 1) + +if __name__ == '__main__': + unittest.main()