hisat-3n/sstring.cpp
2025-01-18 21:09:52 +08:00

203 lines
5.3 KiB
C++

/*
* Copyright 2011, Ben Langmead <langmea@cs.jhu.edu>
*
* This file is part of Bowtie 2.
*
* Bowtie 2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Bowtie 2 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Bowtie 2. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef MAIN_SSTRING
#include <string.h>
#include <iostream>
#include "ds.h"
#include "sstring.h"
using namespace std;
int main(void) {
cerr << "Test inter-class comparison operators...";
{
SString<int> s(2);
s.set('a', 0);
s.set('b', 1);
assert(sstr_eq(s, (const char *)"ab"));
assert(!sstr_neq(s, (const char *)"ab"));
assert(!sstr_lt(s, (const char *)"ab"));
assert(!sstr_gt(s, (const char *)"ab"));
assert(sstr_leq(s, (const char *)"ab"));
assert(sstr_geq(s, (const char *)"ab"));
SStringExpandable<int> s2;
s2.append('a');
s2.append('b');
assert(sstr_eq(s, s2));
assert(sstr_eq(s2, (const char *)"ab"));
assert(!sstr_neq(s, s2));
assert(!sstr_neq(s2, (const char *)"ab"));
assert(!sstr_lt(s, s2));
assert(!sstr_lt(s2, (const char *)"ab"));
assert(!sstr_gt(s, s2));
assert(!sstr_gt(s2, (const char *)"ab"));
assert(sstr_leq(s, s2));
assert(sstr_leq(s2, (const char *)"ab"));
assert(sstr_geq(s, s2));
assert(sstr_geq(s2, (const char *)"ab"));
SStringFixed<int, 12> s3;
s3.append('a');
s3.append('b');
assert(sstr_eq(s, s3));
assert(sstr_eq(s2, s3));
assert(sstr_eq(s3, (const char *)"ab"));
assert(!sstr_neq(s, s3));
assert(!sstr_neq(s2, s3));
assert(!sstr_neq(s3, (const char *)"ab"));
assert(!sstr_lt(s, s3));
assert(!sstr_lt(s2, s3));
assert(!sstr_lt(s3, (const char *)"ab"));
assert(!sstr_gt(s, s3));
assert(!sstr_gt(s2, s3));
assert(!sstr_gt(s3, (const char *)"ab"));
assert(sstr_geq(s, s3));
assert(sstr_geq(s2, s3));
assert(sstr_geq(s3, (const char *)"ab"));
assert(sstr_leq(s, s3));
assert(sstr_leq(s2, s3));
assert(sstr_leq(s3, (const char *)"ab"));
}
cerr << "PASSED" << endl;
cerr << "Test flag for whether to consider end-of-word < other chars ...";
{
SString<char> ss("String");
SString<char> sl("String1");
assert(sstr_lt(ss, sl));
assert(sstr_gt(ss, sl, false));
assert(sstr_leq(ss, sl));
assert(sstr_geq(ss, sl, false));
}
cerr << "PASSED" << endl;
cerr << "Test toZBuf and toZBufXForm ...";
{
SString<uint32_t> s(10);
for(int i = 0; i < 10; i++) {
s[i] = (uint32_t)i;
}
assert(strcmp(s.toZBufXForm("0123456789"), "0123456789") == 0);
}
cerr << "PASSED" << endl;
cerr << "Test S2bDnaString ...";
{
const char *str =
"ACGTACGTAC" "ACGTACGTAC" "ACGTACGTAC"
"ACGTACGTAC" "ACGTACGTAC" "ACGTACGTAC";
const char *gs =
"GGGGGGGGGG" "GGGGGGGGGG" "GGGGGGGGGG"
"GGGGGGGGGG" "GGGGGGGGGG" "GGGGGGGGGG";
for(size_t i = 0; i < 60; i++) {
S2bDnaString s(str, i, true);
S2bDnaString sr;
BTDnaString s2(str, i, true);
assert(sstr_eq(s, s2));
if(i >= 10) {
BTDnaString s3;
s.windowGetDna(s3, true, false, 3, 4);
assert(sstr_eq(s3.toZBuf(), (const char*)"TACG"));
s.windowGetDna(s3, false, false, 3, 4);
assert(sstr_eq(s3.toZBuf(), (const char*)"CGTA"));
assert_eq('A', s.toChar(0));
assert_eq('G', s.toChar(2));
assert_eq('A', s.toChar(4));
assert_eq('G', s.toChar(6));
assert_eq('A', s.toChar(8));
s.reverseWindow(1, 8);
s2.reverseWindow(1, 8);
assert_eq('A', s.toChar(1));
assert_eq('T', s.toChar(2));
assert_eq('G', s.toChar(3));
assert_eq('C', s.toChar(4));
assert_eq('A', s.toChar(5));
assert_eq('T', s.toChar(6));
assert_eq('G', s.toChar(7));
assert_eq('C', s.toChar(8));
assert(sstr_eq(s, s2));
s.reverseWindow(1, 8);
s2.reverseWindow(1, 8);
assert(sstr_eq(s, s2));
}
if(i > 1) {
s.reverse();
sr.installReverseChars(str, i);
s2.reverse();
assert(sstr_eq(s, s2));
assert(sstr_eq(sr, s2));
s.reverse();
sr.reverse();
assert(sstr_neq(s, s2));
assert(sstr_neq(sr, s2));
s.fill(2);
s2.reverse();
assert(sstr_leq(s, gs));
assert(sstr_gt(s, s2));
assert(sstr_gt(s, sr));
s2.fill(2);
sr.fill(2);
assert(sstr_eq(s, s2));
assert(sstr_eq(s, sr));
}
}
S2bDnaString s(str, true);
S2bDnaString sr;
BTDnaString s2(str, true);
assert(sstr_eq(s2.toZBuf(), str));
assert(sstr_eq(s, s2));
s.reverse();
sr.installReverseChars(str);
s2.reverse();
assert(sstr_eq(s, s2));
assert(sstr_eq(sr, s2));
s.reverse();
sr.reverse();
assert(sstr_neq(s, s2));
assert(sstr_neq(sr, s2));
}
cerr << "PASSED" << endl;
cerr << "Test operator=() ...";
{
S2bDnaString s;
s.installChars(string("gtcagtca"));
assert(sstr_eq(s.toZBuf(), (const char *)"GTCAGTCA"));
}
cerr << "PASSED" << endl;
cerr << "Conversions from string ...";
{
SStringExpandable<char> se(string("hello"));
EList<SStringExpandable<char> > sel;
sel.push_back(SStringExpandable<char>(string("hello")));
}
cerr << "PASSED" << endl;
cerr << "PASSED" << endl;
}
#endif /*def MAIN_SSTRING*/