00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "Validate.h"
00019 #include "BaseUtilities.h"
00020
00021 const std::string Validate::READ1_CIGAR = "5M2D";
00022 const std::string Validate::READ1_SEQ = "CCGAA";
00023 const std::string Validate::READ1_QUAL = "6>6+4";
00024
00025 const std::string Validate::READ6_CIGAR = "3S2H5M";
00026 const std::string Validate::READ6_SEQ = "TGCACGTN";
00027 const std::string Validate::READ6_QUAL = "453;>>>>";
00028
00029 const std::string Validate::READ7_CIGAR = "3S5M1S3H";
00030 const std::string Validate::READ7_SEQ = "TGCACGTNG";
00031 const std::string Validate::READ7_QUAL = "453;>>>>5";
00032
00033 void validateRead1(SamRecord& samRecord)
00034 {
00035
00036
00037
00038 int expectedBlockSize = 89;
00039 const char* expectedReferenceName = "1";
00040 const char* expectedMateReferenceName = "1";
00041 const char* expectedMateReferenceNameOrEqual = "=";
00042
00043 bamRecordStruct* expectedRecordPtr =
00044 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
00045
00046 char tag[3];
00047 char type;
00048 void* value;
00049 const bamRecordStruct* bufferPtr;
00050 unsigned char* varPtr;
00051
00052 expectedRecordPtr->myBlockSize = expectedBlockSize;
00053 expectedRecordPtr->myReferenceID = 0;
00054 expectedRecordPtr->myPosition = Validate::READ1_POS;
00055 expectedRecordPtr->myReadNameLength = 23;
00056 expectedRecordPtr->myMapQuality = 0;
00057 expectedRecordPtr->myBin = 4681;
00058 expectedRecordPtr->myCigarLength = 2;
00059 expectedRecordPtr->myFlag = 73;
00060 expectedRecordPtr->myReadLength = 5;
00061 expectedRecordPtr->myMateReferenceID = 0;
00062 expectedRecordPtr->myMatePosition = 1010;
00063 expectedRecordPtr->myInsertSize = 0;
00064
00065 assert(samRecord.getString("MD") == "37");
00066 assert(samRecord.getString("YZ") == "");
00067 assert(samRecord.getInteger("YZ") == -1);
00068 assert(samRecord.getDouble("YZ") == -1);
00069
00070 assert(samRecord.get0BasedAlignmentEnd() == Validate::READ1_ALIGN_END);
00071 assert(samRecord.get1BasedAlignmentEnd() == (Validate::READ1_ALIGN_END + 1));
00072 assert(samRecord.getAlignmentLength() == Validate::READ1_ALIGN_LEN);
00073 assert(samRecord.get1BasedUnclippedStart() == (Validate::READ1_UNCLIP_START + 1));
00074 assert(samRecord.get0BasedUnclippedStart() == Validate::READ1_UNCLIP_START);
00075 assert(samRecord.get1BasedUnclippedEnd() == (Validate::READ1_UNCLIP_END + 1));
00076 assert(samRecord.get0BasedUnclippedEnd() == Validate::READ1_UNCLIP_END);
00077
00078
00079 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
00080 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
00081 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
00082 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
00083 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
00084 assert(samRecord.getReadNameLength() ==
00085 expectedRecordPtr->myReadNameLength);
00086 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
00087 assert(samRecord.getBin() == expectedRecordPtr->myBin);
00088 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
00089 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
00090 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
00091 assert(samRecord.getMateReferenceID() ==
00092 expectedRecordPtr->myMateReferenceID);
00093 assert(strcmp(samRecord.getMateReferenceName(),
00094 expectedMateReferenceName) == 0);
00095 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
00096 expectedMateReferenceNameOrEqual) == 0);
00097 assert(samRecord.get1BasedMatePosition() ==
00098 expectedRecordPtr->myMatePosition + 1);
00099 assert(samRecord.get0BasedMatePosition() ==
00100 expectedRecordPtr->myMatePosition);
00101 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
00102 assert(strcmp(samRecord.getReadName(), "1:1011:F:255+17M15D20M") == 0);
00103 assert(samRecord.getCigar() == Validate::READ1_CIGAR);
00104 assert(samRecord.getSequence() == Validate::READ1_SEQ);
00105 assert(samRecord.getQuality() == Validate::READ1_QUAL);
00106
00107 assert(samRecord.getSequence(0) == 'C');
00108 assert(samRecord.getQuality(0) == '6');
00109 assert(samRecord.getSequence(1) == 'C');
00110 assert(samRecord.getQuality(1) == '>');
00111 assert(samRecord.getSequence(2) == 'G');
00112 assert(samRecord.getQuality(2) == '6');
00113 assert(samRecord.getSequence(3) == 'A');
00114 assert(samRecord.getQuality(3) == '+');
00115 assert(samRecord.getSequence(4) == 'A');
00116 assert(samRecord.getQuality(4) == '4');
00117
00118 bool caught = false;
00119 try
00120 {
00121 samRecord.getSequence(-1);
00122 }
00123 catch (std::exception& e)
00124 {
00125 caught = true;
00126 assert(strcmp(e.what(), "SamRecord::getSequence(-1) is out of range. Index must be between 0 and 4") == 0);
00127 }
00128 assert(caught == true);
00129 caught = false;
00130 try
00131 {
00132 samRecord.getQuality(-1);
00133 }
00134 catch (std::exception& e)
00135 {
00136 caught = true;
00137 assert(strcmp(e.what(), "SamRecord::getQuality(-1) is out of range. Index must be between 0 and 4") == 0);
00138 }
00139 assert(caught == true);
00140
00141 caught = false;
00142 try
00143 {
00144 samRecord.getSequence(5);
00145 }
00146 catch (std::exception& e)
00147 {
00148 caught = true;
00149 assert(strcmp(e.what(), "SamRecord::getSequence(5) is out of range. Index must be between 0 and 4") == 0);
00150 }
00151 assert(caught == true);
00152 caught = false;
00153 try
00154 {
00155 samRecord.getQuality(5);
00156 }
00157 catch (std::exception& e)
00158 {
00159 caught = true;
00160 assert(strcmp(e.what(), "SamRecord::getQuality(5) is out of range. Index must be between 0 and 4") == 0);
00161 }
00162 assert(caught == true);
00163
00164 assert(samRecord.getNumOverlaps(1010, 1017) == 5);
00165 assert(samRecord.getNumOverlaps(1010, 1016) == 5);
00166 assert(samRecord.getNumOverlaps(1012, 1017) == 3);
00167 assert(samRecord.getNumOverlaps(1015, 1017) == 0);
00168 assert(samRecord.getNumOverlaps(1017, 1010) == 0);
00169 assert(samRecord.getNumOverlaps(1013, 1011) == 0);
00170 assert(samRecord.getNumOverlaps(-1, 1017) == 5);
00171 assert(samRecord.getNumOverlaps(1010, -1) == 5);
00172
00173
00174 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00175 assert(tag[0] == 'A');
00176 assert(tag[1] == 'M');
00177 assert(type == 'i');
00178 assert(*(char*)value == 0);
00179 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00180 assert(tag[0] == 'M');
00181 assert(tag[1] == 'D');
00182 assert(type == 'Z');
00183 assert(*(String*)value == "37");
00184 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00185 assert(tag[0] == 'N');
00186 assert(tag[1] == 'M');
00187 assert(type == 'i');
00188 assert(*(char*)value == 0);
00189 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00190 assert(tag[0] == 'X');
00191 assert(tag[1] == 'T');
00192 assert(type == 'A');
00193 assert(*(char*)value == 'R');
00194
00195 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00196 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00197
00198
00199 bufferPtr = (const bamRecordStruct*)samRecord.getRecordBuffer();
00200
00201 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
00202 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
00203 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
00204 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
00205 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
00206 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
00207 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
00208 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
00209 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
00210 assert(bufferPtr->myMateReferenceID ==
00211 expectedRecordPtr->myMateReferenceID);
00212 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
00213 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
00214
00215
00216
00217 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
00218
00219
00220 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
00221 {
00222 assert(*varPtr == samRecord.getReadName()[i]);
00223 varPtr++;
00224 }
00225
00226
00227
00228 assert(*(unsigned int*)varPtr == 80);
00229
00230 varPtr += 4;
00231
00232 assert(*(unsigned int*)varPtr == 34);
00233
00234 varPtr += 4;
00235
00236
00237
00238 assert(*varPtr == 0x22);
00239 varPtr++;
00240
00241 assert(*varPtr == 0x41);
00242 varPtr++;
00243
00244 assert(*varPtr == 0x10);
00245 varPtr++;
00246
00247
00248 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
00249 {
00250 assert(*varPtr == samRecord.getQuality()[i] - 33);
00251 varPtr++;
00252 }
00253
00254
00255 assert(*varPtr == 'A');
00256 varPtr++;
00257 assert(*varPtr == 'M');
00258 varPtr++;
00259 assert(*varPtr == 'C');
00260 varPtr++;
00261 assert(*varPtr == 0);
00262 varPtr++;
00263 assert(*varPtr == 'M');
00264 varPtr++;
00265 assert(*varPtr == 'D');
00266 varPtr++;
00267 assert(*varPtr == 'Z');
00268 varPtr++;
00269 assert(*varPtr == '3');
00270 varPtr++;
00271 assert(*varPtr == '7');
00272 varPtr++;
00273 assert(*varPtr == 0);
00274 varPtr++;
00275 assert(*varPtr == 'N');
00276 varPtr++;
00277 assert(*varPtr == 'M');
00278 varPtr++;
00279 assert(*varPtr == 'C');
00280 varPtr++;
00281 assert(*varPtr == 0);
00282 varPtr++;
00283 assert(*varPtr == 'X');
00284 varPtr++;
00285 assert(*varPtr == 'T');
00286 varPtr++;
00287 assert(*varPtr == 'A');
00288 varPtr++;
00289 assert(*varPtr == 'R');
00290 varPtr++;
00291 }
00292
00293
00294 void validateRead2(SamRecord& samRecord)
00295 {
00296
00297
00298
00299 int expectedBlockSize = 61;
00300 const char* expectedReferenceName = "1";
00301 const char* expectedMateReferenceName = "1";
00302 const char* expectedMateReferenceNameOrEqual = "=";
00303
00304 bamRecordStruct* expectedRecordPtr =
00305 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
00306
00307 char tag[3];
00308 char type;
00309 void* value;
00310 bamRecordStruct* bufferPtr;
00311 unsigned char* varPtr;
00312
00313 expectedRecordPtr->myBlockSize = expectedBlockSize;
00314 expectedRecordPtr->myReferenceID = 0;
00315 expectedRecordPtr->myPosition = Validate::READ2_POS;
00316 expectedRecordPtr->myReadNameLength = 23;
00317 expectedRecordPtr->myMapQuality = 0;
00318 expectedRecordPtr->myBin = 4681;
00319 expectedRecordPtr->myCigarLength = 0;
00320 expectedRecordPtr->myFlag = 133;
00321 expectedRecordPtr->myReadLength = 4;
00322 expectedRecordPtr->myMateReferenceID = 0;
00323 expectedRecordPtr->myMatePosition = 1010;
00324 expectedRecordPtr->myInsertSize = 0;
00325
00326
00327 bamRecordStruct retrieveRecord;
00328 String retrieveReadName;
00329 String retrieveCigar;
00330 String retrieveSequence;
00331 String retrieveQuality;
00332
00333 assert(samRecord.getFields(retrieveRecord, retrieveReadName,
00334 retrieveCigar, retrieveSequence,
00335 retrieveQuality) == true);
00336 assert(retrieveRecord.myBlockSize == expectedRecordPtr->myBlockSize);
00337 assert(retrieveRecord.myReferenceID == expectedRecordPtr->myReferenceID);
00338 assert(retrieveRecord.myPosition == expectedRecordPtr->myPosition);
00339 assert(retrieveRecord.myReadNameLength ==
00340 expectedRecordPtr->myReadNameLength);
00341 assert(retrieveRecord.myMapQuality == expectedRecordPtr->myMapQuality);
00342 assert(retrieveRecord.myBin == expectedRecordPtr->myBin);
00343 assert(retrieveRecord.myCigarLength == expectedRecordPtr->myCigarLength);
00344 assert(retrieveRecord.myFlag == expectedRecordPtr->myFlag);
00345 assert(retrieveRecord.myReadLength == expectedRecordPtr->myReadLength);
00346 assert(retrieveRecord.myMateReferenceID ==
00347 expectedRecordPtr->myMateReferenceID);
00348 assert(retrieveRecord.myMatePosition == expectedRecordPtr->myMatePosition);
00349 assert(retrieveRecord.myInsertSize == expectedRecordPtr->myInsertSize);
00350
00351
00352 assert(samRecord.getAlignmentLength() == 0);
00353 assert(samRecord.get0BasedAlignmentEnd() == 1011);
00354 assert(samRecord.get1BasedAlignmentEnd() == 1012);
00355 assert(samRecord.get0BasedUnclippedStart() == 1011);
00356 assert(samRecord.get1BasedUnclippedStart() == 1012);
00357 assert(samRecord.get0BasedUnclippedEnd() == 1011);
00358 assert(samRecord.get1BasedUnclippedEnd() == 1012);
00359
00360
00361 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
00362 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
00363 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
00364 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
00365 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
00366 assert(samRecord.getReadNameLength() ==
00367 expectedRecordPtr->myReadNameLength);
00368 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
00369 assert(samRecord.getBin() == expectedRecordPtr->myBin);
00370 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
00371 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
00372 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
00373 assert(samRecord.getMateReferenceID() ==
00374 expectedRecordPtr->myMateReferenceID);
00375 assert(strcmp(samRecord.getMateReferenceName(),
00376 expectedMateReferenceName) == 0);
00377 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
00378 expectedMateReferenceNameOrEqual) == 0);
00379 assert(samRecord.get1BasedMatePosition() ==
00380 expectedRecordPtr->myMatePosition + 1);
00381 assert(samRecord.get0BasedMatePosition() ==
00382 expectedRecordPtr->myMatePosition);
00383 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
00384 assert(strcmp(samRecord.getReadName(), "1:1011:F:255+17M15D20M") == 0);
00385 assert(strcmp(samRecord.getCigar(), "*") == 0);
00386 assert(strcmp(samRecord.getSequence(), "CTGT") == 0);
00387 assert(strcmp(samRecord.getQuality(), ">>9>") == 0);
00388
00389 assert(samRecord.getSequence(0) == 'C');
00390 assert(samRecord.getQuality(0) == '>');
00391 assert(samRecord.getSequence(1) == 'T');
00392 assert(samRecord.getQuality(1) == '>');
00393 assert(samRecord.getSequence(2) == 'G');
00394 assert(samRecord.getQuality(2) == '9');
00395 assert(samRecord.getSequence(3) == 'T');
00396 assert(samRecord.getQuality(3) == '>');
00397 bool caught = false;
00398 try
00399 {
00400 samRecord.getSequence(-1);
00401 }
00402 catch (std::exception& e)
00403 {
00404 caught = true;
00405 assert(strcmp(e.what(), "SamRecord::getSequence(-1) is out of range. Index must be between 0 and 3") == 0);
00406 }
00407 assert(caught == true);
00408 caught = false;
00409 try
00410 {
00411 samRecord.getQuality(-1);
00412 }
00413 catch (std::exception& e)
00414 {
00415 caught = true;
00416 assert(strcmp(e.what(), "SamRecord::getQuality(-1) is out of range. Index must be between 0 and 3") == 0);
00417 }
00418 assert(caught == true);
00419
00420 caught = false;
00421 try
00422 {
00423 samRecord.getSequence(4);
00424 }
00425 catch (std::exception& e)
00426 {
00427 caught = true;
00428 assert(strcmp(e.what(), "SamRecord::getSequence(4) is out of range. Index must be between 0 and 3") == 0);
00429 }
00430 assert(caught == true);
00431 caught = false;
00432 try
00433 {
00434 samRecord.getQuality(4);
00435 }
00436 catch (std::exception& e)
00437 {
00438 caught = true;
00439 assert(strcmp(e.what(), "SamRecord::getQuality(4) is out of range. Index must be between 0 and 3") == 0);
00440 }
00441 assert(caught == true);
00442
00443 assert(samRecord.getNumOverlaps(1011, 1017) == 0);
00444 assert(samRecord.getNumOverlaps(0, 1116) == 0);
00445
00446
00447 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00448 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00449
00450
00451 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
00452
00453 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
00454 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
00455 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
00456 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
00457 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
00458 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
00459 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
00460 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
00461 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
00462 assert(bufferPtr->myMateReferenceID ==
00463 expectedRecordPtr->myMateReferenceID);
00464 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
00465 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
00466
00467
00468
00469 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
00470
00471
00472 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
00473 {
00474 assert(*varPtr == samRecord.getReadName()[i]);
00475 varPtr++;
00476 }
00477
00478
00479
00480
00481 assert(*varPtr == 0x28);
00482 varPtr++;
00483
00484 assert(*varPtr == 0x48);
00485 varPtr++;
00486
00487
00488 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
00489 {
00490 assert(*varPtr == samRecord.getQuality()[i] - 33);
00491 varPtr++;
00492 }
00493
00494
00495 }
00496
00497
00498 void validateRead3(SamRecord& samRecord)
00499 {
00500
00501
00502
00503 int expectedBlockSize = 87;
00504 const char* expectedReferenceName = "1";
00505 const char* expectedMateReferenceName = "18";
00506 const char* expectedMateReferenceNameOrEqual = "18";
00507
00508 bamRecordStruct* expectedRecordPtr =
00509 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
00510
00511 char tag[3];
00512 char type;
00513 void* value;
00514 bamRecordStruct* bufferPtr;
00515 unsigned char* varPtr;
00516
00517 expectedRecordPtr->myBlockSize = expectedBlockSize;
00518 expectedRecordPtr->myReferenceID = 0;
00519 expectedRecordPtr->myPosition = 74;
00520 expectedRecordPtr->myReadNameLength = 21;
00521 expectedRecordPtr->myMapQuality = 0;
00522 expectedRecordPtr->myBin = 4681;
00523 expectedRecordPtr->myCigarLength = 1;
00524 expectedRecordPtr->myFlag = 97;
00525 expectedRecordPtr->myReadLength = 5;
00526 expectedRecordPtr->myMateReferenceID = 17;
00527 expectedRecordPtr->myMatePosition = 756;
00528 expectedRecordPtr->myInsertSize = 0;
00529
00530
00531 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
00532 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
00533 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
00534 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
00535 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
00536 assert(samRecord.getReadNameLength() ==
00537 expectedRecordPtr->myReadNameLength);
00538 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
00539 assert(samRecord.getBin() == expectedRecordPtr->myBin);
00540 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
00541 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
00542 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
00543 assert(samRecord.getMateReferenceID() ==
00544 expectedRecordPtr->myMateReferenceID);
00545 assert(strcmp(samRecord.getMateReferenceName(),
00546 expectedMateReferenceName) == 0);
00547 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
00548 expectedMateReferenceNameOrEqual) == 0);
00549 assert(samRecord.get1BasedMatePosition() ==
00550 expectedRecordPtr->myMatePosition + 1);
00551 assert(samRecord.get0BasedMatePosition() ==
00552 expectedRecordPtr->myMatePosition);
00553 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
00554 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:295") == 0);
00555 assert(strcmp(samRecord.getCigar(), "5M") == 0);
00556 assert(strcmp(samRecord.getSequence(), "ACGTN") == 0);
00557 assert(strcmp(samRecord.getQuality(), ";>>>>") == 0);
00558 assert(samRecord.getNumOverlaps(74, 79) == 5);
00559 assert(samRecord.getNumOverlaps(74, 78) == 4);
00560 assert(samRecord.getNumOverlaps(73, 79) == 5);
00561 assert(samRecord.getNumOverlaps(75, 79) == 4);
00562 assert(samRecord.getNumOverlaps(0, 179) == 5);
00563 assert(samRecord.getNumOverlaps(0, 19) == 0);
00564
00565
00566 assert(samRecord.get0BasedAlignmentEnd() == 78);
00567 assert(samRecord.get1BasedAlignmentEnd() == 79);
00568 assert(samRecord.getAlignmentLength() == 5);
00569 assert(samRecord.get0BasedUnclippedStart() == 74);
00570 assert(samRecord.get1BasedUnclippedStart() == 75);
00571 assert(samRecord.get0BasedUnclippedEnd() == 78);
00572 assert(samRecord.get1BasedUnclippedEnd() == 79);
00573
00574
00575
00576 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00577 assert(tag[0] == 'A');
00578 assert(tag[1] == 'M');
00579 assert(type == 'i');
00580 assert(*(char*)value == 0);
00581 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00582 assert(tag[0] == 'M');
00583 assert(tag[1] == 'D');
00584 assert(type == 'Z');
00585 assert(*(String*)value == "30A0C5");
00586 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00587 assert(tag[0] == 'N');
00588 assert(tag[1] == 'M');
00589 assert(type == 'i');
00590 assert(*(char*)value == 2);
00591 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00592 assert(tag[0] == 'X');
00593 assert(tag[1] == 'T');
00594 assert(type == 'A');
00595 assert(*(char*)value == 'R');
00596
00597 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00598 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00599
00600
00601 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
00602
00603 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
00604 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
00605 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
00606 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
00607 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
00608 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
00609 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
00610 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
00611 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
00612 assert(bufferPtr->myMateReferenceID ==
00613 expectedRecordPtr->myMateReferenceID);
00614 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
00615 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
00616
00617
00618
00619 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
00620
00621
00622 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
00623 {
00624 assert(*varPtr == samRecord.getReadName()[i]);
00625 varPtr++;
00626 }
00627
00628
00629
00630 assert(*(unsigned int*)varPtr == 80);
00631
00632 varPtr += 4;
00633
00634
00635
00636 assert(*varPtr == 0x12);
00637 varPtr++;
00638
00639 assert(*varPtr == 0x48);
00640 varPtr++;
00641
00642 assert(*varPtr == 0xF0);
00643 varPtr++;
00644
00645
00646 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
00647 {
00648 assert(*varPtr == samRecord.getQuality()[i] - 33);
00649 varPtr++;
00650 }
00651
00652
00653 assert(*varPtr == 'A');
00654 varPtr++;
00655 assert(*varPtr == 'M');
00656 varPtr++;
00657 assert(*varPtr == 'C');
00658 varPtr++;
00659 assert(*varPtr == 0);
00660 varPtr++;
00661 assert(*varPtr == 'M');
00662 varPtr++;
00663 assert(*varPtr == 'D');
00664 varPtr++;
00665 assert(*varPtr == 'Z');
00666 varPtr++;
00667 assert(*varPtr == '3');
00668 varPtr++;
00669 assert(*varPtr == '0');
00670 varPtr++;
00671 assert(*varPtr == 'A');
00672 varPtr++;
00673 assert(*varPtr == '0');
00674 varPtr++;
00675 assert(*varPtr == 'C');
00676 varPtr++;
00677 assert(*varPtr == '5');
00678 varPtr++;
00679 assert(*varPtr == 0);
00680 varPtr++;
00681 assert(*varPtr == 'N');
00682 varPtr++;
00683 assert(*varPtr == 'M');
00684 varPtr++;
00685 assert(*varPtr == 'C');
00686 varPtr++;
00687 assert(*varPtr == 2);
00688 varPtr++;
00689 assert(*varPtr == 'X');
00690 varPtr++;
00691 assert(*varPtr == 'T');
00692 varPtr++;
00693 assert(*varPtr == 'A');
00694 varPtr++;
00695 assert(*varPtr == 'R');
00696 varPtr++;
00697 }
00698
00699
00700 void validateRead4(SamRecord& samRecord)
00701 {
00702
00703
00704
00705 int expectedBlockSize = 57;
00706 const char* expectedReferenceName = "1";
00707 const char* expectedMateReferenceName = "18";
00708 const char* expectedMateReferenceNameOrEqual = "18";
00709
00710 bamRecordStruct* expectedRecordPtr =
00711 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
00712
00713 char tag[3];
00714 char type;
00715 void* value;
00716 bamRecordStruct* bufferPtr;
00717 unsigned char* varPtr;
00718
00719 expectedRecordPtr->myBlockSize = expectedBlockSize;
00720 expectedRecordPtr->myReferenceID = 0;
00721 expectedRecordPtr->myPosition = 74;
00722 expectedRecordPtr->myReadNameLength = 21;
00723 expectedRecordPtr->myMapQuality = 0;
00724 expectedRecordPtr->myBin = 4681;
00725 expectedRecordPtr->myCigarLength = 0;
00726 expectedRecordPtr->myFlag = 97;
00727 expectedRecordPtr->myReadLength = 0;
00728 expectedRecordPtr->myMateReferenceID = 17;
00729 expectedRecordPtr->myMatePosition = 756;
00730 expectedRecordPtr->myInsertSize = 0;
00731
00732
00733 assert(samRecord.get1BasedUnclippedEnd() == 75);
00734 assert(samRecord.get0BasedUnclippedEnd() == 74);
00735 assert(samRecord.get0BasedUnclippedStart() == 74);
00736 assert(samRecord.get1BasedUnclippedStart() == 75);
00737 assert(samRecord.get1BasedAlignmentEnd() == 75);
00738 assert(samRecord.get0BasedAlignmentEnd() == 74);
00739 assert(samRecord.getAlignmentLength() == 0);
00740
00741
00742 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
00743 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
00744 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
00745 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
00746 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
00747 assert(samRecord.getReadNameLength() ==
00748 expectedRecordPtr->myReadNameLength);
00749 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
00750 assert(samRecord.getBin() == expectedRecordPtr->myBin);
00751 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
00752 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
00753 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
00754 assert(samRecord.getMateReferenceID() ==
00755 expectedRecordPtr->myMateReferenceID);
00756 assert(strcmp(samRecord.getMateReferenceName(),
00757 expectedMateReferenceName) == 0);
00758 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
00759 expectedMateReferenceNameOrEqual) == 0);
00760 assert(samRecord.get1BasedMatePosition() ==
00761 expectedRecordPtr->myMatePosition + 1);
00762 assert(samRecord.get0BasedMatePosition() ==
00763 expectedRecordPtr->myMatePosition);
00764 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
00765 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:295") == 0);
00766 assert(strcmp(samRecord.getCigar(), "*") == 0);
00767 assert(strcmp(samRecord.getSequence(), "*") == 0);
00768 assert(strcmp(samRecord.getQuality(), "*") == 0);
00769
00770 bool caught = false;
00771 try
00772 {
00773 samRecord.getSequence(0);
00774 }
00775 catch (std::exception& e)
00776 {
00777 caught = true;
00778 assert(strcmp(e.what(), "SamRecord::getSequence(0) is not allowed since sequence = '*'") == 0);
00779 }
00780 assert(caught == true);
00781 caught = false;
00782 try
00783 {
00784 assert(samRecord.getQuality(0) == BaseUtilities::UNKNOWN_QUALITY_CHAR);
00785 }
00786 catch (std::exception& e)
00787 {
00788 caught = true;
00789 }
00790 assert(caught == false);
00791 try
00792 {
00793 samRecord.getSequence(-1);
00794 }
00795 catch (std::exception& e)
00796 {
00797 caught = true;
00798 assert(strcmp(e.what(), "SamRecord::getSequence(-1) is not allowed since sequence = '*'") == 0);
00799 }
00800 assert(caught == true);
00801 caught = false;
00802 try
00803 {
00804 assert(samRecord.getQuality(-1) == BaseUtilities::UNKNOWN_QUALITY_CHAR);
00805 }
00806 catch (std::exception& e)
00807 {
00808 caught = true;
00809 }
00810 assert(caught == false);
00811
00812 caught = false;
00813 try
00814 {
00815 samRecord.getSequence(5);
00816 }
00817 catch (std::exception& e)
00818 {
00819 caught = true;
00820 assert(strcmp(e.what(), "SamRecord::getSequence(5) is not allowed since sequence = '*'") == 0);
00821 }
00822 assert(caught == true);
00823 caught = false;
00824 try
00825 {
00826 assert(samRecord.getQuality(5) == BaseUtilities::UNKNOWN_QUALITY_CHAR);
00827 }
00828 catch (std::exception& e)
00829 {
00830 caught = true;
00831 }
00832 assert(caught == false);
00833
00834 assert(samRecord.getNumOverlaps(74, 79) == 0);
00835 assert(samRecord.getNumOverlaps(74, 78) == 0);
00836 assert(samRecord.getNumOverlaps(73, 79) == 0);
00837 assert(samRecord.getNumOverlaps(75, 79) == 0);
00838 assert(samRecord.getNumOverlaps(0, 179) == 0);
00839 assert(samRecord.getNumOverlaps(0, 19) == 0);
00840
00841
00842 assert(samRecord.getNextSamTag(tag, type, &value) == true);
00843 assert(tag[0] == 'A');
00844 assert(tag[1] == 'M');
00845 assert(type == 'i');
00846 assert(*(char*)value == 0);
00847
00848 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00849 assert(samRecord.getNextSamTag(tag, type, &value) == false);
00850
00851
00852 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
00853
00854 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
00855 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
00856 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
00857 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
00858 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
00859 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
00860 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
00861 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
00862 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
00863 assert(bufferPtr->myMateReferenceID ==
00864 expectedRecordPtr->myMateReferenceID);
00865 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
00866 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
00867
00868
00869
00870 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
00871
00872
00873 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
00874 {
00875 assert(*varPtr == samRecord.getReadName()[i]);
00876 varPtr++;
00877 }
00878
00879
00880
00881
00882
00883
00884
00885 assert(*varPtr == 'A');
00886 varPtr++;
00887 assert(*varPtr == 'M');
00888 varPtr++;
00889 assert(*varPtr == 'C');
00890 varPtr++;
00891 assert(*varPtr == 0);
00892 varPtr++;
00893 }
00894
00895
00896 void validateRead5(SamRecord& samRecord)
00897 {
00898
00899
00900 int expectedBlockSize = 87;
00901 const char* expectedReferenceName = "2";
00902 const char* expectedMateReferenceName = "18";
00903 const char* expectedMateReferenceNameOrEqual = "18";
00904
00905 bamRecordStruct* expectedRecordPtr =
00906 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
00907
00908 char tag[3];
00909 char type;
00910 void* value;
00911 bamRecordStruct* bufferPtr;
00912 unsigned char* varPtr;
00913
00914 expectedRecordPtr->myBlockSize = expectedBlockSize;
00915 expectedRecordPtr->myReferenceID = 1;
00916 expectedRecordPtr->myPosition = 74;
00917 expectedRecordPtr->myReadNameLength = 21;
00918 expectedRecordPtr->myMapQuality = 0;
00919 expectedRecordPtr->myBin = 4681;
00920 expectedRecordPtr->myCigarLength = 1;
00921 expectedRecordPtr->myFlag = 97;
00922 expectedRecordPtr->myReadLength = 5;
00923 expectedRecordPtr->myMateReferenceID = 17;
00924 expectedRecordPtr->myMatePosition = 756;
00925 expectedRecordPtr->myInsertSize = 0;
00926
00927
00928 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
00929 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
00930 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
00931 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
00932 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
00933 assert(samRecord.getReadNameLength() ==
00934 expectedRecordPtr->myReadNameLength);
00935 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
00936 assert(samRecord.getBin() == expectedRecordPtr->myBin);
00937 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
00938 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
00939 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
00940 assert(samRecord.getMateReferenceID() ==
00941 expectedRecordPtr->myMateReferenceID);
00942 assert(strcmp(samRecord.getMateReferenceName(),
00943 expectedMateReferenceName) == 0);
00944 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
00945 expectedMateReferenceNameOrEqual) == 0);
00946 assert(samRecord.get1BasedMatePosition() ==
00947 expectedRecordPtr->myMatePosition + 1);
00948 assert(samRecord.get0BasedMatePosition() ==
00949 expectedRecordPtr->myMatePosition);
00950 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
00951 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:295") == 0);
00952 assert(strcmp(samRecord.getCigar(), "5M") == 0);
00953 assert(strcmp(samRecord.getSequence(), "ACGTN") == 0);
00954 assert(strcmp(samRecord.getQuality(), "*") == 0);
00955 assert(samRecord.getNumOverlaps(74, 79) == 5);
00956 assert(samRecord.getNumOverlaps(74, 78) == 4);
00957 assert(samRecord.getNumOverlaps(73, 79) == 5);
00958 assert(samRecord.getNumOverlaps(75, 79) == 4);
00959 assert(samRecord.getNumOverlaps(0, 179) == 5);
00960 assert(samRecord.getNumOverlaps(0, 19) == 0);
00961
00962 assert(samRecord.getSequence(0) == 'A');
00963 char expChar = BaseUtilities::UNKNOWN_QUALITY_CHAR;
00964 assert(samRecord.getQuality(0) == expChar);
00965 assert(samRecord.getSequence(1) == 'C');
00966 assert(samRecord.getQuality(1) == expChar);
00967 assert(samRecord.getSequence(2) == 'G');
00968 assert(samRecord.getQuality(2) == expChar);
00969 assert(samRecord.getSequence(3) == 'T');
00970 assert(samRecord.getQuality(3) == expChar);
00971 assert(samRecord.getSequence(4) == 'N');
00972 assert(samRecord.getQuality(4) == expChar);
00973
00974 bool caught = false;
00975 try
00976 {
00977 samRecord.getSequence(-1);
00978 }
00979 catch (std::exception& e)
00980 {
00981 caught = true;
00982 assert(strcmp(e.what(), "SamRecord::getSequence(-1) is out of range. Index must be between 0 and 4") == 0);
00983 }
00984 assert(caught == true);
00985 caught = false;
00986 try
00987 {
00988 samRecord.getQuality(-1);
00989 }
00990 catch (std::exception& e)
00991 {
00992 caught = true;
00993 assert(strcmp(e.what(), "SamRecord::getQuality(-1) is out of range. Index must be between 0 and 4") == 0);
00994 }
00995 assert(caught == true);
00996
00997 caught = false;
00998 try
00999 {
01000 samRecord.getSequence(5);
01001 }
01002 catch (std::exception& e)
01003 {
01004 caught = true;
01005 assert(strcmp(e.what(), "SamRecord::getSequence(5) is out of range. Index must be between 0 and 4") == 0);
01006 }
01007 assert(caught == true);
01008 caught = false;
01009 try
01010 {
01011 samRecord.getQuality(5);
01012 }
01013 catch (std::exception& e)
01014 {
01015 caught = true;
01016 assert(strcmp(e.what(), "SamRecord::getQuality(5) is out of range. Index must be between 0 and 4") == 0);
01017 }
01018 assert(caught == true);
01019
01020
01021 assert(samRecord.getNextSamTag(tag, type, &value) == true);
01022 assert(tag[0] == 'A');
01023 assert(tag[1] == 'M');
01024 assert(type == 'i');
01025 assert(*(char*)value == 0);
01026 assert(samRecord.getNextSamTag(tag, type, &value) == true);
01027 assert(tag[0] == 'M');
01028 assert(tag[1] == 'D');
01029 assert(type == 'Z');
01030 assert(*(String*)value == "30A0C5");
01031 assert(samRecord.getNextSamTag(tag, type, &value) == true);
01032 assert(tag[0] == 'N');
01033 assert(tag[1] == 'M');
01034 assert(type == 'i');
01035 assert(*(char*)value == 2);
01036 assert(samRecord.getNextSamTag(tag, type, &value) == true);
01037 assert(tag[0] == 'X');
01038 assert(tag[1] == 'T');
01039 assert(type == 'A');
01040 assert(*(char*)value == 'R');
01041
01042 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01043 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01044
01045
01046 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01047
01048 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01049 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01050 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01051 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01052 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01053 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01054 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01055 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01056 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01057 assert(bufferPtr->myMateReferenceID ==
01058 expectedRecordPtr->myMateReferenceID);
01059 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01060 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01061
01062
01063
01064 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01065
01066
01067 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01068 {
01069 assert(*varPtr == samRecord.getReadName()[i]);
01070 varPtr++;
01071 }
01072
01073
01074
01075 assert(*(unsigned int*)varPtr == 80);
01076
01077 varPtr += 4;
01078
01079
01080
01081 assert(*varPtr == 0x12);
01082 varPtr++;
01083
01084 assert(*varPtr == 0x48);
01085 varPtr++;
01086
01087 assert(*varPtr == 0xF0);
01088 varPtr++;
01089
01090
01091 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
01092 {
01093 assert(*varPtr == 0xFF);
01094 varPtr++;
01095 }
01096
01097
01098 assert(*varPtr == 'A');
01099 varPtr++;
01100 assert(*varPtr == 'M');
01101 varPtr++;
01102 assert(*varPtr == 'C');
01103 varPtr++;
01104 assert(*varPtr == 0);
01105 varPtr++;
01106 assert(*varPtr == 'M');
01107 varPtr++;
01108 assert(*varPtr == 'D');
01109 varPtr++;
01110 assert(*varPtr == 'Z');
01111 varPtr++;
01112 assert(*varPtr == '3');
01113 varPtr++;
01114 assert(*varPtr == '0');
01115 varPtr++;
01116 assert(*varPtr == 'A');
01117 varPtr++;
01118 assert(*varPtr == '0');
01119 varPtr++;
01120 assert(*varPtr == 'C');
01121 varPtr++;
01122 assert(*varPtr == '5');
01123 varPtr++;
01124 assert(*varPtr == 0);
01125 varPtr++;
01126 assert(*varPtr == 'N');
01127 varPtr++;
01128 assert(*varPtr == 'M');
01129 varPtr++;
01130 assert(*varPtr == 'C');
01131 varPtr++;
01132 assert(*varPtr == 2);
01133 varPtr++;
01134 assert(*varPtr == 'X');
01135 varPtr++;
01136 assert(*varPtr == 'T');
01137 varPtr++;
01138 assert(*varPtr == 'A');
01139 varPtr++;
01140 assert(*varPtr == 'R');
01141 varPtr++;
01142 }
01143
01144
01145 void validateRead6(SamRecord& samRecord)
01146 {
01147
01148
01149
01150 int expectedBlockSize = 77;
01151 const char* expectedReferenceName = "1";
01152 const char* expectedMateReferenceName = "18";
01153 const char* expectedMateReferenceNameOrEqual = "18";
01154
01155 bamRecordStruct* expectedRecordPtr =
01156 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
01157
01158 char tag[3];
01159 char type;
01160 void* value;
01161 bamRecordStruct* bufferPtr;
01162 unsigned char* varPtr;
01163
01164 expectedRecordPtr->myBlockSize = expectedBlockSize;
01165 expectedRecordPtr->myReferenceID = 0;
01166 expectedRecordPtr->myPosition = Validate::READ6_POS;
01167 expectedRecordPtr->myReadNameLength = 21;
01168 expectedRecordPtr->myMapQuality = 0;
01169 expectedRecordPtr->myBin = 4681;
01170 expectedRecordPtr->myCigarLength = 3;
01171 expectedRecordPtr->myFlag = 97;
01172 expectedRecordPtr->myReadLength = 8;
01173 expectedRecordPtr->myMateReferenceID = 17;
01174 expectedRecordPtr->myMatePosition = 756;
01175 expectedRecordPtr->myInsertSize = 0;
01176
01177
01178 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
01179 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
01180 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
01181 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
01182 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
01183 assert(samRecord.getReadNameLength() ==
01184 expectedRecordPtr->myReadNameLength);
01185 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
01186 assert(samRecord.getBin() == expectedRecordPtr->myBin);
01187 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
01188 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
01189 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
01190 assert(samRecord.getMateReferenceID() ==
01191 expectedRecordPtr->myMateReferenceID);
01192 assert(strcmp(samRecord.getMateReferenceName(),
01193 expectedMateReferenceName) == 0);
01194 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
01195 expectedMateReferenceNameOrEqual) == 0);
01196 assert(samRecord.get1BasedMatePosition() ==
01197 expectedRecordPtr->myMatePosition + 1);
01198 assert(samRecord.get0BasedMatePosition() ==
01199 expectedRecordPtr->myMatePosition);
01200 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
01201 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:296") == 0);
01202 assert(samRecord.getCigar() == Validate::READ6_CIGAR);
01203 assert(samRecord.getSequence() == Validate::READ6_SEQ);
01204 assert(samRecord.getQuality() == Validate::READ6_QUAL);
01205 assert(samRecord.getNumOverlaps(1750, 1755) == 5);
01206 assert(samRecord.getNumOverlaps(1750, 1754) == 4);
01207 assert(samRecord.getNumOverlaps(0, 2000) == 5);
01208 assert(samRecord.getNumOverlaps(1749, 1755) == 5);
01209 assert(samRecord.getNumOverlaps(1751, 1755) == 4);
01210 assert(samRecord.getNumOverlaps(0, 1752) == 2);
01211 assert(samRecord.getNumOverlaps(0, 19) == 0);
01212
01213
01214 assert(samRecord.get0BasedAlignmentEnd() == Validate::READ6_ALIGN_END);
01215 assert(samRecord.get1BasedAlignmentEnd() == (Validate::READ6_ALIGN_END + 1));
01216 assert(samRecord.getAlignmentLength() == Validate::READ6_ALIGN_LEN);
01217 assert(samRecord.get0BasedUnclippedStart() == Validate::READ6_UNCLIP_START);
01218 assert(samRecord.get1BasedUnclippedStart() == (Validate::READ6_UNCLIP_START + 1));
01219 assert(samRecord.get0BasedUnclippedEnd() == Validate::READ6_UNCLIP_END);
01220 assert(samRecord.get1BasedUnclippedEnd() == (Validate::READ6_UNCLIP_END + 1));
01221
01222
01223 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01224
01225
01226 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01227
01228 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01229 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01230 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01231 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01232 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01233 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01234 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01235 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01236 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01237 assert(bufferPtr->myMateReferenceID ==
01238 expectedRecordPtr->myMateReferenceID);
01239 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01240 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01241
01242
01243
01244 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01245
01246
01247 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01248 {
01249 assert(*varPtr == samRecord.getReadName()[i]);
01250 varPtr++;
01251 }
01252
01253
01254
01255
01256 assert(*(unsigned int*)varPtr == 0x34);
01257
01258 varPtr += 4;
01259
01260 assert(*(unsigned int*)varPtr == 0x25);
01261
01262 varPtr += 4;
01263
01264 assert(*(unsigned int*)varPtr == 0x50);
01265
01266 varPtr += 4;
01267
01268
01269
01270 assert(*varPtr == 0x84);
01271 varPtr++;
01272
01273 assert(*varPtr == 0x21);
01274 varPtr++;
01275
01276 assert(*varPtr == 0x24);
01277 varPtr++;
01278
01279 assert(*varPtr == 0x8F);
01280 varPtr++;
01281
01282
01283 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
01284 {
01285 assert(*varPtr == samRecord.getQuality()[i] - 33);
01286 varPtr++;
01287 }
01288 }
01289
01290
01291 void validateRead7(SamRecord& samRecord)
01292 {
01293
01294
01295
01296 int expectedBlockSize = 83;
01297 const char* expectedReferenceName = "2";
01298 const char* expectedMateReferenceName = "18";
01299 const char* expectedMateReferenceNameOrEqual = "18";
01300
01301 bamRecordStruct* expectedRecordPtr =
01302 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
01303
01304 char tag[3];
01305 char type;
01306 void* value;
01307 bamRecordStruct* bufferPtr;
01308 unsigned char* varPtr;
01309
01310 expectedRecordPtr->myBlockSize = expectedBlockSize;
01311 expectedRecordPtr->myReferenceID = 1;
01312 expectedRecordPtr->myPosition = Validate::READ7_POS;
01313 expectedRecordPtr->myReadNameLength = 21;
01314 expectedRecordPtr->myMapQuality = 0;
01315 expectedRecordPtr->myBin = 4681;
01316 expectedRecordPtr->myCigarLength = 4;
01317 expectedRecordPtr->myFlag = 97;
01318 expectedRecordPtr->myReadLength = 9;
01319 expectedRecordPtr->myMateReferenceID = 17;
01320 expectedRecordPtr->myMatePosition = 756;
01321 expectedRecordPtr->myInsertSize = 0;
01322
01323
01324 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
01325 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
01326 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
01327 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
01328 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
01329 assert(samRecord.getReadNameLength() ==
01330 expectedRecordPtr->myReadNameLength);
01331 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
01332 assert(samRecord.getBin() == expectedRecordPtr->myBin);
01333 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
01334 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
01335 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
01336 assert(samRecord.getMateReferenceID() ==
01337 expectedRecordPtr->myMateReferenceID);
01338 assert(strcmp(samRecord.getMateReferenceName(),
01339 expectedMateReferenceName) == 0);
01340 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
01341 expectedMateReferenceNameOrEqual) == 0);
01342 assert(samRecord.get1BasedMatePosition() ==
01343 expectedRecordPtr->myMatePosition + 1);
01344 assert(samRecord.get0BasedMatePosition() ==
01345 expectedRecordPtr->myMatePosition);
01346 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
01347 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:297") == 0);
01348 assert(samRecord.getCigar() == Validate::READ7_CIGAR);
01349 assert(samRecord.getSequence() == Validate::READ7_SEQ);
01350 assert(samRecord.getQuality() == Validate::READ7_QUAL);
01351 assert(samRecord.getNumOverlaps(1750, 1755) == 5);
01352 assert(samRecord.getNumOverlaps(1750, 1754) == 4);
01353 assert(samRecord.getNumOverlaps(0, 2000) == 5);
01354 assert(samRecord.getNumOverlaps(1749, 1755) == 5);
01355 assert(samRecord.getNumOverlaps(1751, 1755) == 4);
01356 assert(samRecord.getNumOverlaps(0, 1752) == 2);
01357 assert(samRecord.getNumOverlaps(0, 19) == 0);
01358
01359
01360 assert(samRecord.get0BasedAlignmentEnd() == Validate::READ7_ALIGN_END);
01361 assert(samRecord.get1BasedAlignmentEnd() == (Validate::READ7_ALIGN_END + 1));
01362 assert(samRecord.getAlignmentLength() == Validate::READ7_ALIGN_LEN);
01363 assert(samRecord.get0BasedUnclippedStart() == Validate::READ7_UNCLIP_START);
01364 assert(samRecord.get1BasedUnclippedStart() == (Validate::READ7_UNCLIP_START + 1));
01365 assert(samRecord.get0BasedUnclippedEnd() == Validate::READ7_UNCLIP_END);
01366 assert(samRecord.get1BasedUnclippedEnd() == (Validate::READ7_UNCLIP_END + 1));
01367
01368
01369 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01370
01371
01372 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01373
01374 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01375 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01376 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01377 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01378 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01379 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01380 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01381 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01382 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01383 assert(bufferPtr->myMateReferenceID ==
01384 expectedRecordPtr->myMateReferenceID);
01385 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01386 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01387
01388
01389
01390 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01391
01392
01393 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01394 {
01395 assert(*varPtr == samRecord.getReadName()[i]);
01396 varPtr++;
01397 }
01398
01399
01400
01401
01402 assert(*(unsigned int*)varPtr == 0x34);
01403
01404 varPtr += 4;
01405
01406 assert(*(unsigned int*)varPtr == 0x50);
01407
01408 varPtr += 4;
01409
01410 assert(*(unsigned int*)varPtr == 0x14);
01411
01412 varPtr += 4;
01413
01414 assert(*(unsigned int*)varPtr == 0x35);
01415
01416 varPtr += 4;
01417
01418
01419
01420 assert(*varPtr == 0x84);
01421 varPtr++;
01422
01423 assert(*varPtr == 0x21);
01424 varPtr++;
01425
01426 assert(*varPtr == 0x24);
01427 varPtr++;
01428
01429 assert(*varPtr == 0x8F);
01430 varPtr++;
01431
01432 assert(*varPtr == 0x40);
01433 varPtr++;
01434
01435
01436 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
01437 {
01438 assert(*varPtr == samRecord.getQuality()[i] - 33);
01439 varPtr++;
01440 }
01441 }
01442
01443
01444 void validateRead8(SamRecord& samRecord)
01445 {
01446
01447
01448
01449 int expectedBlockSize = 65;
01450 const char* expectedReferenceName = "*";
01451 const char* expectedMateReferenceName = "*";
01452 const char* expectedMateReferenceNameOrEqual = "*";
01453
01454 bamRecordStruct* expectedRecordPtr =
01455 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
01456
01457 char tag[3];
01458 char type;
01459 void* value;
01460 bamRecordStruct* bufferPtr;
01461 unsigned char* varPtr;
01462
01463 expectedRecordPtr->myBlockSize = expectedBlockSize;
01464 expectedRecordPtr->myReferenceID = -1;
01465 expectedRecordPtr->myPosition = -1;
01466 expectedRecordPtr->myReadNameLength = 27;
01467 expectedRecordPtr->myMapQuality = 0;
01468 expectedRecordPtr->myBin = 4680;
01469 expectedRecordPtr->myCigarLength = 0;
01470 expectedRecordPtr->myFlag = 141;
01471 expectedRecordPtr->myReadLength = 4;
01472 expectedRecordPtr->myMateReferenceID = -1;
01473 expectedRecordPtr->myMatePosition = -1;
01474 expectedRecordPtr->myInsertSize = 0;
01475
01476
01477 assert(samRecord.get0BasedAlignmentEnd() == -1);
01478 assert(samRecord.get1BasedAlignmentEnd() == 0);
01479 assert(samRecord.getAlignmentLength() == 0);
01480 assert(samRecord.get0BasedUnclippedStart() == -1);
01481 assert(samRecord.get1BasedUnclippedStart() == 0);
01482 assert(samRecord.get0BasedUnclippedEnd() == -1);
01483 assert(samRecord.get1BasedUnclippedEnd() == 0);
01484
01485
01486 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
01487 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
01488 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
01489 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
01490 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
01491 assert(samRecord.getReadNameLength() ==
01492 expectedRecordPtr->myReadNameLength);
01493 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
01494 assert(samRecord.getBin() == expectedRecordPtr->myBin);
01495 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
01496 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
01497 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
01498 assert(samRecord.getMateReferenceID() ==
01499 expectedRecordPtr->myMateReferenceID);
01500 assert(strcmp(samRecord.getMateReferenceName(),
01501 expectedMateReferenceName) == 0);
01502 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
01503 expectedMateReferenceNameOrEqual) == 0);
01504 assert(samRecord.get1BasedMatePosition() ==
01505 expectedRecordPtr->myMatePosition + 1);
01506 assert(samRecord.get0BasedMatePosition() ==
01507 expectedRecordPtr->myMatePosition);
01508 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
01509 assert(strcmp(samRecord.getReadName(), "Y:16597235+13M13I11M:F:181") == 0);
01510 assert(strcmp(samRecord.getCigar(), "*") == 0);
01511 assert(strcmp(samRecord.getSequence(), "AACT") == 0);
01512 assert(strcmp(samRecord.getQuality(), "==;;") == 0);
01513 assert(samRecord.getNumOverlaps(1750, 1755) == 0);
01514 assert(samRecord.getNumOverlaps(1750, 1754) == 0);
01515 assert(samRecord.getNumOverlaps(0, 2000) == 0);
01516 assert(samRecord.getNumOverlaps(1749, 1755) == 0);
01517 assert(samRecord.getNumOverlaps(1751, 1755) == 0);
01518 assert(samRecord.getNumOverlaps(0, 1752) == 0);
01519 assert(samRecord.getNumOverlaps(0, 19) == 0);
01520 assert(samRecord.getNumOverlaps(-1, 4) == 0);
01521
01522
01523 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01524 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01525
01526
01527 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01528
01529 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01530 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01531 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01532 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01533 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01534 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01535 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01536 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01537 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01538 assert(bufferPtr->myMateReferenceID ==
01539 expectedRecordPtr->myMateReferenceID);
01540 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01541 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01542
01543
01544
01545 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01546
01547
01548 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01549 {
01550 assert(*varPtr == samRecord.getReadName()[i]);
01551 varPtr++;
01552 }
01553
01554
01555
01556
01557 assert(*varPtr == 0x11);
01558 varPtr++;
01559
01560 assert(*varPtr == 0x28);
01561 varPtr++;
01562
01563
01564 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
01565 {
01566 assert(*varPtr == samRecord.getQuality()[i] - 33);
01567 varPtr++;
01568 }
01569
01570
01571 }
01572
01573
01574 void validateRead9(SamRecord& samRecord)
01575 {
01576
01577
01578
01579 int expectedBlockSize = 77;
01580 const char* expectedReferenceName = "3";
01581 const char* expectedMateReferenceName = "18";
01582 const char* expectedMateReferenceNameOrEqual = "18";
01583
01584 bamRecordStruct* expectedRecordPtr =
01585 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
01586
01587 char tag[3];
01588 char type;
01589 void* value;
01590 bamRecordStruct* bufferPtr;
01591 unsigned char* varPtr;
01592
01593 expectedRecordPtr->myBlockSize = expectedBlockSize;
01594 expectedRecordPtr->myReferenceID = 2;
01595 expectedRecordPtr->myPosition = 74;
01596 expectedRecordPtr->myReadNameLength = 21;
01597 expectedRecordPtr->myMapQuality = 0;
01598 expectedRecordPtr->myBin = 4681;
01599 expectedRecordPtr->myCigarLength = 3;
01600 expectedRecordPtr->myFlag = 97;
01601 expectedRecordPtr->myReadLength = 8;
01602 expectedRecordPtr->myMateReferenceID = 17;
01603 expectedRecordPtr->myMatePosition = 756;
01604 expectedRecordPtr->myInsertSize = 0;
01605
01606
01607 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
01608 assert(samRecord.getStatus() == SamStatus::SUCCESS);
01609 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
01610 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
01611 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
01612 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
01613 assert(samRecord.getReadNameLength() ==
01614 expectedRecordPtr->myReadNameLength);
01615 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
01616 assert(samRecord.getBin() == expectedRecordPtr->myBin);
01617 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
01618 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
01619 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
01620 assert(samRecord.getMateReferenceID() ==
01621 expectedRecordPtr->myMateReferenceID);
01622 assert(strcmp(samRecord.getMateReferenceName(),
01623 expectedMateReferenceName) == 0);
01624 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
01625 expectedMateReferenceNameOrEqual) == 0);
01626 assert(samRecord.get1BasedMatePosition() ==
01627 expectedRecordPtr->myMatePosition + 1);
01628 assert(samRecord.get0BasedMatePosition() ==
01629 expectedRecordPtr->myMatePosition);
01630 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
01631 assert(strcmp(samRecord.getReadName(), "18:462+29M5I3M:F:298") == 0);
01632 assert(strcmp(samRecord.getCigar(), "3S5M4H") == 0);
01633 assert((strcmp(samRecord.getSequence(), "TGCACGTN") == 0) ||
01634 (strcmp(samRecord.getSequence(), "tgcacgtn") == 0));
01635 assert(strcmp(samRecord.getQuality(), "453;>>>>") == 0);
01636 assert(samRecord.getNumOverlaps(74, 79) == 5);
01637 assert(samRecord.getNumOverlaps(73, 79) == 5);
01638 assert(samRecord.getNumOverlaps(75, 78) == 3);
01639 assert(samRecord.getNumOverlaps(0, 1017) == 5);
01640 assert(samRecord.getNumOverlaps(79, 85) == 0);
01641 assert(samRecord.getNumOverlaps(78, 85) == 1);
01642 assert(samRecord.getNumOverlaps(-1, 1017) == 5);
01643
01644
01645 assert(samRecord.get0BasedAlignmentEnd() == 78);
01646 assert(samRecord.get1BasedAlignmentEnd() == 79);
01647 assert(samRecord.getAlignmentLength() == 5);
01648 assert(samRecord.get0BasedUnclippedStart() == 71);
01649 assert(samRecord.get1BasedUnclippedStart() == 72);
01650 assert(samRecord.get0BasedUnclippedEnd() == 82);
01651 assert(samRecord.get1BasedUnclippedEnd() == 83);
01652
01653
01654 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01655
01656
01657 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01658 assert(bufferPtr != NULL);
01659
01660 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01661 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01662 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01663 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01664 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01665 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01666 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01667 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01668 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01669 assert(bufferPtr->myMateReferenceID ==
01670 expectedRecordPtr->myMateReferenceID);
01671 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01672 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01673
01674
01675
01676 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01677
01678
01679 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01680 {
01681 assert(*varPtr == samRecord.getReadName()[i]);
01682 varPtr++;
01683 }
01684
01685
01686
01687
01688 assert(*(unsigned int*)varPtr == 0x34);
01689
01690 varPtr += 4;
01691
01692 assert(*(unsigned int*)varPtr == 0x50);
01693
01694 varPtr += 4;
01695
01696 assert(*(unsigned int*)varPtr == 0x45);
01697
01698 varPtr += 4;
01699
01700
01701
01702 assert(*varPtr == 0x84);
01703 varPtr++;
01704
01705 assert(*varPtr == 0x21);
01706 varPtr++;
01707
01708 assert(*varPtr == 0x24);
01709 varPtr++;
01710
01711 assert(*varPtr == 0x8F);
01712 varPtr++;
01713
01714
01715 for(int i = 0; i < expectedRecordPtr->myReadLength; i++)
01716 {
01717 assert(*varPtr == samRecord.getQuality()[i] - 33);
01718 varPtr++;
01719 }
01720 }
01721
01722
01723 void validateRead10(SamRecord& samRecord)
01724 {
01725
01726
01727
01728 int expectedBlockSize = 59;
01729 const char* expectedReferenceName = "*";
01730 const char* expectedMateReferenceName = "*";
01731 const char* expectedMateReferenceNameOrEqual = "*";
01732
01733 bamRecordStruct* expectedRecordPtr =
01734 (bamRecordStruct *) malloc(expectedBlockSize + sizeof(int));
01735
01736 char tag[3];
01737 char type;
01738 void* value;
01739 bamRecordStruct* bufferPtr;
01740 unsigned char* varPtr;
01741
01742 expectedRecordPtr->myBlockSize = expectedBlockSize;
01743 expectedRecordPtr->myReferenceID = -1;
01744 expectedRecordPtr->myPosition = -1;
01745 expectedRecordPtr->myReadNameLength = 27;
01746 expectedRecordPtr->myMapQuality = 0;
01747 expectedRecordPtr->myBin = 4680;
01748 expectedRecordPtr->myCigarLength = 0;
01749 expectedRecordPtr->myFlag = 141;
01750 expectedRecordPtr->myReadLength = 0;
01751 expectedRecordPtr->myMateReferenceID = -1;
01752 expectedRecordPtr->myMatePosition = -1;
01753 expectedRecordPtr->myInsertSize = 0;
01754
01755
01756 assert(samRecord.get0BasedUnclippedStart() == -1);
01757 assert(samRecord.get1BasedUnclippedStart() == 0);
01758 assert(samRecord.get0BasedUnclippedEnd() == -1);
01759 assert(samRecord.get1BasedUnclippedEnd() == 0);
01760 assert(samRecord.get1BasedAlignmentEnd() == 0);
01761 assert(samRecord.get0BasedAlignmentEnd() == -1);
01762 assert(samRecord.getAlignmentLength() == 0);
01763
01764
01765 assert(samRecord.getBlockSize() == expectedRecordPtr->myBlockSize);
01766 assert(samRecord.getReferenceID() == expectedRecordPtr->myReferenceID);
01767 assert(strcmp(samRecord.getReferenceName(), expectedReferenceName) == 0);
01768 assert(samRecord.get1BasedPosition() == expectedRecordPtr->myPosition + 1);
01769 assert(samRecord.get0BasedPosition() == expectedRecordPtr->myPosition);
01770 assert(samRecord.getReadNameLength() ==
01771 expectedRecordPtr->myReadNameLength);
01772 assert(samRecord.getMapQuality() == expectedRecordPtr->myMapQuality);
01773 assert(samRecord.getBin() == expectedRecordPtr->myBin);
01774 assert(samRecord.getCigarLength() == expectedRecordPtr->myCigarLength);
01775 assert(samRecord.getFlag() == expectedRecordPtr->myFlag);
01776 assert(samRecord.getReadLength() == expectedRecordPtr->myReadLength);
01777 assert(samRecord.getMateReferenceID() ==
01778 expectedRecordPtr->myMateReferenceID);
01779 assert(strcmp(samRecord.getMateReferenceName(),
01780 expectedMateReferenceName) == 0);
01781 assert(strcmp(samRecord.getMateReferenceNameOrEqual(),
01782 expectedMateReferenceNameOrEqual) == 0);
01783 assert(samRecord.get1BasedMatePosition() ==
01784 expectedRecordPtr->myMatePosition + 1);
01785 assert(samRecord.get0BasedMatePosition() ==
01786 expectedRecordPtr->myMatePosition);
01787 assert(samRecord.getInsertSize() == expectedRecordPtr->myInsertSize);
01788 assert(strcmp(samRecord.getReadName(), "Y:16597235+13M13I11M:F:181") == 0);
01789 assert(strcmp(samRecord.getCigar(), "*") == 0);
01790 assert(strcmp(samRecord.getSequence(), "*") == 0);
01791 assert(strcmp(samRecord.getQuality(), "*") == 0);
01792 assert(samRecord.getNumOverlaps(74, 79) == 0);
01793 assert(samRecord.getNumOverlaps(73, 79) == 0);
01794 assert(samRecord.getNumOverlaps(75, 78) == 0);
01795 assert(samRecord.getNumOverlaps(0, 1017) == 0);
01796 assert(samRecord.getNumOverlaps(79, 85) == 0);
01797 assert(samRecord.getNumOverlaps(78, 85) == 0);
01798 assert(samRecord.getNumOverlaps(-1, 1017) == 0);
01799
01800
01801 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01802 assert(samRecord.getNextSamTag(tag, type, &value) == false);
01803
01804
01805 bufferPtr = (bamRecordStruct*)samRecord.getRecordBuffer();
01806
01807 assert(bufferPtr->myBlockSize == expectedRecordPtr->myBlockSize);
01808 assert(bufferPtr->myReferenceID == expectedRecordPtr->myReferenceID);
01809 assert(bufferPtr->myPosition == expectedRecordPtr->myPosition);
01810 assert(bufferPtr->myReadNameLength == expectedRecordPtr->myReadNameLength);
01811 assert(bufferPtr->myMapQuality == expectedRecordPtr->myMapQuality);
01812 assert(bufferPtr->myBin == expectedRecordPtr->myBin);
01813 assert(bufferPtr->myCigarLength == expectedRecordPtr->myCigarLength);
01814 assert(bufferPtr->myFlag == expectedRecordPtr->myFlag);
01815 assert(bufferPtr->myReadLength == expectedRecordPtr->myReadLength);
01816 assert(bufferPtr->myMateReferenceID ==
01817 expectedRecordPtr->myMateReferenceID);
01818 assert(bufferPtr->myMatePosition == expectedRecordPtr->myMatePosition);
01819 assert(bufferPtr->myInsertSize == expectedRecordPtr->myInsertSize);
01820
01821
01822
01823 varPtr = (unsigned char*)(&(bufferPtr->myData[0]));
01824
01825
01826 for(int i = 0; i < expectedRecordPtr->myReadNameLength; i++)
01827 {
01828 assert(*varPtr == samRecord.getReadName()[i]);
01829 varPtr++;
01830 }
01831
01832
01833
01834
01835
01836 }
01837
01838
01839 void validateHeader(SamFileHeader& samHeader)
01840 {
01841 validateHeaderFields(samHeader);
01842 validateHeaderString(samHeader);
01843 }
01844
01845
01846 void validateHeaderFields(SamFileHeader& samHeader)
01847 {
01848 const char* value;
01849
01850
01851
01852
01853 value = samHeader.getHDTagValue("GO");
01854 assert(strcmp(value, "") == 0);
01855
01856
01857
01858
01859 value = samHeader.getPGTagValue("CL", "1");
01860 assert(strcmp(value, "") == 0);
01861
01862
01863
01864 value = samHeader.getSQTagValue("LN", "1");
01865 assert(value != NULL);
01866 assert(strcmp(value, "247249719") == 0);
01867 value = samHeader.getSQTagValue("LN", "22");
01868 assert(value != NULL);
01869 assert(strcmp(value, "49691432") == 0);
01870
01871
01872
01873
01874 value = samHeader.getSQTagValue("LN", "1000");
01875 assert(strcmp(value, "") == 0);
01876
01877
01878
01879
01880 value = samHeader.getSQTagValue("AS", "1");
01881 assert(strcmp(value, "") == 0);
01882
01883
01884
01885 value = samHeader.getRGTagValue("LB", "myID2");
01886 assert(value != NULL);
01887 assert(strcmp(value, "library2") == 0);
01888 value = samHeader.getRGTagValue("LB", "myID");
01889 assert(value != NULL);
01890 assert(strcmp(value, "library") == 0);
01891
01892
01893
01894
01895 SamHeaderSQ* sq = samHeader.getSQ("10");
01896 assert(strcmp(sq->getTagValue("SN"), "10") == 0);
01897 assert(strcmp(sq->getTagValue("LN"), "135374737") == 0);
01898
01899
01900 assert(strcmp(sq->getTagValue("DD"), "") == 0);
01901
01902
01903
01904
01905
01906 const SamHeaderRG* rg = samHeader.getRG("myID");
01907 assert(strcmp(rg->getTagValue("ID"), "myID") == 0);
01908 assert(strcmp(rg->getTagValue("SM"), "sample") == 0);
01909 assert(strcmp(rg->getTagValue("LB"), "library") == 0);
01910
01911
01912 assert(strcmp(rg->getTagValue("DD"), "") == 0);
01913
01914
01915
01916 rg = samHeader.getRG("noExist");
01917 assert(rg == NULL);
01918
01919
01920
01921 sq = samHeader.getSQ("noExist");
01922 assert(sq == NULL);
01923
01924
01925
01926 assert(samHeader.getReferenceID("2") == 1);
01927 std::string refIDStdString = "X";
01928 assert(samHeader.getReferenceID(refIDStdString.c_str()) == 22);
01929 String refIDString = "22";
01930 assert(samHeader.getReferenceID(refIDString) == 21);
01931 assert(samHeader.getReferenceID(refIDString.c_str()) == 21);
01932 assert(samHeader.getReferenceID("Z") == SamReferenceInfo::NO_REF_ID);
01933 assert(samHeader.getReferenceID("Z", true) == 23);
01934 assert(samHeader.getReferenceID("*") == -1);
01935 refIDString = "*";
01936 assert(samHeader.getReferenceID(refIDString) == -1);
01937 assert(samHeader.getReferenceID(refIDString.c_str()) == -1);
01938 }
01939
01940 void validateHeaderString(SamFileHeader& samHeader)
01941 {
01942
01943 std::string headerString = "";
01944 assert(samHeader.getHeaderString(headerString) == true);
01945 assert(headerString == "@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");
01946 }