summaryrefslogtreecommitdiffstats
path: root/tests/test-qpath.c
blob: ecf1a0ae55401ac0cc3c053b4d77edfe05e97bd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
#include "misc.h"
#include "qpath.h"
#include "qlib_init.h"

#include <stdio.h>

struct thread_master *master ;          /* required by lib !    */

/*==============================================================================
 * qpath torture tests
 *
 */
static int qpath_reduce_testing(void) ;

int
main(int argc, char **argv)
{
  int errors = 0 ;

  qlib_init_first_stage() ;

  fprintf(stdout, "qpath torture tests\n") ;

  errors += qpath_reduce_testing() ;



  if (errors == 0)
    fprintf(stdout, "No errors\n") ;
  else
    fprintf(stderr, "*** %d errors\n", errors) ;
} ;

/*==============================================================================
 * Testing Path Reduction
 */
static int qpath_reduce_test(qpath qp, const char* from, const char* to) ;

static int
qpath_reduce_testing(void)
{
  int   errors = 0 ;
  qpath qp ;

  fprintf(stdout, "  qpath_reduce() testing") ;

  qp = qpath_init_new(NULL) ;

  /* Trivial Tests                                                      */

  errors += qpath_reduce_test(qp, "",
                                  "") ;
  errors += qpath_reduce_test(qp, "a",
                                  "a") ;
  errors += qpath_reduce_test(qp, ".",
                                  ".") ;
  errors += qpath_reduce_test(qp, "/",
                                  "/") ;
  errors += qpath_reduce_test(qp, "/a",
                                  "/a") ;
  errors += qpath_reduce_test(qp, "/.",
                                  "/-") ;
  errors += qpath_reduce_test(qp, "//",
                                  "//") ;
  errors += qpath_reduce_test(qp, "//a",
                                  "//a") ;
  errors += qpath_reduce_test(qp, "//.",
                                  "//-") ;
  errors += qpath_reduce_test(qp, "///",
                                  "/--") ;
  errors += qpath_reduce_test(qp, "///a",
                                  "/--a") ;
  errors += qpath_reduce_test(qp, "///.",
                                  "/---") ;

  /* Slightly longer paths                                              */

  errors += qpath_reduce_test(qp, "abc",
                                  "abc") ;
  errors += qpath_reduce_test(qp, "abc.",
                                  "abc.") ;
  errors += qpath_reduce_test(qp, ".abc",
                                  ".abc") ;
  errors += qpath_reduce_test(qp, "/abc",
                                  "/abc") ;
  errors += qpath_reduce_test(qp, "/.abc",
                                  "/.abc") ;
  errors += qpath_reduce_test(qp, "/..abc",
                                  "/..abc") ;
  errors += qpath_reduce_test(qp, "//abc",
                                  "//abc") ;
  errors += qpath_reduce_test(qp, "//abc.",
                                  "//abc.") ;
  errors += qpath_reduce_test(qp, "//.abc",
                                  "//.abc") ;
  errors += qpath_reduce_test(qp, "///abc",
                                  "/--abc") ;
  errors += qpath_reduce_test(qp, "///abc.",
                                  "/--abc.") ;
  errors += qpath_reduce_test(qp, "///..abc",
                                  "/--..abc") ;

  errors += qpath_reduce_test(qp, "abc/pqr",
                                  "abc/pqr") ;
  errors += qpath_reduce_test(qp, "abc./pqr/",
                                  "abc./pqr/") ;
  errors += qpath_reduce_test(qp, ".abc/pqr//",
                                  ".abc/pqr/-") ;
  errors += qpath_reduce_test(qp, "/abc/pqr",
                                  "/abc/pqr") ;
  errors += qpath_reduce_test(qp, "/.abc/pqr/",
                                  "/.abc/pqr/") ;
  errors += qpath_reduce_test(qp, "/..abc/pqr///",
                                  "/..abc/pqr/--") ;
  errors += qpath_reduce_test(qp, "//abc/pqr",
                                  "//abc/pqr") ;
  errors += qpath_reduce_test(qp, "//abc./pqr/",
                                  "//abc./pqr/") ;
  errors += qpath_reduce_test(qp, "//.abc/pqr//",
                                  "//.abc/pqr/-") ;
  errors += qpath_reduce_test(qp, "///abc/pqr",
                                  "/--abc/pqr") ;
  errors += qpath_reduce_test(qp, "///abc./pqr/",
                                  "/--abc./pqr/") ;
  errors += qpath_reduce_test(qp, "///..abc/pqr//",
                                  "/--..abc/pqr/-") ;

  /* Lots of / and . to get rid of -- NB: does not discard trailing '/' */

  errors += qpath_reduce_test(qp, "/.///./././//",
                                  "/------------") ;
  errors += qpath_reduce_test(qp, "/.a.///./././//",
                                  "/.a./----------") ;
  errors += qpath_reduce_test(qp, "/.///.b/././//",
                                  "/----.b/------") ;
  errors += qpath_reduce_test(qp, "/.a.///./././//.z.",
                                  "/.a./----------.z.") ;
  errors += qpath_reduce_test(qp, "/.///.b/././//z.",
                                  "/----.b/------z.") ;
  errors += qpath_reduce_test(qp, "/a///./././//.z./",
                                  "/a/----------.z./") ;
  errors += qpath_reduce_test(qp, "/.///.b/././//.z./",
                                  "/----.b/------.z./") ;

  errors += qpath_reduce_test(qp, "//.///./././//",
                                  "//------------") ;
  errors += qpath_reduce_test(qp, "//.a.///./././//",
                                  "//.a./----------") ;
  errors += qpath_reduce_test(qp, "//.///.b/././//",
                                  "//----.b/------") ;
  errors += qpath_reduce_test(qp, "//a///./././//z",
                                  "//a/----------z") ;
  errors += qpath_reduce_test(qp, "//.///.b/././//.z.",
                                  "//----.b/------.z.") ;
  errors += qpath_reduce_test(qp, "//a///./././//..z/",
                                  "//a/----------..z/") ;
  errors += qpath_reduce_test(qp, "//.///.b/././//z../",
                                  "//----.b/------z../") ;

  errors += qpath_reduce_test(qp, "///.///./././//",
                                  "/--------------") ;
  errors += qpath_reduce_test(qp, "///..a///./././//",
                                  "/--..a/----------") ;
  errors += qpath_reduce_test(qp, "///.///.b/././//",
                                  "/------.b/------") ;
  errors += qpath_reduce_test(qp, "///a..///./././//z",
                                  "/--a../----------z") ;
  errors += qpath_reduce_test(qp, "///.///.b/././//z",
                                  "/------.b/------z") ;
  errors += qpath_reduce_test(qp, "///..a..///./././//z/",
                                  "/--..a../----------z/") ;
  errors += qpath_reduce_test(qp, "///.///.b/././//z/",
                                  "/------.b/------z/") ;

  /* Assorted trailing '.'                                              */

  errors += qpath_reduce_test(qp, ".",
                                  ".") ;
  errors += qpath_reduce_test(qp, "./",
                                  "./") ;
  errors += qpath_reduce_test(qp, "a././",
                                  "a./--") ;
  errors += qpath_reduce_test(qp, "/.a/./",
                                  "/.a/--") ;
  errors += qpath_reduce_test(qp, "/a./.",
                                  "/a./-") ;
  errors += qpath_reduce_test(qp, "/.",
                                  "/-") ;
  errors += qpath_reduce_test(qp, "/./",
                                  "/--") ;
  errors += qpath_reduce_test(qp, "//.",
                                  "//-") ;
  errors += qpath_reduce_test(qp, "//./",
                                  "//--") ;
  errors += qpath_reduce_test(qp, "///.",
                                  "/---") ;
  errors += qpath_reduce_test(qp, "///.//",
                                  "/-----") ;

  /* Possible ..                                                        */

  errors += qpath_reduce_test(qp, ".a.a.a./..",
                                  "----------") ;
  errors += qpath_reduce_test(qp, "..aaa../../",
                                  "-----------") ;
  errors += qpath_reduce_test(qp, "..aaa../..",
                                  "----------") ;
  errors += qpath_reduce_test(qp, "..aaa../.././//././/.",
                                  "---------------------") ;
  errors += qpath_reduce_test(qp, "..aaa../../..z",
                                  "-----------..z") ;
  errors += qpath_reduce_test(qp, "..aaa../../..z../",
                                  "-----------..z../") ;

  errors += qpath_reduce_test(qp, "..b.b.b../..aaa../..",
                                  "..b.b.b../----------") ;
  errors += qpath_reduce_test(qp, "..bbb../..a.a.a../../",
                                  "..bbb../-------------") ;
  errors += qpath_reduce_test(qp, "..bbb../..a.a.a../.././///./",
                                  "..bbb../--------------------") ;
  errors += qpath_reduce_test(qp, "..bbb../..aaa.././/../..z..",
                                  "..bbb../--------------..z..") ;
  errors += qpath_reduce_test(qp, "..bbb../..aaa.././/../..z../",
                                  "..bbb../--------------..z../") ;

  errors += qpath_reduce_test(qp, "/..a.a.a../..",
                                  "/------------") ;
  errors += qpath_reduce_test(qp, "/..a.a.a/../",
                                  "/-----------") ;
  errors += qpath_reduce_test(qp, "/a.a.a../.././///./",
                                  "/------------------") ;
  errors += qpath_reduce_test(qp, "/..aaa/.//../..z",
                                  "/------------..z") ;
  errors += qpath_reduce_test(qp, "/aaa.././/../z/",
                                  "/------------z/") ;

  errors += qpath_reduce_test(qp, "//aaa../..",
                                  "//--------") ;
  errors += qpath_reduce_test(qp, "//..aaa/../",
                                  "//---------") ;
  errors += qpath_reduce_test(qp, "//aaa../.././///./",
                                  "//----------------") ;
  errors += qpath_reduce_test(qp, "//aaa.././/../..z",
                                  "//------------..z") ;
  errors += qpath_reduce_test(qp, "//..aaa/.//../z../",
                                  "//------------z../") ;

  errors += qpath_reduce_test(qp, "./aaa../..",
                                  "./--------") ;
  errors += qpath_reduce_test(qp, "./..aaa/../",
                                  "./---------") ;
  errors += qpath_reduce_test(qp, "./aaa../.././///./",
                                  "./----------------") ;
  errors += qpath_reduce_test(qp, "./..aaa/.//../z",
                                  "./------------z") ;
  errors += qpath_reduce_test(qp, "./aaa.././/../z/",
                                  "./------------z/") ;

  errors += qpath_reduce_test(qp, ".///./aaa./..",
                                  "./-----------") ;
  errors += qpath_reduce_test(qp, "./././.aaa/../",
                                  "./------------") ;
  errors += qpath_reduce_test(qp, "./////.aaa/.././///./",
                                  "./-------------------") ;
  errors += qpath_reduce_test(qp, "././//./aaa././/../z",
                                  "./-----------------z") ;
  errors += qpath_reduce_test(qp, "./..aaa.././/../z/",
                                  "./--------------z/") ;

  errors += qpath_reduce_test(qp, "///..aaa../..",
                                  "/------------") ;
  errors += qpath_reduce_test(qp, "///.aaa./../",
                                  "/-----------") ;
  errors += qpath_reduce_test(qp, "///aaa/.././///./",
                                  "/----------------") ;
  errors += qpath_reduce_test(qp, "///..aaa/.//../z",
                                  "/--------------z") ;
  errors += qpath_reduce_test(qp, "///aaa.././/../z/",
                                  "/--------------z/") ;

  errors += qpath_reduce_test(qp, ".bbb/..aaa/../..",
                                  "----------------") ;
  errors += qpath_reduce_test(qp, "bbb./aaa../../../",
                                  "-----------------") ;
  errors += qpath_reduce_test(qp, "bbb../aaa../../.././///./",
                                  "-------------------------") ;
  errors += qpath_reduce_test(qp, "..bbb/..aaa/../../z",
                                  "------------------z") ;
  errors += qpath_reduce_test(qp, "bbb../..aaa/../../z/",
                                  "------------------z/") ;

  errors += qpath_reduce_test(qp, "bbb./aaa/../.zzz/../qqq/../..",
                                  "-----------------------------") ;
  errors += qpath_reduce_test(qp, "bbb/.aaa/../zzz./../qqq/../../",
                                  "------------------------------") ;
  errors += qpath_reduce_test(qp, "/bbb/aaa/../zzz../../..qqq/../../",
                                  "/--------------------------------") ;
  errors += qpath_reduce_test(qp, "//bbb../aaa/../zzz/../qqq../../../",
                                  "//--------------------------------") ;
  errors += qpath_reduce_test(qp, "./..bbb/aaa/../zzz/../qqq/../../",
                                  "./------------------------------") ;
  errors += qpath_reduce_test(qp, "./bbb/aaa../../zzz/../qqq/../..",
                                  "./-----------------------------") ;
  errors += qpath_reduce_test(qp, "///bbb/aaa/../zzz../../qqq/../../",
                                  "/--------------------------------") ;

  errors += qpath_reduce_test(qp, "bbb/aaa/../zzz/../qqq/../../.",
                                  "-----------------------------") ;
  errors += qpath_reduce_test(qp, "bbb/aaa/../zzz/../qqq/../.././",
                                  "------------------------------") ;
  errors += qpath_reduce_test(qp, "/bbb/aaa/../zzz/../qqq/../../",
                                  "/----------------------------") ;
  errors += qpath_reduce_test(qp, "//bbb/aaa/../zzz/../qqq/../../",
                                  "//----------------------------") ;
  errors += qpath_reduce_test(qp, "./bbb/aaa/../zzz/../qqq/../../",
                                  "./----------------------------") ;
  errors += qpath_reduce_test(qp, "./bbb/aaa/../zzz/../qqq/../..",
                                  "./---------------------------") ;
  errors += qpath_reduce_test(qp, "///bbb/aaa/../zzz/../qqq/../../",
                                  "/------------------------------") ;

  errors += qpath_reduce_test(qp, "o/aaa../../zzz/../qqq/../../.",
                                  "-----------------------------") ;
  errors += qpath_reduce_test(qp, "o/aaa/../zzz../../qqq/../.././",
                                  "------------------------------") ;
  errors += qpath_reduce_test(qp, "o/bbb/aaa/../zzz/../qqq../../../",
                                  "o/------------------------------") ;
  errors += qpath_reduce_test(qp, "o/bbb/aaa/../zzz/../qqq/../../",
                                  "o/----------------------------") ;
  errors += qpath_reduce_test(qp, "o/bbb/aaa/../zzz/../qqq/../../",
                                  "o/----------------------------") ;
  errors += qpath_reduce_test(qp, "o/bbb/aaa/../zzz/../qqq/../..",
                                  "o/---------------------------") ;
  errors += qpath_reduce_test(qp, "o//bbb/aaa/../zzz/../qqq/../../",
                                  "o/-----------------------------") ;

  errors += qpath_reduce_test(qp, "zzz../././/.././o/..",
                                  "--------------------") ;
  errors += qpath_reduce_test(qp, "zzz.././o//.././o/../",
                                  "zzz../---------------") ;

  /* Impossible ..                                                      */

  errors += qpath_reduce_test(qp, "..",
                                  "..") ;
  errors += qpath_reduce_test(qp, "../",
                                  "../") ;
  errors += qpath_reduce_test(qp, "/..",
                                  "/..") ;
  errors += qpath_reduce_test(qp, "/../",
                                  "/../") ;
  errors += qpath_reduce_test(qp, "//..",
                                  "//..") ;
  errors += qpath_reduce_test(qp, "//../",
                                  "//../") ;
  errors += qpath_reduce_test(qp, "///..",
                                  "/--..") ;
  errors += qpath_reduce_test(qp, "///../",
                                  "/--../") ;
  errors += qpath_reduce_test(qp, "./..",
                                  "./..") ;
  errors += qpath_reduce_test(qp, "./../",
                                  "./../") ;
  errors += qpath_reduce_test(qp, ".///..",
                                  "./--..") ;
  errors += qpath_reduce_test(qp, ".///../",
                                  "./--../") ;
  errors += qpath_reduce_test(qp, ".///..",
                                  "./--..") ;
  errors += qpath_reduce_test(qp, "././/../",
                                  "./---../") ;

  errors += qpath_reduce_test(qp, "..///./..",
                                  "../----..") ;
  errors += qpath_reduce_test(qp, "..///./../",
                                  "../----../") ;
  errors += qpath_reduce_test(qp, "/.././///..",
                                  "/../-----..") ;
  errors += qpath_reduce_test(qp, "/..///.//../",
                                  "/../-----../") ;
  errors += qpath_reduce_test(qp, "//..///.//../.",
                                  "//../-----../-") ;
  errors += qpath_reduce_test(qp, "//..//.///.././",
                                  "//../-----../--") ;
  errors += qpath_reduce_test(qp, "///..///.//..",
                                  "/--../-----..") ;
  errors += qpath_reduce_test(qp, "///.././/./../",
                                  "/--../-----../") ;
  errors += qpath_reduce_test(qp, "./../../..",
                                  "./../../..") ;
  errors += qpath_reduce_test(qp, "./../../../",
                                  "./../../../") ;
  errors += qpath_reduce_test(qp, ".///..///.///.///..",
                                  "./--../----------..") ;
  errors += qpath_reduce_test(qp, ".///.././././../",
                                  "./--../------../") ;
  errors += qpath_reduce_test(qp, ".///..///////..",
                                  "./--../------..") ;
  errors += qpath_reduce_test(qp, "././/..//////..////",
                                  "./---../-----../---") ;

  errors += qpath_reduce_test(qp, "../././/.",
                                  "../------") ;
  errors += qpath_reduce_test(qp, "../zzz/..",
                                  "../------") ;
  errors += qpath_reduce_test(qp, "/../zzz/.//./../",
                                  "/../------------") ;
  errors += qpath_reduce_test(qp, "/zzz../././/.././..",
                                  "/----------------..") ;
  errors += qpath_reduce_test(qp, "/zzz../././/.././../",
                                  "/----------------../") ;
  errors += qpath_reduce_test(qp, "zzz../././/.././..",
                                  "----------------..") ;
  errors += qpath_reduce_test(qp, "zzz../././/.././../",
                                  "----------------../") ;
  errors += qpath_reduce_test(qp, "/zzz../././/.././..",
                                  "/----------------..") ;
  errors += qpath_reduce_test(qp, "/zzz../././/.././../",
                                  "/----------------../") ;
  errors += qpath_reduce_test(qp, "//zzz../././/.././..",
                                  "//----------------..") ;
  errors += qpath_reduce_test(qp, "//zzz../././/.././../",
                                  "//----------------../") ;
  errors += qpath_reduce_test(qp, "///zzz../././/.././..",
                                  "/------------------..") ;
  errors += qpath_reduce_test(qp, "///zzz../././/.././../",
                                  "/------------------../") ;

  /* Finish up                                                          */

  qpath_reset(qp, free_it) ;

  if (errors == 0)
    fprintf(stdout, " -- OK\n") ;
  else
    fprintf(stdout, "\n  *** %d errors\n", errors) ;

  return errors ;
} ;


static int
qpath_reduce_test(qpath qp, const char* from, const char* to)
{
  const char* r ;
        char  e[100] ;
  const char* p ;
        char* q ;

  assert(strlen(to) <  sizeof(e)) ;
  if (strlen(to) != strlen(from))
    {
      fprintf(stdout,
              "\n"
              "  qpath_reduce(%s)\n"
              "          to: '%s' ???", from, to) ;
      return 1 ;
    } ;

  p = to ;
  q = e ;

  while (1)
    {
      char ch = *p++ ;

      if ((ch == ' ') || (ch == '-'))
        continue ;

      *q++ = ch ;

      if (ch == '\0')
        break ;
    } ;

  qpath_set(qp, from) ;         /* Reduces automajically        */

  r = qpath_string(qp) ;

  if (strcmp(r, e) == 0)
    return 0 ;

  fprintf(stdout,
          "\n"
          "  qpath_reduce(%s)\n"
          "    returned: '%s'\n"
          "    expected: '%s'", from, r, e) ;

  return 1 ;
} ;