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     // Add an SQ.
00433     assert(samHeader.setSQTag("AS", "HG18", "newName") == true);
00434     assert(samHeader.getHeaderString(headerString) == true);
00435     // SQ does not show up since it is missing the LN field.
00436     assert(headerString == 
00437            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00438     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00439     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00440     // Add the SQ's SN
00441     assert(samHeader.setSQTag("SN", "newName", "newName") == true);
00442     assert(samHeader.getHeaderString(headerString) == true);
00443     // SQ does not show up since it is missing the LN field.
00444     assert(headerString == 
00445            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n");
00446     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00447     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00448     // Get the SQ.
00449     sq = samHeader.getSQ("newName");
00450     assert(sq != NULL);
00451     // Modify the SQ
00452     assert(sq->setTag("LN", "111") == true);
00453     assert(strcmp(samHeader.getSQTagValue("SN", "newName"), "newName") == 0);
00454     assert(strcmp(samHeader.getSQTagValue("AS", "newName"), "HG18") == 0);
00455     assert(strcmp(samHeader.getSQTagValue("LN", "newName"), "111") == 0);
00456     assert(samHeader.getHeaderString(headerString) == true);
00457     assert(headerString == 
00458            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00459 
00460     //////////////////////////////////////////////////////////////////////
00461     // Add a new RG Tag
00462     assert(samHeader.setRGTag("ID", "rgID", "rgID") == true);
00463     assert(samHeader.getHeaderString(headerString) == true);
00464     // New RG does not show up since it is still missing a required field.
00465     assert(headerString == 
00466            "@HD\tSO:queryname\tVN:3.1\n@PG\tID:newID\n@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00467     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00468    
00469     // Add the missing SM field.
00470     assert(samHeader.setRGTag("SM", "sm1", "rgID") == true);
00471     assert(samHeader.getHeaderString(headerString) == true);
00472     assert(headerString == 
00473            "@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");
00474     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00475    
00476     // Verify can't modify the key.
00477     assert(samHeader.setRGTag("ID", "rgID1", "rgID") == false);
00478     assert(samHeader.getHeaderString(headerString) == true);
00479     assert(headerString == 
00480            "@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");
00481     assert(strcmp(samHeader.getRGTagValue("ID", "rgID"), "rgID") == 0);
00482 
00483     // Verify that the copied header did not change.
00484     assert(newHeader.getHeaderString(headerString) == true);
00485     assert(headerString == "@HD\tVN:1.0\n@SQ\tLN:123\tSN:chr20\n");
00486     // Verify it was added to the parsed header.
00487     assert(strcmp(newHeader.getSQTagValue("LN", "chr20"), "123") == 0);
00488 
00489     // Add a new RG Tag
00490     assert(samHeader.setRGTag("SM", "sample1", "rgID1") == true);
00491     assert(samHeader.getHeaderString(headerString) == true);
00492     // String does not show the tag until all required fields are there.
00493     assert(headerString ==
00494            "@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");
00495     assert(strcmp(samHeader.getRGTagValue("ID", "rgID1"), "rgID1") == 0);
00496     assert(strcmp(samHeader.getRGTagValue("SM", "rgID1"), "sample1") == 0);
00497    
00498     // Modify an RG tag.
00499     assert(samHeader.setRGTag("SM", "sample", "rgID1") == true);
00500     assert(samHeader.getHeaderString(headerString) == true);
00501     assert(headerString == 
00502            "@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");
00503     assert(strcmp(samHeader.getRGTagValue("ID", "rgID1"), "rgID1") == 0);
00504     assert(strcmp(samHeader.getRGTagValue("SM", "rgID1"), "sample") == 0);
00505 
00506     // Test removing an rg that does not exist.
00507     assert(samHeader.removeRG("rgID2") == true);
00508     assert(samHeader.getHeaderString(headerString) == true);
00509     assert(headerString == 
00510            "@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");
00511    
00512     // Create a new RG, set some values and add it.
00513     SamHeaderRG* rg = new SamHeaderRG();
00514     // Try adding it without a key.
00515     assert(samHeader.addRG(rg) == false);
00516     assert(samHeader.getHeaderString(headerString) == true);
00517     assert(headerString == 
00518            "@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");
00519     // Set some values in rg.
00520     assert(rg->setTag("ID", "rgID2") == true);
00521     assert(rg->setTag("SM", "sm2") == true);
00522     assert(samHeader.getHeaderString(headerString) == true);
00523     assert(headerString == 
00524            "@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");
00525     // Add the new RG.
00526     assert(samHeader.addRG(rg) == true);
00527     assert(samHeader.getHeaderString(headerString) == true);
00528     assert(headerString == 
00529            "@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");
00530     assert(strcmp(samHeader.getRGTagValue("ID", "rgID2"), "rgID2") == 0);
00531 
00532     // Test trying to add another one with the same key.
00533     rg = new SamHeaderRG();
00534     assert(rg->setTag("ID", "rgID2") == true);
00535     assert(samHeader.addRG(rg) == false);
00536     assert(samHeader.getHeaderString(headerString) == true);
00537     assert(headerString == 
00538            "@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");
00539 
00540 
00541     // Test removing the rg again.
00542     assert(samHeader.removeRG("rgID2") == true);
00543     assert(samHeader.getHeaderString(headerString) == true);
00544     assert(headerString ==
00545            "@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");
00546    
00547     // Test getting an rg tag that doesn't exist
00548     assert(strcmp(samHeader.getRGTagValue("DS", "rgID"), "") == 0);
00549     assert(samHeader.getHeaderString(headerString) == true);
00550     assert(headerString == 
00551            "@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");
00552    
00553     // Test getting an rg tag from a removed key
00554     assert(strcmp(samHeader.getRGTagValue("ID", "rgID2"), "") == 0);
00555     assert(samHeader.getHeaderString(headerString) == true);
00556     assert(headerString == 
00557            "@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");
00558 
00559     // Test getting an rg tag from an key that doesn't exist
00560     assert(strcmp(samHeader.getRGTagValue("ID", "rgID22"), "") == 0);
00561     assert(samHeader.getHeaderString(headerString) == true);
00562     assert(headerString == 
00563            "@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");
00564 
00565     // Test adding a null header.
00566     rg = NULL;
00567     assert(samHeader.addRG(rg) == false);
00568     assert(samHeader.getHeaderString(headerString) == true);
00569     assert(headerString == 
00570            "@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");
00571    
00572     // Test adding the deleted header back in.
00573     rg = new SamHeaderRG();
00574     assert(rg->setTag("ID", "rgID2") == true);
00575     assert(rg->setTag("SM", "sm2") == true);
00576     assert(samHeader.addRG(rg) == true);
00577     assert(samHeader.getHeaderString(headerString) == true);
00578     assert(headerString ==
00579            "@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");
00580 
00581     // Test adding an RG that is already there.
00582     assert(samHeader.addHeaderLine("@RG\tID:rgID\tSM:sm5") == false);
00583     assert(samHeader.getHeaderString(headerString) == true);
00584     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");
00585     // Verify it was added to the parsed header.
00586     assert(strcmp(samHeader.getRGTagValue("SM", "rgID"), "sm1") == 0);
00587 
00588 
00589     // Get an RG record then modify it.
00590     rg = samHeader.getRG("rgID1");
00591     assert(rg != NULL);
00592     assert(rg->setTag("SM", "sample1") == true);
00593     assert(samHeader.getHeaderString(headerString) == true);
00594     assert(headerString == 
00595            "@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");
00596    
00597     // Try to modify the key.
00598     assert(rg->setTag("ID", "rgID111") == false);
00599     assert(samHeader.getHeaderString(headerString) == true);
00600     assert(headerString ==
00601            "@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");
00602    
00603     ////////////////////////////////////////////////////////////////////////////
00604     // Test getting a comment when there aren't any.
00605     assert(strcmp(samHeader.getNextComment(), "") == 0);
00606     assert(samHeader.getHeaderString(headerString) == true);
00607     assert(headerString ==
00608            "@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");
00609 
00610     // Test getting each headerline when there are no comments.
00611     const char* hdrlinechar;
00612     std::string hdrline;
00613     assert(samHeader.getNextHeaderLine(hdrline));
00614     hdrlinechar = hdrline.c_str();
00615     // Test to make sure there is not memory corruption.
00616     std::string tmpString = "@SQ\tSN:queryname\tVN:3.1\n";
00617     assert(hdrline == "@HD\tSO:queryname\tVN:3.1\n");
00618     assert(strcmp(hdrlinechar,
00619                   "@HD\tSO:queryname\tVN:3.1\n") == 0);
00620 
00621     assert(samHeader.getNextHeaderLine(hdrline));
00622     assert(hdrline == "@PG\tID:newID\n");
00623     assert(samHeader.getNextHeaderLine(hdrline));
00624     assert(hdrline == "@SQ\tSN:newName\tAS:HG18\tLN:111\n");
00625     assert(samHeader.getNextHeaderLine(hdrline)); 
00626     assert(hdrline == "@RG\tID:rgID\tSM:sm1\n");
00627     assert(samHeader.getNextHeaderLine(hdrline));
00628     assert(hdrline == "@RG\tID:rgID1\tSM:sample1\n");
00629     assert(samHeader.getNextHeaderLine(hdrline)); 
00630     assert(hdrline == "@RG\tID:rgID2\tSM:sm2\n");
00631     assert(!samHeader.getNextHeaderLine(hdrline));
00632     assert(hdrline == "");
00633     assert(!samHeader.getNextHeaderLine(hdrline));
00634     assert(hdrline == "");
00635     assert(samHeader.getHeaderString(headerString) == true);
00636     assert(headerString ==
00637            "@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");
00638 
00639     // Verify that getHeaderRecord returns nothing.
00640     assert(samHeader.getNextHeaderRecord() == NULL);
00641 
00642     // Reset the header record iter.
00643     samHeader.resetHeaderRecordIter();
00644 
00645     // Test getting each headerrecord when there are no comments.
00646     SamHeaderRecord* hdrRec = samHeader.getNextHeaderRecord();
00647     assert(hdrRec != NULL);
00648     assert(strcmp(hdrRec->getTypeString(), "HD") == 0);
00649     assert(hdrRec->getType() == SamHeaderRecord::HD);
00650     assert(strcmp(hdrRec->getTagValue("SO"), "queryname") == 0);
00651     assert(strcmp(hdrRec->getTagValue("VN"), "3.1") == 0);
00652     hdrRec = samHeader.getNextHeaderRecord();
00653     assert(hdrRec != NULL);
00654     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00655     assert(hdrRec->getType() == SamHeaderRecord::PG);
00656     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00657     hdrRec = samHeader.getNextHeaderRecord();
00658     assert(hdrRec != NULL);
00659     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00660     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00661     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00662     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00663     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00664     hdrRec = samHeader.getNextHeaderRecord();
00665     assert(hdrRec != NULL);
00666     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00667     assert(hdrRec->getType() == SamHeaderRecord::RG);
00668     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00669     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00670 
00671     // Get the SQ Header Record (should have no affect on the general
00672     // getNextHeaderRecord calls).
00673     hdrRec = samHeader.getNextSQRecord();
00674     assert(hdrRec != NULL);
00675     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00676     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00677     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00678     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00679     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00680     // Only one SQ Header Record.
00681     hdrRec = samHeader.getNextSQRecord();
00682     assert(hdrRec == NULL);
00683 
00684     // Get the RG/PG Header Records (should have no affect on the general
00685     // getNextHeaderRecord calls).
00686     hdrRec = samHeader.getNextRGRecord();
00687     assert(hdrRec != NULL);
00688     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00689     assert(hdrRec->getType() == SamHeaderRecord::RG);
00690     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00691     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00692     // Get the next RG record.
00693     hdrRec = samHeader.getNextRGRecord();
00694     assert(hdrRec != NULL);
00695     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00696     assert(hdrRec->getType() == SamHeaderRecord::RG);
00697     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00698     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00699     // Get the PG record.
00700     hdrRec = samHeader.getNextPGRecord();
00701     assert(hdrRec != NULL);
00702     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00703     assert(hdrRec->getType() == SamHeaderRecord::PG);
00704     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00705     // Get the last RG record.
00706     hdrRec = samHeader.getNextRGRecord();
00707     assert(hdrRec != NULL);
00708     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00709     assert(hdrRec->getType() == SamHeaderRecord::RG);
00710     assert(strcmp(hdrRec->getTagValue("ID"), "rgID2") == 0);
00711     assert(strcmp(hdrRec->getTagValue("SM"), "sm2") == 0);
00712     // Already got all RG Records.
00713     hdrRec = samHeader.getNextRGRecord();
00714     assert(hdrRec == NULL);
00715     // Reset the RG record.
00716     samHeader.resetRGRecordIter();
00717     // Get the RG record.
00718     hdrRec = samHeader.getNextRGRecord();
00719     assert(hdrRec != NULL);
00720     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00721     assert(hdrRec->getType() == SamHeaderRecord::RG);
00722     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00723     assert(strcmp(hdrRec->getTagValue("SM"), "sm1") == 0);
00724     // No more PG records.
00725     hdrRec = samHeader.getNextPGRecord();
00726     assert(hdrRec == NULL);
00727     // No more SQ records.
00728     hdrRec = samHeader.getNextSQRecord();
00729     assert(hdrRec == NULL);    
00730     // Reset the SQ record iterator.
00731     samHeader.resetSQRecordIter();
00732     // No more PG records.
00733     hdrRec = samHeader.getNextPGRecord();
00734     assert(hdrRec == NULL);
00735     // Get the now reset SQ record.
00736     hdrRec = samHeader.getNextSQRecord();
00737     assert(hdrRec != NULL);
00738     assert(strcmp(hdrRec->getTypeString(), "SQ") == 0);
00739     assert(hdrRec->getType() == SamHeaderRecord::SQ);
00740     assert(strcmp(hdrRec->getTagValue("SN"), "newName") == 0);
00741     assert(strcmp(hdrRec->getTagValue("AS"), "HG18") == 0);
00742     assert(strcmp(hdrRec->getTagValue("LN"), "111") == 0);
00743     // Only one SQ Header Record.
00744     hdrRec = samHeader.getNextSQRecord();
00745     assert(hdrRec == NULL);
00746     // Reset the PG record iterator.
00747     samHeader.resetPGRecordIter();
00748     // No more SQ records.
00749     hdrRec = samHeader.getNextSQRecord();
00750     assert(hdrRec == NULL);    
00751     // Get the next RG record.
00752     hdrRec = samHeader.getNextRGRecord();
00753     assert(hdrRec != NULL);
00754     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00755     assert(hdrRec->getType() == SamHeaderRecord::RG);
00756     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00757     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00758     // Get the PG record.
00759     hdrRec = samHeader.getNextPGRecord();
00760     assert(hdrRec != NULL);
00761     assert(strcmp(hdrRec->getTypeString(), "PG") == 0);
00762     assert(hdrRec->getType() == SamHeaderRecord::PG);
00763     assert(strcmp(hdrRec->getTagValue("ID"), "newID") == 0);
00764 
00765 
00766     hdrRec = samHeader.getNextHeaderRecord();
00767     assert(hdrRec != NULL);
00768     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00769     assert(hdrRec->getType() == SamHeaderRecord::RG);
00770     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00771     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00772     hdrRec = samHeader.getNextHeaderRecord();
00773     assert(hdrRec != NULL);
00774     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00775     assert(hdrRec->getType() == SamHeaderRecord::RG);
00776     assert(strcmp(hdrRec->getTagValue("ID"), "rgID2") == 0);
00777     assert(strcmp(hdrRec->getTagValue("SM"), "sm2") == 0);
00778     hdrRec = samHeader.getNextHeaderRecord();
00779     assert(hdrRec == NULL);
00780     hdrRec = samHeader.getNextHeaderRecord();
00781     assert(hdrRec == NULL);
00782     assert(!samHeader.getNextHeaderLine(hdrline));
00783     assert(hdrline == "");
00784     assert(!samHeader.getNextHeaderLine(hdrline));
00785     assert(hdrline == "");
00786 
00787     assert(samHeader.getHeaderString(headerString) == true);
00788     assert(headerString ==
00789            "@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");
00790 
00791     // Add some comments.
00792     assert(samHeader.addComment("My Comment") == true);
00793     assert(samHeader.getHeaderString(headerString) == true);
00794     assert(headerString ==
00795            "@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");
00796 
00797     // Call getNextHeaderRecord - still nothing.
00798     hdrRec = samHeader.getNextHeaderRecord();
00799     assert(hdrRec == NULL);   
00800 
00801     // Call getNextHeaderLine - should return the comment.
00802     assert(samHeader.getNextHeaderLine(hdrline));
00803     assert(hdrline == "@CO\tMy Comment\n");
00804     assert(!samHeader.getNextHeaderLine(hdrline));
00805     assert(hdrline == "");
00806     assert(!samHeader.getNextHeaderLine(hdrline));
00807     assert(hdrline == "");
00808 
00809     // Call getNextCommentLine - should return the comment.
00810     assert(strcmp(samHeader.getNextComment(), "My Comment") == 0);
00811     assert(strcmp(samHeader.getNextComment(), "") == 0);
00812     assert(strcmp(samHeader.getNextComment(), "") == 0);
00813 
00814     // Add another comment.
00815     assert(samHeader.addComment("My Comment2") == true);
00816     assert(samHeader.getHeaderString(headerString) == true);
00817     assert(headerString ==
00818            "@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");
00819 
00820     newHeader = samHeader;
00821     assert(newHeader.getHeaderString(headerString) == true);
00822     assert(headerString ==
00823            "@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");
00824 
00825     // Call getNextHeaderLine - should return the comment.
00826     assert(samHeader.getNextHeaderLine(hdrline));
00827     assert(hdrline == "@CO\tMy Comment2\n");
00828     assert(!samHeader.getNextHeaderLine(hdrline));
00829     assert(hdrline == "");
00830     assert(!samHeader.getNextHeaderLine(hdrline));
00831     assert(hdrline == "");
00832 
00833     // Call getNextCommentLine - should return the comment.
00834     assert(strcmp(samHeader.getNextComment(), "My Comment2") == 0);
00835     assert(strcmp(samHeader.getNextComment(), "") == 0);
00836     assert(strcmp(samHeader.getNextComment(), "") == 0);
00837 
00838     // Reset the header record iter.
00839     samHeader.resetHeaderRecordIter();
00840    
00841     // Recall getNextCommentLine - should not return anything.
00842     assert(strcmp(samHeader.getNextComment(), "") == 0);
00843     assert(strcmp(samHeader.getNextComment(), "") == 0);   
00844 
00845     // Reset the next comment iter.
00846     samHeader.resetCommentIter();
00847 
00848     // Call the get next headerLine, record, comment interspersed with
00849     // each other.
00850     hdrRec = samHeader.getNextHeaderRecord();
00851     assert(hdrRec != NULL);
00852     assert(strcmp(hdrRec->getTypeString(), "HD") == 0);
00853     assert(hdrRec->getType() == SamHeaderRecord::HD);
00854     assert(strcmp(hdrRec->getTagValue("SO"), "queryname") == 0);
00855     assert(strcmp(hdrRec->getTagValue("VN"), "3.1") == 0);
00856     assert(samHeader.getNextHeaderLine(hdrline));
00857     assert(hdrline == "@PG\tID:newID\n");
00858     assert(samHeader.getNextHeaderLine(hdrline)); 
00859     assert(hdrline == "@SQ\tSN:newName\tAS:HG18\tLN:111\n");   
00860     hdrRec = samHeader.getNextHeaderRecord();
00861     assert(hdrRec != NULL);
00862     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00863     assert(hdrRec->getType() == SamHeaderRecord::RG);
00864     assert(strcmp(hdrRec->getTagValue("ID"), "rgID") == 0);
00865     hdrRec = samHeader.getNextHeaderRecord();
00866     assert(hdrRec != NULL);
00867     assert(strcmp(samHeader.getNextComment(), "My Comment") == 0);
00868     assert(strcmp(hdrRec->getTypeString(), "RG") == 0);
00869     assert(hdrRec->getType() == SamHeaderRecord::RG);
00870     assert(strcmp(hdrRec->getTagValue("ID"), "rgID1") == 0);
00871     assert(strcmp(hdrRec->getTagValue("SM"), "sample1") == 0);
00872     assert(samHeader.getNextHeaderLine(hdrline));
00873     assert(hdrline == "@RG\tID:rgID2\tSM:sm2\n");
00874     hdrRec = samHeader.getNextHeaderRecord();
00875     assert(hdrRec == NULL);
00876     assert(samHeader.getNextHeaderLine(hdrline));
00877     assert(hdrline == "@CO\tMy Comment\n");
00878     hdrRec = samHeader.getNextHeaderRecord();
00879     assert(hdrRec == NULL);
00880     assert(samHeader.getNextHeaderLine(hdrline));
00881     assert(hdrline == "@CO\tMy Comment2\n");
00882     assert(!samHeader.getNextHeaderLine(hdrline));
00883     assert(hdrline == "");
00884     assert(strcmp(samHeader.getNextComment(), "My Comment2") == 0);
00885     assert(!samHeader.getNextHeaderLine(hdrline));
00886     assert(hdrline == "");
00887     hdrRec = samHeader.getNextHeaderRecord();
00888     assert(hdrRec == NULL);
00889     assert(strcmp(samHeader.getNextComment(), "") == 0);
00890     assert(strcmp(samHeader.getNextComment(), "") == 0);
00891 
00892     samOut.WriteHeader(samHeader);
00893 
00894     // Reset the header.
00895     samHeader.resetHeader();
00896     assert(samHeader.getHeaderString(headerString) == true);
00897     assert(headerString == "");
00898     assert(!samHeader.getNextHeaderLine(hdrline)); 
00899     assert(hdrline == "");
00900     assert(strcmp(samHeader.getHDTagValue("SO"), "") == 0);
00901     assert(strcmp(samHeader.getHDTagValue("VN"), "") == 0);
00902 
00903     // Try adding a key to the HD tag.
00904     hd = new SamHeaderHD();
00905     assert(hd->addKey("3.1") == false);
00906     assert(strcmp(hd->getTagValue("VN"), "") == 0);
00907     assert(hd->isActiveHeaderRecord() == false);
00908 
00909     assert(hd->setTag("VN", "3.1") == true);
00910     assert(hd->isActiveHeaderRecord() == true);
00911     assert(strcmp(hd->getTagValue("VN"), "3.1") == 0);
00912 
00913     // Verify the copied header did not change.
00914     assert(newHeader.getHeaderString(headerString) == true);
00915     assert(headerString ==
00916            "@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");
00917     // Verify it was added to the parsed header.
00918     assert(strcmp(newHeader.getSQTagValue("LN", "chr20"), "") == 0);
00919 }
00920 
00921 
00922 void testWriteCopiedHeader()
00923 {
00924     SamFile samIn;
00925     assert(samIn.OpenForRead("testFiles/testBam.bam"));
00926 
00927     SamFile samOut;
00928     assert(samOut.OpenForWrite("results/MyTestOut2.bam"));
00929     SamFile samOut2;
00930     assert(samOut2.OpenForWrite("results/MyTestOut2.sam"));
00931 
00932     // Read the sam header.
00933     SamFileHeader samHeader;
00934     assert(samIn.ReadHeader(samHeader));
00935     validateHeader(samHeader);
00936 
00937     SamFileHeader newHeader;
00938 
00939     std::string hdrLine;
00940     assert(samHeader.getNextHeaderLine(hdrLine));
00941     newHeader.addHeaderLine("@HD\tVN:1.02");
00942     bool hdrStatus = true;
00943     while(hdrStatus)
00944     {
00945         newHeader.addHeaderLine(hdrLine.c_str());
00946         hdrStatus = samHeader.getNextHeaderLine(hdrLine);
00947     }
00948 
00949     // Write the sam header.
00950     assert(samOut.WriteHeader(newHeader));
00951     assert(samOut2.WriteHeader(newHeader));
00952 
00953     SamRecord samRecord;
00954 
00955     // Keep reading records until ReadRecord returns false.
00956     while(samIn.ReadRecord(samHeader, samRecord))
00957     {
00958         // Successfully read a record from the file, so write it.
00959         assert(samOut.WriteRecord(newHeader, samRecord));
00960         assert(samOut2.WriteRecord(newHeader, samRecord));
00961     }
00962 
00963     assert(samIn.GetStatus() == SamStatus::NO_MORE_RECS);
00964 
00965     // Close the output files.
00966     samOut.Close();
00967     samOut2.Close();
00968 
00969     SamFileReader bamRead("results/MyTestOut2.bam");
00970     SamFileReader samRead("results/MyTestOut2.sam");
00971     
00972     // Read and check the header.
00973     assert(samRead.ReadHeader(samHeader));
00974     validateHeaderFields(samHeader);
00975     std::string headerString = "";
00976     assert(samHeader.getHeaderString(headerString) == true);
00977     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");
00978     
00979     assert(bamRead.ReadHeader(samHeader));
00980     validateHeaderFields(samHeader);
00981     headerString = "";
00982     assert(samHeader.getHeaderString(headerString) == true);
00983     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");
00984     
00985     assert(samHeader.getNextHeaderLine(hdrLine));
00986     std::string expectedString = "@HD\tVN:1.02\n";
00987 
00988     assert(expectedString == hdrLine);
00989     
00990 
00991     // TODO - validate reading these written records back in.
00992 
00993 }
00994 
Generated on Tue Aug 23 18:19:04 2011 for libStatGen Software by  doxygen 1.6.3