class TestFeature(unittest.TestCase):

    def setUp(self):
        # Set up Feature objects to be used in the tests
        # Forward strand example
        self.rna_data = \
            Feature('CG9130-RB','chr3L','1252012','1255989','+')
        # Reverse strand example
        self.rna_data_2 = \
            Feature('CG13051-RA','chr3L','16257914','16258166','-')

    def test_properties(self):
        self.assertEqual(self.rna_data.chrom,'chr3L')
        self.assertEqual(self.rna_data_2.chrom,'chr3L')

    def test__eq__(self):
        self.assertEqual(self.rna_data,Feature('CG9130-RB',
                                               'chr3L',
                                               '1252012',
                                               '1255989','+'))
        self.assertNotEqual(self.rna_data,self.rna_data_2)

    def test_contains_position(self):
        position = 1253000
        self.assertTrue(self.rna_data.containsPosition(position),
                        "Transcript should contain position")
        position = 4250000
        self.assertFalse(self.rna_data.containsPosition(position),
                         "Transcript should not contain position")
        position = 10000
        self.assertFalse(self.rna_data.containsPosition(position),
                         "Transcript should not contain position")

    def test_get_closest_edge_distance(self):
        # Single position
        position = 1200000
        # Single reference position
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position),
                         abs(self.rna_data.start-position),
                         "Incorrect closest edge distance #1")
        position = 1300000
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position),
                         abs(self.rna_data.end-position),
                         "Incorrect closest edge distance #2")

    def test_get_closest_edge_distance_outside_region(self):
        # Reference region (2 positions)
        position1 = 1100000
        position2 = 1200000
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2),
                         abs(self.rna_data.start-position2),
                         "Incorrect closest edge distance (region #1)")
        position1 = 1300000
        position2 = 1400000
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2),
                         abs(self.rna_data.end-position1),
                         "Incorrect closest edge distance (region #2)")

    def test_get_closest_edge_distance_partially_inside_region(self):
        # Partially inside reference region
        position1 = 1200000
        position2 = 1255000
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2),
                         abs(self.rna_data.end-position2),
                         "Incorrect closest edge distance (inside region #1)")
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2,
                                                                zero_inside_region=True),
                         0,
                         "Incorrect closest edge distance (inside region #2)")

    def test_get_closest_edge_distance_completely_inside_region(self):
        # Completely inside reference region
        position1 = 1250000
        position2 = 1300000
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2),
                         abs(self.rna_data.start-position1),
                         "Incorrect closest edge distance (inside region #3)")
        self.assertEqual(self.rna_data.getClosestEdgeDistanceTo(position1,
                                                                position2,
                                                                zero_inside_region=True),
                         0,
                         "Incorrect closest edge distance (inside region #4)")

    def test_get_promoter_region(self):
        leading = 10000
        trailing = 2500
        promoter = self.rna_data.getPromoterRegion(leading,trailing)
        self.assertEqual(promoter,
                         (self.rna_data.getTSS()-leading,
                          self.rna_data.getTSS()+trailing),
                         "Incorrect promoter region for + strand example")
        promoter = self.rna_data_2.getPromoterRegion(leading,trailing)
        self.assertEqual(promoter,
                         (self.rna_data_2.getTSS()+leading,
                          self.rna_data_2.getTSS()-trailing),
                         "Incorrect promoter region for - strand example")