|
@@ -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() |