Browse code

renamed recenteditor_data to re_data, recenteditor_tests to re_tests

Dario Rodriguez authored on 01/04/2019 21:26:29
Showing 1 changed files
1 1
deleted file mode 100644
... ...
@@ -1,374 +0,0 @@
1
-/*
2
- * recenteditor_data.c
3
- *
4
- * A programmers editor
5
- *
6
- * Tests (ensure correct functionality of modules)
7
- *
8
- * Author: Dario Rodriguez dario@softhome.net
9
- * This program is licensed under the terms of GNU GPL v2.1+
10
- */
11
-
12
-#include <stdio.h>
13
-#include <stdlib.h>
14
-#include <unistd.h>
15
-#include <string.h>
16
-#include <limits.h>
17
-#include <fcntl.h>
18
-#include <errno.h>
19
-
20
-#include "recenteditor_data.h"
21
-
22
-#define PREFIX "retest_"
23
-#define TEST_OK "OK"
24
-
25
-typedef struct test_t  {
26
-        char *name;
27
-        char *(*fn)(redata_t *,char *,char *, int, int);
28
-        char *param1;
29
-        char *param2;
30
-        int int1;
31
-        int int2;
32
-} test_t;
33
-
34
-static char *malloc_data(int size, int seed);
35
-static int write_file(char *filename, char *buf, int buflen);
36
-
37
-char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);
38
-char *test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed);
39
-
40
-int
41
-main(int argc, char *argv[])
42
-{
43
-        static int sizes[]={-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,31,32,33,63,64,65,127,128,129,1023,1024,1025,16384};
44
-        test_t tests[]={
45
-                {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
46
-                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
47
-                {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
48
-                {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
49
-                {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
50
-                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
51
-                {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
52
-                {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
53
-                {"testedit_move",test_edit,PREFIX "EDIT", "A0$This is a text to move.$M17,7$ move$",0,0},
54
-        };
55
-        int flag_exit=0,flag_all=0;
56
-        redata_t *redata;
57
-        int i,s;
58
-        int nerrors,total;
59
-        char *res;
60
-        for(i=1;i<argc;i++) {
61
-                if(strcmp(argv[i],"--help")==0) {
62
-                        fprintf(stderr,"Syntax: %s [--all] [--exit] [--help]\nExplanation:\n\t--all: do even the slow tests\n\t--exit: exit program at first unsuccessful test\n\t--help: this text\n",argv[0]);
63
-                        return(1);
64
-                } else if(strcmp(argv[i],"--all")==0) {
65
-                        flag_all=1;
66
-                } else if(strcmp(argv[i],"--exit")==0) {
67
-                        flag_exit=1;
68
-                }
69
-        }
70
-        nerrors=0;
71
-        total=0;
72
-        for(s=0;s<(sizeof(sizes)/sizeof(sizes[0]));s++) {
73
-                if(sizes[s]!=-1)
74
-                        fprintf(stderr,"SIZE: %i\n",sizes[s]);
75
-                for(i=0;i<(sizeof(tests)/sizeof(tests[0]));i++,total++) {
76
-                        if(!flag_all && tests[i].int1>=1024)
77
-                                continue; /* too slow: skip unless testing --all */
78
-                        if((redata=redata_init())==NULL) {
79
-                                fprintf(stderr,"ERROR: problem initializing redata module\n");
80
-                                return(1);
81
-                        }
82
-                        if(sizes[s]!=-1)
83
-                                redata_config_chunkdatasize(redata,sizes[s]);
84
-                        fprintf(stderr,"%s...",tests[i].name);
85
-                        res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
86
-                                if(strcmp(res,TEST_OK)==0) {
87
-                                fprintf(stderr," ok.\n");
88
-                        } else {
89
-                                fprintf(stderr," ERROR: %s\n",res);
90
-                                nerrors++;
91
-                                if(flag_exit) {
92
-                                        /* exit on first error */
93
-                                        s=sizeof(sizes)/sizeof(sizes[0]);
94
-                                        break;
95
-                                }
96
-                        }
97
-                        redata_free(redata),redata=NULL;
98
-                }
99
-                fprintf(stderr,"\n");
100
-        }
101
-        if(nerrors==0)
102
-                fprintf(stderr,"All %i tests passed OK\n",total);
103
-        else
104
-                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,total);
105
-        redata_free(redata),redata=NULL;
106
-        return((nerrors==0)?0:1);
107
-}
108
-
109
-static char *
110
-malloc_data(int size, int seed)
111
-{
112
-        char *mem;
113
-        int i;
114
-        if(size<=0 || (mem=malloc(size))==NULL)
115
-                return(NULL);
116
-        memset(mem,0,size);
117
-        if(seed==0) {
118
-                for(i=0;i<size;i++)
119
-                        ((unsigned char *)mem)[i]=(i%256);
120
-        } else {
121
-                srandom(*((unsigned int *)(&seed)));
122
-                for(i=0;i<size;i++)
123
-                        ((unsigned char *)mem)[i]=(random()&0xff);
124
-        }
125
-        return(mem);
126
-
127
-}
128
-
129
-static int
130
-write_file(char *filename, char *buf, int buflen)
131
-{
132
-        int fd;
133
-        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
134
-                free(buf),buf=NULL;
135
-                return(-1);
136
-        }
137
-        write(fd,buf,buflen);
138
-        close(fd),fd=-1;
139
-        return(0);
140
-}
141
-
142
-char *
143
-test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
144
-{
145
-        char *mem;
146
-        char hash129_pre[129];
147
-        char hash129_post[129];
148
-fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(dummy!=NULL)?"\"":"",(dummy!=NULL)?dummy:"NULL",(dummy!=NULL)?"\"":"",filesize,dummy2);
149
-        /* prepare file for loading */
150
-        if((mem=malloc_data(filesize,0))==NULL)
151
-                return("insuf. mem. for temp. buffer");
152
-        if(write_file(filename,mem,filesize)==-1)
153
-                return("couldn't create temporary file");
154
-        redata_filehash(redata,filename,hash129_pre);
155
-        free(mem),mem=NULL;
156
-        /* load file */
157
-        if(redata_load(redata,filename,0)!=0) {
158
-                unlink(filename);
159
-                return("couldn't load file");
160
-        }
161
-        unlink(filename);
162
-        redata_hash(redata,hash129_post);
163
-        if(strcmp(hash129_pre,hash129_post)!=0)
164
-                return("loaded file is corrupted");
165
-        /* save file */
166
-        redata_save(redata,filename);
167
-        hash129_post[0]='\0';
168
-        redata_filehash(redata,filename,hash129_post);
169
-        if(strcmp(hash129_pre,hash129_post)!=0)
170
-                return("saved file is corrupted");
171
-        unlink(filename);
172
-        return(TEST_OK);
173
-}
174
-
175
-char *
176
-test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
177
-{
178
-        static char errorbuf[256];
179
-        char progress[256];
180
-        int k;
181
-        int cursize,maxsize;
182
-        char *ptr;
183
-        int l,o;
184
-        char *mem;
185
-        char endcode;
186
-        char *ptrend;
187
-        int size;
188
-        char hash129_memold[129];
189
-        char hash129_mem[129];
190
-        char hash129_redata[129];
191
-        mem=NULL;
192
-fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(edits!=NULL)?"\"":"",(edits!=NULL)?edits:"NULL",(edits!=NULL)?"\"":"",filesize,seed);
193
-        /* two passes: k==0 count needed memory, k==1 do edits */
194
-        for(k=0,maxsize=cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
195
-                for(ptr=edits;*ptr!='\0';) {
196
-                        if(k!=0) {
197
-                                redata_memhash(redata,mem,cursize,hash129_memold);
198
-                        }
199
-                        if((l=strlen(progress))<(sizeof(progress)-1)) {
200
-                                progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
201
-                                progress[l+1]='\0';
202
-                        }
203
-if(k!=0) unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
204
-if(k!=0) redata_save(redata,"test.pre");
205
-                        if(*ptr=='A') {
206
-                                /* A<insertpos><endchar><text><endchar> */
207
-                                ptr++;
208
-                                errno=0;
209
-                                l=(int)strtol(ptr,&ptr,10);
210
-                                if(errno!=0 || l<0 || l>cursize) {
211
-                                        if(mem!=NULL)
212
-                                                free(mem),mem=NULL;
213
-                                        return("test_edit(): error parsing position");
214
-                                }
215
-                                endcode=*ptr;
216
-                                ptr+=(*ptr!='\0')?1:0;
217
-                                ptrend=strchr(ptr,endcode);
218
-                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
219
-                                size=ptrend-ptr;
220
-                                if(k!=0) {
221
-                                        /* editing */
222
-                                        memmove(mem+l+size,mem+l,cursize-l);
223
-                                        memcpy(mem+l,ptr,size);
224
-                                        redata_op_add(redata,l,ptr,size,NULL);
225
-                                }
226
-                                cursize+=size;
227
-                                ptr+=size;
228
-                                ptr+=(*ptr!='\0')?1:0;
229
-                        } else if(*ptr=='D') {
230
-                                /* D<delpos><endchar><text><endchar> */
231
-                                ptr++;
232
-                                errno=0;
233
-                                l=(int)strtol(ptr,&ptr,10);
234
-                                if(errno!=0) {
235
-                                        if(mem!=NULL)
236
-                                                free(mem),mem=NULL;
237
-                                        return("test_edit(): error parsing position");
238
-                                }
239
-                                endcode=*ptr;
240
-                                ptr+=(*ptr!='\0')?1:0;
241
-                                ptrend=strchr(ptr,endcode);
242
-                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
243
-                                size=ptrend-ptr;
244
-                                if(l<0 || (l+size)>cursize) {
245
-                                        if(mem!=NULL)
246
-                                                free(mem),mem=NULL;
247
-                                        return("test_edit(): internal error: invalid pasition or size");
248
-                                }
249
-                                if(k!=0) {
250
-                                        if(memcmp(mem+l,ptr,size)!=0
251
-                                          || redata_data_compare(redata,l,ptr,size)!=0) {
252
-                                                if(mem!=NULL)
253
-                                                        free(mem),mem=NULL;
254
-                                                return("test_edit(): internal error: deletion data doesn't match");
255
-                                        }
256
-                                        /* editing */
257
-                                        memmove(mem+l,mem+l+size,cursize-l-size);
258
-                                        redata_op_del(redata,l,size,NULL);
259
-                                }
260
-                                cursize-=size;
261
-                                ptr+=size;
262
-                                ptr+=(*ptr!='\0')?1:0;
263
-                        } else if(*ptr=='M') {
264
-                                /* M<origpos>,<destpos><endchar><text><endchar> */
265
-                                ptr++;
266
-                                errno=0;
267
-                                l=(int)strtol(ptr,&ptr,10);
268
-                                if(errno!=0) {
269
-                                        if(mem!=NULL)
270
-                                                free(mem),mem=NULL;
271
-                                        return("test_edit(): error parsing position");
272
-                                }
273
-                                ptr+=(*ptr==',')?1:0;
274
-                                errno=0;
275
-                                o=(int)strtol(ptr,&ptr,10);
276
-                                if(errno!=0) {
277
-                                        if(mem!=NULL)
278
-                                                free(mem),mem=NULL;
279
-                                        return("test_edit(): error parsing position");
280
-                                }
281
-                                endcode=*ptr;
282
-                                ptr+=(*ptr!='\0')?1:0;
283
-                                ptrend=strchr(ptr,endcode);
284
-                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
285
-                                size=ptrend-ptr;
286
-                                if(l<0 || (l+size)>cursize || o<0 || o>cursize || (o>=l && o<(l+size))) {
287
-                                        if(mem!=NULL)
288
-                                                free(mem),mem=NULL;
289
-                                        return("test_edit(): internal error: invalid pasition or size");
290
-                                }
291
-                                if(k!=0) {
292
-                                        if(memcmp(mem+l,ptr,size)!=0
293
-                                          || redata_data_compare(redata,l,ptr,size)!=0) {
294
-                                                if(mem!=NULL)
295
-                                                        free(mem),mem=NULL;
296
-                                                return("test_edit(): internal error: move data doesn't match");
297
-                                        }
298
-                                        /* editing */
299
-                                        if(l>o) {
300
-                                                memmove(mem+o+size,mem+o,l-o);
301
-                                                memcpy(mem+o,ptr,size);
302
-                                        } else {
303
-                                                memmove(mem+l,mem+l+size,o-l-size);
304
-                                                memcpy(mem+o-size,ptr,size);
305
-                                        }
306
-                                        redata_op_move(redata,l,size,o,NULL);
307
-                                }
308
-                                ptr+=size;
309
-                                ptr+=(*ptr!='\0')?1:0;
310
-                        } else {
311
-                                if(mem!=NULL)
312
-                                        free(mem),mem=NULL;
313
-                                snprintf(errorbuf,sizeof(errorbuf),
314
-                                  "test_edit(): unknown edit action at pos %i: '%c' (progress: %s)",(int) (ptr-edits),*ptr,progress);
315
-                                errorbuf[sizeof(errorbuf)-1]='\0';
316
-                                return(errorbuf);
317
-                        }
318
-                        if(cursize>maxsize)
319
-                                maxsize=cursize;
320
-                        if(k!=0) {
321
-if(k!=0) redata_save(redata,"test.post");
322
-                                redata_hash(redata,hash129_redata);
323
-                                redata_memhash(redata,mem,cursize,hash129_mem);
324
-                                if(strcmp(hash129_redata,hash129_mem)!=0) {
325
-                                        if(mem!=NULL)
326
-                                                free(mem),mem=NULL;
327
-                                        snprintf(errorbuf,sizeof(errorbuf),
328
-                                          "corrupted edit before pos %i (progress: %s)",(int) (ptr-edits),progress);
329
-                                        errorbuf[sizeof(errorbuf)-1]='\0';
330
-                                        return(errorbuf);
331
-                                }
332
-                                redata_op_undo(redata);
333
-redata_save(redata,"test.undo");
334
-                                redata_hash(redata,hash129_redata);
335
-                                if(strcmp(hash129_redata,hash129_memold)!=0) {
336
-                                        if(mem!=NULL)
337
-                                                free(mem),mem=NULL;
338
-                                        snprintf(errorbuf,sizeof(errorbuf),
339
-                                          "corrupted undo before pos %i (progress: %s)",(int) (ptr-edits),progress);
340
-                                        errorbuf[sizeof(errorbuf)-1]='\0';
341
-                                        return(errorbuf);
342
-                                }
343
-                                redata_op_redo(redata);
344
-redata_save(redata,"test.redo");
345
-                                redata_hash(redata,hash129_redata);
346
-                                if(strcmp(hash129_redata,hash129_mem)!=0) {
347
-                                        if(mem!=NULL)
348
-                                                free(mem),mem=NULL;
349
-                                        snprintf(errorbuf,sizeof(errorbuf),
350
-                                          "corrupted redo before pos %i (progress: %s)",(int) (ptr-edits),progress);
351
-                                        errorbuf[sizeof(errorbuf)-1]='\0';
352
-                                        return(errorbuf);
353
-                                }
354
-                        }
355
-                }
356
-                if(k==0) {
357
-                        /* reserve memory, do init */
358
-                        if((mem=malloc_data(maxsize,seed))==NULL)
359
-                                return("insuf. mem. for temp. buffer");
360
-                        if(write_file(filename,mem,filesize)==-1)
361
-                                return("couldn't create temporary file");
362
-                        if(redata_load(redata,filename,0)!=0) {
363
-                                unlink(filename);
364
-                                return("couldn't load file");
365
-                        }
366
-                        unlink(filename);
367
-                }
368
-        }
369
-        if(mem!=NULL)
370
-                free(mem),mem=NULL;
371
-unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
372
-        return(TEST_OK);
373
-}
374
-
Browse code

Add move test. Fix op_move code.

Dario Rodriguez authored on 18/03/2019 21:56:38
Showing 1 changed files
... ...
@@ -43,26 +43,38 @@ main(int argc, char *argv[])
43 43
         static int sizes[]={-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,31,32,33,63,64,65,127,128,129,1023,1024,1025,16384};
44 44
         test_t tests[]={
45 45
                 {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
46
-#if 0 /* more newfile tests (VERY slow) */
47 46
                 {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
48 47
                 {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
49 48
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
50 49
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
51 50
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
52
-#endif
53 51
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
54 52
                 {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
53
+                {"testedit_move",test_edit,PREFIX "EDIT", "A0$This is a text to move.$M17,7$ move$",0,0},
55 54
         };
55
+        int flag_exit=0,flag_all=0;
56 56
         redata_t *redata;
57 57
         int i,s;
58 58
         int nerrors,total;
59 59
         char *res;
60
+        for(i=1;i<argc;i++) {
61
+                if(strcmp(argv[i],"--help")==0) {
62
+                        fprintf(stderr,"Syntax: %s [--all] [--exit] [--help]\nExplanation:\n\t--all: do even the slow tests\n\t--exit: exit program at first unsuccessful test\n\t--help: this text\n",argv[0]);
63
+                        return(1);
64
+                } else if(strcmp(argv[i],"--all")==0) {
65
+                        flag_all=1;
66
+                } else if(strcmp(argv[i],"--exit")==0) {
67
+                        flag_exit=1;
68
+                }
69
+        }
60 70
         nerrors=0;
61 71
         total=0;
62 72
         for(s=0;s<(sizeof(sizes)/sizeof(sizes[0]));s++) {
63 73
                 if(sizes[s]!=-1)
64 74
                         fprintf(stderr,"SIZE: %i\n",sizes[s]);
65 75
                 for(i=0;i<(sizeof(tests)/sizeof(tests[0]));i++,total++) {
76
+                        if(!flag_all && tests[i].int1>=1024)
77
+                                continue; /* too slow: skip unless testing --all */
66 78
                         if((redata=redata_init())==NULL) {
67 79
                                 fprintf(stderr,"ERROR: problem initializing redata module\n");
68 80
                                 return(1);
... ...
@@ -76,11 +88,11 @@ main(int argc, char *argv[])
76 88
                         } else {
77 89
                                 fprintf(stderr," ERROR: %s\n",res);
78 90
                                 nerrors++;
79
-#if 0
80
-/* exit on first error */
81
-s=sizeof(sizes)/sizeof(sizes[0]);
82
-break;
83
-#endif
91
+                                if(flag_exit) {
92
+                                        /* exit on first error */
93
+                                        s=sizeof(sizes)/sizeof(sizes[0]);
94
+                                        break;
95
+                                }
84 96
                         }
85 97
                         redata_free(redata),redata=NULL;
86 98
                 }
... ...
@@ -168,7 +180,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
168 180
         int k;
169 181
         int cursize,maxsize;
170 182
         char *ptr;
171
-        int l;
183
+        int l,o;
172 184
         char *mem;
173 185
         char endcode;
174 186
         char *ptrend;
... ...
@@ -248,6 +260,53 @@ if(k!=0) redata_save(redata,"test.pre");
248 260
                                 cursize-=size;
249 261
                                 ptr+=size;
250 262
                                 ptr+=(*ptr!='\0')?1:0;
263
+                        } else if(*ptr=='M') {
264
+                                /* M<origpos>,<destpos><endchar><text><endchar> */
265
+                                ptr++;
266
+                                errno=0;
267
+                                l=(int)strtol(ptr,&ptr,10);
268
+                                if(errno!=0) {
269
+                                        if(mem!=NULL)
270
+                                                free(mem),mem=NULL;
271
+                                        return("test_edit(): error parsing position");
272
+                                }
273
+                                ptr+=(*ptr==',')?1:0;
274
+                                errno=0;
275
+                                o=(int)strtol(ptr,&ptr,10);
276
+                                if(errno!=0) {
277
+                                        if(mem!=NULL)
278
+                                                free(mem),mem=NULL;
279
+                                        return("test_edit(): error parsing position");
280
+                                }
281
+                                endcode=*ptr;
282
+                                ptr+=(*ptr!='\0')?1:0;
283
+                                ptrend=strchr(ptr,endcode);
284
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
285
+                                size=ptrend-ptr;
286
+                                if(l<0 || (l+size)>cursize || o<0 || o>cursize || (o>=l && o<(l+size))) {
287
+                                        if(mem!=NULL)
288
+                                                free(mem),mem=NULL;
289
+                                        return("test_edit(): internal error: invalid pasition or size");
290
+                                }
291
+                                if(k!=0) {
292
+                                        if(memcmp(mem+l,ptr,size)!=0
293
+                                          || redata_data_compare(redata,l,ptr,size)!=0) {
294
+                                                if(mem!=NULL)
295
+                                                        free(mem),mem=NULL;
296
+                                                return("test_edit(): internal error: move data doesn't match");
297
+                                        }
298
+                                        /* editing */
299
+                                        if(l>o) {
300
+                                                memmove(mem+o+size,mem+o,l-o);
301
+                                                memcpy(mem+o,ptr,size);
302
+                                        } else {
303
+                                                memmove(mem+l,mem+l+size,o-l-size);
304
+                                                memcpy(mem+o-size,ptr,size);
305
+                                        }
306
+                                        redata_op_move(redata,l,size,o,NULL);
307
+                                }
308
+                                ptr+=size;
309
+                                ptr+=(*ptr!='\0')?1:0;
251 310
                         } else {
252 311
                                 if(mem!=NULL)
253 312
                                         free(mem),mem=NULL;
Browse code

Fix some corner cases of op_add, op_del

Dario Rodriguez authored on 16/03/2019 11:04:02
Showing 1 changed files
... ...
@@ -43,11 +43,13 @@ main(int argc, char *argv[])
43 43
         static int sizes[]={-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,31,32,33,63,64,65,127,128,129,1023,1024,1025,16384};
44 44
         test_t tests[]={
45 45
                 {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
46
-/*                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
46
+#if 0 /* more newfile tests (VERY slow) */
47
+                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
47 48
                 {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
48 49
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
49 50
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
50
-                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},*/
51
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
52
+#endif
51 53
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
52 54
                 {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
53 55
         };
... ...
@@ -74,15 +76,20 @@ main(int argc, char *argv[])
74 76
                         } else {
75 77
                                 fprintf(stderr," ERROR: %s\n",res);
76 78
                                 nerrors++;
77
-                                }
79
+#if 0
80
+/* exit on first error */
81
+s=sizeof(sizes)/sizeof(sizes[0]);
82
+break;
83
+#endif
84
+                        }
78 85
                         redata_free(redata),redata=NULL;
79 86
                 }
80 87
                 fprintf(stderr,"\n");
81 88
         }
82 89
         if(nerrors==0)
83
-                fprintf(stderr,"All tests passed OK\n");
90
+                fprintf(stderr,"All %i tests passed OK\n",total);
84 91
         else
85
-                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,i);
92
+                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,total);
86 93
         redata_free(redata),redata=NULL;
87 94
         return((nerrors==0)?0:1);
88 95
 }
... ...
@@ -181,7 +188,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
181 188
                                 progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
182 189
                                 progress[l+1]='\0';
183 190
                         }
184
-/*if(k!=0) redata_save(redata,"test.pre");*/
191
+if(k!=0) unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
192
+if(k!=0) redata_save(redata,"test.pre");
185 193
                         if(*ptr=='A') {
186 194
                                 /* A<insertpos><endchar><text><endchar> */
187 195
                                 ptr++;
... ...
@@ -251,7 +259,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
251 259
                         if(cursize>maxsize)
252 260
                                 maxsize=cursize;
253 261
                         if(k!=0) {
254
-/*if(k!=0) redata_save(redata,"test.post");*/
262
+if(k!=0) redata_save(redata,"test.post");
255 263
                                 redata_hash(redata,hash129_redata);
256 264
                                 redata_memhash(redata,mem,cursize,hash129_mem);
257 265
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -263,7 +271,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
263 271
                                         return(errorbuf);
264 272
                                 }
265 273
                                 redata_op_undo(redata);
266
-/*redata_save(redata,"test.undo");*/
274
+redata_save(redata,"test.undo");
267 275
                                 redata_hash(redata,hash129_redata);
268 276
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
269 277
                                         if(mem!=NULL)
... ...
@@ -274,7 +282,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
274 282
                                         return(errorbuf);
275 283
                                 }
276 284
                                 redata_op_redo(redata);
277
-/*redata_save(redata,"test.redo");*/
285
+redata_save(redata,"test.redo");
278 286
                                 redata_hash(redata,hash129_redata);
279 287
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
280 288
                                         if(mem!=NULL)
... ...
@@ -301,6 +309,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
301 309
         }
302 310
         if(mem!=NULL)
303 311
                 free(mem),mem=NULL;
312
+unlink("test.pre"),unlink("test.post"),unlink("test.undo"),unlink("test.redo");
304 313
         return(TEST_OK);
305 314
 }
306 315
 
Browse code

Implement op_move. Make the tests more thorough by having them check several different chunkdatasizes.

Dario Rodriguez authored on 15/03/2019 21:43:40
Showing 1 changed files
... ...
@@ -40,36 +40,45 @@ char *test_edit(redata_t *redata, char *filename, char *edits, int filesize, int
40 40
 int
41 41
 main(int argc, char *argv[])
42 42
 {
43
+        static int sizes[]={-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,31,32,33,63,64,65,127,128,129,1023,1024,1025,16384};
43 44
         test_t tests[]={
44 45
                 {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
45
-                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
46
+/*                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
46 47
                 {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
47 48
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
48 49
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
49
-                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
50
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},*/
50 51
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
51 52
                 {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
52 53
         };
53 54
         redata_t *redata;
54
-        int i;
55
-        int nerrors;
55
+        int i,s;
56
+        int nerrors,total;
56 57
         char *res;
57
-        for(i=0,nerrors=0;i<(sizeof(tests)/sizeof(tests[0]));i++) {
58
-                if((redata=redata_init())==NULL) {
59
-                        fprintf(stderr,"ERROR: problem initializing redata module\n");
60
-                        return(1);
61
-                }
62
-                fprintf(stderr,"%s...",tests[i].name);
63
-                res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
64
-                if(strcmp(res,TEST_OK)==0) {
65
-                        fprintf(stderr," ok.\n");
66
-                } else {
67
-                        fprintf(stderr," ERROR: %s\n",res);
68
-                        nerrors++;
58
+        nerrors=0;
59
+        total=0;
60
+        for(s=0;s<(sizeof(sizes)/sizeof(sizes[0]));s++) {
61
+                if(sizes[s]!=-1)
62
+                        fprintf(stderr,"SIZE: %i\n",sizes[s]);
63
+                for(i=0;i<(sizeof(tests)/sizeof(tests[0]));i++,total++) {
64
+                        if((redata=redata_init())==NULL) {
65
+                                fprintf(stderr,"ERROR: problem initializing redata module\n");
66
+                                return(1);
67
+                        }
68
+                        if(sizes[s]!=-1)
69
+                                redata_config_chunkdatasize(redata,sizes[s]);
70
+                        fprintf(stderr,"%s...",tests[i].name);
71
+                        res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
72
+                                if(strcmp(res,TEST_OK)==0) {
73
+                                fprintf(stderr," ok.\n");
74
+                        } else {
75
+                                fprintf(stderr," ERROR: %s\n",res);
76
+                                nerrors++;
77
+                                }
78
+                        redata_free(redata),redata=NULL;
69 79
                 }
70
-                redata_free(redata),redata=NULL;
80
+                fprintf(stderr,"\n");
71 81
         }
72
-        fprintf(stderr,"\n");
73 82
         if(nerrors==0)
74 83
                 fprintf(stderr,"All tests passed OK\n");
75 84
         else
Browse code

Add del test

Dario Rodriguez authored on 15/03/2019 13:38:18
Showing 1 changed files
... ...
@@ -48,6 +48,7 @@ main(int argc, char *argv[])
48 48
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
49 49
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
50 50
                 {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
51
+                {"testedit_del",test_edit,PREFIX "EDIT", "A0$Testing add/del$D8$add/$",0,0},
51 52
         };
52 53
         redata_t *redata;
53 54
         int i;
... ...
@@ -149,7 +150,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
149 150
         static char errorbuf[256];
150 151
         char progress[256];
151 152
         int k;
152
-        int cursize;
153
+        int cursize,maxsize;
153 154
         char *ptr;
154 155
         int l;
155 156
         char *mem;
... ...
@@ -162,7 +163,7 @@ test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
162 163
         mem=NULL;
163 164
 fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(edits!=NULL)?"\"":"",(edits!=NULL)?edits:"NULL",(edits!=NULL)?"\"":"",filesize,seed);
164 165
         /* two passes: k==0 count needed memory, k==1 do edits */
165
-        for(k=0,cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
166
+        for(k=0,maxsize=cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
166 167
                 for(ptr=edits;*ptr!='\0';) {
167 168
                         if(k!=0) {
168 169
                                 redata_memhash(redata,mem,cursize,hash129_memold);
... ...
@@ -196,6 +197,40 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
196 197
                                 cursize+=size;
197 198
                                 ptr+=size;
198 199
                                 ptr+=(*ptr!='\0')?1:0;
200
+                        } else if(*ptr=='D') {
201
+                                /* D<delpos><endchar><text><endchar> */
202
+                                ptr++;
203
+                                errno=0;
204
+                                l=(int)strtol(ptr,&ptr,10);
205
+                                if(errno!=0) {
206
+                                        if(mem!=NULL)
207
+                                                free(mem),mem=NULL;
208
+                                        return("test_edit(): error parsing position");
209
+                                }
210
+                                endcode=*ptr;
211
+                                ptr+=(*ptr!='\0')?1:0;
212
+                                ptrend=strchr(ptr,endcode);
213
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
214
+                                size=ptrend-ptr;
215
+                                if(l<0 || (l+size)>cursize) {
216
+                                        if(mem!=NULL)
217
+                                                free(mem),mem=NULL;
218
+                                        return("test_edit(): internal error: invalid pasition or size");
219
+                                }
220
+                                if(k!=0) {
221
+                                        if(memcmp(mem+l,ptr,size)!=0
222
+                                          || redata_data_compare(redata,l,ptr,size)!=0) {
223
+                                                if(mem!=NULL)
224
+                                                        free(mem),mem=NULL;
225
+                                                return("test_edit(): internal error: deletion data doesn't match");
226
+                                        }
227
+                                        /* editing */
228
+                                        memmove(mem+l,mem+l+size,cursize-l-size);
229
+                                        redata_op_del(redata,l,size,NULL);
230
+                                }
231
+                                cursize-=size;
232
+                                ptr+=size;
233
+                                ptr+=(*ptr!='\0')?1:0;
199 234
                         } else {
200 235
                                 if(mem!=NULL)
201 236
                                         free(mem),mem=NULL;
... ...
@@ -204,6 +239,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
204 239
                                 errorbuf[sizeof(errorbuf)-1]='\0';
205 240
                                 return(errorbuf);
206 241
                         }
242
+                        if(cursize>maxsize)
243
+                                maxsize=cursize;
207 244
                         if(k!=0) {
208 245
 /*if(k!=0) redata_save(redata,"test.post");*/
209 246
                                 redata_hash(redata,hash129_redata);
... ...
@@ -242,7 +279,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
242 279
                 }
243 280
                 if(k==0) {
244 281
                         /* reserve memory, do init */
245
-                        if((mem=malloc_data(cursize,seed))==NULL)
282
+                        if((mem=malloc_data(maxsize,seed))==NULL)
246 283
                                 return("insuf. mem. for temp. buffer");
247 284
                         if(write_file(filename,mem,filesize)==-1)
248 285
                                 return("couldn't create temporary file");
Browse code

recenteditor_data: change undo type from string to char (as it is in the unsaved buf)

Dario Rodriguez authored on 15/03/2019 13:21:58
Showing 1 changed files
... ...
@@ -171,7 +171,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
171 171
                                 progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
172 172
                                 progress[l+1]='\0';
173 173
                         }
174
-if(k!=0) redata_save(redata,"test.pre");
174
+/*if(k!=0) redata_save(redata,"test.pre");*/
175 175
                         if(*ptr=='A') {
176 176
                                 /* A<insertpos><endchar><text><endchar> */
177 177
                                 ptr++;
... ...
@@ -205,7 +205,7 @@ if(k!=0) redata_save(redata,"test.pre");
205 205
                                 return(errorbuf);
206 206
                         }
207 207
                         if(k!=0) {
208
-if(k!=0) redata_save(redata,"test.post");
208
+/*if(k!=0) redata_save(redata,"test.post");*/
209 209
                                 redata_hash(redata,hash129_redata);
210 210
                                 redata_memhash(redata,mem,cursize,hash129_mem);
211 211
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -217,7 +217,7 @@ if(k!=0) redata_save(redata,"test.post");
217 217
                                         return(errorbuf);
218 218
                                 }
219 219
                                 redata_op_undo(redata);
220
-redata_save(redata,"test.undo");
220
+/*redata_save(redata,"test.undo");*/
221 221
                                 redata_hash(redata,hash129_redata);
222 222
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
223 223
                                         if(mem!=NULL)
... ...
@@ -228,7 +228,7 @@ redata_save(redata,"test.undo");
228 228
                                         return(errorbuf);
229 229
                                 }
230 230
                                 redata_op_redo(redata);
231
-redata_save(redata,"test.redo");
231
+/*redata_save(redata,"test.redo");*/
232 232
                                 redata_hash(redata,hash129_redata);
233 233
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
234 234
                                         if(mem!=NULL)
Browse code

unsaved_loadappend: implement loading of A(dd) and D(el) registers

Dario Rodriguez authored on 14/03/2019 22:37:34
Showing 1 changed files
... ...
@@ -47,7 +47,7 @@ main(int argc, char *argv[])
47 47
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
48 48
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
49 49
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
50
-                {"testedit_add",test_edit,PREFIX "EDIT", "A,0,$Testing add$",0,0},
50
+                {"testedit_add",test_edit,PREFIX "EDIT", "A0$Testing add$",0,0},
51 51
         };
52 52
         redata_t *redata;
53 53
         int i;
... ...
@@ -173,9 +173,8 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
173 173
                         }
174 174
 if(k!=0) redata_save(redata,"test.pre");
175 175
                         if(*ptr=='A') {
176
-                                /* A,<insertpos>,<endchar>,<text><endchar> */
176
+                                /* A<insertpos><endchar><text><endchar> */
177 177
                                 ptr++;
178
-                                ptr+=(*ptr==',')?1:0;
179 178
                                 errno=0;
180 179
                                 l=(int)strtol(ptr,&ptr,10);
181 180
                                 if(errno!=0 || l<0 || l>cursize) {
... ...
@@ -183,7 +182,6 @@ if(k!=0) redata_save(redata,"test.pre");
183 182
                                                 free(mem),mem=NULL;
184 183
                                         return("test_edit(): error parsing position");
185 184
                                 }
186
-                                ptr+=(*ptr==',')?1:0;
187 185
                                 endcode=*ptr;
188 186
                                 ptr+=(*ptr!='\0')?1:0;
189 187
                                 ptrend=strchr(ptr,endcode);
Browse code

partial unsaved implementation

Dario Rodriguez authored on 13/03/2019 23:31:53
Showing 1 changed files
... ...
@@ -47,7 +47,7 @@ main(int argc, char *argv[])
47 47
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
48 48
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
49 49
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
50
-                {"testedit_add",test_edit,PREFIX "EDIT", "A,0,$,Testing add$",0,0},
50
+                {"testedit_add",test_edit,PREFIX "EDIT", "A,0,$Testing add$",0,0},
51 51
         };
52 52
         redata_t *redata;
53 53
         int i;
... ...
@@ -186,7 +186,6 @@ if(k!=0) redata_save(redata,"test.pre");
186 186
                                 ptr+=(*ptr==',')?1:0;
187 187
                                 endcode=*ptr;
188 188
                                 ptr+=(*ptr!='\0')?1:0;
189
-                                ptr+=(*ptr==',')?1:0;
190 189
                                 ptrend=strchr(ptr,endcode);
191 190
                                 ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
192 191
                                 size=ptrend-ptr;
Browse code

implementation of op_del, op_undo, op_redo

Dario Rodriguez authored on 13/03/2019 17:07:30
Showing 1 changed files
... ...
@@ -171,6 +171,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
171 171
                                 progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
172 172
                                 progress[l+1]='\0';
173 173
                         }
174
+if(k!=0) redata_save(redata,"test.pre");
174 175
                         if(*ptr=='A') {
175 176
                                 /* A,<insertpos>,<endchar>,<text><endchar> */
176 177
                                 ptr++;
... ...
@@ -185,6 +186,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
185 186
                                 ptr+=(*ptr==',')?1:0;
186 187
                                 endcode=*ptr;
187 188
                                 ptr+=(*ptr!='\0')?1:0;
189
+                                ptr+=(*ptr==',')?1:0;
188 190
                                 ptrend=strchr(ptr,endcode);
189 191
                                 ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
190 192
                                 size=ptrend-ptr;
... ...
@@ -206,6 +208,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
206 208
                                 return(errorbuf);
207 209
                         }
208 210
                         if(k!=0) {
211
+if(k!=0) redata_save(redata,"test.post");
209 212
                                 redata_hash(redata,hash129_redata);
210 213
                                 redata_memhash(redata,mem,cursize,hash129_mem);
211 214
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
... ...
@@ -217,6 +220,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
217 220
                                         return(errorbuf);
218 221
                                 }
219 222
                                 redata_op_undo(redata);
223
+redata_save(redata,"test.undo");
220 224
                                 redata_hash(redata,hash129_redata);
221 225
                                 if(strcmp(hash129_redata,hash129_memold)!=0) {
222 226
                                         if(mem!=NULL)
... ...
@@ -227,6 +231,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
227 231
                                         return(errorbuf);
228 232
                                 }
229 233
                                 redata_op_redo(redata);
234
+redata_save(redata,"test.redo");
230 235
                                 redata_hash(redata,hash129_redata);
231 236
                                 if(strcmp(hash129_redata,hash129_mem)!=0) {
232 237
                                         if(mem!=NULL)
Browse code

Undo/redo enablement

Dario Rodriguez authored on 11/03/2019 23:24:17
Showing 1 changed files
... ...
@@ -192,7 +192,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
192 192
                                         /* editing */
193 193
                                         memmove(mem+l+size,mem+l,cursize-l);
194 194
                                         memcpy(mem+l,ptr,size);
195
-                                        redata_op_add(redata,ptr,size,l);
195
+                                        redata_op_add(redata,l,ptr,size,NULL);
196 196
                                 }
197 197
                                 cursize+=size;
198 198
                                 ptr+=size;
Browse code

Implement add operation

Dario Rodriguez authored on 10/03/2019 23:50:38
Showing 1 changed files
... ...
@@ -190,7 +190,7 @@ fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\
190 190
                                 size=ptrend-ptr;
191 191
                                 if(k!=0) {
192 192
                                         /* editing */
193
-                                        memmove(mem+l+size,mem+l,size);
193
+                                        memmove(mem+l+size,mem+l,cursize-l);
194 194
                                         memcpy(mem+l,ptr,size);
195 195
                                         redata_op_add(redata,ptr,size,l);
196 196
                                 }
Browse code

Add insertion test as preparation for implementing insertion

Dario Rodriguez authored on 08/03/2019 18:49:22
Showing 1 changed files
... ...
@@ -15,6 +15,7 @@
15 15
 #include <string.h>
16 16
 #include <limits.h>
17 17
 #include <fcntl.h>
18
+#include <errno.h>
18 19
 
19 20
 #include "recenteditor_data.h"
20 21
 
... ...
@@ -30,7 +31,11 @@ typedef struct test_t  {
30 31
         int int2;
31 32
 } test_t;
32 33
 
34
+static char *malloc_data(int size, int seed);
35
+static int write_file(char *filename, char *buf, int buflen);
36
+
33 37
 char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);
38
+char *test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed);
34 39
 
35 40
 int
36 41
 main(int argc, char *argv[])
... ...
@@ -42,7 +47,7 @@ main(int argc, char *argv[])
42 47
                 {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
43 48
                 {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
44 49
                 {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
45
-
50
+                {"testedit_add",test_edit,PREFIX "EDIT", "A,0,$,Testing add$",0,0},
46 51
         };
47 52
         redata_t *redata;
48 53
         int i;
... ...
@@ -67,31 +72,56 @@ main(int argc, char *argv[])
67 72
         if(nerrors==0)
68 73
                 fprintf(stderr,"All tests passed OK\n");
69 74
         else
70
-                fprintf(stderr,"%i tests failed of %i total tests.\n",nerrors,i);
75
+                fprintf(stderr,"%i test(s) failed of %i tests run.\n",nerrors,i);
71 76
         redata_free(redata),redata=NULL;
72 77
         return((nerrors==0)?0:1);
73 78
 }
74 79
 
80
+static char *
81
+malloc_data(int size, int seed)
82
+{
83
+        char *mem;
84
+        int i;
85
+        if(size<=0 || (mem=malloc(size))==NULL)
86
+                return(NULL);
87
+        memset(mem,0,size);
88
+        if(seed==0) {
89
+                for(i=0;i<size;i++)
90
+                        ((unsigned char *)mem)[i]=(i%256);
91
+        } else {
92
+                srandom(*((unsigned int *)(&seed)));
93
+                for(i=0;i<size;i++)
94
+                        ((unsigned char *)mem)[i]=(random()&0xff);
95
+        }
96
+        return(mem);
97
+
98
+}
99
+
100
+static int
101
+write_file(char *filename, char *buf, int buflen)
102
+{
103
+        int fd;
104
+        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
105
+                free(buf),buf=NULL;
106
+                return(-1);
107
+        }
108
+        write(fd,buf,buflen);
109
+        close(fd),fd=-1;
110
+        return(0);
111
+}
112
+
75 113
 char *
76 114
 test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
77 115
 {
78 116
         char *mem;
79 117
         char hash129_pre[129];
80 118
         char hash129_post[129];
81
-        int fd,i;
82
-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);
119
+fprintf(stderr,"\ntest_newfile(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(dummy!=NULL)?"\"":"",(dummy!=NULL)?dummy:"NULL",(dummy!=NULL)?"\"":"",filesize,dummy2);
83 120
         /* prepare file for loading */
84
-        if((mem=malloc(filesize))==NULL)
121
+        if((mem=malloc_data(filesize,0))==NULL)
85 122
                 return("insuf. mem. for temp. buffer");
86
-        memset(mem,0,filesize);
87
-        for(i=0;i<filesize;i++)
88
-                ((unsigned char *)mem)[i]=(filesize%256);
89
-        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
90
-                free(mem),mem=NULL;
123
+        if(write_file(filename,mem,filesize)==-1)
91 124
                 return("couldn't create temporary file");
92
-        }
93
-        write(fd,mem,filesize);
94
-        close(fd),fd=-1;
95 125
         redata_filehash(redata,filename,hash129_pre);
96 126
         free(mem),mem=NULL;
97 127
         /* load file */
... ...
@@ -113,3 +143,116 @@ fprintf(stderr,"\ntest_newfile(%s%s%s,%s,%i,%i);\nResult: ",(filename!=NULL)?"\"
113 143
         return(TEST_OK);
114 144
 }
115 145
 
146
+char *
147
+test_edit(redata_t *redata, char *filename, char *edits, int filesize, int seed)
148
+{
149
+        static char errorbuf[256];
150
+        char progress[256];
151
+        int k;
152
+        int cursize;
153
+        char *ptr;
154
+        int l;
155
+        char *mem;
156
+        char endcode;
157
+        char *ptrend;
158
+        int size;
159
+        char hash129_memold[129];
160
+        char hash129_mem[129];
161
+        char hash129_redata[129];
162
+        mem=NULL;
163
+fprintf(stderr,"\ntest_edit(%s%s%s,%s%s%s,%i,%i);\nResult: ",(filename!=NULL)?"\"":"",(filename!=NULL)?filename:"NULL",(filename!=NULL)?"\"":"",(edits!=NULL)?"\"":"",(edits!=NULL)?edits:"NULL",(edits!=NULL)?"\"":"",filesize,seed);
164
+        /* two passes: k==0 count needed memory, k==1 do edits */
165
+        for(k=0,cursize=filesize,progress[0]='\0';k<2;k++,cursize=0,progress[0]='\0') {
166
+                for(ptr=edits;*ptr!='\0';) {
167
+                        if(k!=0) {
168
+                                redata_memhash(redata,mem,cursize,hash129_memold);
169
+                        }
170
+                        if((l=strlen(progress))<(sizeof(progress)-1)) {
171
+                                progress[l]=(l<(sizeof(progress)-2))?*ptr:'+';
172
+                                progress[l+1]='\0';
173
+                        }
174
+                        if(*ptr=='A') {
175
+                                /* A,<insertpos>,<endchar>,<text><endchar> */
176
+                                ptr++;
177
+                                ptr+=(*ptr==',')?1:0;
178
+                                errno=0;
179
+                                l=(int)strtol(ptr,&ptr,10);
180
+                                if(errno!=0 || l<0 || l>cursize) {
181
+                                        if(mem!=NULL)
182
+                                                free(mem),mem=NULL;
183
+                                        return("test_edit(): error parsing position");
184
+                                }
185
+                                ptr+=(*ptr==',')?1:0;
186
+                                endcode=*ptr;
187
+                                ptr+=(*ptr!='\0')?1:0;
188
+                                ptrend=strchr(ptr,endcode);
189
+                                ptrend=(ptrend==NULL)?ptr+strlen(ptr):ptrend;
190
+                                size=ptrend-ptr;
191
+                                if(k!=0) {
192
+                                        /* editing */
193
+                                        memmove(mem+l+size,mem+l,size);
194
+                                        memcpy(mem+l,ptr,size);
195
+                                        redata_op_add(redata,ptr,size,l);
196
+                                }
197
+                                cursize+=size;
198
+                                ptr+=size;
199
+                                ptr+=(*ptr!='\0')?1:0;
200
+                        } else {
201
+                                if(mem!=NULL)
202
+                                        free(mem),mem=NULL;
203
+                                snprintf(errorbuf,sizeof(errorbuf),
204
+                                  "test_edit(): unknown edit action at pos %i: '%c' (progress: %s)",(int) (ptr-edits),*ptr,progress);
205
+                                errorbuf[sizeof(errorbuf)-1]='\0';
206
+                                return(errorbuf);
207
+                        }
208
+                        if(k!=0) {
209
+                                redata_hash(redata,hash129_redata);
210
+                                redata_memhash(redata,mem,cursize,hash129_mem);
211
+                                if(strcmp(hash129_redata,hash129_mem)!=0) {
212
+                                        if(mem!=NULL)
213
+                                                free(mem),mem=NULL;
214
+                                        snprintf(errorbuf,sizeof(errorbuf),
215
+                                          "corrupted edit before pos %i (progress: %s)",(int) (ptr-edits),progress);
216
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
217
+                                        return(errorbuf);
218
+                                }
219
+                                redata_op_undo(redata);
220
+                                redata_hash(redata,hash129_redata);
221
+                                if(strcmp(hash129_redata,hash129_memold)!=0) {
222
+                                        if(mem!=NULL)
223
+                                                free(mem),mem=NULL;
224
+                                        snprintf(errorbuf,sizeof(errorbuf),
225
+                                          "corrupted undo before pos %i (progress: %s)",(int) (ptr-edits),progress);
226
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
227
+                                        return(errorbuf);
228
+                                }
229
+                                redata_op_redo(redata);
230
+                                redata_hash(redata,hash129_redata);
231
+                                if(strcmp(hash129_redata,hash129_mem)!=0) {
232
+                                        if(mem!=NULL)
233
+                                                free(mem),mem=NULL;
234
+                                        snprintf(errorbuf,sizeof(errorbuf),
235
+                                          "corrupted redo before pos %i (progress: %s)",(int) (ptr-edits),progress);
236
+                                        errorbuf[sizeof(errorbuf)-1]='\0';
237
+                                        return(errorbuf);
238
+                                }
239
+                        }
240
+                }
241
+                if(k==0) {
242
+                        /* reserve memory, do init */
243
+                        if((mem=malloc_data(cursize,seed))==NULL)
244
+                                return("insuf. mem. for temp. buffer");
245
+                        if(write_file(filename,mem,filesize)==-1)
246
+                                return("couldn't create temporary file");
247
+                        if(redata_load(redata,filename,0)!=0) {
248
+                                unlink(filename);
249
+                                return("couldn't load file");
250
+                        }
251
+                        unlink(filename);
252
+                }
253
+        }
254
+        if(mem!=NULL)
255
+                free(mem),mem=NULL;
256
+        return(TEST_OK);
257
+}
258
+
Browse code

Fix bug in genname triggered when there were no '/' in filename. Add load/save unit test (test_newfile).

Dario Rodriguez authored on 07/03/2019 18:02:06
Showing 1 changed files
... ...
@@ -14,19 +14,102 @@
14 14
 #include <unistd.h>
15 15
 #include <string.h>
16 16
 #include <limits.h>
17
+#include <fcntl.h>
17 18
 
18 19
 #include "recenteditor_data.h"
19 20
 
21
+#define PREFIX "retest_"
22
+#define TEST_OK "OK"
23
+
24
+typedef struct test_t  {
25
+        char *name;
26
+        char *(*fn)(redata_t *,char *,char *, int, int);
27
+        char *param1;
28
+        char *param2;
29
+        int int1;
30
+        int int2;
31
+} test_t;
32
+
33
+char *test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2);
34
+
20 35
 int
21 36
 main(int argc, char *argv[])
22 37
 {
38
+        test_t tests[]={
39
+                {"newfile_16",test_newfile,PREFIX "FILE", NULL, 16, 0},
40
+                {"newfile_1024",test_newfile,PREFIX "FILE", NULL, 1024, 0},
41
+                {"newfile_32767",test_newfile,PREFIX "FILE", NULL, 32767, 0},
42
+                {"newfile_32768",test_newfile,PREFIX "FILE", NULL, 32768, 0},
43
+                {"newfile_32769",test_newfile,PREFIX "FILE", NULL, 32769, 0},
44
+                {"newfile_131072",test_newfile,PREFIX "FILE", NULL, 131072, 0},
45
+
46
+        };
23 47
         redata_t *redata;
24
-        if((redata=redata_init())==NULL) {
25
-                fprintf(stderr,"ERROR: problem initializong redata module\n");
26
-                return(1);
48
+        int i;
49
+        int nerrors;
50
+        char *res;
51
+        for(i=0,nerrors=0;i<(sizeof(tests)/sizeof(tests[0]));i++) {
52
+                if((redata=redata_init())==NULL) {
53
+                        fprintf(stderr,"ERROR: problem initializing redata module\n");
54
+                        return(1);
55
+                }
56
+                fprintf(stderr,"%s...",tests[i].name);
57
+                res=tests[i].fn(redata,tests[i].param1,tests[i].param2,tests[i].int1,tests[i].int2);
58
+                if(strcmp(res,TEST_OK)==0) {
59
+                        fprintf(stderr," ok.\n");
60
+                } else {
61
+                        fprintf(stderr," ERROR: %s\n",res);
62
+                        nerrors++;
63
+                }
64
+                redata_free(redata),redata=NULL;
27 65
         }
28
-#warning TODO
66
+        fprintf(stderr,"\n");
67
+        if(nerrors==0)
68
+                fprintf(stderr,"All tests passed OK\n");
69
+        else
70
+                fprintf(stderr,"%i tests failed of %i total tests.\n",nerrors,i);
29 71
         redata_free(redata),redata=NULL;
72
+        return((nerrors==0)?0:1);
30 73
 }
31 74
 
75
+char *
76
+test_newfile(redata_t *redata, char *filename, char *dummy, int filesize, int dummy2)
77
+{
78
+        char *mem;
79
+        char hash129_pre[129];
80
+        char hash129_post[129];
81
+        int fd,i;
82
+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);
83
+        /* prepare file for loading */
84
+        if((mem=malloc(filesize))==NULL)
85
+                return("insuf. mem. for temp. buffer");
86
+        memset(mem,0,filesize);
87
+        for(i=0;i<filesize;i++)
88
+                ((unsigned char *)mem)[i]=(filesize%256);
89
+        if((fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644))==-1) {
90
+                free(mem),mem=NULL;
91
+                return("couldn't create temporary file");
92
+        }
93
+        write(fd,mem,filesize);
94
+        close(fd),fd=-1;
95
+        redata_filehash(redata,filename,hash129_pre);
96
+        free(mem),mem=NULL;
97
+        /* load file */
98
+        if(redata_load(redata,filename,0)!=0) {
99
+                unlink(filename);
100
+                return("couldn't load file");
101
+        }
102
+        unlink(filename);
103
+        redata_hash(redata,hash129_post);
104
+        if(strcmp(hash129_pre,hash129_post)!=0)
105
+                return("loaded file is corrupted");
106
+        /* save file */
107
+        redata_save(redata,filename);
108
+        hash129_post[0]='\0';
109
+        redata_filehash(redata,filename,hash129_post);
110
+        if(strcmp(hash129_pre,hash129_post)!=0)
111
+                return("saved file is corrupted");
112
+        unlink(filename);
113
+        return(TEST_OK);
114
+}
32 115
 
Browse code

Add undobuf structire and corresponding functions

Dario Rodriguez authored on 05/03/2019 21:40:51
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,32 @@
1
+/*
2
+ * recenteditor_data.c
3
+ *
4
+ * A programmers editor
5
+ *
6
+ * Tests (ensure correct functionality of modules)
7
+ *
8
+ * Author: Dario Rodriguez dario@softhome.net
9
+ * This program is licensed under the terms of GNU GPL v2.1+
10
+ */
11
+
12
+#include <stdio.h>
13
+#include <stdlib.h>
14
+#include <unistd.h>
15
+#include <string.h>
16
+#include <limits.h>
17
+
18
+#include "recenteditor_data.h"
19
+
20
+int
21
+main(int argc, char *argv[])
22
+{
23
+        redata_t *redata;
24
+        if((redata=redata_init())==NULL) {
25
+                fprintf(stderr,"ERROR: problem initializong redata module\n");
26
+                return(1);
27
+        }
28
+#warning TODO
29
+        redata_free(redata),redata=NULL;
30
+}
31
+
32
+