def test_add_to_read_groups_doesNothingWhenNotInCommonKeys(self):
        readA = SplitRead(**initParams({'name':'readA'}))
        common_keys = set([readA.key()])
        read_groups = {}

        readB = SplitRead(**initParams({'name':'readB'}))       
        readB.add_to_read_groups(common_keys, read_groups)
        
        self.assertEqual(0, len(read_groups))
    def test_write_sam_pairs_skipsIfWrongPosition(self):
        writer = MockWriter()
        
        leftA = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 10}))
        rightA = SplitRead(**initParams({'name':'readA', 'side':"R", 'position': 5}))
        
        read_group_key = leftA.key()
        read_group_pairs = {read_group_key:[(leftA, rightA, 5)]}

        split_read_from_file = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 999}))
        split_read_from_file.write_sam_pairs(read_group_pairs, "line\t"*12, writer)
        
        self.assertEqual(0, len(writer.lines()))
    def test_add_to_read_groups_addsToCorrectSide(self):
        left10 = SplitRead(**initParams({'name':'readA', 'side':"L", 'position':10, 'split_len':40, 'original_read_len':100}))
        left15 = SplitRead(**initParams({'name':'readA', 'side':"L", 'position':15, 'split_len':40, 'original_read_len':100}))
        right30 = SplitRead(**initParams({'name':'readA', 'side':"R", 'position':30, 'split_len':60, 'original_read_len':100}))
        read_group_key = left10.key()
        common_keys = set([read_group_key])
        read_groups = {}

        left10.add_to_read_groups(common_keys, read_groups)
        left15.add_to_read_groups(common_keys, read_groups)
        right30.add_to_read_groups(common_keys, read_groups)
        
        self.assertEqual(1, len(read_groups))
        self.assertEqual(([left10, left15], [right30]), read_groups[read_group_key])
    def test_write_sam_pairs_writesLineForEachPairParticipation(self):
        writer = MockWriter()
        stub_line = "readA|"*12
        leftA5 = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 5}))
        rightA10 = SplitRead(**initParams({'name':'readA', 'side':"R", 'position': 10}))
        rightA15 = SplitRead(**initParams({'name':'readA', 'side':"R", 'position': 15}))
        
        read_group_key = leftA5.key()
        read_group_pairs = {read_group_key:[(leftA5, rightA10), (leftA5, rightA15)]}

        split_read_from_file = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 5}))
        split_read_from_file.write_sam_pairs(read_group_pairs, stub_line+"\n", writer, "|")
        
        actual_lines = writer.lines()
        self.assertEqual(2, len(actual_lines))
 def test_gap_distance(self):
     srL1 = SplitRead(**initParams({'position':25, 'split_len':60, 'strand':"+", 'side':"L", 'original_read_len':200}))
     srR1 = SplitRead(**initParams({'position':100, 'split_len':40, 'strand':"+", 'side':"R", 'original_read_len':200}))
     self.assertEqual(15, srL1.gap_distance(srR1))
     self.assertEqual(15, srR1.gap_distance(srL1))
     
     srL2 = SplitRead(**initParams({'position':100, 'split_len':40, 'strand':"-", 'side':"L", 'original_read_len':200}))
     srR2 = SplitRead(**initParams({'position':55, 'split_len':30, 'strand':"-", 'side':"R", 'original_read_len':200}))
     self.assertEqual(15, srL2.gap_distance(srR2))
     self.assertEqual(15, srR2.gap_distance(srL2))
    def test_is_oriented_false(self):
        left = SplitRead(**initParams({'side':"L", 'position': 2, 'strand':"+"}))
        right = SplitRead(**initParams({'side':"R", 'position': 1, 'strand':"+"}))
        self.assertEqual(False, left.is_oriented(right))
        self.assertEqual(False, right.is_oriented(left))

        left = SplitRead(**initParams({'side':"L", 'position': 1, 'strand':"-"}))
        right = SplitRead(**initParams({'side':"R", 'position': 2, 'strand':"-"}))
        self.assertEqual(False, left.is_oriented(right))
        self.assertEqual(False, right.is_oriented(left))
    def test_write_sam_pairs_writesNegativeStrandSamLines(self):
        writer = MockWriter()
        input_line = "readA|147|chr12|5|255|42M|*|0|0|TCACC|DDDDD|XA:i:0"
        left_read = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 5200, 'split_len':15, 'original_read_len':100}))
        right_read = SplitRead(**initParams({'name':'readA', 'side':"R", 'position': 5000, 'split_len':85, 'original_read_len':100}))
        
        read_group_key = left_read.key()
        read_group_pairs = {read_group_key:[(left_read, right_read)]}

        first_split_read_from_file = SplitRead(**initParams({'name':'readA', 'side':"L", 'position': 5200, 'split_len':15, 'original_read_len':100}))
        first_split_read_from_file.write_sam_pairs(read_group_pairs, input_line+"\n", writer,"|")
        second_split_read_from_file = SplitRead(**initParams({'name':'readA', 'side':"R", 'position': 5000, 'split_len':85, 'original_read_len':100}))
        second_split_read_from_file.write_sam_pairs(read_group_pairs, input_line+"\n", writer,"|")
        
        actual_lines = writer.lines()
        self.assertEqual(2, len(actual_lines))
        self.assertEqual("readA-L-15|115|chr12|5200|255|42M|=|5000|-200|TCACC|DDDDD|XA:i:0", actual_lines[0])
        self.assertEqual("readA-L-15|147|chr12|5000|255|42M|=|5200|200|TCACC|DDDDD|XA:i:0", actual_lines[1])
 def test_format(self):
     params = initParams({'name':"foo", 'side':"L", 'split_len':10, 'strand':"strand", 'chromosome':"chr", 'position':100, 'matches':5}) 
     sr = SplitRead(**params)
     self.assertEqual("foo~L~10~strand~chr~100~5", sr.format("~"))   
 def test_add_to_group_keys(self):
     group_keys = {'L':set(), 'R':set()}
     readA10 = SplitRead(**initParams({'name':'readA', 'side':"L", 'position':10}))
     readA15 = SplitRead(**initParams({'name':'readA', 'side':"L", 'position':15}))
     readB30 = SplitRead(**initParams({'name':'readB', 'side':"R", 'position':30}))
     
     readA10.add_to_group_keys(group_keys)
     readA15.add_to_group_keys(group_keys)
     readB30.add_to_group_keys(group_keys)
     
     self.assertEqual(2, len(group_keys))
     self.assertEqual(set([readA10.key(), readA15.key()]), group_keys["L"])
     self.assertEqual(set([readB30.key()]), group_keys["R"])
 def test_left_name(self):
     left = SplitRead(**initParams({'name':'readA', 'side':"L", 'split_len': 10, 'original_read_len': 100}))
     right = SplitRead(**initParams({'name':'readA', 'side':"R", 'split_len': 90, 'original_read_len': 100}))
     self.assertEqual("readA-L-10", left.left_name())
     self.assertEqual("readA-L-10", right.left_name())
 def test_is_oriented_falseIfSideSame(self):
     left = SplitRead(**initParams({'side':"L", 'position': 10, 'strand':"+"}))
     left2 = SplitRead(**initParams({'side':"L", 'position': 150, 'strand':"+"}))
     self.assertEqual(False, left.is_oriented(left2))
     self.assertEqual(False, left2.is_oriented(left))