/** Read a line specifying an atom, store it in the config. Use supplied types to add assign radius and class. Returns FREESASA_WARN for duplicates. Returns FREESASA_FAIL for syntax errors or memory allocation errors. FREESASA_SUCCESS else. */ static int read_atoms_line(struct classifier_config *config, const struct classifier_types *types, const char* line) { size_t blen=100; char buf1[blen], buf2[blen], buf3[blen]; int res, type, atom; if (sscanf(line,"%s %s %s",buf1,buf2,buf3) == 3) { type = find_string(types->name, buf3, types->n_types); if (type < 0) return freesasa_fail("Unknown atom type '%s' in line '%s'",buf3,line); res = add_residue(config,buf1); if (res == FREESASA_FAIL) return fail_msg(""); atom = add_atom(config->residue[res], buf2, types->type_radius[type], types->type_class[type]); if (atom == FREESASA_FAIL) return fail_msg(""); if (atom == FREESASA_WARN) return FREESASA_WARN; } else { return freesasa_fail("in %s(): Could not parse line '%s', expecting triplet of type " "'RESIDUE ATOM CLASS', for example 'ALA CB C_ALI'.", __func__, line); } return FREESASA_SUCCESS; }
END_TEST START_TEST (test_classifier) { freesasa_set_verbosity(FREESASA_V_SILENT); set_fail_freq(1); ck_assert_ptr_eq(classifier_types_new(),NULL); ck_assert_ptr_eq(classifier_residue_new("A"),NULL); ck_assert_ptr_eq(classifier_config_new(),NULL); for (int i = 1; i < 5; ++i) { set_fail_freq(10000); struct classifier_types *types = classifier_types_new(); struct classifier_residue *res = classifier_residue_new("ALA"); struct classifier_config *cfg = classifier_config_new(); if (i < 3) { set_fail_freq(i); ck_assert_int_eq(add_class(types,"A"),FREESASA_FAIL); set_fail_freq(i); ck_assert_int_eq(add_type(types,"a","A",1.0),FREESASA_FAIL); } set_fail_freq(i); ck_assert_int_eq(add_atom(res,"A",1.0,0),FREESASA_FAIL); set_fail_freq(i); ck_assert_int_eq(add_residue(cfg,"A"),FREESASA_FAIL); classifier_types_free(types); classifier_residue_free(res); classifier_config_free(cfg); } // don't test all levels, but make sure errors in low level // allocation propagates to the interface FILE *config = fopen(SHAREDIR "naccess.config","r"); ck_assert_ptr_ne(config, NULL); for (int i = 1; i < 50; ++i) { set_fail_freq(i); ck_assert_ptr_eq(freesasa_classifier_from_file(config),NULL); rewind(config); } fclose(config); freesasa_set_verbosity(FREESASA_V_NORMAL); }