WriteFiles.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 "SamFile.h"
00019 #include "WriteFiles.h"
00020 #include "Validate.h"
00021 
00022 #include <assert.h>
00023 #include <stdio.h>
00024 
00025 void testWrite()
00026 {
00027     testHeaderWrite();
00028     testWriteCopiedHeader();
00029 }
00030 
00031 void testHeaderWrite()
00032 {
00033     SamFile samOut;
00034 
00035     samOut.OpenForWrite("results/MyTestOut.sam");
00036 
00037     // Create a sam header.
00038     SamFileHeader samHeader;
00039    
00040     std::string headerString = "";
00041 
00042     // Test getting HD & PG and the HD-SO tag when they do not exist.
00043     assert(samHeader.getHD() == NULL);
00044     assert(samHeader.getPG("1") == NULL);
00045     assert(strcmp(samHeader.getTagSO(), "") == 0);
00046 
00047     // Test removing the HD tag that does not exist.
00048     assert(samHeader.removeHD() == true);
00049     assert(samHeader.getHD() == NULL);
00050     assert(strcmp(samHeader.getHDTagValue("VN"), "") == 0);
00051     assert(samHeader.getHeaderString(headerString) == true);
00052     assert(headerString == "");
00053 
00054     char type[3] = "HD";
00055     char tag[3] = "VN";
00056     // Verify it has not yet been added to the parsed header.
00057     assert(strcmp(samHeader.getHDTagValue("VN"), "") == 0);
00058     assert(samHeader.addHeaderLine(type, tag, "1.0") == true);
00059     assert(samHeader.getHeaderString(headerString) == true);
00060     assert(headerString == "@HD\tVN:1.0\n");
00061 
00062     // Verify it was added to the parsed header.
00063     assert(strcmp(samHeader.getHDTagValue("VN"), "1.0") == 0);
00064 
00065     type[0] = 'S';
00066     type[1] = 'Q';
00067     tag[0] = 'L';
00068     tag[1] = 'N';
00069     // Cannot add SQ LN tag without adding the SN tag also.
00070     assert(samHeader.addHeaderLine(type, tag, "123") == false);
00071     assert(samHeader.getHeaderString(headerString) == true);
00072     assert(headerString == "@HD\tVN:1.0\n");
00073 
00074     // Has not yet been added, so returns blank.
00075     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "") == 0);
00076 
00077     // Can't add the SQ type without a LN.
00078     std::string line = "@SQ\tSN:123";
00079     assert(samHeader.addHeaderLine(line.c_str()) == false);
00080     assert(samHeader.getHeaderString(headerString) == true);
00081     assert(headerString == "@HD\tVN:1.0\n");
00082 
00083     // Successfully add a SQ line.
00084     line = "@SQ\tLN:123\tSN:chr20";
00085     assert(samHeader.addHeaderLine(line.c_str()) == true);
00086     assert(samHeader.getHeaderString(headerString) == true);
00087     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00088     // Verify it was added to the parsed header.
00089     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00090 
00091     // Test to make sure nothing changes if try to copy into self.
00092     samHeader = samHeader;
00093     assert(samHeader.addHeaderLine(line.c_str()) == false);
00094     assert(samHeader.getHeaderString(headerString) == true);
00095     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00096     // Verify it was added to the parsed header.
00097     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00098 
00099     samHeader.copy(samHeader);
00100     assert(samHeader.addHeaderLine(line.c_str()) == false);
00101     assert(samHeader.getHeaderString(headerString) == true);
00102     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00103     // Verify it was added to the parsed header.
00104     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00105 
00106     // Test adding an HD that is already there.
00107     assert(samHeader.addHeaderLine("@HD\tVN:1.1") == false);
00108     assert(samHeader.getHeaderString(headerString) == true);
00109     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00110     // Verify it was added to the parsed header.
00111     assert(strcmp(samHeader.getHDTagValue("VN"), "1.0") == 0);
00112 
00113     // Test copying the header.
00114     SamFileHeader newHeader = samHeader;
00115     assert(newHeader.getHeaderString(headerString) == true);
00116     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00117     // Verify it was added to the parsed header.
00118     assert(strcmp(newHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00119     
00120 
00121     // Modify one of the tags.
00122     assert(samHeader.setHDTag("VN", "1.1") == true);
00123     assert(samHeader.getHeaderString(headerString) == true);
00124     assert(headerString == "@HD\tVN:1.1\n@SQ\tLN:123\tSN:chr20\n");
00125     // Verify it was modified.
00126     assert(strcmp(samHeader.getHDTagValue("VN"), "1.1") == 0);
00127 
00128     // Remove the version.
00129     assert(samHeader.setHDTag("VN", "") == true);
00130     assert(samHeader.getHeaderString(headerString) == true);
00131     assert(headerString == "@SQ\tLN:123\tSN:chr20\n");
00132     // Verify it was removed.
00133     assert(strcmp(samHeader.getHDTagValue("VN"), "") == 0);
00134    
00135     // Remove the SN from the SQ type - fails because SN is the key.
00136     assert(samHeader.setSQTag("SN", "", "chr20") == false);
00137     assert(samHeader.getHeaderString(headerString) == true);
00138     assert(headerString == "@SQ\tLN:123\tSN:chr20\n");
00139     // Verify it was not removed.
00140     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00141     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00142    
00143     // Remove the LN from the SQ type
00144     assert(samHeader.setSQTag("LN", "", "chr20") == true);
00145     assert(samHeader.getHeaderString(headerString) == true);
00146     // No header is reported since SQ must have an LN.
00147     assert(headerString == "");
00148     // Verify it was removed.
00149     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "") == 0);
00150     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00151    
00152     // Add it back in.
00153     assert(samHeader.setSQTag("LN", "124", "chr20") == true);
00154     assert(samHeader.getHeaderString(headerString) == true);
00155     assert(headerString == "@SQ\tLN:124\tSN:chr20\n");
00156     // Verify it was added.
00157     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "124") == 0);
00158     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00159 
00160     // Delete the SQ line.
00161     assert(samHeader.removeSQ("chr20") == true);
00162     // There is no header string.
00163     assert(samHeader.getHeaderString(headerString) == true);
00164     assert(headerString == "");
00165     // Verify it was removed.
00166     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "") == 0);
00167     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "") == 0);
00168 
00169     // Create an SQ record and add it back in.
00170     SamHeaderSQ* sq = new SamHeaderSQ();
00171     assert(sq->setTag("LN", "123") == true);
00172     assert(sq->setTag("SN", "chr20") == true);
00173     assert(samHeader.addSQ(sq) == true);
00174     assert(samHeader.getHeaderString(headerString) == true);
00175     assert(headerString == "@SQ\tLN:123\tSN:chr20\n");
00176     // Verify it was added.
00177     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00178     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00179 
00180     // Modify a tag.
00181     assert(sq->setTag("LN", "222") == true);
00182     assert(samHeader.getHeaderString(headerString) == true);
00183     assert(headerString == "@SQ\tLN:222\tSN:chr20\n");
00184     // Verify it was modified.
00185     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00186     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "222") == 0);
00187    
00188 
00189     // Test adding another SQ with the same key.
00190     SamHeaderSQ* sq2 = new SamHeaderSQ();
00191     assert(sq2->setTag("LN", "333") == true);
00192     assert(sq2->setTag("SN", "chr20") == true);
00193     assert(samHeader.addSQ(sq2) == false);
00194     assert(samHeader.getHeaderString(headerString) == true);
00195     assert(headerString == "@SQ\tLN:222\tSN:chr20\n");
00196     // Verify it was not added.
00197     assert(strcmp(samHeader.getSQTagValue("SN", "chr20"), "chr20") == 0);
00198     assert(strcmp(samHeader.getSQTagValue("LN", "chr20"), "222") == 0);
00199     delete sq2;
00200 
00201     // Add a new tag to the SQ tag.
00202     assert(samHeader.setSQTag("AS", "HG18", "chr20") == true);
00203     assert(samHeader.getHeaderString(headerString) == true);
00204     assert(headerString == "@SQ\tLN:222\tSN:chr20\tAS:HG18\n");
00205     // Verify it was added.
00206     assert(strcmp(samHeader.getSQTagValue("AS", "chr20"), "HG18") == 0);
00207    
00208     // Modify the AS tag.
00209     assert(samHeader.setSQTag("AS", "HG19", "chr20") == true);
00210     assert(samHeader.getHeaderString(headerString) == true);
00211     assert(headerString == "@SQ\tLN:222\tSN:chr20\tAS:HG19\n");
00212     // Verify it was added.
00213     assert(strcmp(samHeader.getSQTagValue("AS", "chr20"), "HG19") == 0);
00214 
00215     // Add a new tag .
00216     sq2 = new SamHeaderSQ();
00217     assert(sq2->setTag("LN", "333") == true);
00218     assert(sq2->setTag("SN", "chr1") == true);
00219     assert(samHeader.addSQ(sq2) == true);
00220     assert(samHeader.getHeaderString(headerString) == true);
00221     assert(headerString == 
00222            "@SQ\tLN:222\tSN:chr20\tAS:HG19\n@SQ\tLN:333\tSN:chr1\n");
00223     // Verify it was added.
00224     assert(strcmp(samHeader.getSQTagValue("SN", "chr1"), "chr1") == 0);
00225     assert(strcmp(samHeader.getSQTagValue("LN", "chr1"), "333") == 0);
00226 
00227     // Test removing an SQ tag that does not exist.
00228     assert(samHeader.removeSQ("chr100") == true);
00229     assert(samHeader.getHeaderString(headerString) == true);
00230     assert(headerString == 
00231            "@SQ\tLN:222\tSN:chr20\tAS:HG19\n@SQ\tLN:333\tSN:chr1\n");
00232 
00233     // Remove the newly added sq2 by resetting it.
00234     sq2->reset();
00235     // Verify it was removed.
00236     assert(samHeader.getHeaderString(headerString) == true);
00237     assert(headerString == "@SQ\tLN:222\tSN:chr20\tAS:HG19\n");
00238     assert(strcmp(samHeader.getSQTagValue("SN", "chr1"), "") == 0);
00239     assert(strcmp(samHeader.getSQTagValue("LN", "chr1"), "") == 0);
00240 
00241     // Test getting HD which does exist since it was set before.  Even
00242     // though the VN was removed so it doesn't appear in the header string,
00243     // it was never actually removed.
00244     SamHeaderHD* hd = samHeader.getHD();
00245     assert(hd != NULL);
00246     // Blank since the sort order was never set.
00247     assert(strcmp(samHeader.getTagSO(), "") == 0);
00248 
00249     // Set the version number.
00250     assert(hd->setTag("VN", "2.1") == true);
00251     // Verify it was added.
00252     assert(samHeader.getHeaderString(headerString) == true);
00253     assert(headerString == "@HD\tVN:2.1\n@SQ\tLN:222\tSN:chr20\tAS:HG19\n");
00254     assert(strcmp(samHeader.getHDTagValue("VN"), "2.1") == 0);
00255 
00256     // Set the SO
00257     assert(hd->setTag("SO", "coordinate") == true);
00258     // Verify it was added.
00259     assert(samHeader.getHeaderString(headerString) == true);
00260     assert(headerString == 
00261            "@HD\tVN:2.1\tSO:coordinate\n@SQ\tLN:222\tSN:chr20\tAS:HG19\n");
00262     assert(strcmp(samHeader.getHDTagValue("SO"), "coordinate") == 0);
00263 
00264     // Reset the header.
00265     samHeader.resetHeader();
00266     assert(samHeader.getHeaderString(headerString) == true);
00267     assert(headerString == "");
00268    
00269     // Add a new HD tag.
00270     assert(samHeader.setHDTag("SO", "queryname") == true);
00271     assert(strcmp(samHeader.getHDTagValue("SO"), "queryname") == 0);
00272     assert(samHeader.getHeaderString(headerString) == true);
00273     // Blank since missing VN.
00274     assert(headerString == "");
00275 
00276     // Set the VN.
00277     assert(samHeader.setHDTag("VN", "3.1") == true);
00278     assert(strcmp(samHeader.getHDTagValue("SO"), "queryname") == 0);
00279     assert(strcmp(samHeader.getHDTagValue("VN"), "3.1") == 0);
00280     assert(samHeader.getHeaderString(headerString) == true);
00281     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n");
00282    
00283     //////////////////////////////////////////////////////////////
00284     // Test removing a non-existent PG.
00285     assert(samHeader.removePG("1") == true);
00286     assert(samHeader.getHeaderString(headerString) == true);
00287     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n");
00288 
00289     // Test adding a null PG.
00290     SamHeaderPG* pg = NULL;
00291     assert(samHeader.addPG(pg) == false);
00292     assert(samHeader.getHeaderString(headerString) == true);
00293     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n");
00294    
00295     // Add a PG tag.
00296     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "") == 0);
00297     assert(samHeader.setPGTag("ID", "pid", "pid") == true);
00298     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00299     assert(samHeader.getHeaderString(headerString) == true);
00300     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00301 
00302     // Verify can't modify the key.
00303     assert(samHeader.setPGTag("ID", "pid1", "pid") == false);
00304     assert(samHeader.getHeaderString(headerString) == true);
00305     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00306     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00307 
00308     // Test adding a null PG.
00309     pg = NULL;
00310     assert(samHeader.addPG(pg) == false);
00311     assert(samHeader.getHeaderString(headerString) == true);
00312     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00313    
00314     // Test adding a PG header when it already exists.
00315     pg = new SamHeaderPG();
00316     assert(pg->setTag("ID", "pid") == true);
00317     assert(samHeader.addPG(pg) == false);
00318     assert(samHeader.getHeaderString(headerString) == true);
00319     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00320     delete pg;
00321 
00322     // Get a PG that does not exist.
00323     pg = samHeader.getPG("pid1");
00324     assert(pg == NULL);
00325 
00326     // Get a PG tag that does not exist.
00327     assert(strcmp(samHeader.getPGTagValue("CL", "pid"), "") == 0);
00328 
00329     // Get the PG tag.
00330     pg = samHeader.getPG("pid");
00331     assert(pg != NULL);
00332     assert(strcmp(pg->getTagValue("ID"), "pid") == 0);
00333     // Add a tag to the PG.
00334     assert(pg->setTag("VN", "pg1") == true);
00335     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "pg1") == 0);
00336     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00337     assert(samHeader.getHeaderString(headerString) == true);
00338     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\tVN:pg1\n");
00339    
00340     // Test modifying the key tag - fails.
00341     assert(pg->setTag("ID", "pid1") == false);
00342     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "pg1") == 0);
00343     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00344     assert(samHeader.getHeaderString(headerString) == true);
00345     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\tVN:pg1\n");
00346 
00347     // Test modifying the VN tag.
00348     assert(samHeader.setPGTag("VN", "pg", "pid") == true);
00349     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "pg") == 0);
00350     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00351     assert(samHeader.getHeaderString(headerString) == true);
00352     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\tVN:pg\n");
00353    
00354     // Test removing the VN tag.
00355     assert(pg->setTag("VN", "") == true);
00356     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "") == 0);
00357     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00358     assert(samHeader.getHeaderString(headerString) == true);
00359     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00360    
00361     // Test removing a PG that does not exist.
00362     assert(samHeader.removePG("pid1") == true);
00363     assert(samHeader.getHeaderString(headerString) == true);
00364     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:pid\n");
00365     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "") == 0);
00366     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "pid") == 0);
00367 
00368     // Test removing the PG.
00369     assert(samHeader.removePG("pid") == true);
00370     assert(samHeader.getHeaderString(headerString) == true);
00371     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n");
00372     assert(strcmp(samHeader.getPGTagValue("VN", "pid"), "") == 0);
00373     assert(strcmp(samHeader.getPGTagValue("ID", "pid"), "") == 0);
00374 
00375     // Test adding a PG header.
00376     pg = new SamHeaderPG();
00377     assert(pg->setTag("ID", "newID") == true);
00378     assert(samHeader.addPG(pg) == true);
00379     assert(samHeader.getHeaderString(headerString) == true);
00380     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00381 
00382     // Test adding a PG that is already there.
00383     assert(samHeader.addHeaderLine("@PG\tID:newID") == false);
00384     assert(samHeader.getHeaderString(headerString) == true);
00385     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00386     // Verify it was added to the parsed header.
00387     assert(strcmp(samHeader.getPGTagValue("ID", "newID"), "newID") == 0);
00388 
00389     // Test adding another PG header.
00390     pg = new SamHeaderPG();
00391     assert(pg->setTag("ID", "newID1") == true);
00392     assert(samHeader.addPG(pg) == true);
00393     assert(samHeader.getHeaderString(headerString) == true);
00394     assert(headerString == 
00395            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@PG\tID:newID1\n");
00396 
00397     // Test adding another PG header.
00398     pg = new SamHeaderPG();
00399     assert(pg->setTag("ID", "pid") == true);
00400     assert(samHeader.addPG(pg) == true);
00401     assert(samHeader.getHeaderString(headerString) == true);
00402     assert(headerString == 
00403            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@PG\tID:newID1\n@PG\tID:pid\n");
00404 
00405     // Test removing the new pg.
00406     assert(samHeader.removePG("newID1") == true);
00407     assert(samHeader.getHeaderString(headerString) == true);
00408     assert(headerString == 
00409            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@PG\tID:pid\n");
00410 
00411     // Test removing the other new pg.
00412     assert(samHeader.removePG("pid") == true);
00413     assert(samHeader.getHeaderString(headerString) == true);
00414     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00415 
00416     // Test adding a tag
00417     assert(samHeader.setPGTag("VN", "1.0", "newID") == true);
00418     assert(strcmp(samHeader.getPGTagValue("VN", "newID"), "1.0") == 0);
00419     assert(strcmp(samHeader.getPGTagValue("ID", "newID"), "newID") == 0);
00420     assert(samHeader.getHeaderString(headerString) == true);
00421     assert(headerString == 
00422            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\tVN:1.0\n");
00423    
00424     // Test removing a tag
00425     assert(samHeader.setPGTag("VN", "", "newID") == true);
00426     assert(strcmp(samHeader.getPGTagValue("VN", "newID"), "") == 0);
00427     assert(strcmp(samHeader.getPGTagValue("ID", "newID"), "newID") == 0);
00428     assert(samHeader.getHeaderString(headerString) == true);
00429     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00430    
00431 
00432 
00433     ////////////////////////////////////////////////////////////////////
00434     // Add an SQ.
00435     assert(samHeader.setSQTag("AS", "HG18", "newName") == true);
00436     assert(samHeader.getHeaderString(headerString) == true);
00437     // SQ does not show up since it is missing the LN field.
00438     assert(headerString == 
00439            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00440     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00441     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00442     // Add the SQ's SN
00443     assert(samHeader.setSQTag("SN", "newName", "newName") == true);
00444     assert(samHeader.getHeaderString(headerString) == true);
00445     // SQ does not show up since it is missing the LN field.
00446     assert(headerString == 
00447            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00448     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00449     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00450     // Get the SQ.
00451     sq = samHeader.getSQ("newName");
00452     assert(sq != NULL);
00453     // Modify the SQ
00454     assert(sq->setTag("LN", "111") == true);
00455     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00456     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00457     assert(strcmp(samHeader.getSQTagValue("LN", "newName"), "111") == 0);
00458     assert(samHeader.getHeaderString(headerString) == true);
00459     assert(headerString == 
00460            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00461 
00462     //////////////////////////////////////////////////////////////////////
00463     // Add a new RG Tag
00464     assert(samHeader.setRGTag("ID", "rgID", "rgID") == true);
00465     assert(samHeader.getHeaderString(headerString) == true);
00466     // New RG does not show up since it is still missing a required field.
00467     assert(headerString == 
00468            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00469     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00470    
00471     // Add the missing SM field.
00472     assert(samHeader.setRGTag("SM", "sm1", "rgID") == true);
00473     assert(samHeader.getHeaderString(headerString) == true);
00474     // New RG does not show up since it is still missing a required field.
00475     assert(headerString == 
00476            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n");
00477     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00478    
00479     // Verify can't modify the key.
00480     assert(samHeader.setRGTag("ID", "rgID1", "rgID") == false);
00481     assert(samHeader.getHeaderString(headerString) == true);
00482     assert(headerString == 
00483            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n");
00484     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00485 
00486     // Verify that the copied header did not change.
00487     assert(newHeader.getHeaderString(headerString) == true);
00488     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00489     // Verify it was added to the parsed header.
00490     assert(strcmp(newHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00491 
00492 
00493     // Add a new RG Tag
00494     assert(samHeader.setRGTag("SM", "sample1", "rgID1") == true);
00495     assert(samHeader.getHeaderString(headerString) == true);
00496     // String does not show the tag until all required fields are there.
00497     assert(headerString ==
00498            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n");
00499     assert(strcmp(samHeader.getRGTagValue("ID", "rgID1"), "rgID1") == 0);
00500     assert(strcmp(samHeader.getRGTagValue("SM", "rgID1"), "sample1") == 0);
00501    
00502     // Modify an RG tag.
00503     assert(samHeader.setRGTag("SM", "sample", "rgID1") == true);
00504     assert(samHeader.getHeaderString(headerString) == true);
00505     assert(headerString == 
00506            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00507     assert(strcmp(samHeader.getRGTagValue("ID", "rgID1"), "rgID1") == 0);
00508     assert(strcmp(samHeader.getRGTagValue("SM", "rgID1"), "sample") == 0);
00509 
00510     // Test removing an rg that does not exist.
00511     assert(samHeader.removeRG("rgID2") == true);
00512     assert(samHeader.getHeaderString(headerString) == true);
00513     assert(headerString == 
00514            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00515    
00516     // Create a new RG, set some values and add it.
00517     SamHeaderRG* rg = new SamHeaderRG();
00518     // Try adding it without a key.
00519     assert(samHeader.addRG(rg) == false);
00520     assert(samHeader.getHeaderString(headerString) == true);
00521     assert(headerString == 
00522            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00523     // Set some values in rg.
00524     assert(rg->setTag("ID", "rgID2") == true);
00525     assert(rg->setTag("SM", "sm2") == true);
00526     assert(samHeader.getHeaderString(headerString) == true);
00527     assert(headerString == 
00528            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00529     // Add the new RG.
00530     assert(samHeader.addRG(rg) == true);
00531     assert(samHeader.getHeaderString(headerString) == true);
00532     assert(headerString == 
00533            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n@RG\tID:rgID2\tSM:sm2\n");
00534     assert(strcmp(samHeader.getRGTagValue("ID", "rgID2"), "rgID2") == 0);
00535 
00536     // Test trying to add another one with the same key.
00537     rg = new SamHeaderRG();
00538     assert(rg->setTag("ID", "rgID2") == true);
00539     assert(samHeader.addRG(rg) == false);
00540     assert(samHeader.getHeaderString(headerString) == true);
00541     assert(headerString == 
00542            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n@RG\tID:rgID2\tSM:sm2\n");
00543 
00544 
00545     // Test removing the rg again.
00546     assert(samHeader.removeRG("rgID2") == true);
00547     assert(samHeader.getHeaderString(headerString) == true);
00548     assert(headerString ==
00549            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00550    
00551     // Test getting an rg tag that doesn't exist
00552     assert(strcmp(samHeader.getRGTagValue("DS", "rgID"), "") == 0);
00553     assert(samHeader.getHeaderString(headerString) == true);
00554     assert(headerString == 
00555            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00556    
00557     // Test getting an rg tag from a removed key
00558     assert(strcmp(samHeader.getRGTagValue("ID", "rgID2"), "") == 0);
00559     assert(samHeader.getHeaderString(headerString) == true);
00560     assert(headerString == 
00561            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00562 
00563     // Test getting an rg tag from an key that doesn't exist
00564     assert(strcmp(samHeader.getRGTagValue("ID", "rgID22"), "") == 0);
00565     assert(samHeader.getHeaderString(headerString) == true);
00566     assert(headerString == 
00567            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00568 
00569     // Test adding a null header.
00570     rg = NULL;
00571     assert(samHeader.addRG(rg) == false);
00572     assert(samHeader.getHeaderString(headerString) == true);
00573     assert(headerString == 
00574            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n");
00575    
00576     // Test adding the deleted header back in.
00577     rg = new SamHeaderRG();
00578     assert(rg->setTag("ID", "rgID2") == true);
00579     assert(rg->setTag("SM", "sm2") == true);
00580     assert(samHeader.addRG(rg) == true);
00581     assert(samHeader.getHeaderString(headerString) == true);
00582     assert(headerString ==
00583            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n@RG\tID:rgID2\tSM:sm2\n");
00584 
00585     // Test adding an RG that is already there.
00586     assert(samHeader.addHeaderLine("@RG\tID:rgID\tSM:sm5") == false);
00587     assert(samHeader.getHeaderString(headerString) == true);
00588     assert(headerString == "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample\n@RG\tID:rgID2\tSM:sm2\n");
00589     // Verify it was added to the parsed header.
00590     assert(strcmp(samHeader.getRGTagValue("SM", "rgID"), "sm1") == 0);
00591 
00592 
00593     // Get an RG record then modify it.
00594     rg = samHeader.getRG("rgID1");
00595     assert(rg != NULL);
00596     assert(rg->setTag("SM", "sample1") == true);
00597     assert(samHeader.getHeaderString(headerString) == true);
00598     assert(headerString == 
00599            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n");
00600    
00601     // Try to modify the key.
00602     assert(rg->setTag("ID", "rgID111") == false);
00603     assert(samHeader.getHeaderString(headerString) == true);
00604     assert(headerString ==
00605            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n");
00606    
00607     ////////////////////////////////////////////////////////////////////////////
00608     // Test getting a comment when there aren't any.
00609     assert(strcmp(samHeader.getNextComment(), "") == 0);
00610     assert(samHeader.getHeaderString(headerString) == true);
00611     assert(headerString ==
00612            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n");
00613 
00614     // Test getting each headerline when there are no comments.
00615     const char* hdrlinechar;
00616     std::string hdrline;
00617     assert(samHeader.getNextHeaderLine(hdrline));
00618     hdrlinechar = hdrline.c_str();
00619     // Test to make sure there is not memory corruption.
00620     std::string tmpString = "@SQ\tSN:queryname\tVN:3.1\n";
00621     assert(hdrline == "@HD\tSO:queryname\tVN:3.1\n");
00622     assert(strcmp(hdrlinechar,
00623                   "@HD\tSO:queryname\tVN:3.1\n") == 0);
00624 
00625     assert(samHeader.getNextHeaderLine(hdrline));
00626     assert(hdrline == "@PG\tID:newID\n");
00627     assert(samHeader.getNextHeaderLine(hdrline));
00628     assert(hdrline == "@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00629     assert(samHeader.getNextHeaderLine(hdrline)); 
00630     assert(hdrline == "@RG\tID:rgID\tSM:sm1\n");
00631     assert(samHeader.getNextHeaderLine(hdrline));
00632     assert(hdrline == "@RG\tID:rgID1\tSM:sample1\n");
00633     assert(samHeader.getNextHeaderLine(hdrline)); 
00634     assert(hdrline == "@RG\tID:rgID2\tSM:sm2\n");
00635     assert(!samHeader.getNextHeaderLine(hdrline));
00636     assert(hdrline == "");
00637     assert(!samHeader.getNextHeaderLine(hdrline));
00638     assert(hdrline == "");
00639     assert(samHeader.getHeaderString(headerString) == true);
00640     assert(headerString ==
00641            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n");
00642 
00643     // Verify that getHeaderRecord returns nothing.
00644     assert(samHeader.getNextHeaderRecord() == NULL);
00645 
00646     // Reset the header record iter.
00647     samHeader.resetHeaderRecordIter();
00648 
00649     // Test getting each headerrecord when there are no comments.
00650     SamHeaderRecord* hdrRec = samHeader.getNextHeaderRecord();
00651     assert(hdrRec != NULL);
00652     assert(strcmp(hdrRec->getTypeString(), "HD") == 0);
00653     assert(hdrRec->getType() == SamHeaderRecord::HD);
00654     assert(strcmp(hdrRec->getTagValue("SO"), "queryname") == 0);
00655     assert(strcmp(hdrRec->getTagValue("VN"), "3.1") == 0);
00656     hdrRec = samHeader.getNextHeaderRecord();
00657     assert(hdrRec != NULL);
00658     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00659     assert(hdrRec->getType() == SamHeaderRecord::PG);
00660     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00661     hdrRec = samHeader.getNextHeaderRecord();
00662     assert(hdrRec != NULL);
00663     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00664     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00665     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00666     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00667     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00668     hdrRec = samHeader.getNextHeaderRecord();
00669     assert(hdrRec != NULL);
00670     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00671     assert(hdrRec->getType() == SamHeaderRecord::RG);
00672     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00673     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00674 
00675     // Get the SQ Header Record (should have no affect on the general
00676     // getNextHeaderRecord calls).
00677     hdrRec = samHeader.getNextSQRecord();
00678     assert(hdrRec != NULL);
00679     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00680     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00681     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00682     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00683     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00684     // Only one SQ Header Record.
00685     hdrRec = samHeader.getNextSQRecord();
00686     assert(hdrRec == NULL);
00687 
00688     // Get the RG/PG Header Records (should have no affect on the general
00689     // getNextHeaderRecord calls).
00690     hdrRec = samHeader.getNextRGRecord();
00691     assert(hdrRec != NULL);
00692     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00693     assert(hdrRec->getType() == SamHeaderRecord::RG);
00694     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00695     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00696     // Get the next RG record.
00697     hdrRec = samHeader.getNextRGRecord();
00698     assert(hdrRec != NULL);
00699     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00700     assert(hdrRec->getType() == SamHeaderRecord::RG);
00701     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00702     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00703     // Get the PG record.
00704     hdrRec = samHeader.getNextPGRecord();
00705     assert(hdrRec != NULL);
00706     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00707     assert(hdrRec->getType() == SamHeaderRecord::PG);
00708     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00709     // Get the last RG record.
00710     hdrRec = samHeader.getNextRGRecord();
00711     assert(hdrRec != NULL);
00712     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00713     assert(hdrRec->getType() == SamHeaderRecord::RG);
00714     assert(strcmp(hdrRec->getTagValue("ID"), "rgID2") == 0);
00715     assert(strcmp(hdrRec->getTagValue("SM"), "sm2") == 0);
00716     // Already got all RG Records.
00717     hdrRec = samHeader.getNextRGRecord();
00718     assert(hdrRec == NULL);
00719     // Reset the RG record.
00720     samHeader.resetRGRecordIter();
00721     // Get the RG record.
00722     hdrRec = samHeader.getNextRGRecord();
00723     assert(hdrRec != NULL);
00724     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00725     assert(hdrRec->getType() == SamHeaderRecord::RG);
00726     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00727     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00728     // No more PG records.
00729     hdrRec = samHeader.getNextPGRecord();
00730     assert(hdrRec == NULL);
00731     // No more SQ records.
00732     hdrRec = samHeader.getNextSQRecord();
00733     assert(hdrRec == NULL);    
00734     // Reset the SQ record iterator.
00735     samHeader.resetSQRecordIter();
00736     // No more PG records.
00737     hdrRec = samHeader.getNextPGRecord();
00738     assert(hdrRec == NULL);
00739     // Get the now reset SQ record.
00740     hdrRec = samHeader.getNextSQRecord();
00741     assert(hdrRec != NULL);
00742     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00743     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00744     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00745     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00746     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00747     // Only one SQ Header Record.
00748     hdrRec = samHeader.getNextSQRecord();
00749     assert(hdrRec == NULL);
00750     // Reset the PG record iterator.
00751     samHeader.resetPGRecordIter();
00752     // No more SQ records.
00753     hdrRec = samHeader.getNextSQRecord();
00754     assert(hdrRec == NULL);    
00755     // Get the next RG record.
00756     hdrRec = samHeader.getNextRGRecord();
00757     assert(hdrRec != NULL);
00758     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00759     assert(hdrRec->getType() == SamHeaderRecord::RG);
00760     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00761     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00762     // Get the PG record.
00763     hdrRec = samHeader.getNextPGRecord();
00764     assert(hdrRec != NULL);
00765     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00766     assert(hdrRec->getType() == SamHeaderRecord::PG);
00767     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00768 
00769 
00770     hdrRec = samHeader.getNextHeaderRecord();
00771     assert(hdrRec != NULL);
00772     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00773     assert(hdrRec->getType() == SamHeaderRecord::RG);
00774     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00775     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00776     hdrRec = samHeader.getNextHeaderRecord();
00777     assert(hdrRec != NULL);
00778     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00779     assert(hdrRec->getType() == SamHeaderRecord::RG);
00780     assert(strcmp(hdrRec->getTagValue("ID"), "rgID2") == 0);
00781     assert(strcmp(hdrRec->getTagValue("SM"), "sm2") == 0);
00782     hdrRec = samHeader.getNextHeaderRecord();
00783     assert(hdrRec == NULL);
00784     hdrRec = samHeader.getNextHeaderRecord();
00785     assert(hdrRec == NULL);
00786     assert(!samHeader.getNextHeaderLine(hdrline));
00787     assert(hdrline == "");
00788     assert(!samHeader.getNextHeaderLine(hdrline));
00789     assert(hdrline == "");
00790 
00791     assert(samHeader.getHeaderString(headerString) == true);
00792     assert(headerString ==
00793            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n");
00794 
00795     // Add some comments.
00796     assert(samHeader.addComment("My Comment") == true);
00797     assert(samHeader.getHeaderString(headerString) == true);
00798     assert(headerString ==
00799            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n@CO\tMy Comment\n");
00800 
00801     // Call getNextHeaderRecord - still nothing.
00802     hdrRec = samHeader.getNextHeaderRecord();
00803     assert(hdrRec == NULL);   
00804 
00805     // Call getNextHeaderLine - should return the comment.
00806     assert(samHeader.getNextHeaderLine(hdrline));
00807     assert(hdrline == "@CO\tMy Comment\n");
00808     assert(!samHeader.getNextHeaderLine(hdrline));
00809     assert(hdrline == "");
00810     assert(!samHeader.getNextHeaderLine(hdrline));
00811     assert(hdrline == "");
00812 
00813     // Call getNextCommentLine - should return the comment.
00814     assert(strcmp(samHeader.getNextComment(), "My Comment") == 0);
00815     assert(strcmp(samHeader.getNextComment(), "") == 0);
00816     assert(strcmp(samHeader.getNextComment(), "") == 0);
00817 
00818     // Add another comment.
00819     assert(samHeader.addComment("My Comment2") == true);
00820     assert(samHeader.getHeaderString(headerString) == true);
00821     assert(headerString ==
00822            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n@CO\tMy Comment\n@CO\tMy Comment2\n");
00823 
00824     newHeader = samHeader;
00825     assert(newHeader.getHeaderString(headerString) == true);
00826     assert(headerString ==
00827            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n@CO\tMy Comment\n@CO\tMy Comment2\n");
00828 
00829     // Call getNextHeaderLine - should return the comment.
00830     assert(samHeader.getNextHeaderLine(hdrline));
00831     assert(hdrline == "@CO\tMy Comment2\n");
00832     assert(!samHeader.getNextHeaderLine(hdrline));
00833     assert(hdrline == "");
00834     assert(!samHeader.getNextHeaderLine(hdrline));
00835     assert(hdrline == "");
00836 
00837     // Call getNextCommentLine - should return the comment.
00838     assert(strcmp(samHeader.getNextComment(), "My Comment2") == 0);
00839     assert(strcmp(samHeader.getNextComment(), "") == 0);
00840     assert(strcmp(samHeader.getNextComment(), "") == 0);
00841 
00842     // Reset the header record iter.
00843     samHeader.resetHeaderRecordIter();
00844    
00845     // Recall getNextCommentLine - should not return anything.
00846     assert(strcmp(samHeader.getNextComment(), "") == 0);
00847     assert(strcmp(samHeader.getNextComment(), "") == 0);   
00848 
00849     // Reset the next comment iter.
00850     samHeader.resetCommentIter();
00851 
00852     // Call the get next headerLine, record, comment interspersed with
00853     // each other.
00854     hdrRec = samHeader.getNextHeaderRecord();
00855     assert(hdrRec != NULL);
00856     assert(strcmp(hdrRec->getTypeString(), "HD") == 0);
00857     assert(hdrRec->getType() == SamHeaderRecord::HD);
00858     assert(strcmp(hdrRec->getTagValue("SO"), "queryname") == 0);
00859     assert(strcmp(hdrRec->getTagValue("VN"), "3.1") == 0);
00860     assert(samHeader.getNextHeaderLine(hdrline));
00861     assert(hdrline == "@PG\tID:newID\n");
00862     assert(samHeader.getNextHeaderLine(hdrline)); 
00863     assert(hdrline == "@SQ\tSN:newName\tAS:HG18\tLN:111\n");   
00864     hdrRec = samHeader.getNextHeaderRecord();
00865     assert(hdrRec != NULL);
00866     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00867     assert(hdrRec->getType() == SamHeaderRecord::RG);
00868     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00869     hdrRec = samHeader.getNextHeaderRecord();
00870     assert(hdrRec != NULL);
00871     assert(strcmp(samHeader.getNextComment(), "My Comment") == 0);
00872     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00873     assert(hdrRec->getType() == SamHeaderRecord::RG);
00874     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00875     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00876     assert(samHeader.getNextHeaderLine(hdrline));
00877     assert(hdrline == "@RG\tID:rgID2\tSM:sm2\n");
00878     hdrRec = samHeader.getNextHeaderRecord();
00879     assert(hdrRec == NULL);
00880     assert(samHeader.getNextHeaderLine(hdrline));
00881     assert(hdrline == "@CO\tMy Comment\n");
00882     hdrRec = samHeader.getNextHeaderRecord();
00883     assert(hdrRec == NULL);
00884     assert(samHeader.getNextHeaderLine(hdrline));
00885     assert(hdrline == "@CO\tMy Comment2\n");
00886     assert(!samHeader.getNextHeaderLine(hdrline));
00887     assert(hdrline == "");
00888     assert(strcmp(samHeader.getNextComment(), "My Comment2") == 0);
00889     assert(!samHeader.getNextHeaderLine(hdrline));
00890     assert(hdrline == "");
00891     hdrRec = samHeader.getNextHeaderRecord();
00892     assert(hdrRec == NULL);
00893     assert(strcmp(samHeader.getNextComment(), "") == 0);
00894     assert(strcmp(samHeader.getNextComment(), "") == 0);
00895 
00896     samOut.WriteHeader(samHeader);
00897 
00898     // Reset the header.
00899     samHeader.resetHeader();
00900     assert(samHeader.getHeaderString(headerString) == true);
00901     assert(headerString == "");
00902     assert(!samHeader.getNextHeaderLine(hdrline)); 
00903     assert(hdrline == "");
00904     assert(strcmp(samHeader.getHDTagValue("SO"), "") == 0);
00905     assert(strcmp(samHeader.getHDTagValue("VN"), "") == 0);
00906 
00907     // Try adding a key to the HD tag.
00908     hd = new SamHeaderHD();
00909     assert(hd->addKey("3.1") == false);
00910     assert(strcmp(hd->getTagValue("VN"), "") == 0);
00911     assert(hd->isActiveHeaderRecord() == false);
00912 
00913     assert(hd->setTag("VN", "3.1") == true);
00914     assert(hd->isActiveHeaderRecord() == true);
00915     assert(strcmp(hd->getTagValue("VN"), "3.1") == 0);
00916 
00917     // Verify the copied header did not change.
00918     assert(newHeader.getHeaderString(headerString) == true);
00919     assert(headerString ==
00920            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n@RG\tID:rgID\tSM:sm1\n@RG\tID:rgID1\tSM:sample1\n@RG\tID:rgID2\tSM:sm2\n@CO\tMy Comment\n@CO\tMy Comment2\n");
00921     // Verify it was added to the parsed header.
00922     assert(strcmp(newHeader.getSQTagValue("LN", "chr20"), "") == 0);
00923 }
00924 
00925 
00926 void testWriteCopiedHeader()
00927 {
00928     SamFile samIn;
00929     assert(samIn.OpenForRead("testFiles/testBam.bam"));
00930 
00931     SamFile samOut;
00932     assert(samOut.OpenForWrite("results/MyTestOut2.bam"));
00933     SamFile samOut2;
00934     assert(samOut2.OpenForWrite("results/MyTestOut2.sam"));
00935 
00936     // Read the sam header.
00937     SamFileHeader samHeader;
00938     assert(samIn.ReadHeader(samHeader));
00939     validateHeader(samHeader);
00940 
00941     SamFileHeader newHeader;
00942 
00943     std::string hdrLine;
00944     assert(samHeader.getNextHeaderLine(hdrLine));
00945     newHeader.addHeaderLine("@HD\tVN:1.02");
00946     bool hdrStatus = true;
00947     while(hdrStatus)
00948     {
00949         newHeader.addHeaderLine(hdrLine.c_str());
00950         hdrStatus = samHeader.getNextHeaderLine(hdrLine);
00951     }
00952 
00953     // Write the sam header.
00954     assert(samOut.WriteHeader(newHeader));
00955     assert(samOut2.WriteHeader(newHeader));
00956 
00957     SamRecord samRecord;
00958 
00959     // Keep reading records until ReadRecord returns false.
00960     while(samIn.ReadRecord(samHeader, samRecord))
00961     {
00962         // Successfully read a record from the file, so write it.
00963         assert(samOut.WriteRecord(newHeader, samRecord));
00964         assert(samOut2.WriteRecord(newHeader, samRecord));
00965     }
00966 
00967     assert(samIn.GetStatus() == SamStatus::NO_MORE_RECS);
00968 
00969     // Close the output files.
00970     samOut.Close();
00971     samOut2.Close();
00972 
00973     SamFileReader bamRead("results/MyTestOut2.bam");
00974     SamFileReader samRead("results/MyTestOut2.sam");
00975     
00976     // Read and check the header.
00977     assert(samRead.ReadHeader(samHeader));
00978     validateHeaderFields(samHeader);
00979     std::string headerString = "";
00980     assert(samHeader.getHeaderString(headerString) == true);
00981     assert(headerString == "@HD\tVN:1.02\n@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\tLB:library2\n@CO\tComment 1\n@CO\tComment 2\n");
00982     
00983     assert(bamRead.ReadHeader(samHeader));
00984     validateHeaderFields(samHeader);
00985     headerString = "";
00986     assert(samHeader.getHeaderString(headerString) == true);
00987     assert(headerString == "@HD\tVN:1.02\n@SQ\tSN:1\tLN:247249719\n@SQ\tSN:2\tLN:242951149\n@SQ\tSN:3\tLN:199501827\n@SQ\tSN:4\tLN:191273063\n@SQ\tSN:5\tLN:180857866\n@SQ\tSN:6\tLN:170899992\n@SQ\tSN:7\tLN:158821424\n@SQ\tSN:8\tLN:146274826\n@SQ\tSN:9\tLN:140273252\n@SQ\tSN:10\tLN:135374737\n@SQ\tSN:11\tLN:134452384\n@SQ\tSN:12\tLN:132349534\n@SQ\tSN:13\tLN:114142980\n@SQ\tSN:14\tLN:106368585\n@SQ\tSN:15\tLN:100338915\n@SQ\tSN:16\tLN:88827254\n@SQ\tSN:17\tLN:78774742\n@SQ\tSN:18\tLN:76117153\n@SQ\tSN:19\tLN:63811651\n@SQ\tSN:20\tLN:62435964\n@SQ\tSN:21\tLN:46944323\n@SQ\tSN:22\tLN:49691432\n@SQ\tSN:X\tLN:154913754\n@RG\tID:myID\tLB:library\tSM:sample\n@RG\tID:myID2\tSM:sample2\tLB:library2\n@CO\tComment 1\n@CO\tComment 2\n");
00988     
00989     assert(samHeader.getNextHeaderLine(hdrLine));
00990     std::string expectedString = "@HD\tVN:1.02\n";
00991 
00992     assert(expectedString == hdrLine);
00993     
00994 
00995     // TODO - validate reading these written records back in.
00996 
00997 }
00998 
Generated on Wed Nov 17 15:38:28 2010 for StatGen Software by  doxygen 1.6.3