view commons/core/coord/test/Test_Range.py @ 6:769e306b7933

Change the repository level.
author yufei-luo
date Fri, 18 Jan 2013 04:54:14 -0500
parents
children 94ab73e8a190
line wrap: on
line source

# Copyright INRA (Institut National de la Recherche Agronomique)
# http://www.inra.fr
# http://urgi.versailles.inra.fr
#
# This software is governed by the CeCILL license under French law and
# abiding by the rules of distribution of free software.  You can  use, 
# modify and/ or redistribute the software under the terms of the CeCILL
# license as circulated by CEA, CNRS and INRIA at the following URL
# "http://www.cecill.info". 
#
# As a counterpart to the access to the source code and  rights to copy,
# modify and redistribute granted by the license, users are provided only
# with a limited warranty  and the software's author,  the holder of the
# economic rights,  and the successive licensors  have only  limited
# liability. 
#
# In this respect, the user's attention is drawn to the risks associated
# with loading,  using,  modifying and/or developing or reproducing the
# software by the user in light of its specific status of free software,
# that may mean  that it is complicated to manipulate,  and  that  also
# therefore means  that it is reserved for developers  and  experienced
# professionals having in-depth computer knowledge. Users are therefore
# encouraged to load and test the software's suitability as regards their
# requirements in conditions enabling the security of their systems and/or 
# data to be ensured and,  more generally, to use and operate it in the 
# same conditions as regards security. 
#
# The fact that you are presently reading this means that you have had
# knowledge of the CeCILL license and that you accept its terms.


import unittest
from commons.core.coord.Range import Range
from commons.core.coord.Range import getBin, getIdx


class Test_Range( unittest.TestCase ):
    
    def setUp(self):
        self._range = Range()
        
    def test_setFromString(self):
        line = "chunk1\t190000\t390000"
        self._range.setFromString( line )
        self.assertEqual( self._range.seqname, "chunk1" )
        self.assertEqual( self._range.start, 190000 )
        self.assertEqual( self._range.end, 390000 )
        
        line = "chunk1\t190000\t390000\n"
        self._range.setFromString( line )
        self.assertEqual( self._range.seqname, "chunk1" )
        self.assertEqual( self._range.start, 190000 )
        self.assertEqual( self._range.end, 390000 )
        
        line = "chunk1;190000;390000"
        self._range.setFromString( line, ";" )
        self.assertEqual( self._range.seqname, "chunk1" )
        self.assertEqual( self._range.start, 190000 )
        self.assertEqual( self._range.end, 390000 )
        
    def test_setFromTuple(self):
        tuple = ("chunk1","190000","390000")
        self._range.setFromTuple( tuple)
        
        self.assertEqual( self._range.seqname, "chunk1" )
        self.assertEqual( self._range.start, 190000 )
        self.assertEqual( self._range.end, 390000 )
        
    def test___eq__(self):
        self._range.setFromString( "chunk1\t190000\t390000\n" )
        o = Range()
        o.setFromString( "chunk1\t190000\t390000\n" )
        self.assertEqual( self._range, o )
        
        o.setFromString( "chunk1\t190000\t39" )
        self.assertNotEquals( self._range, o )
        
        o.setFromString( "chromosome1\t190000\t390000" )
        self.assertNotEquals( self._range, o )
        
        o.setFromString( "chunk1\t390000\t190000" )
        self.assertNotEquals( self._range, o )
        
        o.setFromString( "chromosome1\t390000\t190000" )
        self.assertNotEquals( self._range, o )
        
    def test_getMin(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        expMin = 190000
        obsMin = self._range.getMin() 
        self.assertTrue(expMin, obsMin)
        
    def test_getMax(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        expMax = 390000
        obsMax = self._range.getMax() 
        self.assertTrue(expMax, obsMax)
        
    def test_isOnDirectStrand_true(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        self.assertTrue(self._range.isOnDirectStrand())
        
    def test_isOnDirectStrand_false(self):
        self._range.setFromTuple( ("chunk1", 390000, 190000) )
        self.assertFalse(self._range.isOnDirectStrand())
        
    def test_isOnReverseStrand_true(self):
        self._range.setFromTuple( ("chunk1", 390000, 190000) )
        self.assertTrue(self._range.isOnReverseStrand())
        
    def test_isOnReverseStrand_false(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        self.assertFalse(self._range.isOnReverseStrand())
        
    def test_getStrand_direct(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        expStrand = '+'
        obsStrand = self._range.getStrand()
        self.assertEqual(expStrand, obsStrand)
        
    def test_getStrand_reverse(self):
        self._range.setFromTuple( ("chunk1", 390000, 190000) )
        expStrand = '-'
        obsStrand = self._range.getStrand()
        self.assertEqual(expStrand, obsStrand)
        
    def test_reverse(self):
        obsRange = Range("chunk1", 190000, 390000)
        expRange = Range("chunk1", 390000, 190000)
        obsRange.reverse()
        self.assertEquals(expRange, obsRange)
        
    def test_getLength(self):
        self._range.setFromTuple( ("chunk1", 190000, 390000) )
        expLength = 200001 
        obsLength = self._range.getLength()
        self.assertEquals(expLength, obsLength)
        
    def test_isEmpty_true( self ):
        exp = True
        obs = self._range.isEmpty()
        self.assertEquals( exp, obs )
        
    def test_isEmpty_false( self ):
        self._range.setFromTuple( ( "seq1", 1, 10 ) )
        exp = False
        obs = self._range.isEmpty()
        self.assertEquals( exp, obs )
        
    def test_merge_diff_sequences( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        range2 = Range( "seq2", 6, 12 )
        expReturn = None
        expRange = Range( "seq1", 6, 10 )
        obsReturn = self._range.merge( range2 )
        obsRange = self._range
        self.assertEquals( expReturn, obsReturn )
        self.assertEquals( expRange, obsRange )
        
    def test_merge_no_overlapping_ranges( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        range2 = Range( "seq1", 12, 20 )
        expReturn = None
        expRange = Range( "seq1", 6, 20 )
        obsReturn = self._range.merge( range2 )
        obsRange = self._range
        self.assertEquals( expReturn, obsReturn )
        self.assertEquals( expRange, obsRange )
        
    def test_merge_no_overlapping_ranges_range1_on_neg_strand( self ):
        self._range.setFromTuple( ( "seq1", 10, 6 ) )
        range2 = Range( "seq1", 12, 20 )
        expReturn = None
        expRange = Range( "seq1", 20, 6 )
        obsReturn = self._range.merge( range2 )
        obsRange = self._range
        self.assertEquals( expReturn, obsReturn )
        self.assertEquals( expRange, obsRange )
        
    def test_merge_overlapping_ranges_range1_and_range2_on_neg_strand( self ):
        self._range.setFromTuple( ( "seq1", 10, 6 ) )
        range2 = Range( "seq1", 20, 12 )
        expReturn = None
        expRange = Range( "seq1", 20, 6 )
        obsReturn = self._range.merge( range2 )
        obsRange = self._range
        self.assertEquals( expReturn, obsReturn )
        self.assertEquals( expRange, obsRange )
        
    def test_merge_on_overlapping_ranges_range1_and_range2( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        range2 = Range( "seq1", 8, 20 )
        expReturn = None
        expRange = Range( "seq1", 6, 20 )
        obsReturn = self._range.merge( range2 )
        obsRange = self._range
        self.assertEquals( expReturn, obsReturn )
        self.assertEquals( expRange, obsRange )
        
    def test_isOverlapping_diff_sequences( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq2", 6, 10 )
        exp = False
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_no( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 16, 20 )
        exp = False
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_yes( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 1, 15 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_yes_range2_on_neg_strand( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 15, 1 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_range1_before_range2( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 8, 15 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_range1_after_range2( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 1, 8 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_range1_equal_range2( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 6, 10 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_yes_edges_left( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 1, 6 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_yes_edges_right( self ):
        self._range.setFromTuple( ( "seq1", 6, 10 ) )
        r2 = Range( "seq1", 10, 20 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
    def test_isOverlapping_yes_one_nt( self ):
        self._range.setFromTuple( ( "seq1", 10, 10 ) )
        r2 = Range( "seq1", 10, 20 )
        exp = True
        obs = self._range.isOverlapping( r2 )
        self.assertEquals( exp, obs )
        
        
    def test_getOverlapLength_on_different_range( self ):
        range1 = Range( "chunk1", 190000, 390000 )
        range2 = Range( "chunk2", 290000, 590000 )
        expSize = 0
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_getOverlapLength_on_no_overalping_range( self ):
        range1 =Range( "chunk1", 190000, 390000 )
        range2 =Range( "chunk1", 490000, 590000 )
        expSize = 0
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_getOverlapLength_range2_included_in_range1( self ):
        range1 = Range( "chunk1", 19, 39 )
        range2 = Range( "chunk1", 22, 25 )
        expSize = 4
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        obsSize = range2.getOverlapLength( range1 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_getOverlapLength_range1_included_in_range2( self ):
        range1 = Range( "chunk1", 220000, 250000 )
        range2 = Range( "chunk1", 190000, 390000 )
        expSize = 30001
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_getOverlapLength_range1_before_range2( self ):
        range1 = Range( "chunk1", 190000, 390000 )
        range2 = Range( "chunk1", 290000, 590000 )
        expSize = 100001
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_getOverlapLength_range1_after_range2( self ):
        range1 = Range( "chunk1", 390000, 790000 )
        range2 = Range( "chunk1", 290000, 590000 )
        expSize = 200001
        obsSize = range1.getOverlapLength( range2 )
        self.assertEquals( expSize, obsSize )
        
        
    def test_isIncludedIn( self ):
        iRange1 = Range( "chunk1", 21, 30 )
        iRange2 = Range( "chunk1", 11, 40 )
        self.assertTrue( iRange1.isIncludedIn( iRange2 ) )
        
        
    def test_isIncludedIn_diffStrand( self ):
        iRange1 = Range( "chunk1", 21, 30 )
        iRange2 = Range( "chunk1", 40, 11 )
        self.assertTrue( iRange1.isIncludedIn( iRange2 ) )
        
        
    def test_isIncludedIn_onlyOverlap( self ):
        iRange1 = Range( "chunk1", 21, 50 )
        iRange2 = Range( "chunk1", 11, 40 )
        self.assertFalse( iRange1.isIncludedIn( iRange2 ) )
        
        
    def test_isIncludedIn_diffSeqname( self ):
        iRange1 = Range( "chunk1", 21, 30 )
        iRange2 = Range( "chunk2", 11, 40 )
        self.assertFalse( iRange1.isIncludedIn( iRange2 ) )
        
        
    def test_getDistance_on_overlapping_range(self):
        overlapTuple1 = ("chunk1", 220000, 250000)
        overlapRange1 = Range()
        overlapRange1.setFromTuple(overlapTuple1)
        
        overlapTuple2 = ("chunk1", 190000, 390000)
        overlapRange2 = Range()
        overlapRange2.setFromTuple(overlapTuple2)
        
        expDistance = 0
        obsDistance = overlapRange1.getDistance(overlapRange2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_getDistance_on_range1_on_plus_strand_included_in_range2_on_neg_strand(self):
        tuple1 = ("chunk1", 220000, 250000)
        range1 = Range()
        range1.setFromTuple(tuple1)
        
        tuple2 = ("chunk1", 390000, 190000)
        range2 = Range()
        range1.setFromTuple(tuple2)
        
        expDistance = -1
        obsDistance = range1.getDistance(range2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_getDistance_range1_after_range2(self):
        tuple1 = ("chunk1", 390000, 590000)
        range1 = Range()
        range1.setFromTuple(tuple1)
        
        tuple2 = ("chunk1", 190000, 290000)
        range2 = Range()
        range2.setFromTuple(tuple2)
        
        expDistance = 100000
        obsDistance = range1.getDistance(range2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_getDistance_range1_before_range2(self):
        tuple1 = ("chunk1", 190000, 290000)
        range1 = Range()
        range1.setFromTuple(tuple1)
        
        tuple2 = ("chunk1", 390000, 590000)
        range2 = Range()
        range2.setFromTuple(tuple2)
        
        expDistance = 100000
        obsDistance = range1.getDistance(range2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_getDistance_range1_after_range2_both_on_neg_strand(self):   
        tuple1 = ("chunk1", 590000, 390000)
        range1 = Range()
        range1.setFromTuple(tuple1)
        
        tuple2 = ("chunk1", 290000, 190000)
        range2 = Range()
        range2.setFromTuple(tuple2)
        
        expDistance = 100000
        obsDistance = range1.getDistance(range2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_getDistance_range1_before_range2_both_on_neg_strand(self):   
        tuple1 = ("chunk1", 290000, 190000)
        range1 = Range()
        range1.setFromTuple(tuple1)
        
        tuple2 = ("chunk1", 590000, 390000)
        range2 = Range()
        range2.setFromTuple(tuple2)
        
        expDistance = 100000
        obsDistance = range1.getDistance(range2)
        
        self.assertEquals(expDistance, obsDistance)
        
    def test_diff_on_no_overlapping_range(self):
        range1 = Range("chunk1", 190000, 390000)
        range2 = Range("chunk1", 490000, 590000)
        
        expRange1 = Range("chunk1",190000,390000)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_on_different_chunks(self):
        range1 = Range("chunk1", 190000, 390000)
        range2 = Range("chunk2", 290000, 590000)
        
        expRange1 = Range("chunk1", 190000, 390000)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range1_before_range2(self):
        range1 = Range("chunk1", 190000, 390000)
        range2 = Range("chunk1", 290000, 590000)
        
        expRange1 = Range("chunk1", 190000, 289999)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range1_before_range2_range1_on_neg_strand(self):
        range1 = Range("chunk1", 390000, 190000)
        range2 = Range("chunk1", 290000, 590000)
        
        expRange1 = Range("chunk1", 289999, 190000)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range2_included_in_range1(self):
        range1 = Range("chunk1", 190000, 590000)
        range2 = Range("chunk1", 290000, 390000)
        
        expRange1 = Range("chunk1", 190000, 289999)
        expReturnedRange = Range("chunk1", 390001, 590000)
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range2_included_in_range1_range1_on_reverse_strand(self):
        range1 = Range("chunk1", 590000, 190000)
        range2 = Range("chunk1", 290000, 390000)
        
        expRange1 = Range("chunk1", 289999, 190000)
        expReturnedRange = Range("chunk1", 590000, 390001)
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range1_included_in_range2(self):
        range1 = Range("chunk1", 390000, 490000)
        range2 = Range("chunk1", 290000, 590000)
        
        expRange1 = Range("chunk1",0,0)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range1_after_range2(self):
        range1 = Range("chunk1", 390000, 590000)
        range2 = Range("chunk1", 290000, 490000)
        
        expRange1 = Range("chunk1", 490001, 590000)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_diff_range1_after_range2_range1_on_neg_strand(self):
        range1 = Range("chunk1", 590000, 390000)
        range2 = Range("chunk1", 290000, 490000)
        
        expRange1 = Range("chunk1", 590000, 490001)
        expReturnedRange = Range("chunk1")
        
        obsReturnedRange = range1.diff(range2)
        obsRange1 = range1
        
        self.assertEquals(expRange1, obsRange1)
        self.assertEquals(expReturnedRange, obsReturnedRange)
        
    def test_getIdx(self):
        self.assertEqual(getIdx(1000,3),1000001)
        self.assertEqual(getIdx(999,3),1000000)
        self.assertEqual(getIdx(2000,3),1000002)
        self.assertEqual(getIdx(2000,4),2000000)
        self.assertEqual(getIdx(2000,5),3000000)
        self.assertEqual(getIdx(20000000,6),4000000)
        self.assertEqual(getIdx(20000000,5),3000200)
        self.assertEqual(getIdx(20000000,4),2002000)
        self.assertEqual(getIdx(20000000,3),1020000)
        
    def test_getBin_bin_level_9(self):
        tuple1 = ("chunk1", 190000000, 390000000)
        range1 =Range()
        range1.setFromTuple(tuple1)
        
        expRes = 100000000.0
        obsRes = range1.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_8(self):
        tuple1 = ("chunk1", 19000000, 39000000)
        range1 =Range()
        range1.setFromTuple(tuple1)
        
        expRes = 100000000.0
        obsRes = range1.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_7(self):
        tuple1 = ("chunk1", 1900000, 3900000)
        range1 =Range()
        range1.setFromTuple(tuple1)
        
        expRes = 10000000.0
        obsRes = range1.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_6(self):
        tuple1 = ("chunk1", 190000, 390000)
        range1 =Range()
        range1.setFromTuple(tuple1)
        
        expRes = 1000000.0
        obsRes = range1.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_5(self):
        tuple = ("chunk1", 19000, 39000)
        range =Range()
        range.setFromTuple(tuple)
        expRes = 100000.0
        obsRes = range.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_4(self):
        tuple = ("chunk1", 1900, 3900)
        range =Range()
        range.setFromTuple(tuple)
        
        expRes = 10000.0
        obsRes = range.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_3(self):
        tuple = ("chunk1", 190, 390)
        range =Range()
        range.setFromTuple(tuple)
        
        expRes = 1000.0
        obsRes = range.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_2(self):
        tuple = ("chunk1", 19, 39)
        range =Range()
        range.setFromTuple(tuple)
        
        expRes = 1000.0
        obsRes = range.getBin()
        
        self.assertEquals(expRes, obsRes)
        
    def test_getBin_bin_level_1(self):
        tuple = ("chunk1", 1, 3)
        range =Range()
        range.setFromTuple(tuple)
        
        expRes = 1000.0
        obsRes = range.getBin()
        
        self.assertEquals(expRes, obsRes)
        
        
    def test_getBin_function(self):
        expBin = 2L
        obsBin = getBin(200, 2)
        
        self.assertEquals(expBin, obsBin)
        
    def test_findIdx(self):
        o = Range()
        o.setFromString( "chunk1\t1000\t2000\n" )
        self.assertEqual(o.findIdx(),2000000)
        
        o.setFromString( "chunk1\t2000\t1000\n" )       
        self.assertEqual(o.findIdx(),2000000)
        
        o.setFromString( "chunk1\t200\t999\n" )       
        self.assertEqual(o.findIdx(),1000000)
        
        o.setFromString( "chunk1\t1\t20000000\n" )       
        self.assertEqual(o.findIdx(),4000000)
        
        
test_suite = unittest.TestSuite()
test_suite.addTest( unittest.makeSuite( Test_Range ) )
if __name__ == "__main__":
    unittest.TextTestRunner(verbosity=2).run( test_suite )