mas01cr@487: #include mas01cr@487: #include mas01cr@487: #include mas01cr@487: #include mas01cr@487: #include mas01cr@487: #include mas01cr@487: #include mas01cr@487: mas01cr@489: #define TESTDB "testdb" mas01cr@489: mas01cr@487: void clean_remove_db(char *dbname); mas01ik@355: int testoneresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, double Dist,double Qpos,double Spos); mas01ik@355: void maketestfile(char * filename, int * ivals, double * dvals, int dvalsize); mas01cr@379: int testoneradiusresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, int count); mas01ik@355: void makekeylistfile(char * filename, char * item); mas01ik@355: mas01cr@487: void clean_remove_db(char * dbname) { mas01cr@487: unlink(dbname); mas01ik@355: } mas01ik@355: mas01ik@355: int testoneresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, double Dist,double Qpos,double Spos){ mas01ik@355: mas01ik@355: int ret=0; mas01ik@355: double tolerance=.0001; mas01ik@355: mas01ik@355: mas01ik@355: mas01ik@355: if (strcmp(Rlist,myadbqueryresult->Rlist[i])){ mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01ik@355: mas01cr@487: if (fabs((double)Dist - (double)myadbqueryresult->Dist[i]) > tolerance){ mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01cr@487: if (fabs((double)Qpos - (double)myadbqueryresult->Qpos[i]) > tolerance){ mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01cr@487: if (fabs((double)Spos - (double)myadbqueryresult->Spos[i]) > tolerance){ mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01ik@355: return ret; mas01ik@355: } mas01ik@355: mas01ik@355: mas01cr@379: int testoneradiusresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, int count){ mas01ik@355: mas01ik@355: int ret=0; mas01ik@355: mas01ik@355: if (strcmp(Rlist,myadbqueryresult->Rlist[i])){ mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01cr@379: /* KLUDGE: at the moment, the structure returned from "sequence" mas01cr@379: queries with a radius has two unused fields, Dist and Qpos, and mas01cr@379: the Spos field is punned to indicate the count of hits from mas01cr@379: that track. This is really ugly and needs to die. */ mas01cr@379: if (count != myadbqueryresult->Spos[i]) { mas01ik@355: ret=-1; mas01ik@355: } mas01ik@355: mas01ik@355: return ret; mas01ik@355: } mas01ik@355: mas01ik@355: void maketestfile(char * filename, int * ivals, double * dvals, int dvalsize) { mas01ik@355: mas01ik@355: FILE * myfile; mas01ik@355: mas01ik@355: myfile=fopen(filename,"w"); mas01ik@355: fwrite(ivals,sizeof(int),1,myfile); mas01ik@355: fwrite(dvals,sizeof(double),dvalsize,myfile); mas01ik@355: fflush(myfile); mas01ik@355: fclose(myfile); mas01ik@355: mas01ik@355: /* should probably test for success, but then it is a test suite already... */ mas01ik@355: } mas01ik@355: mas01ik@355: void makekeylistfile(char * filename, char * item){ mas01ik@355: mas01ik@355: FILE * myfile; mas01ik@355: mas01ik@355: myfile=fopen(filename,"w"); mas01ik@355: fprintf(myfile,"%s\n",item); mas01ik@355: fflush(myfile); mas01ik@355: fclose(myfile); mas01ik@355: mas01ik@355: } mas01cr@489: mas01cr@493: int close_enough(double a, double b, double epsilon) { mas01cr@493: return (fabs(a-b) < epsilon); mas01cr@493: } mas01cr@493: mas01cr@489: int result_position(adb_query_results_t *r, const char *key, float dist, uint32_t qpos, uint32_t ipos) { mas01cr@489: for(uint32_t k = 0; k < r->nresults; k++) { mas01cr@489: adb_result_t result = r->results[k]; mas01cr@493: if(close_enough(dist, result.dist, 1e-4) && (qpos == result.qpos) && mas01cr@489: (ipos == result.ipos) && !(strcmp(key, result.key))) { mas01cr@489: return k; mas01cr@489: } mas01cr@489: } mas01cr@489: return -1; mas01cr@489: } mas01cr@489: mas01cr@489: #define result_present_or_fail(r, k, d, q, i) \ mas01cr@489: if(result_position(r, k, d, q, i) < 0) return 1; mas01cr@489: