/************************************************************************
* program to run testsuite for HyperLEDA. Based on "testsuite" routine
* from newLEDA package. Written by chil 
* Returns 0 as exit status if tests succeeded, 1 otherwise
*
* History:
*  $Log: $
*  2004/05/27, converted to C, chil
*  2004/05/24, created
*************************************************************************/
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "pleinpot/psql.h"

int exec_testsuite(void) {
  int istat;
  void *pg_res, *pg_res1;
  char *query, *query1;
  int length,tid,ival,ieval,artype,tstat,nres,ival1;
  double dval,deval,dval1;
  char *tname,*rtype,*rval,*erval,*rval1,*strbuf;
  int len0,len1,ntuples,ntuples1,i;
   
  query = (char *)malloc(1500*sizeof(char));
  query1 = (char *)malloc(1500*sizeof(char));
  tname = (char *)malloc(50*sizeof(char));
  rtype = (char *)malloc(50*sizeof(char));
  rval = (char *)malloc(100*sizeof(char));
  erval = (char *)malloc(100*sizeof(char));
  rval1 = (char *)malloc(100*sizeof(char));
  strbuf = (char *)malloc(100*sizeof(char));
  istat = 0;

  sprintf(query,"SELECT id,tname,tquery,rtype,rval,erval FROM testsuite WHERE category=0 ORDER by id");
  pg_res = plc_pghl_execquery(query);
  ntuples = plc_pghl_ntuples(pg_res);
  if (ntuples >= 1) {
    for (i=1; i<=ntuples; i++) {
      tstat = 0;
      tid = plc_pghl_getvali(pg_res, i-1, 0);
      tname = plc_pghl_getvalue(pg_res, i-1, 1);
      query1 = plc_pghl_getvalue(pg_res, i-1, 2);
      rtype = plc_pghl_getvalue(pg_res, i-1, 3);
      rval = plc_pghl_getvalue(pg_res, i-1, 4);
      erval = plc_pghl_getvalue(pg_res, i-1, 5);
      
      fprintf(stderr,"Processing test #%d : %s ...",tid,tname);
      /*printf("\n%s\n",query1);*/
      pg_res1 = plc_pghl_execquery(query1);
      ntuples1 = plc_pghl_ntuples(pg_res1);
      if (ntuples1 >= 1) {
	if (strncmp(rtype,"int",3) == 0) {
	  /*fprintf(stderr,"TYPE OF ARG IS integer\n");*/
	  ival = atoi(rval);
	  if (strlen(erval)>0) {
	    ieval = atoi(erval);
	  } 
	  else {
	    ieval = 0;
	  }
	  ival1 = plc_pghl_getvali(pg_res1, 0, 0);
	  /*printf("ival=%d ival1=%d ieval=%d\n",ival,ival1,ieval);*/
	  if (abs(ival-ival1) <= ieval) {
	    tstat = 0;
             fprintf(stderr,"ok\n");
	  } 
	  else {
	    tstat = 1;
	    fprintf(stderr,"failed (expect:%d) (get:%d)\n",ival,ival1);
	  }
	} 
	else if ((strncmp(rtype,"dou",3)==0) || (strncmp(rtype,"rea",3)==0)) {
	  /*fprintf(stderr,"TYPE OF ARG IS float\n");*/
	  dval = atof(rval);
	  if (strlen(erval)>0) {
             deval = atof(erval);
	  } 
	  else {
	    deval = 0;
	  }
	  dval1 = plc_pghl_getvald(pg_res1, 0, 0);
	  if (fabs(dval-dval1)<=deval) {
	    tstat = 0;
	    fprintf(stderr,"ok\n");
	  } 
	  else {
	    tstat = 1;
	    fprintf(stderr,"failed (expect:%g) (get:%g)\n",dval,dval1);
	  }
	} 
	else {
	  /*fprintf(stderr,"TYPE OF ARG IS text\n");*/
	  rval1 = plc_pghl_getvalue(pg_res1, 0, 0);
	  /* trim the trailing blanks */
	  for (len0 = strlen(rval); len0 >1 && rval[len0-1] == 32; len0 --)
	    rval[len0-1] = 0;
	  for (len1 = strlen(rval); len1 >1 && rval[len1-1] == 32; len1 --)
	    rval[len1-1] = 0;
	  if (len1 == len0) {
	    if (strncmp(rval,rval1,len0) == 0) {
	      tstat = 0;
	      fprintf(stderr,"ok\n");
	    } 
	    else {
	      tstat = 1;
	      fprintf(stderr,"failed (expect:%s) (get:%s)\n",rval,rval1);
	    }
	  } 
	  else {
	    tstat = 1;
	    fprintf(stderr,"failed (expect:%s) (get:%s)\n",rval,rval1);
	  }
	}
	plc_pghl_finishquery(pg_res1);
      } else if(ntuples<1) {
	fprintf(stderr,"failed\n");
	tstat = 2;
      }
      if (tstat != 0) istat=1;
    }
    strbuf = plc_pghl_getvalue(pg_res, 0, 0);
  } 
  else {
    istat = -1;
  }
  plc_pghl_finishquery(pg_res);
  
  return istat;
}


int main(int narg, char **carg) {
  int status = 0;

  plc_debut(0, narg, carg);

  if (plc_pghl_connect() != 0) {
    plc_ehsfatal("REGTESTS: regression tests failed, could not connect to DB");
  }
  status = exec_testsuite();
  plc_pghl_disconnect();
  if (status==0) {
    fprintf(stderr,"All the tests were passed successfully\n");
  } 
  else {
    fprintf(stderr,"At least one of the tests failed\n");
    status = 1;
  }
  return status;
}
/**** end *******************************************************************/
