24 mutable SmartCharPtr
buffer;
26 void annotate_error() {
28 char *fieldDescription =
NULp;
37 fieldDescription ? fieldDescription :
"");
38 free(fieldDescription);
51 error =
"has no entries";
65 :
"could not detect sequence data";
72 error =
"cannot handle type as sequence- or associated-data";
73 createPossible =
false;
83 createPossible =
false;
102 return buffer.content();
116 bool annotateError =
true;
118 if (createPossible) {
126 annotateError =
false;
128 else if (wasFound()) {
129 error =
"cannot create data over existing";
133 error =
"cannot create data (logic error)";
137 if (error && annotateError) annotate_error();
153 bool SaiCalculator::allSaiHaveDataInAlignment(
const char *ali) {
154 bool seenMissingData =
false;
157 for (
int i = 0; inputSaiNames[i] && !seenMissingData; ++i) {
158 seenMissingData = !
saiHasDataInAli(gb_sai_data, inputSaiNames[i], ali);
160 return !seenMissingData;
163 void SaiCalculator::run() {
168 if (!gb_target_sai) {
174 error = gb_target_sai
191 calc4ali(ali, gb_target_sai);
199 if (aliName.
empty())
error =
"No alignments found";
201 for (
int a = 0; aliName[a] && !
error; ++a) {
202 calc4ali(aliName[a], gb_target_sai);
209 if (aliName.
empty())
error =
"No alignments found";
212 for (
int a = 0; aliName[a] && !
error; ++a) {
213 if (allSaiHaveDataInAlignment(aliName[a])) {
214 commonAliName.
put(aliName[a]);
217 if (commonAliName.
empty() && !
error)
error =
"No alignments found where all SAI have data";
219 for (
int a = 0; commonAliName[a] && !
error; ++a) {
220 calc4ali(commonAliName[a], gb_target_sai);
227 if (aliName.
empty())
error =
"No alignments found";
230 for (
int a = 0; aliName[a] && !
error; ++a) {
232 existingAliName.
put(aliName[a]);
235 if (existingAliName.
empty() && !
error)
error =
"No alignments found where target SAI has data";
237 for (
int a = 0; existingAliName[a] && !
error; ++a) {
238 calc4ali(existingAliName[a], gb_target_sai);
249 void SaiCalculator::calc4ali(
const char *ali,
GBDATA *gb_target_sai) {
254 string sai_comment =
"CalcSAI: ";
258 for (
int i = 0; inputSaiNames[i] && !
error; ++i) {
265 if (saiseq.getError()) {
266 error = saiseq.getError();
268 else if (saiseq.wasFound()) {
269 saiData.put(saiseq.read_string());
277 if (i>0) sai_comment +=
'+';
278 sai_comment += inputSaiNames[i];
285 sai_comment +=
" | ";
286 sai_comment += op.get_description();
294 if (!targetSeq.wasFound()) {
300 error = targetSeq.write_string(saidata.c_str());
323 void TEST_SequenceHandler() {
350 TEST_EXPECT_CONTAINS(mfdna.read_char_pntr(),
"8570068866840660555755577540000060080000008775740000000008876547667770006555555");
351 TEST_EXPECT_EQUAL (mfpro.read_char_pntr(),
"====050846555500000760006557055586550000055000555686654808508057566566754665055005800080550004500005666688====0=");
352 TEST_EXPECT_CONTAINS(pvdna.read_char_pntr(),
"..---664--2662440-44-61662664462-----4--4------662440.........442241224552");
353 TEST_EXPECT_CONTAINS(mldna.read_char_pntr(),
"00111101111111110111100010001100111111111111111111010111111111111100111111111100000011111111001001111111111111111");
354 TEST_EXPECT_EQUAL (mlpro.read_char_pntr(),
"0000101101000011111111111001100011001111100111000111100111011101011011100110100110111111001110011110111111000010");
359 TEST_EXPECT_EQUAL (mfpro.read_char_pntr(),
"====-5-8465555-----76---6557-5558655-----55---5556866548-85-8-57566566754665-55--58---8-55---45----5666688====-=");
363 TEST_EXPECT_EQUAL(mlpro.read_char_pntr(),
"1111010010111100000000000110011100110000011000111000011000100010100100011001011001000000110001100001000000111101");
401 TEST_EXPECT_ERROR_CONTAINS(codna.getError(),
"could not detect sequence data (at extended 'CONSENSUS'; alignment 'ali_dna')");
402 TEST_EXPECT_ERROR_CONTAINS(copro.getError(),
"cannot handle type as sequence- or associated-data (at extended 'CONSENSUS'; alignment 'ali_prot')");
408 TEST_EXPECT_NORESULT__NOERROREXPORTED(codna.read_char_pntr());
419 #define TEST_EXPECT_MAKEOP(type,cfg) do{ \
420 ErrorOrSaiOperatorPtr made = SaiOperator::make(type,cfg); \
421 if (made.hasError()) { \
422 TEST_EXPECT_NO_ERROR(made.getError().deliver()); \
424 op = made.getValue(); \
439 static void clone_test_sai(
GBDATA *gb_main,
const char *name) {
452 static GB_ERROR clone_SAI(
GBDATA *gb_main,
const char *source_name,
const char *dest_name) {
458 if (!gb_source) error =
"cant find source";
461 if (gb_dest_exists) error =
"dest exists";
475 void TEST_SaiCalculator() {
491 inputSais.
put(
"MAX_FREQUENCY");
499 inputSais.
put(
"markerline");
500 TEST_EXPECT_MAKEOP(
SOP_ACI,
"aci='translate(\"01\",\"-x\")'");
514 TEST_EXPECT_MAKEOP(
SOP_ACI,
"aci='translate(\"01\",\"10\")'");
529 TEST_EXPECT_EQUAL(&*bitstr,
"1111010010111100000000000110011100110000011000111000011000100010100100011001011001000000110001100001000000111101");
532 inputSais.
put(
"POS_VAR_BY_PARSIMONY");
533 TEST_EXPECT_MAKEOP(
SOP_ACI,
"aci='remove(\"-=.0\")|len|srt(0=-)'");
542 TEST_EXPECT_ERROR_CONTAINS(calculator.getError().deliver(),
"has no entries (at extended 'POS_VAR_BY_PARSIMONY'; alignment 'ali_prot')");
553 inputSais.
put(
"CONSENSUS");
554 TEST_EXPECT_MAKEOP(
SOP_ACI,
"aci='count(atAT);head(1)|mult|srt(0=-)'");
562 TEST_EXPECT_ERROR_CONTAINS(calculator.getError().deliver(),
"has no entries (at extended 'markerline'; alignment 'ali_dna_incomplete')");
571 clone_test_sai(gb_main,
"ml_cons1");
572 clone_test_sai(gb_main,
"markerline_aci");
578 TEST_EXPECT_MAKEOP(
SOP_ACI,
"aci='count(gcGC);head(1)|mult|srt(0=-)'");
607 const char *written_ascii =
"TEST_calcSAI_written.arb";
608 const char *expectd_ascii =
"TEST_calcSAI_expectd.arb";
614 #if defined(TEST_AUTO_UPDATE)
615 TEST_COPY_FILE(written_ascii, expectd_ascii);
GB_ERROR GB_copy_dropProtectMarksAndTempstate(GBDATA *dest, GBDATA *source)
GBDATA * GB_open(const char *path, const char *opent)
void put(const char *elem)
GBDATA * GB_child(GBDATA *father)
GB_ERROR GB_write_string(GBDATA *gbd, const char *s)
GBDATA * GBT_expect_SAI_rel_SAI_data(GBDATA *gb_sai_data, const char *name)
GBDATA * GBT_get_alignment(GBDATA *gb_main, const char *aliname)
GB_ERROR getError() const
void GBT_get_alignment_names(ConstStrArray &names, GBDATA *gbd)
char * GB_read_as_string(GBDATA *gbd)
const char * GBS_global_string(const char *templat,...)
char * GBS_string_eval(const char *insource, const char *icommand)
GB_ERROR create(GB_TYPES type, const char *fieldName)
GBDATA * GBT_expect_SAI(GBDATA *gb_main, const char *name)
int GB_unlink(const char *path)
char buffer[MESSAGE_BUFFERSIZE]
GB_ERROR GB_delete(GBDATA *&source)
GBDATA * GBT_find_SAI(GBDATA *gb_main, const char *name)
#define TEST_EXPECT_CONTAINS(str, part)
GB_ERROR GB_await_error()
GBDATA * GB_create_container(GBDATA *father, const char *key)
#define TEST_EXPECT(cond)
GB_TYPES GB_read_type(GBDATA *gbd)
GB_ERROR write_string(const char *data) const
GB_CSTR GB_read_key_pntr(GBDATA *gbd)
GBDATA * GB_create(GBDATA *father, const char *key, GB_TYPES type)
GB_ERROR GBT_set_default_alignment(GBDATA *gb_main, const char *alignment_name)
GB_ERROR GB_save_as(GBDATA *gbd, const char *path, const char *savetype)
const char * read_char_pntr() const
GBDATA * GB_clone(GBDATA *gb_destCont, GBDATA *gb_source)
#define TEST_REJECT(cond)
#define TEST_REJECT_NULL(n)
static void error(const char *msg)
char * read_string() const
#define TEST_EXPECT_ZERO_OR_SHOW_ERRNO(iocond)
SequenceHandler(GBDATA *gb_item_, const char *ali_)
GB_ERROR GB_write_int(GBDATA *gbd, long i)
GB_ERROR GB_set_temporary(GBDATA *gbd) __ATTR__USERESULT
#define TEST_EXPECT_NULL(n)
GB_ERROR close(GB_ERROR error)
GB_ERROR GBT_write_string(GBDATA *gb_container, const char *fieldpath, const char *content)
bool saiHasDataInAli(GBDATA *gb_sai_data, const char *saiName, const char *ali)
#define TEST_EXPECT_NO_ERROR(call)
#define TEST_EXPECT_ERROR_CONTAINS(call, part)
NOT4PERL GBDATA * GBT_create_sequence_data(GBDATA *species, const char *ali_name, const char *key, GB_TYPES type, int security_write)
char * GBT_get_default_alignment(GBDATA *gb_main)
GBDATA * GBT_find_SAI_rel_SAI_data(GBDATA *gb_sai_data, const char *name)
#define TEST_EXPECT_TEXTFILE_DIFFLINES(fgot, fwant, diff)
ARB_ERROR getError() const
GBDATA * GB_nextChild(GBDATA *child)
GB_transaction ta(gb_var)
GB_CSTR GB_read_char_pntr(GBDATA *gbd)
GBDATA * GBT_get_SAI_data(GBDATA *gb_main)
GB_CSTR GBT_get_name_or_description(GBDATA *gb_item)
#define TEST_EXPECT_EQUAL(expr, want)
GBDATA * GB_entry(GBDATA *father, const char *key)
char * GBS_global_string_copy(const char *templat,...)
void GB_close(GBDATA *gbd)
GB_ERROR GB_write_autoconv_string(GBDATA *gbd, const char *val)