libStatGen Software 1
ValidationTest.cpp
1/*
2 * Copyright (C) 2010 Regents of the University of Michigan
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "SamRecord.h"
19#include "SamValidation.h"
20#include "ValidationTest.h"
21#include <assert.h>
22
23void testSamQNAME()
24{
25 // This method tests:
26 // QNAME.Length() > 0 and <= 254
27 // QNAME does not contain [ \t\n\r]
28
29 char qname[256];
30 SamFileHeader samHeader;
32 // Error list
33 SamValidationErrors errorList;
34
35 // Test Length == 0 by setting qname[0] to 0 (end of char*)
36 qname[0] = 0;
37 // It fails, because it is a required field.
38 assert(testRecord.setReadName(qname) == false);
39 assert(strcmp(testRecord.getReadName(), "UNKNOWN") == 0);
40 // It was reset to the default which is valid.
41 assert(SamValidator::isValid(samHeader, testRecord, errorList) == true);
42 assert(errorList.numErrors() == 0);
43 assert(errorList.getNextError() == NULL);
44
45 // Test too long of a read name.
46 memset(qname, '.', 255);
47 qname[255] = 0;
48 assert(testRecord.setReadName(qname) == true);
49 assert(strcmp(testRecord.getReadName(), qname) == 0);
50 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
51 // 2 errors - 1 since the qname is longer than 254 (it is 255).
52 // and the qname length including the null is 256, but the
53 // read name length is only 8 bits, so that is a 1.
54 assert(errorList.numErrors() == 2);
55 assert(errorList.getNextError()->getType() ==
57 assert(errorList.getNextError()->getType() ==
59 assert(errorList.getNextError() == NULL);
60
61 // Clear the error list
62 errorList.clear();
63
64 // Setup a buffer to set the record to.
65 int bufferBlockSize = 32;
66
67 bamRecordStruct* bufferRecordPtr =
68 (bamRecordStruct *) malloc(bufferBlockSize + sizeof(int));
69
70 bufferRecordPtr->myBlockSize = bufferBlockSize;
71 bufferRecordPtr->myReferenceID = -1;
72 bufferRecordPtr->myPosition = 1010;
73 // Set the read name length to 0.
74 bufferRecordPtr->myReadNameLength = 0;
75 bufferRecordPtr->myMapQuality = 0;
76 bufferRecordPtr->myBin = 4681;
77 bufferRecordPtr->myCigarLength = 0;
78 bufferRecordPtr->myFlag = 73;
79 bufferRecordPtr->myReadLength = 0;
80 bufferRecordPtr->myMateReferenceID = -1;
81 bufferRecordPtr->myMatePosition = 1010;
82 bufferRecordPtr->myInsertSize = 0;
83
84 assert(testRecord.setBuffer((const char*)bufferRecordPtr,
85 bufferBlockSize + sizeof(int),
86 samHeader) == SamStatus::SUCCESS);
87 // 1 error - the read name length is 0.
88 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
89 assert(errorList.numErrors() == 1);
90 assert(errorList.getNextError()->getType() ==
92 assert(errorList.getNextError() == NULL);
93
94 // Clear the error list
95 errorList.clear();
96
97 // Test a buffer that has a read name, but the length specified is
98 // longer than the first null.
99 bufferBlockSize = 40;
100 bufferRecordPtr->myBlockSize = bufferBlockSize;
101 // Set the read name length to 8 - longer than 3 - "HI\0".
102 bufferRecordPtr->myReadNameLength = 8;
103 bufferRecordPtr->myData[0] = 'H';
104 bufferRecordPtr->myData[1] = 'I';
105 bufferRecordPtr->myData[2] = 0;
106
107 assert(testRecord.setBuffer((const char*)bufferRecordPtr,
108 bufferBlockSize + sizeof(int),
109 samHeader) == SamStatus::SUCCESS);
110 // 1 error - the read name length in the buffer does not match the
111 // length of the read name to the first null.
112 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
113 assert(errorList.numErrors() == 1);
114 assert(errorList.getNextError()->getType() ==
116 assert(errorList.getNextError() == NULL);
117
118 // Clear the error list
119 errorList.clear();
120
121 // Test a buffer that has a read name, but the length specified is
122 // shorter than the first null.
123 bufferBlockSize = 34;
124 bufferRecordPtr->myBlockSize = bufferBlockSize;
125 // Set the read name length to 2 - longer than 3 - "HI\0"..
126 bufferRecordPtr->myReadNameLength = 2;
127 bufferRecordPtr->myData[0] = 'H';
128 bufferRecordPtr->myData[1] = 'I';
129 bufferRecordPtr->myData[2] = 0;
130
131 assert(testRecord.setBuffer((const char*)bufferRecordPtr,
132 bufferBlockSize + sizeof(int),
133 samHeader) == SamStatus::SUCCESS);
134 // 1 error - the read name length in the buffer does not match
135 // the length of the read name to the first null.
136 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
137 assert(errorList.numErrors() == 1);
138 assert(errorList.getNextError()->getType() ==
140 assert(errorList.getNextError() == NULL);
141
142 // Clear the error list
143 errorList.clear();
144}
145
146
147void testBamRID()
148{
149 // BAM
151 // Error list
152 SamValidationErrors errorList;
153 SamFileHeader samHeader;
154
155 // Clear the error list
156 errorList.clear();
157
158 // Setup a buffer to set the record to.
159 int bufferBlockSize = 35;
160
161 bamRecordStruct* bufferRecordPtr =
162 (bamRecordStruct *) malloc(bufferBlockSize + sizeof(int));
163
164 bufferRecordPtr->myBlockSize = bufferBlockSize;
165 bufferRecordPtr->myPosition = 1010;
166 bufferRecordPtr->myReferenceID = -1;
167 // Set the read name length to 0.
168 bufferRecordPtr->myReadNameLength = 3;
169 bufferRecordPtr->myMapQuality = 0;
170 bufferRecordPtr->myBin = 4681;
171 bufferRecordPtr->myCigarLength = 0;
172 bufferRecordPtr->myFlag = 73;
173 bufferRecordPtr->myReadLength = 0;
174 bufferRecordPtr->myMateReferenceID = -1;
175 bufferRecordPtr->myMatePosition = 1010;
176 bufferRecordPtr->myInsertSize = 0;
177 bufferRecordPtr->myData[0] = 'H';
178 bufferRecordPtr->myData[1] = 'I';
179 bufferRecordPtr->myData[2] = 0;
180
181 ////////////////////////////////////////////
182 // Test out of range reference sequence id.
183 bufferRecordPtr->myReferenceID = 100;
184
185 assert(testRecord.setBuffer((const char*)bufferRecordPtr,
186 bufferBlockSize + sizeof(int),
187 samHeader) == SamStatus::SUCCESS);
188 // 1 error - the read name length is 0.
189 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
190 assert(errorList.numErrors() == 1);
191 assert(errorList.getNextError()->getType() ==
193 assert(errorList.getNextError() == NULL);
194
195 // Clear the error list
196 errorList.clear();
197
198 ////////////////////////////////////////////
199 // Test out of range reference sequence id.
200 bufferRecordPtr->myReferenceID = -100;
201
202 assert(testRecord.setBuffer((const char*)bufferRecordPtr,
203 bufferBlockSize + sizeof(int),
204 samHeader) == SamStatus::SUCCESS);
205 // 1 error - the read name length is 0.
206 assert(SamValidator::isValid(samHeader, testRecord, errorList) == false);
207 assert(errorList.numErrors() == 1);
208 assert(errorList.getNextError()->getType() ==
210 assert(errorList.getNextError() == NULL);
211
212 // Clear the error list
213 errorList.clear();
214}
215
216
217void testEmptyQual()
218{
219
220}
221
@ RETURN
just return failure on the error
Definition: ErrorHandler.h:31
This class allows a user to get/set the fields in a SAM/BAM Header.
Definition: SamFileHeader.h:35
Class providing an easy to use interface to get/set/operate on the fields in a SAM/BAM record.
Definition: SamRecord.h:52
Type getType() const
Return the type enum of this validation error object.
@ INVALID_REF_ID
Invalid reference id.
Definition: SamValidation.h:50
@ INVALID_QNAME
Invalid read/query name.
Definition: SamValidation.h:49
The SamValidationErrors class is a container class that holds SamValidationError Objects,...
const SamValidationError * getNextError()
Return a pointer to the next error without removing it from the container, and returning null once al...
void clear()
Remove all the errors from the container.
unsigned int numErrors()
Return the number of validation errors contained in this object.
static bool isValid(SamFileHeader &samHeader, SamRecord &samRecord, SamValidationErrors &validationErrors)
Validates whether or not the specified SamRecord is valid, calling all of the other validations.
@ SUCCESS
method completed successfully.
Definition: StatGenStatus.h:32
Structure of a BAM record.
Definition: SamRecord.h:34