File: SAM.cc

package info (click to toggle)
abyss 2.3.10-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 8,284 kB
  • sloc: cpp: 78,182; ansic: 6,512; makefile: 2,252; perl: 672; sh: 509; haskell: 412; python: 4
file content (113 lines) | stat: -rw-r--r-- 3,855 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include <sstream>
#include <string>

#include "Common/SAM.h"
#include "gtest/gtest.h"

/** Verify SAM records are stored and used correctly */

using namespace std;

/** @Return whether two Alignments are equivalent. */
bool operator==(const Alignment& a, const Alignment& b)
{
	return a.read_start_pos == b.read_start_pos &&
		a.align_length == b.align_length &&
		a.read_length == b.read_length;
}


// Test SAM::parseCigar()
TEST(parseCigar, check_alignment)
{
	Alignment a;
	a.align_length = 40;
	a.read_start_pos = 0;
	a.read_length = 40;
	EXPECT_EQ(a, SAMAlignment::parseCigar("40M", false));

	a.align_length = 40;
	a.read_start_pos = 20;
	a.read_length = 60;
	EXPECT_EQ(a, SAMAlignment::parseCigar("20S40M", false));

	a.align_length = 40;
	a.read_start_pos = 0;
	a.read_length = 60;
	EXPECT_EQ(a, SAMAlignment::parseCigar("40M20S", false));
	EXPECT_EQ(a, SAMAlignment::parseCigar("20S40M", true));

	a.align_length = 40;
	a.read_start_pos = 20;
	a.read_length = 70;
	EXPECT_EQ(a, SAMAlignment::parseCigar("20S40M10S", false));
	EXPECT_EQ(a, SAMAlignment::parseCigar("10S40M20S", true));

	a.align_length = 40;
	a.read_start_pos = 20;
	a.read_length = 70;
	EXPECT_EQ(a, SAMAlignment::parseCigar("20I40M10S", false));

	a.align_length = 40;
	a.read_start_pos = 30;
	a.read_length = 80;
	EXPECT_EQ(a, SAMAlignment::parseCigar("20M10I40M10S", false));

	a.align_length = 40;
	a.read_start_pos = 0;
	a.read_length = 80;
	EXPECT_EQ(a, SAMAlignment::parseCigar("40M10I20M10S", false));
}

// Check that we error when an invalid CIGAR is given.
TEST(parseCigarDeath, invalid_cigar)
{
	EXPECT_DEATH(SAMAlignment::parseCigar("20SS", false), "error: invalid CIGAR: `20SS'");
	EXPECT_DEATH(SAMAlignment::parseCigar("20m", false), "error: invalid CIGAR: `20m'");
}

// Test friend std::istream& operator >>(std::istream& in, SAMRecord& o)
TEST(parseSAMInput, check_values)
{
	std::string testSAMString(  "1:497:R:-272+13M17D24M	113	1	497	37	37M	15	100338662	0	"
								"CGGGTCTGACCTGAGGAGAACTGTGCTCCGCCTTCAG	0;==-==9;>>>>>=>>>>>>>>>>>=>>>>>>>>>>	"
								"XT:A:U	NM:i:0	SM:i:37	AM:i:0	X0:i:1	X1:i:0	XM:i:0	XO:i:0	XG:i:0	MD:Z:37"
								"\n" 
								"19:20389:F:275+18M2D19M	99	1	17644	0	37M	=	17919	314	"
								"TATGACTGCTAATAATACCTACACATGTTAGAACCAT	>>>>>>>>>>>>>>>>>>>><<>>><<>>4::>>:<9	"
								"RG:Z:UM0098:1	XT:A:R	NM:i:0	SM:i:0	AM:i:0	X0:i:4	X1:i:0	XM:i:0	XO:i:0	XG:i:0	MD:Z:37"
								);
	std::istringstream testSAMIStringStream(testSAMString);
	SAMRecord testSAMRecord;
	testSAMIStringStream >> testSAMRecord;
	EXPECT_EQ("1:497:R:-272+13M17D24M", testSAMRecord.qname);
	EXPECT_EQ(113, testSAMRecord.flag);
	EXPECT_EQ("1", testSAMRecord.rname);
	EXPECT_EQ(496, testSAMRecord.pos);
	EXPECT_EQ(37, testSAMRecord.mapq);
	EXPECT_EQ("37M", testSAMRecord.cigar);
	EXPECT_EQ("15", testSAMRecord.mrnm);
	EXPECT_EQ(100338661, testSAMRecord.mpos);
	EXPECT_EQ(0, testSAMRecord.isize);
#if SAM_SEQ_QUAL
	EXPECT_EQ("CGGGTCTGACCTGAGGAGAACTGTGCTCCGCCTTCAG", testSAMRecord.seq);
	EXPECT_EQ("0;==-==9;>>>>>=>>>>>>>>>>>=>>>>>>>>>>", testSAMRecord.qual);
	EXPECT_EQ("XT:A:U	NM:i:0	SM:i:37	AM:i:0	X0:i:1	X1:i:0	XM:i:0	XO:i:0	XG:i:0	MD:Z:37", testSAMRecord.tags);
#endif
	testSAMIStringStream >> testSAMRecord;
	EXPECT_EQ("19:20389:F:275+18M2D19M", testSAMRecord.qname);
	EXPECT_EQ(99, testSAMRecord.flag);
	EXPECT_EQ("1", testSAMRecord.rname);
	EXPECT_EQ(17643, testSAMRecord.pos);
	EXPECT_EQ(0, testSAMRecord.mapq);
	EXPECT_EQ("37M", testSAMRecord.cigar);
	EXPECT_EQ("1", testSAMRecord.mrnm);
	EXPECT_EQ(17918, testSAMRecord.mpos);
	EXPECT_EQ(314, testSAMRecord.isize);
#if SAM_SEQ_QUAL
	EXPECT_EQ("TATGACTGCTAATAATACCTACACATGTTAGAACCAT", testSAMRecord.seq);
	EXPECT_EQ(">>>>>>>>>>>>>>>>>>>><<>>><<>>4::>>:<9", testSAMRecord.qual);
	EXPECT_EQ("RG:Z:UM0098:1	XT:A:R	NM:i:0	SM:i:0	AM:i:0	X0:i:4	X1:i:0	XM:i:0	XO:i:0	XG:i:0	MD:Z:37", testSAMRecord.tags);
#endif
	
}