Skip to content
This repository has been archived by the owner on Dec 16, 2022. It is now read-only.

Commit

Permalink
Sam: add uber off-by-1 test
Browse files Browse the repository at this point in the history
  • Loading branch information
Mauricio Carneiro committed Aug 20, 2014
1 parent a3a6f42 commit 703f0cd
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 5 deletions.
1 change: 0 additions & 1 deletion gamgee/cigar.cpp
Expand Up @@ -113,7 +113,6 @@ CigarElement Cigar::parse_next_cigar_element (stringstream& cigar_stream) {
if ( cigar_stream.fail() || int(element_op) >= 128 )
throw invalid_argument(string("Error parsing cigar string: ") + cigar_stream.str());
const auto encoded_op = cigar_op_parse_table[element_op];
printf("parsed length: %d, op: %d, econded_op: %d\n", element_length, element_op, encoded_op);
if ( encoded_op < 0 )
throw invalid_argument(string("Unrecognized operator ") + char(element_op) + " in cigar string: " + cigar_stream.str());
return make_cigar_element(element_length, static_cast<CigarOperator>(encoded_op));
Expand Down
3 changes: 1 addition & 2 deletions gamgee/cigar.h
Expand Up @@ -56,7 +56,6 @@ class Cigar {
* out of a length and a CigarOperator
*/
inline static CigarElement make_cigar_element(const uint32_t oplen, const CigarOperator op) {
printf("making -- len: %d, op: %d\n", oplen, op);
return (oplen << BAM_CIGAR_SHIFT) | static_cast<uint8_t>(op);
}

Expand All @@ -80,7 +79,7 @@ class Cigar {
* }
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* @return a pair with the element length and operator respectively. Both values can be converted using the Cigar API to actual elements.
* @return a CigarElement with the length and operator. Both values can be converted using the Cigar API (Cigar::cigar_op and Cigar::cigar_oplen) to actual elements.
*/
static CigarElement parse_next_cigar_element (std::stringstream& cigar_stream);

Expand Down
1 change: 0 additions & 1 deletion gamgee/sam.cpp
Expand Up @@ -84,7 +84,6 @@ uint32_t Sam::mate_alignment_stop() const {
stringstream cigar_stream {mate_cigar.value()};
while (cigar_stream.peek() != std::char_traits<char>::eof()) {
const auto element = Cigar::parse_next_cigar_element(cigar_stream);
printf("element length: %d, op: %d\n", Cigar::cigar_oplen(element), static_cast<int>(Cigar::cigar_op(element)));
result += Cigar::consumes_reference_bases(Cigar::cigar_op(element)) ? Cigar::cigar_oplen(element) : 0;
}
return result-1; // we want the last base to be 1-based and **inclusive**
Expand Down
9 changes: 8 additions & 1 deletion test/sam_test.cpp
Expand Up @@ -441,11 +441,18 @@ BOOST_AUTO_TEST_CASE( sam_mate_alignment_stop ) {
auto i = 0u;
for (const auto& record : SingleSamReader{"testdata/test_simple.sam"}) {
if (!missing(record.string_tag("MC"))) {
printf("read: %d, mate cigar: %s, astart: %d, astop: %d, mate_start: %d, mate_stop: %d\n", i, record.string_tag("MC").value().c_str(), record.alignment_start(), record.alignment_stop(), record.mate_alignment_start(), record.mate_alignment_stop());
BOOST_CHECK_EQUAL(record.mate_alignment_stop(), truth_mate_alignment_stop[i++]);
}
else {
BOOST_CHECK_THROW(record.mate_alignment_stop(), invalid_argument);
}
}
}

BOOST_AUTO_TEST_CASE( sam_off_by_one_uber_test ) {
const auto header = SingleSamReader{"testdata/test_simple.bam"}.header();
auto builder = SamBuilder{header};
const auto record = builder.set_name("TEST").set_bases("A").set_cigar("1M").set_base_quals({20}).set_alignment_start(1).build();
BOOST_CHECK_EQUAL(record.alignment_start(), 1);
BOOST_CHECK_EQUAL(record.alignment_stop(), 1);
}

0 comments on commit 703f0cd

Please sign in to comment.