annotate libtests/test_utils_lib.h @ 493:1950d76be128 api-inversion

Even more audiodb_query() deletion Make result_present_or_fail() be a little bit friendlier when comparing distances.
author mas01cr
date Sat, 10 Jan 2009 15:33:11 +0000
parents 4cb6c611f812
children c291e9201a3c
rev   line source
mas01cr@487 1 #include <sys/types.h>
mas01cr@487 2 #include <sys/stat.h>
mas01cr@487 3 #include <math.h>
mas01cr@487 4 #include <unistd.h>
mas01cr@487 5 #include <fcntl.h>
mas01cr@487 6 #include <string.h>
mas01cr@487 7 #include <stdio.h>
mas01cr@487 8
mas01cr@489 9 #define TESTDB "testdb"
mas01cr@489 10
mas01cr@487 11 void clean_remove_db(char *dbname);
mas01ik@355 12 int testoneresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, double Dist,double Qpos,double Spos);
mas01ik@355 13 void maketestfile(char * filename, int * ivals, double * dvals, int dvalsize);
mas01cr@379 14 int testoneradiusresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, int count);
mas01ik@355 15 void makekeylistfile(char * filename, char * item);
mas01ik@355 16
mas01cr@487 17 void clean_remove_db(char * dbname) {
mas01cr@487 18 unlink(dbname);
mas01ik@355 19 }
mas01ik@355 20
mas01ik@355 21 int testoneresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, double Dist,double Qpos,double Spos){
mas01ik@355 22
mas01ik@355 23 int ret=0;
mas01ik@355 24 double tolerance=.0001;
mas01ik@355 25
mas01ik@355 26
mas01ik@355 27
mas01ik@355 28 if (strcmp(Rlist,myadbqueryresult->Rlist[i])){
mas01ik@355 29 ret=-1;
mas01ik@355 30 }
mas01ik@355 31
mas01ik@355 32
mas01cr@487 33 if (fabs((double)Dist - (double)myadbqueryresult->Dist[i]) > tolerance){
mas01ik@355 34 ret=-1;
mas01ik@355 35 }
mas01ik@355 36
mas01cr@487 37 if (fabs((double)Qpos - (double)myadbqueryresult->Qpos[i]) > tolerance){
mas01ik@355 38 ret=-1;
mas01ik@355 39 }
mas01ik@355 40
mas01cr@487 41 if (fabs((double)Spos - (double)myadbqueryresult->Spos[i]) > tolerance){
mas01ik@355 42 ret=-1;
mas01ik@355 43 }
mas01ik@355 44
mas01ik@355 45 return ret;
mas01ik@355 46 }
mas01ik@355 47
mas01ik@355 48
mas01cr@379 49 int testoneradiusresult(adb_queryresult_ptr myadbqueryresult, int i, char * Rlist, int count){
mas01ik@355 50
mas01ik@355 51 int ret=0;
mas01ik@355 52
mas01ik@355 53 if (strcmp(Rlist,myadbqueryresult->Rlist[i])){
mas01ik@355 54 ret=-1;
mas01ik@355 55 }
mas01ik@355 56
mas01cr@379 57 /* KLUDGE: at the moment, the structure returned from "sequence"
mas01cr@379 58 queries with a radius has two unused fields, Dist and Qpos, and
mas01cr@379 59 the Spos field is punned to indicate the count of hits from
mas01cr@379 60 that track. This is really ugly and needs to die. */
mas01cr@379 61 if (count != myadbqueryresult->Spos[i]) {
mas01ik@355 62 ret=-1;
mas01ik@355 63 }
mas01ik@355 64
mas01ik@355 65 return ret;
mas01ik@355 66 }
mas01ik@355 67
mas01ik@355 68 void maketestfile(char * filename, int * ivals, double * dvals, int dvalsize) {
mas01ik@355 69
mas01ik@355 70 FILE * myfile;
mas01ik@355 71
mas01ik@355 72 myfile=fopen(filename,"w");
mas01ik@355 73 fwrite(ivals,sizeof(int),1,myfile);
mas01ik@355 74 fwrite(dvals,sizeof(double),dvalsize,myfile);
mas01ik@355 75 fflush(myfile);
mas01ik@355 76 fclose(myfile);
mas01ik@355 77
mas01ik@355 78 /* should probably test for success, but then it is a test suite already... */
mas01ik@355 79 }
mas01ik@355 80
mas01ik@355 81 void makekeylistfile(char * filename, char * item){
mas01ik@355 82
mas01ik@355 83 FILE * myfile;
mas01ik@355 84
mas01ik@355 85 myfile=fopen(filename,"w");
mas01ik@355 86 fprintf(myfile,"%s\n",item);
mas01ik@355 87 fflush(myfile);
mas01ik@355 88 fclose(myfile);
mas01ik@355 89
mas01ik@355 90 }
mas01cr@489 91
mas01cr@493 92 int close_enough(double a, double b, double epsilon) {
mas01cr@493 93 return (fabs(a-b) < epsilon);
mas01cr@493 94 }
mas01cr@493 95
mas01cr@489 96 int result_position(adb_query_results_t *r, const char *key, float dist, uint32_t qpos, uint32_t ipos) {
mas01cr@489 97 for(uint32_t k = 0; k < r->nresults; k++) {
mas01cr@489 98 adb_result_t result = r->results[k];
mas01cr@493 99 if(close_enough(dist, result.dist, 1e-4) && (qpos == result.qpos) &&
mas01cr@489 100 (ipos == result.ipos) && !(strcmp(key, result.key))) {
mas01cr@489 101 return k;
mas01cr@489 102 }
mas01cr@489 103 }
mas01cr@489 104 return -1;
mas01cr@489 105 }
mas01cr@489 106
mas01cr@489 107 #define result_present_or_fail(r, k, d, q, i) \
mas01cr@489 108 if(result_position(r, k, d, q, i) < 0) return 1;
mas01cr@489 109