BamIndexTest.cpp

00001 /*
00002  *  Copyright (C) 2010  Regents of the University of Michigan
00003  *
00004  *   This program is free software: you can redistribute it and/or modify
00005  *   it under the terms of the GNU General Public License as published by
00006  *   the Free Software Foundation, either version 3 of the License, or
00007  *   (at your option) any later version.
00008  *
00009  *   This program is distributed in the hope that it will be useful,
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  *   GNU General Public License for more details.
00013  *
00014  *   You should have received a copy of the GNU General Public License
00015  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
00016  */
00017 
00018 #include "BamIndex.h"
00019 #include "Validate.h"
00020 
00021 #include <assert.h>
00022 
00023 void testBamIndex()
00024 {
00025     // Create a bam index.
00026     BamIndex bamIndex;
00027     bamIndex.readIndex("testFiles/sortedBam.bam.bai");
00028 
00029     // Get the chunks for reference id 1.
00030     Chunk testChunk;
00031     SortedChunkList chunkList;
00032     assert(bamIndex.getChunksForRegion(1, -1, -1, chunkList) == true);
00033     assert(!chunkList.empty());
00034     testChunk = chunkList.pop();
00035     assert(chunkList.empty());
00036     assert(testChunk.chunk_beg == 0x4e7);
00037     assert(testChunk.chunk_end == 0x599);
00038 
00039     // Get the chunks for reference id 0.
00040     assert(bamIndex.getChunksForRegion(0, -1, -1, chunkList) == true);
00041     assert(!chunkList.empty());
00042     testChunk = chunkList.pop();
00043     assert(chunkList.empty());
00044     assert(testChunk.chunk_beg == 0x360);
00045     assert(testChunk.chunk_end == 0x4e7);
00046 
00047 
00048     // Get the chunks for reference id 2.
00049     assert(bamIndex.getChunksForRegion(2, -1, -1, chunkList) == true);
00050     assert(!chunkList.empty());
00051     testChunk = chunkList.pop();
00052     assert(chunkList.empty());
00053     assert(testChunk.chunk_beg == 0x599);
00054     assert(testChunk.chunk_end == 0x5ea);
00055 
00056     // Get the chunks for reference id 3.
00057     // There isn't one for this ref id, but still successfully read the file,
00058     // so it should return true, but the list should be empty.
00059     assert(bamIndex.getChunksForRegion(3, -1, -1, chunkList) == true);
00060     assert(chunkList.empty());
00061 
00062     // Test reading an indexed bam file.
00063     SamFile inFile;
00064     assert(inFile.OpenForRead("testFiles/sortedBam.bam"));
00065     assert(inFile.ReadBamIndex("testFiles/sortedBam.bam.bai"));
00066     SamFileHeader samHeader;
00067     assert(inFile.ReadHeader(samHeader));
00068     SamRecord samRecord;
00069 
00070     // Section -1 = Ref *: 2 records (8 & 10 from testSam.sam that is reflected
00071     // in the validation.
00072     assert(inFile.SetReadSection(-1));
00073     assert(inFile.ReadRecord(samHeader, samRecord));
00074     validateRead8(samRecord);
00075     assert(inFile.ReadRecord(samHeader, samRecord));
00076     validateRead10(samRecord);
00077     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00078 
00079     // Section 2 = Ref 3: 1 records (9 from testSam.sam that is reflected
00080     // in the validation.
00081     assert(inFile.SetReadSection(2));
00082     assert(inFile.ReadRecord(samHeader, samRecord));
00083     validateRead9(samRecord);
00084     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00085 
00086     // Section 0 = Ref 1: 5 records (3, 4, 1, 2, & 6 from testSam.sam that is
00087     // reflected in the validation.
00088     assert(inFile.SetReadSection(0));
00089     assert(inFile.ReadRecord(samHeader, samRecord));
00090     validateRead3(samRecord);
00091     assert(inFile.ReadRecord(samHeader, samRecord));
00092     validateRead4(samRecord);
00093     assert(inFile.ReadRecord(samHeader, samRecord));
00094     validateRead1(samRecord);
00095     assert(inFile.ReadRecord(samHeader, samRecord));
00096     validateRead2(samRecord);
00097     assert(inFile.ReadRecord(samHeader, samRecord));
00098     validateRead6(samRecord);
00099     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00100 
00101     // Section 1 = Ref 2: 2 records (5 & 7 from testSam.sam that is reflected
00102     // in the validation.
00103     assert(inFile.SetReadSection(1));
00104     assert(inFile.ReadRecord(samHeader, samRecord));
00105     validateRead5(samRecord);
00106     assert(inFile.ReadRecord(samHeader, samRecord));
00107     validateRead7(samRecord);
00108     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00109 
00110     // Section 3 to 22 (ref 4 - 23): 0 records.
00111     for(int i = 3; i < 23; i++)
00112     {
00113         assert(inFile.SetReadSection(i));
00114         assert(inFile.ReadRecord(samHeader, samRecord) == false);
00115     }
00116 
00117 
00118     // Set the read section.
00119     assert(inFile.SetReadSection("1", 1010, 1012));
00120     assert(inFile.ReadRecord(samHeader, samRecord));
00121     validateRead1(samRecord);
00122     assert(inFile.GetNumOverlaps(samRecord) == 2);
00123     assert(samRecord.getNumOverlaps(1010, 1012) == 2);
00124     assert(samRecord.getNumOverlaps(1010, 1020) == 5);
00125     assert(samRecord.getNumOverlaps(1010, 1011) == 1);
00126     assert(samRecord.getNumOverlaps(1011, 1012) == 1);
00127     assert(inFile.ReadRecord(samHeader, samRecord));
00128     validateRead2(samRecord);
00129     assert(inFile.GetNumOverlaps(samRecord) == 0);
00130     assert(samRecord.getNumOverlaps(1010, 1012) == 0);
00131     assert(samRecord.getNumOverlaps(1010, 1020) == 0);
00132     assert(samRecord.getNumOverlaps(1010, 1011) == 0);
00133     assert(samRecord.getNumOverlaps(1011, 1012) == 0);
00134     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00135            
00136     assert(inFile.SetReadSection("1", 1010, 1020));
00137     assert(inFile.ReadRecord(samHeader, samRecord));
00138     validateRead1(samRecord);
00139     assert(inFile.GetNumOverlaps(samRecord) == 5);
00140     assert(samRecord.getNumOverlaps(1010, 1012) == 2);
00141     assert(samRecord.getNumOverlaps(1010, 1020) == 5);
00142     assert(samRecord.getNumOverlaps(1010, 1011) == 1);
00143     assert(samRecord.getNumOverlaps(1011, 1012) == 1);
00144     assert(inFile.ReadRecord(samHeader, samRecord));
00145     validateRead2(samRecord);
00146     assert(inFile.GetNumOverlaps(samRecord) == 0);
00147     assert(samRecord.getNumOverlaps(1010, 1012) == 0);
00148     assert(samRecord.getNumOverlaps(1010, 1020) == 0);
00149     assert(samRecord.getNumOverlaps(1010, 1011) == 0);
00150     assert(samRecord.getNumOverlaps(1011, 1012) == 0);
00151     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00152            
00153     assert(inFile.SetReadSection("1", 1010, 1011));
00154     assert(inFile.ReadRecord(samHeader, samRecord));
00155     validateRead1(samRecord);
00156     assert(inFile.GetNumOverlaps(samRecord) == 1);
00157     assert(samRecord.getNumOverlaps(1010, 1012) == 2);
00158     assert(samRecord.getNumOverlaps(1010, 1020) == 5);
00159     assert(samRecord.getNumOverlaps(1010, 1011) == 1);
00160     assert(samRecord.getNumOverlaps(1011, 1012) == 1);
00161     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00162            
00163     assert(inFile.SetReadSection("1", 1011, 1012));
00164     assert(inFile.ReadRecord(samHeader, samRecord));
00165     validateRead1(samRecord);
00166     assert(inFile.GetNumOverlaps(samRecord) == 1);
00167     assert(samRecord.getNumOverlaps(1010, 1012) == 2);
00168     assert(samRecord.getNumOverlaps(1010, 1020) == 5);
00169     assert(samRecord.getNumOverlaps(1010, 1011) == 1);
00170     assert(samRecord.getNumOverlaps(1011, 1012) == 1);
00171     assert(inFile.ReadRecord(samHeader, samRecord));
00172     validateRead2(samRecord);
00173     assert(inFile.GetNumOverlaps(samRecord) == 0);
00174     assert(samRecord.getNumOverlaps(1010, 1012) == 0);
00175     assert(samRecord.getNumOverlaps(1010, 1020) == 0);
00176     assert(samRecord.getNumOverlaps(1010, 1011) == 0);
00177     assert(samRecord.getNumOverlaps(1011, 1012) == 0);
00178     assert(inFile.ReadRecord(samHeader, samRecord) == false);
00179            
00180 }
Generated on Wed Nov 17 15:38:27 2010 for StatGen Software by  doxygen 1.6.3