/*
 * 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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <limits.h>
#include <fcntl.h>

#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;

char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);

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},

        };
        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 tests failed of %i total tests.\n",nerrors,i);
        redata_free(redata),redata=NULL;
        return((nerrors==0)?0:1);
}

char *
test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
{
        char *mem;
        char hash129_pre[129];
        char hash129_post[129];
        int fd,i;
fprintf(stderr,"\ntest_newfile(%s%s%s,%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(dummy!=NULL)?dummy:"NULL",filesize,dummy2);
        /* prepare file for loading */
        if((mem=malloc(filesize))==NULL)
                return("insuf. mem. for temp. buffer");
        memset(mem,0,filesize);
        for(i=0;i<filesize;i++)
                ((unsigned char *)mem)[i]=(filesize%256);
        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
                free(mem),mem=NULL;
                return("couldn't create temporary file");
        }
        write(fd,mem,filesize);
        close(fd),fd=-1;
        redata_filehash(redata,filename,hash129_pre);
        free(mem),mem=NULL;
        /* load file */
        if(redata_load(redata,filename,0)!=0) {
                unlink(filename);
                return("couldn't load file");
        }
        unlink(filename);
        redata_hash(redata,hash129_post);
        if(strcmp(hash129_pre,hash129_post)!=0)
                return("loaded file is corrupted");
        /* save file */
        redata_save(redata,filename);
        hash129_post[0]='\0';
        redata_filehash(redata,filename,hash129_post);
        if(strcmp(hash129_pre,hash129_post)!=0)
                return("saved file is corrupted");
        unlink(filename);
        return(TEST_OK);
}