/* * recenteditor_data.c * * A programmers editor * * Tests (ensure correct functionality of modules) * * Author: Dario Rodriguez dario@softhome.net * This program is licensed under the terms of GNU GPL v2.1+ */ #include #include #include #include #include #include #include #include "recenteditor_data.h" #define PREFIX "retest_" #define TEST_OK "OK" typedef struct test_t { char *name; char *(*fn)(redata_t *,char *,char *, int, int); char *param1; char *param2; int int1; int int2; } test_t; static char *malloc_data(int size, int seed); static int write_file(char *filename, char *buf, int buflen); char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2); char *test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed); int main(int argc, char *argv[]) { test_t tests[]={ {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0}, {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0}, {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0}, {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0}, {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0}, {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0}, {"testedit_add",test_edit,PREFIX "EDIT", "A,0,$,Testing add$",0,0}, }; redata_t *redata; int i; int nerrors; char *res; for(i=0,nerrors=0;i<(sizeof(tests)/sizeof(tests[0]));i++) { if((redata=redata_init())==NULL) { fprintf(stderr,"ERROR: problem initializing redata module\n"); return(1); } fprintf(stderr,"%s...",tests[i].name); res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2); if(strcmp(res,TEST_OK)==0) { fprintf(stderr," ok.\n"); } else { fprintf(stderr," ERROR: %s\n",res); nerrors++; } redata_free(redata),redata=NULL; } fprintf(stderr,"\n"); if(nerrors==0) fprintf(stderr,"All tests passed OK\n"); else fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,i); redata_free(redata),redata=NULL; return((nerrors==0)?0:1); } static char * malloc_data(int size, int seed) { char *mem; int i; if(size<=0 || (mem=malloc(size))==NULL) return(NULL); memset(mem,0,size); if(seed==0) { for(i=0;i,, */ ptr++; ptr+=(*ptr==',')?1:0; errno=0; l=(int)strtol(ptr,&ptr,10); if(errno!=0 || l<0 || l>cursize) { if(mem!=NULL) free(mem),mem=NULL; return("test_edit(): error parsing position"); } ptr+=(*ptr==',')?1:0; endcode=*ptr; ptr+=(*ptr!='\0')?1:0; ptrend=strchr(ptr,endcode); ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend; size=ptrend-ptr; if(k!=0) { /* editing */ memmove(mem+l+size,mem+l,cursize-l); memcpy(mem+l,ptr,size); redata_op_add(redata,ptr,size,l); } cursize+=size; ptr+=size; ptr+=(*ptr!='\0')?1:0; } else { if(mem!=NULL) free(mem),mem=NULL; snprintf(errorbuf,sizeof(errorbuf), "test_edit(): unknown edit action at pos %i: '%c' (progress: %s)",(int) (ptr-edits),*ptr,progress); errorbuf[sizeof(errorbuf)-1]='\0'; return(errorbuf); } if(k!=0) { redata_hash(redata,hash129_redata); redata_memhash(redata,mem,cursize,hash129_mem); if(strcmp(hash129_redata,hash129_mem)!=0) { if(mem!=NULL) free(mem),mem=NULL; snprintf(errorbuf,sizeof(errorbuf), "corrupted edit before pos %i (progress: %s)",(int) (ptr-edits),progress); errorbuf[sizeof(errorbuf)-1]='\0'; return(errorbuf); } redata_op_undo(redata); redata_hash(redata,hash129_redata); if(strcmp(hash129_redata,hash129_memold)!=0) { if(mem!=NULL) free(mem),mem=NULL; snprintf(errorbuf,sizeof(errorbuf), "corrupted undo before pos %i (progress: %s)",(int) (ptr-edits),progress); errorbuf[sizeof(errorbuf)-1]='\0'; return(errorbuf); } redata_op_redo(redata); redata_hash(redata,hash129_redata); if(strcmp(hash129_redata,hash129_mem)!=0) { if(mem!=NULL) free(mem),mem=NULL; snprintf(errorbuf,sizeof(errorbuf), "corrupted redo before pos %i (progress: %s)",(int) (ptr-edits),progress); errorbuf[sizeof(errorbuf)-1]='\0'; return(errorbuf); } } } if(k==0) { /* reserve memory, do init */ if((mem=malloc_data(cursize,seed))==NULL) return("insuf. mem. for temp. buffer"); if(write_file(filename,mem,filesize)==-1) return("couldn't create temporary file"); if(redata_load(redata,filename,0)!=0) { unlink(filename); return("couldn't load file"); } unlink(filename); } } if(mem!=NULL) free(mem),mem=NULL; return(TEST_OK); }