1;;; Copyright (C) William D Clinger (2016).
2;;;
3;;; Permission is hereby granted, free of charge, to any person
4;;; obtaining a copy of this software and associated documentation
5;;; files (the "Software"), to deal in the Software without
6;;; restriction, including without limitation the rights to use,
7;;; copy, modify, merge, publish, distribute, sublicense, and/or
8;;; sell copies of the Software, and to permit persons to whom the
9;;; Software is furnished to do so, subject to the following
10;;; conditions:
11;;;
12;;; The above copyright notice and this permission notice shall be
13;;; included in all copies or substantial portions of the Software.
14;;;
15;;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16;;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17;;; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18;;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19;;; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20;;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21;;; FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22;;; OTHER DEALINGS IN THE SOFTWARE.
23
24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25;;;
26;;; Tests for SRFI 130.
27;;;
28;;; To run in Larceny or Sagittarius, cd to the directory containing
29;;; this file and incant:
30;;;
31;;;     larceny --r7rs --path . --program srfi-130-test.scm
32;;;     sagittarius -r7 -L . srfi-130-test.scm
33;;;
34;;; Both Larceny and Sagittarius will look for the (srfi 130) library
35;;; in the srfi subdirectory.  The implementations contained within
36;;; the foof and srfi-130 directories can be tested by renaming those
37;;; directories to srfi.
38;;;
39;;; FIXME: These tests are incomplete because there's  a combinatorial
40;;; explosion of possibilities for optional arguments that could be
41;;; either indexes or cursors.  Consider string-prefix-length, for
42;;; example.  For each test that calls that procedure with all four
43;;; optional arguments, there are 16 possible combinations of indexes
44;;; and cursors.  Beginning with string-take, the optional arguments
45;;; tested are indexes rather than cursors.
46
47;;; Unicode is the main motivation for string cursors, so we ought
48;;; to use at least some non-ASCII strings for testing.
49;;; Some systems would blow up if this file were to contain non-ASCII
50;;; characters, however, so we have to be careful here.
51
52(use gauche.test)
53(use srfi-130)
54(test-section "srfi-130")
55(test-module 'srfi-130)
56
57(cond-expand (full-unicode
58              (define ABC
59                (list->string (map integer->char
60                                   '(#x3b1 #x3b2 #x3b3))))
61              (define ABCDEF
62                (list->string (map integer->char
63                                   '(#x0c0 #x062 #x0c7 #x064 #x0c9 #x066)))))
64             (else
65              (define ABC "abc")
66              (define ABCDEF "abcdef")))
67(define EMPTY "")
68(define ABC-ASCII "abc")
69(define ABCDEF-ASCII "abcdef")
70(define ABCDEFFFFOO "abcdeffffoo")
71
72(define-syntax OR
73  (syntax-rules (fail eq? eqv? equal? string=? =)
74    [(or (= expected expr) (fail 'symbol))
75     (test* (symbol->string 'symbol) expected expr)]
76    [(or (eq? expected expr) (fail 'symbol))
77     (test* (symbol->string 'symbol) expected expr)]
78    [(or (eqv? expected expr) (fail 'symbol))
79     (test* (symbol->string 'symbol) expected expr)]
80    [(or (equal? expected expr) (fail 'symbol))
81     (test* (symbol->string 'symbol) expected expr)]
82    [(or (string=? expected expr) (fail 'symbol))
83     (test* (symbol->string 'symbol) expected expr)]
84    [(or expr (fail 'symbol))
85     (test* (symbol->string 'symbol) #t expr)]))
86
87;;-----------------------------------------------------------------------
88(test-section "Cursor operations")
89
90(OR (string-cursor? (string-index->cursor "" 0))
91    (fail 'string-cursor?))
92
93(OR (not (string-cursor? #f))
94    (fail 'string-cursor?))
95
96(OR (string-cursor? (string-index->cursor (make-string 10000) 9999))
97    (fail 'string-cursor?))
98
99(OR (= 0
100       (string-cursor->index EMPTY (string-cursor-start EMPTY)))
101    (fail 'string-cursor-start))
102
103(OR (= 0
104       (string-cursor->index ABC (string-cursor-start ABC)))
105    (fail 'string-cursor-start))
106
107(OR (= 0
108       (string-cursor->index EMPTY (string-cursor-end EMPTY)))
109    (fail 'string-cursor-end))
110
111(OR (= 3
112       (string-cursor->index ABC (string-cursor-end ABC)))
113    (fail 'string-cursor-end))
114
115(OR (= 1
116       (string-cursor->index ABC (string-cursor-next ABC 0)))
117    (fail 'string-cursor-next))
118
119(OR (= 2
120       (string-cursor->index ABC (string-cursor-next ABC 1)))
121    (fail 'string-cursor-next))
122
123(OR (= 3
124       (string-cursor->index ABC (string-cursor-next ABC 2)))
125    (fail 'string-cursor-next))
126
127(OR (= 0
128       (string-cursor->index ABC (string-cursor-prev ABC 1)))
129    (fail 'string-cursor-prev))
130
131(OR (= 1
132       (string-cursor->index ABC (string-cursor-prev ABC 2)))
133    (fail 'string-cursor-prev))
134
135(OR (= 2
136       (string-cursor->index ABC (string-cursor-prev ABC 3)))
137    (fail 'string-cursor-prev))
138
139(OR (= 0
140       (string-cursor->index ABC (string-cursor-forward ABC 0 0)))
141    (fail 'string-cursor-forward))
142
143(OR (= 2
144       (string-cursor->index ABC (string-cursor-forward ABC 0 2)))
145    (fail 'string-cursor-forward))
146
147(OR (= 3
148       (string-cursor->index ABC (string-cursor-forward ABC 1 2)))
149    (fail 'string-cursor-forward))
150
151(OR (= 3
152       (string-cursor->index ABC (string-cursor-forward ABC 3 0)))
153    (fail 'string-cursor-forward))
154
155(OR (= 0
156       (string-cursor->index ABC (string-cursor-back ABC 0 0)))
157    (fail 'string-cursor-back))
158
159(OR (= 0
160       (string-cursor->index ABC (string-cursor-back ABC 2 2)))
161    (fail 'string-cursor-back))
162
163(OR (= 1
164       (string-cursor->index ABC (string-cursor-back ABC 3 2)))
165    (fail 'string-cursor-back))
166
167(OR (= 3
168       (string-cursor->index ABC (string-cursor-back ABC 3 0)))
169    (fail 'string-cursor-back))
170
171
172;;-----------------------------------------------------------------------
173(test-section "These are supposed to work on both indexes and cursors.")
174
175(OR (string-cursor=? 0 0)
176    (fail 'string-cursor=?))
177
178(OR (not (string-cursor=? 0 1))
179    (fail 'string-cursor=?))
180
181(OR (not (string-cursor=? 0 2))
182    (fail 'string-cursor=?))
183
184(OR (not (string-cursor=? 0 3))
185    (fail 'string-cursor=?))
186
187(OR (not (string-cursor=? 1 0))
188    (fail 'string-cursor=?))
189
190(OR (string-cursor=? 1 1)
191    (fail 'string-cursor=?))
192
193(OR (not (string-cursor=? 1 2))
194    (fail 'string-cursor=?))
195
196(OR (not (string-cursor=? 1 3))
197    (fail 'string-cursor=?))
198
199(OR (not (string-cursor=? 2 0))
200    (fail 'string-cursor=?))
201
202(OR (not (string-cursor=? 2 1))
203    (fail 'string-cursor=?))
204
205(OR (string-cursor=? 2 2)
206    (fail 'string-cursor=?))
207
208(OR (not (string-cursor=? 2 3))
209    (fail 'string-cursor=?))
210
211(OR (not (string-cursor=? 3 0))
212    (fail 'string-cursor=?))
213
214(OR (not (string-cursor=? 3 1))
215    (fail 'string-cursor=?))
216
217(OR (not (string-cursor=? 3 2))
218    (fail 'string-cursor=?))
219
220(OR (string-cursor=? 3 3)
221    (fail 'string-cursor=?))
222
223
224(OR (not (string-cursor<? 0 0))
225    (fail 'string-cursor<?))
226
227(OR (string-cursor<? 0 1)
228    (fail 'string-cursor<?))
229
230(OR (string-cursor<? 0 2)
231    (fail 'string-cursor<?))
232
233(OR (string-cursor<? 0 3)
234    (fail 'string-cursor<?))
235
236(OR (not (string-cursor<? 1 0))
237    (fail 'string-cursor<?))
238
239(OR (not (string-cursor<? 1 1))
240    (fail 'string-cursor<?))
241
242(OR (string-cursor<? 1 2)
243    (fail 'string-cursor<?))
244
245(OR (string-cursor<? 1 3)
246    (fail 'string-cursor<?))
247
248(OR (not (string-cursor<? 2 0))
249    (fail 'string-cursor<?))
250
251(OR (not (string-cursor<? 2 1))
252    (fail 'string-cursor<?))
253
254(OR (not (string-cursor<? 2 2))
255    (fail 'string-cursor<?))
256
257(OR (string-cursor<? 2 3)
258    (fail 'string-cursor<?))
259
260(OR (not (string-cursor<? 3 0))
261    (fail 'string-cursor<?))
262
263(OR (not (string-cursor<? 3 1))
264    (fail 'string-cursor<?))
265
266(OR (not (string-cursor<? 3 2))
267    (fail 'string-cursor<?))
268
269(OR (not (string-cursor<? 3 3))
270    (fail 'string-cursor<?))
271
272
273(OR (not (string-cursor>? 0 0))
274    (fail 'string-cursor>?))
275
276(OR (not (string-cursor>? 0 1))
277    (fail 'string-cursor>?))
278
279(OR (not (string-cursor>? 0 2))
280    (fail 'string-cursor>?))
281
282(OR (not (string-cursor>? 0 3))
283    (fail 'string-cursor>?))
284
285(OR (string-cursor>? 1 0)
286    (fail 'string-cursor>?))
287
288(OR (not (string-cursor>? 1 1))
289    (fail 'string-cursor>?))
290
291(OR (not (string-cursor>? 1 2))
292    (fail 'string-cursor>?))
293
294(OR (not (string-cursor>? 1 3))
295    (fail 'string-cursor>?))
296
297(OR (string-cursor>? 2 0)
298    (fail 'string-cursor>?))
299
300(OR (string-cursor>? 2 1)
301    (fail 'string-cursor>?))
302
303(OR (not (string-cursor>? 2 2))
304    (fail 'string-cursor>?))
305
306(OR (not (string-cursor>? 2 3))
307    (fail 'string-cursor>?))
308
309(OR (string-cursor>? 3 0)
310    (fail 'string-cursor>?))
311
312(OR (string-cursor>? 3 1)
313    (fail 'string-cursor>?))
314
315(OR (string-cursor>? 3 2)
316    (fail 'string-cursor>?))
317
318(OR (not (string-cursor>? 3 3))
319    (fail 'string-cursor>?))
320
321
322(OR (string-cursor<=? 0 0)
323    (fail 'string-cursor<=?))
324
325(OR (string-cursor<=? 0 1)
326    (fail 'string-cursor<=?))
327
328(OR (string-cursor<=? 0 2)
329    (fail 'string-cursor<=?))
330
331(OR (string-cursor<=? 0 3)
332    (fail 'string-cursor<=?))
333
334(OR (not (string-cursor<=? 1 0))
335    (fail 'string-cursor<=?))
336
337(OR (string-cursor<=? 1 1)
338    (fail 'string-cursor<=?))
339
340(OR (string-cursor<=? 1 2)
341    (fail 'string-cursor<=?))
342
343(OR (string-cursor<=? 1 3)
344    (fail 'string-cursor<=?))
345
346(OR (not (string-cursor<=? 2 0))
347    (fail 'string-cursor<=?))
348
349(OR (not (string-cursor<=? 2 1))
350    (fail 'string-cursor<=?))
351
352(OR (string-cursor<=? 2 2)
353    (fail 'string-cursor<=?))
354
355(OR (string-cursor<=? 2 3)
356    (fail 'string-cursor<=?))
357
358(OR (not (string-cursor<=? 3 0))
359    (fail 'string-cursor<=?))
360
361(OR (not (string-cursor<=? 3 1))
362    (fail 'string-cursor<=?))
363
364(OR (not (string-cursor<=? 3 2))
365    (fail 'string-cursor<=?))
366
367(OR (string-cursor<=? 3 3)
368    (fail 'string-cursor<=?))
369
370
371(OR (string-cursor>=? 0 0)
372    (fail 'string-cursor>=?))
373
374(OR (not (string-cursor>=? 0 1))
375    (fail 'string-cursor>=?))
376
377(OR (not (string-cursor>=? 0 2))
378    (fail 'string-cursor>=?))
379
380(OR (not (string-cursor>=? 0 3))
381    (fail 'string-cursor>=?))
382
383(OR (string-cursor>=? 1 0)
384    (fail 'string-cursor>=?))
385
386(OR (string-cursor>=? 1 1)
387    (fail 'string-cursor>=?))
388
389(OR (not (string-cursor>=? 1 2))
390    (fail 'string-cursor>=?))
391
392(OR (not (string-cursor>=? 1 3))
393    (fail 'string-cursor>=?))
394
395(OR (string-cursor>=? 2 0)
396    (fail 'string-cursor>=?))
397
398(OR (string-cursor>=? 2 1)
399    (fail 'string-cursor>=?))
400
401(OR (string-cursor>=? 2 2)
402    (fail 'string-cursor>=?))
403
404(OR (not (string-cursor>=? 2 3))
405    (fail 'string-cursor>=?))
406
407(OR (string-cursor>=? 3 0)
408    (fail 'string-cursor>=?))
409
410(OR (string-cursor>=? 3 1)
411    (fail 'string-cursor>=?))
412
413(OR (string-cursor>=? 3 2)
414    (fail 'string-cursor>=?))
415
416(OR (string-cursor>=? 3 3)
417    (fail 'string-cursor>=?))
418
419
420(OR (string-cursor=? (string-index->cursor ABC 0)
421                     (string-index->cursor ABC 0))
422    (fail 'string-cursor=?))
423
424(OR (not (string-cursor=? (string-index->cursor ABC 0)
425                          (string-index->cursor ABC 1)))
426    (fail 'string-cursor=?))
427
428(OR (not (string-cursor=? (string-index->cursor ABC 0)
429                          (string-index->cursor ABC 2)))
430    (fail 'string-cursor=?))
431
432(OR (not (string-cursor=? (string-index->cursor ABC 0)
433                          (string-index->cursor ABC 3)))
434    (fail 'string-cursor=?))
435
436(OR (not (string-cursor=? (string-index->cursor ABC 1)
437                          (string-index->cursor ABC 0)))
438    (fail 'string-cursor=?))
439
440(OR (string-cursor=? (string-index->cursor ABC 1)
441                     (string-index->cursor ABC 1))
442    (fail 'string-cursor=?))
443
444(OR (not (string-cursor=? (string-index->cursor ABC 1)
445                          (string-index->cursor ABC 2)))
446    (fail 'string-cursor=?))
447
448(OR (not (string-cursor=? (string-index->cursor ABC 1)
449                          (string-index->cursor ABC 3)))
450    (fail 'string-cursor=?))
451
452(OR (not (string-cursor=? (string-index->cursor ABC 2)
453                          (string-index->cursor ABC 0)))
454    (fail 'string-cursor=?))
455
456(OR (not (string-cursor=? (string-index->cursor ABC 2)
457                          (string-index->cursor ABC 1)))
458    (fail 'string-cursor=?))
459
460(OR (string-cursor=? (string-index->cursor ABC 2)
461                     (string-index->cursor ABC 2))
462    (fail 'string-cursor=?))
463
464(OR (not (string-cursor=? (string-index->cursor ABC 2)
465                          (string-index->cursor ABC 3)))
466    (fail 'string-cursor=?))
467
468(OR (not (string-cursor=? (string-index->cursor ABC 3)
469                          (string-index->cursor ABC 0)))
470    (fail 'string-cursor=?))
471
472(OR (not (string-cursor=? (string-index->cursor ABC 3)
473                          (string-index->cursor ABC 1)))
474    (fail 'string-cursor=?))
475
476(OR (not (string-cursor=? (string-index->cursor ABC 3)
477                          (string-index->cursor ABC 2)))
478    (fail 'string-cursor=?))
479
480(OR (string-cursor=? (string-index->cursor ABC 3)
481                     (string-index->cursor ABC 3))
482    (fail 'string-cursor=?))
483
484
485(OR (not (string-cursor<? (string-index->cursor ABC 0)
486                          (string-index->cursor ABC 0)))
487    (fail 'string-cursor<?))
488
489(OR (string-cursor<? (string-index->cursor ABC 0)
490                     (string-index->cursor ABC 1))
491    (fail 'string-cursor<?))
492
493(OR (string-cursor<? (string-index->cursor ABC 0)
494                     (string-index->cursor ABC 2))
495    (fail 'string-cursor<?))
496
497(OR (string-cursor<? (string-index->cursor ABC 0)
498                     (string-index->cursor ABC 3))
499    (fail 'string-cursor<?))
500
501(OR (not (string-cursor<? (string-index->cursor ABC 1)
502                          (string-index->cursor ABC 0)))
503    (fail 'string-cursor<?))
504
505(OR (not (string-cursor<? (string-index->cursor ABC 1)
506                          (string-index->cursor ABC 1)))
507    (fail 'string-cursor<?))
508
509(OR (string-cursor<? (string-index->cursor ABC 1)
510                     (string-index->cursor ABC 2))
511    (fail 'string-cursor<?))
512
513(OR (string-cursor<? (string-index->cursor ABC 1)
514                     (string-index->cursor ABC 3))
515    (fail 'string-cursor<?))
516
517(OR (not (string-cursor<? (string-index->cursor ABC 2)
518                          (string-index->cursor ABC 0)))
519    (fail 'string-cursor<?))
520
521(OR (not (string-cursor<? (string-index->cursor ABC 2)
522                          (string-index->cursor ABC 1)))
523    (fail 'string-cursor<?))
524
525(OR (not (string-cursor<? (string-index->cursor ABC 2)
526                          (string-index->cursor ABC 2)))
527    (fail 'string-cursor<?))
528
529(OR (string-cursor<? (string-index->cursor ABC 2)
530                     (string-index->cursor ABC 3))
531    (fail 'string-cursor<?))
532
533(OR (not (string-cursor<? (string-index->cursor ABC 3)
534                          (string-index->cursor ABC 0)))
535    (fail 'string-cursor<?))
536
537(OR (not (string-cursor<? (string-index->cursor ABC 3)
538                          (string-index->cursor ABC 1)))
539    (fail 'string-cursor<?))
540
541(OR (not (string-cursor<? (string-index->cursor ABC 3)
542                          (string-index->cursor ABC 2)))
543    (fail 'string-cursor<?))
544
545(OR (not (string-cursor<? (string-index->cursor ABC 3)
546                          (string-index->cursor ABC 3)))
547    (fail 'string-cursor<?))
548
549
550(OR (not (string-cursor>? (string-index->cursor ABC 0)
551                          (string-index->cursor ABC 0)))
552    (fail 'string-cursor>?))
553
554(OR (not (string-cursor>? (string-index->cursor ABC 0)
555                          (string-index->cursor ABC 1)))
556    (fail 'string-cursor>?))
557
558(OR (not (string-cursor>? (string-index->cursor ABC 0)
559                          (string-index->cursor ABC 2)))
560    (fail 'string-cursor>?))
561
562(OR (not (string-cursor>? (string-index->cursor ABC 0)
563                          (string-index->cursor ABC 3)))
564    (fail 'string-cursor>?))
565
566(OR (string-cursor>? (string-index->cursor ABC 1)
567                     (string-index->cursor ABC 0))
568    (fail 'string-cursor>?))
569
570(OR (not (string-cursor>? (string-index->cursor ABC 1)
571                          (string-index->cursor ABC 1)))
572    (fail 'string-cursor>?))
573
574(OR (not (string-cursor>? (string-index->cursor ABC 1)
575                          (string-index->cursor ABC 2)))
576    (fail 'string-cursor>?))
577
578(OR (not (string-cursor>? (string-index->cursor ABC 1)
579                          (string-index->cursor ABC 3)))
580    (fail 'string-cursor>?))
581
582(OR (string-cursor>? (string-index->cursor ABC 2)
583                     (string-index->cursor ABC 0))
584    (fail 'string-cursor>?))
585
586(OR (string-cursor>? (string-index->cursor ABC 2)
587                     (string-index->cursor ABC 1))
588    (fail 'string-cursor>?))
589
590(OR (not (string-cursor>? (string-index->cursor ABC 2)
591                          (string-index->cursor ABC 2)))
592    (fail 'string-cursor>?))
593
594(OR (not (string-cursor>? (string-index->cursor ABC 2)
595                          (string-index->cursor ABC 3)))
596    (fail 'string-cursor>?))
597
598(OR (string-cursor>? (string-index->cursor ABC 3)
599                     (string-index->cursor ABC 0))
600    (fail 'string-cursor>?))
601
602(OR (string-cursor>? (string-index->cursor ABC 3)
603                     (string-index->cursor ABC 1))
604    (fail 'string-cursor>?))
605
606(OR (string-cursor>? (string-index->cursor ABC 3)
607                     (string-index->cursor ABC 2))
608    (fail 'string-cursor>?))
609
610(OR (not (string-cursor>? (string-index->cursor ABC 3)
611                          (string-index->cursor ABC 3)))
612    (fail 'string-cursor>?))
613
614
615(OR (string-cursor<=? (string-index->cursor ABC 0)
616                      (string-index->cursor ABC 0))
617    (fail 'string-cursor<=?))
618
619(OR (string-cursor<=? (string-index->cursor ABC 0)
620                      (string-index->cursor ABC 1))
621    (fail 'string-cursor<=?))
622
623(OR (string-cursor<=? (string-index->cursor ABC 0)
624                      (string-index->cursor ABC 2))
625    (fail 'string-cursor<=?))
626
627(OR (string-cursor<=? (string-index->cursor ABC 0)
628                      (string-index->cursor ABC 3))
629    (fail 'string-cursor<=?))
630
631(OR (not (string-cursor<=? (string-index->cursor ABC 1)
632                           (string-index->cursor ABC 0)))
633    (fail 'string-cursor<=?))
634
635(OR (string-cursor<=? (string-index->cursor ABC 1)
636                      (string-index->cursor ABC 1))
637    (fail 'string-cursor<=?))
638
639(OR (string-cursor<=? (string-index->cursor ABC 1)
640                      (string-index->cursor ABC 2))
641    (fail 'string-cursor<=?))
642
643(OR (string-cursor<=? (string-index->cursor ABC 1)
644                      (string-index->cursor ABC 3))
645    (fail 'string-cursor<=?))
646
647(OR (not (string-cursor<=? (string-index->cursor ABC 2)
648                           (string-index->cursor ABC 0)))
649    (fail 'string-cursor<=?))
650
651(OR (not (string-cursor<=? (string-index->cursor ABC 2)
652                           (string-index->cursor ABC 1)))
653    (fail 'string-cursor<=?))
654
655(OR (string-cursor<=? (string-index->cursor ABC 2)
656                      (string-index->cursor ABC 2))
657    (fail 'string-cursor<=?))
658
659(OR (string-cursor<=? (string-index->cursor ABC 2)
660                      (string-index->cursor ABC 3))
661    (fail 'string-cursor<=?))
662
663(OR (not (string-cursor<=? (string-index->cursor ABC 3)
664                           (string-index->cursor ABC 0)))
665    (fail 'string-cursor<=?))
666
667(OR (not (string-cursor<=? (string-index->cursor ABC 3)
668                           (string-index->cursor ABC 1)))
669    (fail 'string-cursor<=?))
670
671(OR (not (string-cursor<=? (string-index->cursor ABC 3)
672                           (string-index->cursor ABC 2)))
673    (fail 'string-cursor<=?))
674
675(OR (string-cursor<=? (string-index->cursor ABC 3)
676                      (string-index->cursor ABC 3))
677    (fail 'string-cursor<=?))
678
679
680(OR (string-cursor>=? (string-index->cursor ABC 0)
681                      (string-index->cursor ABC 0))
682    (fail 'string-cursor>=?))
683
684(OR (not (string-cursor>=? (string-index->cursor ABC 0)
685                           (string-index->cursor ABC 1)))
686    (fail 'string-cursor>=?))
687
688(OR (not (string-cursor>=? (string-index->cursor ABC 0)
689                           (string-index->cursor ABC 2)))
690    (fail 'string-cursor>=?))
691
692(OR (not (string-cursor>=? (string-index->cursor ABC 0)
693                           (string-index->cursor ABC 3)))
694    (fail 'string-cursor>=?))
695
696(OR (string-cursor>=? (string-index->cursor ABC 1)
697                      (string-index->cursor ABC 0))
698    (fail 'string-cursor>=?))
699
700(OR (string-cursor>=? (string-index->cursor ABC 1)
701                      (string-index->cursor ABC 1))
702    (fail 'string-cursor>=?))
703
704(OR (not (string-cursor>=? (string-index->cursor ABC 1)
705                           (string-index->cursor ABC 2)))
706    (fail 'string-cursor>=?))
707
708(OR (not (string-cursor>=? (string-index->cursor ABC 1)
709                           (string-index->cursor ABC 3)))
710    (fail 'string-cursor>=?))
711
712(OR (string-cursor>=? (string-index->cursor ABC 2)
713                      (string-index->cursor ABC 0))
714    (fail 'string-cursor>=?))
715
716(OR (string-cursor>=? (string-index->cursor ABC 2)
717                      (string-index->cursor ABC 1))
718    (fail 'string-cursor>=?))
719
720(OR (string-cursor>=? (string-index->cursor ABC 2)
721                      (string-index->cursor ABC 2))
722    (fail 'string-cursor>=?))
723
724(OR (not (string-cursor>=? (string-index->cursor ABC 2)
725                           (string-index->cursor ABC 3)))
726    (fail 'string-cursor>=?))
727
728(OR (string-cursor>=? (string-index->cursor ABC 3)
729                      (string-index->cursor ABC 0))
730    (fail 'string-cursor>=?))
731
732(OR (string-cursor>=? (string-index->cursor ABC 3)
733                      (string-index->cursor ABC 1))
734    (fail 'string-cursor>=?))
735
736(OR (string-cursor>=? (string-index->cursor ABC 3)
737                      (string-index->cursor ABC 2))
738    (fail 'string-cursor>=?))
739
740(OR (string-cursor>=? (string-index->cursor ABC 3)
741                      (string-index->cursor ABC 3))
742    (fail 'string-cursor>=?))
743
744
745(OR (= 0 (string-cursor-diff ABC
746                             (string-index->cursor ABC 0)
747                             (string-index->cursor ABC 0)))
748    (fail 'string-cursor-diff))
749
750(OR (= 3 (string-cursor-diff ABC
751                             (string-index->cursor ABC 0)
752                             (string-index->cursor ABC 3)))
753    (fail 'string-cursor-diff))
754
755(OR (= 0 (string-cursor->index EMPTY (string-index->cursor EMPTY 0)))
756    (fail 'string-cursor->index))
757
758(OR (= 3 (string-cursor->index ABC (string-index->cursor ABC 3)))
759    (fail 'string-cursor->index))
760
761(OR (= 0 (string-cursor->index EMPTY (string-index->cursor EMPTY 0)))
762    (fail 'string-index->cursor))
763
764(OR (= 3 (string-cursor->index ABC (string-index->cursor ABC 3)))
765    (fail 'string-index->cursor))
766
767;;-----------------------------------------------------------------------
768(test-section "Predicates")
769
770(OR (string-null? "")
771    (fail 'string-null))
772
773(OR (not (string-null? "abc"))
774    (fail 'string-null))
775
776(OR (eqv? #t (string-every (lambda (c) (if (char? c) c #f)) ""))
777    (fail 'string-every))
778
779(OR (eqv? #\c (string-every (lambda (c) (if (char? c) c #f)) "abc"))
780    (fail 'string-every))
781
782(OR (eqv? #f (string-every (lambda (c) (if (char>? c #\b) c #f)) "abc"))
783    (fail 'string-every))
784
785(OR (eqv? #\c (string-every (lambda (c) (if (char>? c #\b) c #f)) "abc" 2))
786    (fail 'string-every))
787
788(test* "string-every"
789       #\c
790       (string-every (lambda (c) (if (char>? c #\b) c #f))
791                     ABC-ASCII
792                     (string-index->cursor ABC-ASCII 2)))
793
794(OR (eqv? #t (string-every (lambda (c) (if (char>? c #\b) c #f)) "abc" 1 1))
795    (fail 'string-every))
796
797(test* "string-every"
798       #t
799       (string-every (lambda (c) (if (char>? c #\b) c #f))
800                     ABC-ASCII
801                     (string-index->cursor ABC-ASCII 1)
802                     (string-index->cursor ABC-ASCII 1)))
803
804(OR (eqv? #f (string-any (lambda (c) (if (char? c) c #f)) ""))
805    (fail 'string-any))
806
807(OR (eqv? #\a (string-any (lambda (c) (if (char? c) c #f)) "abc"))
808    (fail 'string-any))
809
810(OR (eqv? #\c (string-any (lambda (c) (if (char>? c #\b) c #f)) "abc"))
811    (fail 'string-any))
812
813(OR (eqv? #\c (string-any (lambda (c) (if (char>? c #\b) c #f)) "abc" 2))
814    (fail 'string-any))
815
816(test* "string-any"
817       #\c
818       (string-any (lambda (c) (if (char>? c #\b) c #f))
819                   ABC-ASCII
820                   (string-index->cursor ABC-ASCII 2)))
821
822(OR (eqv? #f (string-any (lambda (c) (if (char>? c #\b) c #f)) "abc" 0 2))
823    (fail 'string-any))
824
825(test* "string-any"
826       #f
827       (string-any (lambda (c) (if (char>? c #\b) c #f))
828                   ABC-ASCII
829                   (string-cursor-start ABC-ASCII)
830                   (string-index->cursor ABC-ASCII 2)))
831
832;;-----------------------------------------------------------------------
833(test-section "Constructors")
834
835(OR (equal? ""
836            (string-tabulate (lambda (i)
837                               (integer->char (+ i (char->integer #\a))))
838                             0))
839    (fail 'string-tabulate))
840
841(OR (equal? "abc"
842            (string-tabulate (lambda (i)
843                               (integer->char (+ i (char->integer #\a))))
844                             3))
845    (fail 'string-tabulate))
846
847(OR (equal? "abc"
848            (let ((p (open-input-string "abc")))
849              (string-unfold eof-object?
850                             values
851                             (lambda (x) (read-char p))
852                             (read-char p))))
853    (fail 'string-unfold))
854
855(OR (equal? "" (string-unfold null? car cdr '()))
856    (fail 'string-unfold))
857
858(OR (equal? "abc" (string-unfold null? car cdr (string->list "abc")))
859    (fail 'string-unfold))
860
861(OR (equal? "def" (string-unfold null? car cdr '() "def"))
862    (fail 'string-unfold))
863
864(OR (equal? "defabcG"
865            (string-unfold null?
866                           car
867                           cdr
868                           (string->list "abc")
869                           "def"
870                           (lambda (x) (and (null? x) "G"))))
871    (fail 'string-unfold))
872
873(OR (equal? "" (string-unfold-right null? car cdr '()))
874    (fail 'string-unfold-right))
875
876(OR (equal? "cba" (string-unfold-right null? car cdr (string->list "abc")))
877    (fail 'string-unfold-right))
878
879(OR (equal? "def" (string-unfold-right null? car cdr '() "def"))
880    (fail 'string-unfold-right))
881
882(OR (equal? "Gcbadef"
883            (string-unfold-right null?
884                                 car
885                                 cdr
886                                 (string->list "abc")
887                                 "def"
888                                 (lambda (x) (and (null? x) "G"))))
889    (fail 'string-unfold-right))
890
891;;-----------------------------------------------------------------------
892(test-section "Conversion")
893
894(OR (equal? '() (string->list/cursors ""))
895    (fail 'string->list/cursors))
896
897(OR (equal? '() (string->list/cursors "" 0))
898    (fail 'string->list/cursors))
899
900(OR (equal? '() (string->list/cursors "" 0 0))
901    (fail 'string->list/cursors))
902
903(OR (equal? '(#\a #\b #\c) (string->list/cursors "abc"))
904    (fail 'string->list/cursors))
905
906(OR (equal? '() (string->list/cursors "abc" 3))
907    (fail 'string->list/cursors))
908
909(OR (equal? '(#\b #\c) (string->list/cursors "abc" 1 3))
910    (fail 'string->list/cursors))
911
912(OR (equal? '(#\b #\c)
913            (string->list/cursors ABC-ASCII
914                                  (string-index->cursor ABC-ASCII 1)
915                                  (string-index->cursor ABC-ASCII 3)))
916    (fail 'string->list/cursors))
917
918(OR (equal? '#() (string->vector/cursors ""))
919    (fail 'string->vector/cursors))
920
921(OR (equal? '#() (string->vector/cursors "" 0))
922    (fail 'string->vector/cursors))
923
924(OR (equal? '#() (string->vector/cursors "" 0 0))
925    (fail 'string->vector/cursors))
926
927(OR (equal? '#(#\a #\b #\c) (string->vector/cursors "abc"))
928    (fail 'string->vector/cursors))
929
930(OR (equal? '#() (string->vector/cursors "abc" 3))
931    (fail 'string->vector/cursors))
932
933(OR (equal? '#(#\b #\c) (string->vector/cursors "abc" 1 3))
934    (fail 'string->vector/cursors))
935
936(OR (equal? '#(#\b #\c)
937            (string->vector/cursors ABC-ASCII
938                                    (string-index->cursor ABC-ASCII 1)
939                                    (string-index->cursor ABC-ASCII 3)))
940    (fail 'string->vector/cursors))
941
942(OR (equal? "" (reverse-list->string '()))
943    (fail 'reverse-list->string))
944
945(OR (equal? "cba" (reverse-list->string '(#\a #\b #\c)))
946    (fail 'reverse-list->string))
947
948(OR (equal? "" (string-join '()))
949    (fail 'string-join))
950
951(OR (equal? " ab cd  e f "
952            (string-join '("" "ab" "cd" "" "e" "f" "")))
953    (fail 'string-join))
954
955(OR (equal? "" (string-join '() ""))
956    (fail 'string-join))
957
958(OR (equal? "abcdef"
959            (string-join '("" "ab" "cd" "" "e" "f" "") ""))
960    (fail 'string-join))
961
962(OR (equal? "" (string-join '() "xyz"))
963    (fail 'string-join))
964
965(OR (equal? "xyzabxyzcdxyzxyzexyzfxyz"
966            (string-join '("" "ab" "cd" "" "e" "f" "") "xyz"))
967    (fail 'string-join))
968
969(OR (equal? "" (string-join '() "" 'infix))
970    (fail 'string-join))
971
972(OR (equal? "abcdef"
973            (string-join '("" "ab" "cd" "" "e" "f" "") "" 'infix))
974    (fail 'string-join))
975
976(OR (equal? "" (string-join '() "xyz" 'infix))
977    (fail 'string-join))
978
979(OR (equal? "xyzabxyzcdxyzxyzexyzfxyz"
980            (string-join '("" "ab" "cd" "" "e" "f" "") "xyz" 'infix))
981    (fail 'string-join))
982
983(OR (equal? 'horror
984            (guard (exn (#t 'horror))
985             (string-join '() "" 'strict-infix)))
986    (fail 'string-join))
987
988(OR (equal? "abcdef"
989            (string-join '("" "ab" "cd" "" "e" "f" "") "" 'strict-infix))
990    (fail 'string-join))
991
992(OR (equal? 'wham
993            (guard (exn (else 'wham))
994             (string-join '() "xyz" 'strict-infix)))
995    (fail 'string-join))
996
997(OR (equal? "xyzabxyzcdxyzxyzexyzfxyz"
998            (string-join '("" "ab" "cd" "" "e" "f" "") "xyz" 'strict-infix))
999    (fail 'string-join))
1000
1001(OR (equal? "" (string-join '() "" 'suffix))
1002    (fail 'string-join))
1003
1004(OR (equal? "abcdef"
1005            (string-join '("" "ab" "cd" "" "e" "f" "") "" 'suffix))
1006    (fail 'string-join))
1007
1008(OR (equal? "" (string-join '() "xyz" 'suffix))
1009    (fail 'string-join))
1010
1011(OR (equal? "xyzabxyzcdxyzxyzexyzfxyzxyz"
1012            (string-join '("" "ab" "cd" "" "e" "f" "") "xyz" 'suffix))
1013    (fail 'string-join))
1014
1015(OR (equal? "" (string-join '() "" 'prefix))
1016    (fail 'string-join))
1017
1018(OR (equal? "abcdef"
1019            (string-join '("" "ab" "cd" "" "e" "f" "") "" 'prefix))
1020    (fail 'string-join))
1021
1022(OR (equal? "" (string-join '() "xyz" 'prefix))
1023    (fail 'string-join))
1024
1025(OR (equal? "xyzxyzabxyzcdxyzxyzexyzfxyz"
1026            (string-join '("" "ab" "cd" "" "e" "f" "") "xyz" 'prefix))
1027    (fail 'string-join))
1028
1029;;-----------------------------------------------------------------------
1030(test-section "Selection")
1031
1032(OR (char=? #\a (string-ref/cursor "abc" 0))
1033    (fail 'string-ref/cursor))
1034
1035(OR (char=? #\c (string-ref/cursor "abc" 2))
1036    (fail 'string-ref/cursor))
1037
1038(OR (char=? #\a (string-ref/cursor ABC-ASCII (string-index->cursor ABC-ASCII 0)))
1039    (fail 'string-ref/cursor))
1040
1041(OR (char=? #\c (string-ref/cursor ABC-ASCII (string-index->cursor ABC-ASCII 2)))
1042    (fail 'string-ref/cursor))
1043
1044(OR (string=? "" (substring/cursors "" 0 0))
1045    (fail 'substring/cursors))
1046
1047(OR (string=? "" (substring/cursors "abc" 0 0))
1048    (fail 'substring/cursors))
1049
1050(OR (string=? "" (substring/cursors "abc" 3 3))
1051    (fail 'substring/cursors))
1052
1053(OR (string=? ABC (substring/cursors ABC 0 3))
1054    (fail 'substring/cursors))
1055
1056(OR (string=? ABC
1057              (substring/cursors ABC
1058                                 (string-index->cursor ABC 0)
1059                                 (string-index->cursor ABC 3)))
1060    (fail 'substring/cursors))
1061
1062(OR (string=? "b" (substring/cursors "abc" 1 2))
1063    (fail 'substring/cursors))
1064
1065(OR (string=? "" (string-copy/cursors ""))
1066    (fail 'string-copy/cursors))
1067
1068(OR (string=? "abc" (string-copy/cursors "abc"))
1069    (fail 'string-copy/cursors))
1070
1071(OR (string=? "" (string-copy/cursors "abc" 3))
1072    (fail 'string-copy/cursors))
1073
1074(OR (string=? "c" (string-copy/cursors "abc" 2))
1075    (fail 'string-copy/cursors))
1076
1077(OR (string=? "abc" (string-copy/cursors "abc" 0))
1078    (fail 'string-copy/cursors))
1079
1080(OR (string=? "b" (string-copy/cursors "abc" 1 2))
1081    (fail 'string-copy/cursors))
1082
1083(OR (string=? "" (string-copy/cursors "" 0 0))
1084    (fail 'string-copy/cursors))
1085
1086(OR (string=? "" (string-copy/cursors "abc" 0 0))
1087    (fail 'string-copy/cursors))
1088
1089(OR (string=? "" (string-copy/cursors "abc" 3 3))
1090    (fail 'string-copy/cursors))
1091
1092(OR (string=? "abc" (string-copy/cursors "abc" 0 3))
1093    (fail 'string-copy/cursors))
1094
1095(OR (string=? "b" (string-copy/cursors "abc" 1 2))
1096    (fail 'string-copy/cursors))
1097
1098(OR (string=? (substring ABC 1 2)
1099              (string-copy/cursors ABC
1100                                   (string-index->cursor ABC 1)
1101                                   (string-index->cursor ABC 2)))
1102    (fail 'string-copy/cursors))
1103
1104(OR (string=? "" (string-take "" 0))
1105    (fail 'string-take))
1106
1107(OR (string=? "" (string-take "abcdef" 0))
1108    (fail 'string-take))
1109
1110(OR (string=? "ab" (string-take "abcdef" 2))
1111    (fail 'string-take))
1112
1113(OR (string=? "" (string-drop "" 0))
1114    (fail 'string-drop))
1115
1116(OR (string=? "abcdef" (string-drop "abcdef" 0))
1117    (fail 'string-drop))
1118
1119(OR (string=? "cdef" (string-drop "abcdef" 2))
1120    (fail 'string-drop))
1121
1122(OR (string=? "" (string-take-right "" 0))
1123    (fail 'string-take-right))
1124
1125(OR (string=? "" (string-take-right "abcdef" 0))
1126    (fail 'string-take-right))
1127
1128(OR (string=? "ef" (string-take-right "abcdef" 2))
1129    (fail 'string-take-right))
1130
1131(OR (string=? "" (string-drop-right "" 0))
1132    (fail 'string-drop-right))
1133
1134(OR (string=? "abcdef" (string-drop-right "abcdef" 0))
1135    (fail 'string-drop-right))
1136
1137(OR (string=? "abcd" (string-drop-right "abcdef" 2))
1138    (fail 'string-drop-right))
1139
1140(OR (string=? "" (string-pad "" 0))
1141    (fail 'string-pad))
1142
1143(OR (string=? "     " (string-pad "" 5))
1144    (fail 'string-pad))
1145
1146(OR (string=? "  325" (string-pad "325" 5))
1147    (fail 'string-pad))
1148
1149(OR (string=? "71325" (string-pad "71325" 5))
1150    (fail 'string-pad))
1151
1152(OR (string=? "71325" (string-pad "8871325" 5))
1153    (fail 'string-pad))
1154
1155(OR (string=? "" (string-pad "" 0 #\*))
1156    (fail 'string-pad))
1157
1158(OR (string=? "*****" (string-pad "" 5 #\*))
1159    (fail 'string-pad))
1160
1161(OR (string=? "**325" (string-pad "325" 5 #\*))
1162    (fail 'string-pad))
1163
1164(OR (string=? "71325" (string-pad "71325" 5 #\*))
1165    (fail 'string-pad))
1166
1167(OR (string=? "71325" (string-pad "8871325" 5 #\*))
1168    (fail 'string-pad))
1169
1170(OR (string=? "" (string-pad "" 0 #\* 0))
1171    (fail 'string-pad))
1172
1173(test* "string-pad" "" (string-pad EMPTY 0 #\* (string-cursor-start EMPTY)))
1174
1175(OR (string=? "*****" (string-pad "" 5 #\* 0))
1176    (fail 'string-pad))
1177
1178(OR (string=? "**325" (string-pad "325" 5 #\* 0))
1179    (fail 'string-pad))
1180
1181(OR (string=? "71325" (string-pad "71325" 5 #\* 0))
1182    (fail 'string-pad))
1183
1184(OR (string=? "71325" (string-pad "8871325" 5 #\* 0))
1185    (fail 'string-pad))
1186
1187(OR (string=? "***25" (string-pad "325" 5 #\* 1))
1188    (fail 'string-pad))
1189
1190(test* "string-pad "
1191       "***25"
1192       (let ([s "325"])
1193         (string-pad s 5 #\* (string-index->cursor s 1))))
1194
1195(OR (string=? "*1325" (string-pad "71325" 5 #\* 1))
1196    (fail 'string-pad))
1197
1198(OR (string=? "71325" (string-pad "8871325" 5 #\* 1))
1199    (fail 'string-pad))
1200
1201(OR (string=? "" (string-pad "" 0 #\* 0 0))
1202    (fail 'string-pad))
1203
1204(OR (string=? "*****" (string-pad "" 5 #\* 0 0))
1205    (fail 'string-pad))
1206
1207(OR (string=? "**325" (string-pad "325" 5 #\* 0 3))
1208    (fail 'string-pad))
1209
1210(test* "string-pad"
1211       "**325"
1212       (let ([s "325"])
1213         (string-pad s 5 #\* (string-cursor-start s) (string-cursor-end s))))
1214
1215(OR (string=? "**713" (string-pad "71325" 5 #\* 0 3))
1216    (fail 'string-pad))
1217
1218(OR (string=? "**887" (string-pad "8871325" 5 #\* 0 3))
1219    (fail 'string-pad))
1220
1221(OR (string=? "***25" (string-pad "325" 5 #\* 1 3))
1222    (fail 'string-pad))
1223
1224(OR (string=? "**132" (string-pad "71325" 5 #\* 1 4))
1225    (fail 'string-pad))
1226
1227(OR (string=? "*8713" (string-pad "8871325" 5 #\* 1 5))
1228    (fail 'string-pad))
1229
1230(OR (string=? "" (string-pad-right "" 0))
1231    (fail 'string-pad-right))
1232
1233(OR (string=? "     " (string-pad-right "" 5))
1234    (fail 'string-pad-right))
1235
1236(OR (string=? "325  " (string-pad-right "325" 5))
1237    (fail 'string-pad-right))
1238
1239(OR (string=? "71325" (string-pad-right "71325" 5))
1240    (fail 'string-pad-right))
1241
1242(OR (string=? "88713" (string-pad-right "8871325" 5))
1243    (fail 'string-pad-right))
1244
1245(OR (string=? "" (string-pad-right "" 0 #\*))
1246    (fail 'string-pad-right))
1247
1248(OR (string=? "*****" (string-pad-right "" 5 #\*))
1249    (fail 'string-pad-right))
1250
1251(OR (string=? "325**" (string-pad-right "325" 5 #\*))
1252    (fail 'string-pad-right))
1253
1254(OR (string=? "71325" (string-pad-right "71325" 5 #\*))
1255    (fail 'string-pad-right))
1256
1257(OR (string=? "88713" (string-pad-right "8871325" 5 #\*))
1258    (fail 'string-pad-right))
1259
1260(OR (string=? "" (string-pad-right "" 0 #\* 0))
1261    (fail 'string-pad-right))
1262
1263(OR (string=? "*****" (string-pad-right "" 5 #\* 0))
1264    (fail 'string-pad-right))
1265
1266(OR (string=? "325**" (string-pad-right "325" 5 #\* 0))
1267    (fail 'string-pad-right))
1268
1269(OR (string=? "71325" (string-pad-right "71325" 5 #\* 0))
1270    (fail 'string-pad-right))
1271
1272(OR (string=? "88713" (string-pad-right "8871325" 5 #\* 0))
1273    (fail 'string-pad-right))
1274
1275(OR (string=? "25***" (string-pad-right "325" 5 #\* 1))
1276    (fail 'string-pad-right))
1277
1278(OR (string=? "1325*" (string-pad-right "71325" 5 #\* 1))
1279    (fail 'string-pad-right))
1280
1281(OR (string=? "87132" (string-pad-right "8871325" 5 #\* 1))
1282    (fail 'string-pad-right))
1283
1284(OR (string=? "" (string-pad-right "" 0 #\* 0 0))
1285    (fail 'string-pad-right))
1286
1287(OR (string=? "*****" (string-pad-right "" 5 #\* 0 0))
1288    (fail 'string-pad-right))
1289
1290(OR (string=? "325**" (string-pad-right "325" 5 #\* 0 3))
1291    (fail 'string-pad-right))
1292
1293(OR (string=? "713**" (string-pad-right "71325" 5 #\* 0 3))
1294    (fail 'string-pad-right))
1295
1296(OR (string=? "887**" (string-pad-right "8871325" 5 #\* 0 3))
1297    (fail 'string-pad-right))
1298
1299(OR (string=? "25***" (string-pad-right "325" 5 #\* 1 3))
1300    (fail 'string-pad-right))
1301
1302(OR (string=? "132**" (string-pad-right "71325" 5 #\* 1 4))
1303    (fail 'string-pad-right))
1304
1305(OR (string=? "8713*" (string-pad-right "8871325" 5 #\* 1 5))
1306    (fail 'string-pad-right))
1307
1308
1309(OR (string=? "" (string-trim ""))
1310    (fail 'string-trim))
1311
1312(OR (string=? "a  b  c  " (string-trim "  a  b  c  "))
1313    (fail 'string-trim))
1314
1315(OR (string=? "" (string-trim "" char-whitespace?))
1316    (fail 'string-trim))
1317
1318(OR (string=? "a  b  c  " (string-trim "  a  b  c  " char-whitespace?))
1319    (fail 'string-trim))
1320
1321(OR (string=? "" (string-trim "  a  b  c  " char?))
1322    (fail 'string-trim))
1323
1324(OR (string=? "" (string-trim "" char-whitespace? 0))
1325    (fail 'string-trim))
1326
1327(test* "string-trim" "" (string-trim EMPTY char-whitespace? (string-cursor-start EMPTY)))
1328
1329(OR (string=? "a  b  c  " (string-trim "  a  b  c  " char-whitespace? 0))
1330    (fail 'string-trim))
1331
1332(OR (string=? "" (string-trim "  a  b  c  " char? 0))
1333    (fail 'string-trim))
1334
1335(OR (string=? "b  c  " (string-trim "  a  b  c  " char-whitespace? 3))
1336    (fail 'string-trim))
1337
1338(OR (string=? "" (string-trim "  a  b  c  " char? 3))
1339    (fail 'string-trim))
1340
1341(OR (string=? "" (string-trim "  a  b  c  " char? 0 11))
1342    (fail 'string-trim))
1343
1344(test* "string-trim"
1345       ""
1346       (let ([s "  a  b  c  "])
1347         (string-trim s
1348                      char?
1349                      (string-cursor-start s)
1350                      (string-index->cursor s 11))))
1351
1352(OR (string=? "b  c  " (string-trim "  a  b  c  " char-whitespace? 3 11))
1353    (fail 'string-trim))
1354
1355(OR (string=? "" (string-trim "  a  b  c  " char? 3 11))
1356    (fail 'string-trim))
1357
1358(OR (string=? "" (string-trim "  a  b  c  " char? 0 8))
1359    (fail 'string-trim))
1360
1361(OR (string=? "b  " (string-trim "  a  b  c  " char-whitespace? 3 8))
1362    (fail 'string-trim))
1363
1364(OR (string=? "" (string-trim "  a  b  c  " char? 3 8))
1365    (fail 'string-trim))
1366
1367
1368(OR (string=? "" (string-trim-right ""))
1369    (fail 'string-trim-right))
1370
1371(OR (string=? "  a  b  c" (string-trim-right "  a  b  c  "))
1372    (fail 'string-trim-right))
1373
1374(OR (string=? "" (string-trim-right "" char-whitespace?))
1375    (fail 'string-trim-right))
1376
1377(OR (string=? "  a  b  c" (string-trim-right "  a  b  c  " char-whitespace?))
1378    (fail 'string-trim-right))
1379
1380(OR (string=? "" (string-trim-right "  a  b  c  " char?))
1381    (fail 'string-trim-right))
1382
1383(OR (string=? "" (string-trim-right "" char-whitespace? 0))
1384    (fail 'string-trim-right))
1385
1386(OR (string=? "  a  b  c" (string-trim-right "  a  b  c  " char-whitespace? 0))
1387    (fail 'string-trim-right))
1388
1389(OR (string=? "" (string-trim-right "  a  b  c  " char? 0))
1390    (fail 'string-trim-right))
1391
1392(OR (string=? "  b  c" (string-trim-right "  a  b  c  " char-whitespace? 3))
1393    (fail 'string-trim-right))
1394
1395(OR (string=? "" (string-trim-right "  a  b  c  " char? 3))
1396    (fail 'string-trim-right))
1397
1398(OR (string=? "" (string-trim-right "  a  b  c  " char? 0 11))
1399    (fail 'string-trim-right))
1400
1401(OR (string=? "  b  c" (string-trim-right "  a  b  c  " char-whitespace? 3 11))
1402    (fail 'string-trim-right))
1403
1404(OR (string=? "" (string-trim-right "  a  b  c  " char? 3 11))
1405    (fail 'string-trim-right))
1406
1407(OR (string=? "" (string-trim-right "  a  b  c  " char? 0 8))
1408    (fail 'string-trim-right))
1409
1410(OR (string=? "  b" (string-trim-right "  a  b  c  " char-whitespace? 3 8))
1411    (fail 'string-trim-right))
1412
1413(OR (string=? "" (string-trim-right "  a  b  c  " char? 3 8))
1414    (fail 'string-trim-right))
1415
1416
1417(OR (string=? "" (string-trim-both ""))
1418    (fail 'string-trim-both))
1419
1420(OR (string=? "a  b  c" (string-trim-both "  a  b  c  "))
1421    (fail 'string-trim-both))
1422
1423(OR (string=? "" (string-trim-both "" char-whitespace?))
1424    (fail 'string-trim-both))
1425
1426(OR (string=? "a  b  c" (string-trim-both "  a  b  c  " char-whitespace?))
1427    (fail 'string-trim-both))
1428
1429(OR (string=? "" (string-trim-both "  a  b  c  " char?))
1430    (fail 'string-trim-both))
1431
1432(OR (string=? "" (string-trim-both "" char-whitespace? 0))
1433    (fail 'string-trim-both))
1434
1435(OR (string=? "a  b  c" (string-trim-both "  a  b  c  " char-whitespace? 0))
1436    (fail 'string-trim-both))
1437
1438(OR (string=? "" (string-trim-both "  a  b  c  " char? 0))
1439    (fail 'string-trim-both))
1440
1441(OR (string=? "b  c" (string-trim-both "  a  b  c  " char-whitespace? 3))
1442    (fail 'string-trim-both))
1443
1444(OR (string=? "" (string-trim-both "  a  b  c  " char? 3))
1445    (fail 'string-trim-both))
1446
1447(OR (string=? "" (string-trim-both "  a  b  c  " char? 0 11))
1448    (fail 'string-trim-both))
1449
1450(OR (string=? "b  c" (string-trim-both "  a  b  c  " char-whitespace? 3 11))
1451    (fail 'string-trim-both))
1452
1453(OR (string=? "" (string-trim-both "  a  b  c  " char? 3 11))
1454    (fail 'string-trim-both))
1455
1456(OR (string=? "" (string-trim-both "  a  b  c  " char? 0 8))
1457    (fail 'string-trim-both))
1458
1459(OR (string=? "b" (string-trim-both "  a  b  c  " char-whitespace? 3 8))
1460    (fail 'string-trim-both))
1461
1462(OR (string=? "" (string-trim-both "  a  b  c  " char? 3 8))
1463    (fail 'string-trim-both))
1464
1465
1466(OR (= 0 (string-prefix-length "" ""))
1467    (fail 'string-prefix-length))
1468
1469(OR (= 0 (string-prefix-length "" "aabbccddee"))
1470    (fail 'string-prefix-length))
1471
1472(OR (= 0 (string-prefix-length "aisle" ""))
1473    (fail 'string-prefix-length))
1474
1475(OR (= 0 (string-prefix-length "" "aabbccddee"))
1476    (fail 'string-prefix-length))
1477
1478(OR (= 1 (string-prefix-length "aisle" "aabbccddee"))
1479    (fail 'string-prefix-length))
1480
1481(OR (= 0 (string-prefix-length "bail" "aabbccddee"))
1482    (fail 'string-prefix-length))
1483
1484(OR (= 4 (string-prefix-length "prefix" "preface"))
1485    (fail 'string-prefix-length))
1486
1487(OR (= 0 (string-prefix-length "" "" 0))
1488    (fail 'string-prefix-length))
1489
1490(OR (= 0 (string-prefix-length "" "aabbccddee" 0))
1491    (fail 'string-prefix-length))
1492
1493(OR (= 0 (string-prefix-length "aisle" "" 0))
1494    (fail 'string-prefix-length))
1495
1496(OR (= 1 (string-prefix-length "aisle" "aabbccddee" 0))
1497    (fail 'string-prefix-length))
1498
1499(OR (= 0 (string-prefix-length "bail" "aabbccddee" 0))
1500    (fail 'string-prefix-length))
1501
1502(OR (= 4 (string-prefix-length "prefix" "preface" 0))
1503    (fail 'string-prefix-length))
1504
1505(OR (= 0 (string-prefix-length "aisle" "" 1))
1506    (fail 'string-prefix-length))
1507
1508(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 1))
1509    (fail 'string-prefix-length))
1510
1511(OR (= 1 (string-prefix-length "bail" "aabbccddee" 1))
1512    (fail 'string-prefix-length))
1513
1514(OR (= 0 (string-prefix-length "prefix" "preface" 1))
1515    (fail 'string-prefix-length))
1516
1517(OR (= 0 (string-prefix-length "" "" 0 0))
1518    (fail 'string-prefix-length))
1519
1520(OR (= 0 (string-prefix-length "" "aabbccddee" 0 0))
1521    (fail 'string-prefix-length))
1522
1523(OR (= 0 (string-prefix-length "aisle" "" 0 4))
1524    (fail 'string-prefix-length))
1525
1526(OR (= 1 (string-prefix-length "aisle" "aabbccddee" 0 4))
1527    (fail 'string-prefix-length))
1528
1529(OR (= 0 (string-prefix-length "bail" "aabbccddee" 0 1))
1530    (fail 'string-prefix-length))
1531
1532(OR (= 0 (string-prefix-length "aisle" "" 1 4))
1533    (fail 'string-prefix-length))
1534
1535(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 1 4))
1536    (fail 'string-prefix-length))
1537
1538(OR (= 1 (string-prefix-length "bail" "aabbccddee" 1 4))
1539    (fail 'string-prefix-length))
1540
1541(OR (= 0 (string-prefix-length "prefix" "preface" 1 5))
1542    (fail 'string-prefix-length))
1543
1544(OR (= 0 (string-prefix-length "" "" 0 0 0))
1545    (fail 'string-prefix-length))
1546
1547(OR (= 0 (string-prefix-length "" "aabbccddee" 0 0 0))
1548    (fail 'string-prefix-length))
1549
1550(OR (= 0 (string-prefix-length "aisle" "" 0 4 0))
1551    (fail 'string-prefix-length))
1552
1553(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 0 4 2))
1554    (fail 'string-prefix-length))
1555
1556(OR (= 1 (string-prefix-length "bail" "aabbccddee" 0 1 2))
1557    (fail 'string-prefix-length))
1558
1559(OR (= 0 (string-prefix-length "prefix" "preface" 0 5 1))
1560    (fail 'string-prefix-length))
1561
1562(OR (= 0 (string-prefix-length "aisle" "" 1 4 0))
1563    (fail 'string-prefix-length))
1564
1565(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 1 4 3))
1566    (fail 'string-prefix-length))
1567
1568(OR (= 0 (string-prefix-length "bail" "aabbccddee" 1 4 3))
1569    (fail 'string-prefix-length))
1570
1571(OR (= 3 (string-prefix-length "prefix" "preface" 1 5 1))
1572    (fail 'string-prefix-length))
1573
1574(OR (= 0 (string-prefix-length "" "" 0 0 0 0))
1575    (fail 'string-prefix-length))
1576
1577(OR (= 0 (string-prefix-length "" "aabbccddee" 0 0 0 0))
1578    (fail 'string-prefix-length))
1579
1580(OR (= 0 (string-prefix-length "aisle" "" 0 4 0 0))
1581    (fail 'string-prefix-length))
1582
1583(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 0 4 2 10))
1584    (fail 'string-prefix-length))
1585
1586(OR (= 1 (string-prefix-length "bail" "aabbccddee" 0 1 2 10))
1587    (fail 'string-prefix-length))
1588
1589(OR (= 0 (string-prefix-length "prefix" "preface" 0 5 1 6))
1590    (fail 'string-prefix-length))
1591
1592(OR (= 0 (string-prefix-length "aisle" "" 1 4 0 0))
1593    (fail 'string-prefix-length))
1594
1595(OR (= 0 (string-prefix-length "aisle" "aabbccddee" 1 4 3 3))
1596    (fail 'string-prefix-length))
1597
1598(OR (= 0 (string-prefix-length "bail" "aabbccddee" 1 4 3 6))
1599    (fail 'string-prefix-length))
1600
1601(OR (= 3 (string-prefix-length "prefix" "preface" 1 5 1 7))
1602    (fail 'string-prefix-length))
1603
1604
1605(OR (= 0 (string-suffix-length "" ""))
1606    (fail 'string-suffix-length))
1607
1608(OR (= 0 (string-suffix-length "" "aabbccddee"))
1609    (fail 'string-suffix-length))
1610
1611(OR (= 0 (string-suffix-length "aisle" ""))
1612    (fail 'string-suffix-length))
1613
1614(OR (= 0 (string-suffix-length "" "aabbccddee"))
1615    (fail 'string-suffix-length))
1616
1617(OR (= 1 (string-suffix-length "aisle" "aabbccddee"))
1618    (fail 'string-suffix-length))
1619
1620(OR (= 0 (string-suffix-length "bail" "aabbccddee"))
1621    (fail 'string-suffix-length))
1622
1623(OR (= 3 (string-suffix-length "place" "preface"))
1624    (fail 'string-suffix-length))
1625
1626(OR (= 0 (string-suffix-length "" "" 0))
1627    (fail 'string-suffix-length))
1628
1629(OR (= 0 (string-suffix-length "" "aabbccddee" 0))
1630    (fail 'string-suffix-length))
1631
1632(OR (= 0 (string-suffix-length "aisle" "" 0))
1633    (fail 'string-suffix-length))
1634
1635(OR (= 1 (string-suffix-length "aisle" "aabbccddee" 0))
1636    (fail 'string-suffix-length))
1637
1638(OR (= 0 (string-suffix-length "bail" "aabbccddee" 0))
1639    (fail 'string-suffix-length))
1640
1641(OR (= 3 (string-suffix-length "place" "preface" 0))
1642    (fail 'string-suffix-length))
1643
1644(OR (= 0 (string-suffix-length "aisle" "" 1))
1645    (fail 'string-suffix-length))
1646
1647(OR (= 1 (string-suffix-length "aisle" "aabbccddee" 1))
1648    (fail 'string-suffix-length))
1649
1650(OR (= 0 (string-suffix-length "bail" "aabbccddee" 1))
1651    (fail 'string-suffix-length))
1652
1653(OR (= 3 (string-suffix-length "place" "preface" 1))
1654    (fail 'string-suffix-length))
1655
1656(OR (= 0 (string-suffix-length "" "" 0 0))
1657    (fail 'string-suffix-length))
1658
1659(OR (= 0 (string-suffix-length "" "aabbccddee" 0 0))
1660    (fail 'string-suffix-length))
1661
1662(OR (= 0 (string-suffix-length "aisle" "" 0 4))
1663    (fail 'string-suffix-length))
1664
1665(OR (= 0 (string-suffix-length "aisle" "aabbccddee" 0 4))
1666    (fail 'string-suffix-length))
1667
1668(OR (= 0 (string-suffix-length "bail" "aabbccddee" 0 1))
1669    (fail 'string-suffix-length))
1670
1671(OR (= 0 (string-suffix-length "aisle" "" 1 4))
1672    (fail 'string-suffix-length))
1673
1674(OR (= 0 (string-suffix-length "aisle" "aabbccddee" 1 4))
1675    (fail 'string-suffix-length))
1676
1677(OR (= 1 (string-suffix-length "aisle" "aabbccddee" 1 5))
1678    (fail 'string-suffix-length))
1679
1680(OR (= 0 (string-suffix-length "bail" "aabbccddee" 1 4))
1681    (fail 'string-suffix-length))
1682
1683(OR (= 3 (string-suffix-length "place" "preface" 1 5))
1684    (fail 'string-suffix-length))
1685
1686(OR (= 0 (string-suffix-length "" "" 0 0 0))
1687    (fail 'string-suffix-length))
1688
1689(OR (= 0 (string-suffix-length "" "aabbccddee" 0 0 0))
1690    (fail 'string-suffix-length))
1691
1692(OR (= 0 (string-suffix-length "aisle" "" 0 4 0))
1693    (fail 'string-suffix-length))
1694
1695(OR (= 0 (string-suffix-length "aisle" "aabbccddee" 0 4 2))
1696    (fail 'string-suffix-length))
1697
1698(OR (= 0 (string-suffix-length "bail" "aabbccddee" 0 1 2))
1699    (fail 'string-suffix-length))
1700
1701(OR (= 3 (string-suffix-length "place" "preface" 0 5 1))
1702    (fail 'string-suffix-length))
1703
1704(OR (= 0 (string-suffix-length "aisle" "" 1 4 0))
1705    (fail 'string-suffix-length))
1706
1707(OR (= 0 (string-suffix-length "aisle" "aabbccddee" 1 4 3))
1708    (fail 'string-suffix-length))
1709
1710(OR (= 0 (string-suffix-length "bail" "aabbccddee" 1 4 3))
1711    (fail 'string-suffix-length))
1712
1713(OR (= 3 (string-suffix-length "place" "preface" 1 5 1))
1714    (fail 'string-suffix-length))
1715
1716(OR (= 0 (string-suffix-length "" "" 0 0 0 0))
1717    (fail 'string-suffix-length))
1718
1719(OR (= 0 (string-suffix-length "" "aabbccddee" 0 0 0 0))
1720    (fail 'string-suffix-length))
1721
1722(OR (= 0 (string-suffix-length "aisle" "" 0 4 0 0))
1723    (fail 'string-suffix-length))
1724
1725(OR (= 1 (string-suffix-length "aisle" "aabbccddee" 0 5 2 10))
1726    (fail 'string-suffix-length))
1727
1728(OR (= 1 (string-suffix-length "bail" "aabbccddee" 0 1 2 4))
1729    (fail 'string-suffix-length))
1730
1731(OR (= 0 (string-suffix-length "place" "preface" 0 5 1 6))
1732    (fail 'string-suffix-length))
1733
1734(OR (= 2 (string-suffix-length "place" "preface" 0 4 1 6))
1735    (fail 'string-suffix-length))
1736
1737(OR (= 0 (string-suffix-length "aisle" "" 1 4 0 0))
1738    (fail 'string-suffix-length))
1739
1740(OR (= 0 (string-suffix-length "aisle" "aabbccddee" 1 4 3 3))
1741    (fail 'string-suffix-length))
1742
1743(OR (= 0 (string-suffix-length "bail" "aabbccddee" 1 4 3 6))
1744    (fail 'string-suffix-length))
1745
1746(OR (= 3 (string-suffix-length "place" "preface" 1 5 1 7))
1747    (fail 'string-suffix-length))
1748
1749
1750(OR (eq? #t (string-prefix? "" ""))
1751    (fail 'string-prefix?))
1752
1753(OR (eq? #t (string-prefix? "" "abc"))
1754    (fail 'string-prefix?))
1755
1756(OR (eq? #t (string-prefix? "a" "abc"))
1757    (fail 'string-prefix?))
1758
1759(OR (eq? #f (string-prefix? "c" "abc"))
1760    (fail 'string-prefix?))
1761
1762(OR (eq? #t (string-prefix? "ab" "abc"))
1763    (fail 'string-prefix?))
1764
1765(OR (eq? #f (string-prefix? "ac" "abc"))
1766    (fail 'string-prefix?))
1767
1768(OR (eq? #t (string-prefix? "abc" "abc"))
1769    (fail 'string-prefix?))
1770
1771(OR (eq? #t (string-suffix? "" ""))
1772    (fail 'string-suffix?))
1773
1774(OR (eq? #t (string-suffix? "" "abc"))
1775    (fail 'string-suffix?))
1776
1777(OR (eq? #f (string-suffix? "a" "abc"))
1778    (fail 'string-suffix?))
1779
1780(OR (eq? #t (string-suffix? "c" "abc"))
1781    (fail 'string-suffix?))
1782
1783(OR (eq? #f (string-suffix? "ac" "abc"))
1784    (fail 'string-suffix?))
1785
1786(OR (eq? #t (string-suffix? "bc" "abc"))
1787    (fail 'string-suffix?))
1788
1789(OR (eq? #t (string-suffix? "abc" "abc"))
1790    (fail 'string-suffix?))
1791
1792(OR (eq? #t (string-prefix? "" "" 0))
1793    (fail 'string-prefix?))
1794
1795(OR (eq? #t (string-prefix? "" "abc" 0))
1796    (fail 'string-prefix?))
1797
1798(OR (eq? #t (string-prefix? "a" "abc" 0))
1799    (fail 'string-prefix?))
1800
1801(OR (eq? #f (string-prefix? "c" "abc" 0))
1802    (fail 'string-prefix?))
1803
1804(OR (eq? #t (string-prefix? "ab" "abc" 0))
1805    (fail 'string-prefix?))
1806
1807(OR (eq? #f (string-prefix? "ac" "abc" 0))
1808    (fail 'string-prefix?))
1809
1810(OR (eq? #t (string-prefix? "abc" "abc" 0))
1811    (fail 'string-prefix?))
1812
1813(OR (eq? #t (string-suffix? "" "" 0))
1814    (fail 'string-suffix?))
1815
1816(OR (eq? #t (string-suffix? "" "abc" 0))
1817    (fail 'string-suffix?))
1818
1819(OR (eq? #f (string-suffix? "a" "abc" 0))
1820    (fail 'string-suffix?))
1821
1822(OR (eq? #t (string-suffix? "c" "abc" 0))
1823    (fail 'string-suffix?))
1824
1825(OR (eq? #f (string-suffix? "ac" "abc" 0))
1826    (fail 'string-suffix?))
1827
1828(OR (eq? #t (string-suffix? "bc" "abc" 0))
1829    (fail 'string-suffix?))
1830
1831(OR (eq? #t (string-suffix? "abc" "abc" 0))
1832    (fail 'string-suffix?))
1833
1834(OR (eq? #t (string-prefix? "ab" "abc" 2))
1835    (fail 'string-prefix?))
1836
1837(OR (eq? #t (string-prefix? "ac" "abc" 2))
1838    (fail 'string-prefix?))
1839
1840(OR (eq? #f (string-prefix? "abc" "abc" 2))
1841    (fail 'string-prefix?))
1842
1843(OR (eq? #t (string-suffix? "ac" "abc" 2))
1844    (fail 'string-suffix?))
1845
1846(OR (eq? #t (string-suffix? "bc" "abc" 2))
1847    (fail 'string-suffix?))
1848
1849(OR (eq? #t (string-suffix? "abc" "abc" 2))
1850    (fail 'string-suffix?))
1851
1852
1853(OR (eq? #t (string-prefix? "" "" 0 0))
1854    (fail 'string-prefix?))
1855
1856(OR (eq? #t (string-prefix? "" "abc" 0 0))
1857    (fail 'string-prefix?))
1858
1859(OR (eq? #t (string-prefix? "a" "abc" 0 0))
1860    (fail 'string-prefix?))
1861
1862(OR (eq? #f (string-prefix? "c" "abc" 0 1))
1863    (fail 'string-prefix?))
1864
1865(OR (eq? #t (string-prefix? "ab" "abc" 0 1))
1866    (fail 'string-prefix?))
1867
1868(OR (eq? #t (string-prefix? "ab" "abc" 0 2))
1869    (fail 'string-prefix?))
1870
1871(OR (eq? #f (string-prefix? "ac" "abc" 0 2))
1872    (fail 'string-prefix?))
1873
1874(OR (eq? #t (string-prefix? "abc" "abc" 0 3))
1875    (fail 'string-prefix?))
1876
1877(OR (eq? #t (string-suffix? "" "" 0 0))
1878    (fail 'string-suffix?))
1879
1880(OR (eq? #t (string-suffix? "" "abc" 0 0))
1881    (fail 'string-suffix?))
1882
1883(OR (eq? #f (string-suffix? "a" "abc" 0 1))
1884    (fail 'string-suffix?))
1885
1886(OR (eq? #t (string-suffix? "c" "abc" 0 1))
1887    (fail 'string-suffix?))
1888
1889(OR (eq? #t (string-suffix? "ac" "abc" 1 2))
1890    (fail 'string-suffix?))
1891
1892(OR (eq? #f (string-suffix? "ac" "abc" 0 2))
1893    (fail 'string-suffix?))
1894
1895(OR (eq? #t (string-suffix? "bc" "abc" 0 2))
1896    (fail 'string-suffix?))
1897
1898(OR (eq? #t (string-suffix? "abc" "abc" 0 3))
1899    (fail 'string-suffix?))
1900
1901(OR (eq? #t (string-prefix? "ab" "abc" 2 2))
1902    (fail 'string-prefix?))
1903
1904(OR (eq? #t (string-prefix? "ac" "abc" 2 2))
1905    (fail 'string-prefix?))
1906
1907(OR (eq? #f (string-prefix? "abc" "abc" 2 3))
1908    (fail 'string-prefix?))
1909
1910(OR (eq? #t (string-suffix? "ac" "abc" 2 2))
1911    (fail 'string-suffix?))
1912
1913(OR (eq? #t (string-suffix? "bc" "abc" 2 2))
1914    (fail 'string-suffix?))
1915
1916(OR (eq? #t (string-suffix? "abc" "abc" 2 3))
1917    (fail 'string-suffix?))
1918
1919
1920(OR (eq? #t (string-prefix? "" "" 0 0 0))
1921    (fail 'string-prefix?))
1922
1923(OR (eq? #t (string-prefix? "" "abc" 0 0 0))
1924    (fail 'string-prefix?))
1925
1926(OR (eq? #t (string-prefix? "a" "abc" 0 0 0))
1927    (fail 'string-prefix?))
1928
1929(OR (eq? #f (string-prefix? "c" "abc" 0 1 0))
1930    (fail 'string-prefix?))
1931
1932(OR (eq? #t (string-prefix? "ab" "abc" 0 1 0))
1933    (fail 'string-prefix?))
1934
1935(OR (eq? #t (string-prefix? "ab" "abc" 0 2 0))
1936    (fail 'string-prefix?))
1937
1938(OR (eq? #f (string-prefix? "ac" "abc" 0 2 0))
1939    (fail 'string-prefix?))
1940
1941(OR (eq? #t (string-prefix? "abc" "abc" 0 3 0))
1942    (fail 'string-prefix?))
1943
1944(OR (eq? #t (string-suffix? "" "" 0 0 0))
1945    (fail 'string-suffix?))
1946
1947(OR (eq? #t (string-suffix? "" "abc" 0 0 0))
1948    (fail 'string-suffix?))
1949
1950(OR (eq? #f (string-suffix? "a" "abc" 0 1 0))
1951    (fail 'string-suffix?))
1952
1953(OR (eq? #t (string-suffix? "c" "abc" 0 1 0))
1954    (fail 'string-suffix?))
1955
1956(OR (eq? #t (string-suffix? "ac" "abc" 1 2 0))
1957    (fail 'string-suffix?))
1958
1959(OR (eq? #f (string-suffix? "ac" "abc" 0 2 0))
1960    (fail 'string-suffix?))
1961
1962(OR (eq? #t (string-suffix? "bc" "abc" 0 2 0))
1963    (fail 'string-suffix?))
1964
1965(OR (eq? #t (string-suffix? "abc" "abc" 0 3 0))
1966    (fail 'string-suffix?))
1967
1968(OR (eq? #t (string-prefix? "ab" "abc" 2 2 0))
1969    (fail 'string-prefix?))
1970
1971(OR (eq? #t (string-prefix? "ac" "abc" 2 2 0))
1972    (fail 'string-prefix?))
1973
1974(OR (eq? #f (string-prefix? "abc" "abc" 2 3 0))
1975    (fail 'string-prefix?))
1976
1977(OR (eq? #t (string-suffix? "ac" "abc" 2 2 0))
1978    (fail 'string-suffix?))
1979
1980(OR (eq? #t (string-suffix? "bc" "abc" 2 2 0))
1981    (fail 'string-suffix?))
1982
1983(OR (eq? #t (string-suffix? "abc" "abc" 2 3 0))
1984    (fail 'string-suffix?))
1985
1986(OR (eq? #t (string-prefix? "" "abc" 0 0 1))
1987    (fail 'string-prefix?))
1988
1989(OR (eq? #t (string-prefix? "a" "abc" 0 0 1))
1990    (fail 'string-prefix?))
1991
1992(OR (eq? #t (string-prefix? "c" "abc" 0 1 2))
1993    (fail 'string-prefix?))
1994
1995(OR (eq? #f (string-prefix? "ab" "abc" 0 1 2))
1996    (fail 'string-prefix?))
1997
1998(OR (eq? #f (string-prefix? "ab" "abc" 0 2 1))
1999    (fail 'string-prefix?))
2000
2001(OR (eq? #f (string-prefix? "ac" "abc" 0 2 1))
2002    (fail 'string-prefix?))
2003
2004(OR (eq? #f (string-prefix? "abc" "abc" 0 3 1))
2005    (fail 'string-prefix?))
2006
2007(OR (eq? #f (string-suffix? "a" "abc" 0 1 2))
2008    (fail 'string-suffix?))
2009
2010(OR (eq? #t (string-suffix? "c" "abc" 0 1 1))
2011    (fail 'string-suffix?))
2012
2013(OR (eq? #t (string-suffix? "ac" "abc" 1 2 2))
2014    (fail 'string-suffix?))
2015
2016(OR (eq? #t (string-suffix? "bc" "abc" 0 2 1))
2017    (fail 'string-suffix?))
2018
2019(OR (eq? #f (string-suffix? "bc" "abc" 0 2 2))
2020    (fail 'string-suffix?))
2021
2022
2023(OR (eq? #t (string-prefix? "" "" 0 0 0 0))
2024    (fail 'string-prefix?))
2025
2026(OR (eq? #t (string-prefix? "" "abc" 0 0 0 3))
2027    (fail 'string-prefix?))
2028
2029(OR (eq? #t (string-prefix? "a" "abc" 0 0 0 3))
2030    (fail 'string-prefix?))
2031
2032(OR (eq? #f (string-prefix? "c" "abc" 0 1 0 3))
2033    (fail 'string-prefix?))
2034
2035(OR (eq? #t (string-prefix? "ab" "abc" 0 1 0 3))
2036    (fail 'string-prefix?))
2037
2038(OR (eq? #t (string-prefix? "ab" "abc" 0 2 0 3))
2039    (fail 'string-prefix?))
2040
2041(OR (eq? #f (string-prefix? "ac" "abc" 0 2 0 3))
2042    (fail 'string-prefix?))
2043
2044(OR (eq? #t (string-prefix? "abc" "abc" 0 3 0 3))
2045    (fail 'string-prefix?))
2046
2047(OR (eq? #t (string-suffix? "" "abc" 0 0 0 3))
2048    (fail 'string-suffix?))
2049
2050(OR (eq? #f (string-suffix? "a" "abc" 0 1 0 3))
2051    (fail 'string-suffix?))
2052
2053(OR (eq? #t (string-suffix? "c" "abc" 0 1 0 3))
2054    (fail 'string-suffix?))
2055
2056(OR (eq? #t (string-suffix? "ac" "abc" 1 2 0 3))
2057    (fail 'string-suffix?))
2058
2059(OR (eq? #f (string-suffix? "ac" "abc" 0 2 0 3))
2060    (fail 'string-suffix?))
2061
2062(OR (eq? #t (string-suffix? "bc" "abc" 0 2 0 3))
2063    (fail 'string-suffix?))
2064
2065(OR (eq? #t (string-suffix? "abc" "abc" 0 3 0 3))
2066    (fail 'string-suffix?))
2067
2068(OR (eq? #t (string-prefix? "ab" "abc" 2 2 0 3))
2069    (fail 'string-prefix?))
2070
2071(OR (eq? #t (string-prefix? "ac" "abc" 2 2 0 3))
2072    (fail 'string-prefix?))
2073
2074(OR (eq? #f (string-prefix? "abc" "abc" 2 3 0 3))
2075    (fail 'string-prefix?))
2076
2077(OR (eq? #t (string-suffix? "ac" "abc" 2 2 0 3))
2078    (fail 'string-suffix?))
2079
2080(OR (eq? #t (string-suffix? "bc" "abc" 2 2 0 3))
2081    (fail 'string-suffix?))
2082
2083(OR (eq? #t (string-suffix? "abc" "abc" 2 3 0 3))
2084    (fail 'string-suffix?))
2085
2086(OR (eq? #t (string-prefix? "" "abc" 0 0 1 3))
2087    (fail 'string-prefix?))
2088
2089(OR (eq? #t (string-prefix? "a" "abc" 0 0 1 3))
2090    (fail 'string-prefix?))
2091
2092(OR (eq? #t (string-prefix? "c" "abc" 0 1 2 3))
2093    (fail 'string-prefix?))
2094
2095(OR (eq? #f (string-prefix? "ab" "abc" 0 1 2 3))
2096    (fail 'string-prefix?))
2097
2098(OR (eq? #f (string-prefix? "ab" "abc" 0 2 1 3))
2099    (fail 'string-prefix?))
2100
2101(OR (eq? #f (string-prefix? "ac" "abc" 0 2 1 3))
2102    (fail 'string-prefix?))
2103
2104(OR (eq? #f (string-prefix? "abc" "abc" 0 3 1 3))
2105    (fail 'string-prefix?))
2106
2107(OR (eq? #f (string-suffix? "a" "abc" 0 1 2 3))
2108    (fail 'string-suffix?))
2109
2110(OR (eq? #t (string-suffix? "c" "abc" 0 1 1 3))
2111    (fail 'string-suffix?))
2112
2113(OR (eq? #t (string-suffix? "ac" "abc" 1 2 2 3))
2114    (fail 'string-suffix?))
2115
2116(OR (eq? #t (string-suffix? "bc" "abc" 0 2 1 3))
2117    (fail 'string-suffix?))
2118
2119(OR (eq? #f (string-suffix? "bc" "abc" 0 2 2 3))
2120    (fail 'string-suffix?))
2121
2122
2123(OR (eq? #t (string-prefix? "" "abc" 0 0 0 2))
2124    (fail 'string-prefix?))
2125
2126(OR (eq? #t (string-prefix? "a" "abc" 0 0 0 2))
2127    (fail 'string-prefix?))
2128
2129(OR (eq? #f (string-prefix? "c" "abc" 0 1 0 2))
2130    (fail 'string-prefix?))
2131
2132(OR (eq? #t (string-prefix? "ab" "abc" 0 1 0 2))
2133    (fail 'string-prefix?))
2134
2135(OR (eq? #f (string-prefix? "abc" "abc" 0 3 0 2))
2136    (fail 'string-prefix?))
2137
2138(OR (eq? #t (string-suffix? "" "abc" 0 0 0 2))
2139    (fail 'string-suffix?))
2140
2141(OR (eq? #f (string-suffix? "c" "abc" 0 1 0 2))
2142    (fail 'string-suffix?))
2143
2144(OR (eq? #f (string-suffix? "ac" "abc" 1 2 0 2))
2145    (fail 'string-suffix?))
2146
2147;;-----------------------------------------------------------------------
2148(test-section "Searching")
2149
2150(OR (= 0
2151       (string-cursor->index EMPTY
2152                             (string-index EMPTY char?)))
2153    (fail 'string-index))
2154
2155(OR (= 0
2156       (string-cursor->index ABCDEF
2157                             (string-index ABCDEF char?)))
2158    (fail 'string-index))
2159
2160(OR (= 4
2161       (string-cursor->index ABCDEF-ASCII
2162                             (string-index ABCDEF-ASCII
2163                                           (lambda (c) (char>? c #\d)))))
2164    (fail 'string-index))
2165
2166(OR (= 6
2167       (string-cursor->index ABCDEF
2168                             (string-index ABCDEF char-whitespace?)))
2169    (fail 'string-index))
2170
2171(OR (= 0
2172       (string-cursor->index EMPTY
2173                             (string-index-right EMPTY char?)))
2174    (fail 'string-index-right))
2175
2176(OR (= 6
2177       (string-cursor->index ABCDEF
2178                             (string-index-right ABCDEF char?)))
2179    (fail 'string-index-right))
2180
2181(OR (= 6
2182       (string-cursor->index ABCDEF
2183                             (string-index-right ABCDEF
2184                                                 (lambda (c) (char>? c #\d)))))
2185    (fail 'string-index-right))
2186
2187(OR (= 0
2188       (string-cursor->index ABCDEF
2189                             (string-index-right ABCDEF char-whitespace?)))
2190    (fail 'string-index-right))
2191
2192(OR (= 0
2193       (string-cursor->index EMPTY (string-skip EMPTY string?)))
2194    (fail 'string-skip))
2195
2196(OR (= 0
2197       (string-cursor->index ABCDEF
2198                             (string-skip ABCDEF string?)))
2199    (fail 'string-skip))
2200
2201(OR (= 4
2202       (string-cursor->index ABCDEF-ASCII
2203                             (string-skip ABCDEF-ASCII
2204                                          (lambda (c) (char<=? c #\d)))))
2205    (fail 'string-skip))
2206
2207(OR (= 6
2208       (string-cursor->index ABCDEF
2209                             (string-skip ABCDEF char?)))
2210    (fail 'string-skip))
2211
2212(OR (= 0
2213       (string-cursor->index EMPTY (string-skip-right EMPTY string?)))
2214    (fail 'string-skip-right))
2215
2216(OR (= 6
2217       (string-cursor->index ABCDEF
2218                             (string-skip-right ABCDEF string?)))
2219    (fail 'string-skip-right))
2220
2221(OR (= 6
2222       (string-cursor->index ABCDEF-ASCII
2223                             (string-skip-right ABCDEF-ASCII
2224                                                (lambda (c) (char<=? c #\d)))))
2225    (fail 'string-skip-right))
2226
2227(OR (= 0
2228       (string-cursor->index ABCDEF
2229                             (string-skip-right ABCDEF char?)))
2230    (fail 'string-skip-right))
2231
2232
2233(OR (= 2
2234       (string-cursor->index ABCDEF
2235                             (string-index ABCDEF char? 2)))
2236    (fail 'string-index))
2237
2238(OR (= 4
2239       (string-cursor->index ABCDEF-ASCII
2240                             (string-index ABCDEF-ASCII
2241                                           (lambda (c) (char>? c #\d)) 2)))
2242    (fail 'string-index))
2243
2244(OR (= 6
2245       (string-cursor->index ABCDEF
2246                             (string-index ABCDEF char-whitespace? 2)))
2247    (fail 'string-index))
2248
2249(OR (= 6
2250       (string-cursor->index ABCDEF
2251                             (string-index-right ABCDEF char? 2)))
2252    (fail 'string-index-right))
2253
2254(OR (= 6
2255       (string-cursor->index ABCDEF-ASCII
2256                             (string-index-right ABCDEF-ASCII
2257                                                 (lambda (c)
2258                                                   (char>? c #\d)) 2)))
2259    (fail 'string-index-right))
2260
2261(OR (= 2
2262       (string-cursor->index ABCDEF
2263                             (string-index-right ABCDEF char-whitespace? 2)))
2264    (fail 'string-index-right))
2265
2266(OR (= 2
2267       (string-cursor->index ABCDEF
2268                             (string-skip ABCDEF string? 2)))
2269    (fail 'string-skip))
2270
2271(OR (= 4
2272       (string-cursor->index ABCDEF-ASCII
2273                             (string-skip ABCDEF-ASCII
2274                                          (lambda (c)
2275                                            (char<=? c #\d)) 2)))
2276    (fail 'string-skip))
2277
2278(OR (= 6
2279       (string-cursor->index ABCDEF
2280                             (string-skip ABCDEF char? 2)))
2281    (fail 'string-skip))
2282
2283(OR (= 6
2284       (string-cursor->index ABCDEF
2285                             (string-skip-right ABCDEF string? 2)))
2286    (fail 'string-skip-right))
2287
2288(OR (= 6
2289       (string-cursor->index ABCDEF-ASCII
2290                             (string-skip-right ABCDEF-ASCII
2291                                                (lambda (c)
2292                                                  (char<=? c #\d)) 2)))
2293    (fail 'string-skip-right))
2294
2295(OR (= 2
2296       (string-cursor->index ABCDEF
2297                             (string-skip-right ABCDEF char? 2)))
2298    (fail 'string-skip-right))
2299
2300
2301(OR (= 2
2302       (string-cursor->index ABCDEF
2303                             (string-index ABCDEF char? 2 5)))
2304    (fail 'string-index))
2305
2306(OR (= 4
2307       (string-cursor->index ABCDEF-ASCII
2308                             (string-index ABCDEF-ASCII
2309                                           (lambda (c) (char>? c #\d)) 2 5)))
2310    (fail 'string-index))
2311
2312(OR (= 5
2313       (string-cursor->index ABCDEF
2314                             (string-index ABCDEF char-whitespace? 2 5)))
2315    (fail 'string-index))
2316
2317(OR (= 5
2318       (string-cursor->index ABCDEF
2319                             (string-index-right ABCDEF char? 2 5)))
2320    (fail 'string-index-right))
2321
2322(OR (= 5
2323       (string-cursor->index ABCDEF-ASCII
2324                             (string-index-right ABCDEF-ASCII
2325                                                 (lambda (c)
2326                                                   (char>? c #\d)) 2 5)))
2327    (fail 'string-index-right))
2328
2329(OR (= 2
2330       (string-cursor->index ABCDEF
2331                             (string-index-right ABCDEF
2332                                                 char-whitespace? 2 5)))
2333    (fail 'string-index-right))
2334
2335(OR (= 2
2336       (string-cursor->index ABCDEF
2337                             (string-skip ABCDEF string? 2 5)))
2338    (fail 'string-skip))
2339
2340(OR (= 4
2341       (string-cursor->index ABCDEF-ASCII
2342                             (string-skip ABCDEF-ASCII
2343                                          (lambda (c) (char<=? c #\d)) 2 5)))
2344    (fail 'string-skip))
2345
2346(OR (= 5
2347       (string-cursor->index ABCDEF
2348                             (string-skip ABCDEF char? 2 5)))
2349    (fail 'string-skip))
2350
2351(OR (= 5
2352       (string-cursor->index ABCDEF
2353                             (string-skip-right ABCDEF string? 2 5)))
2354    (fail 'string-skip-right))
2355
2356(OR (= 5
2357       (string-cursor->index ABCDEF-ASCII
2358                             (string-skip-right ABCDEF-ASCII
2359                                                (lambda (c)
2360                                                  (char<=? c #\d)) 2 5)))
2361    (fail 'string-skip-right))
2362
2363(OR (= 2
2364       (string-cursor->index ABCDEF
2365                             (string-skip-right ABCDEF char? 2 5)))
2366    (fail 'string-skip-right))
2367
2368
2369(OR (eqv? 0
2370          (string-cursor->index EMPTY
2371                                (string-contains EMPTY EMPTY)))
2372    (fail 'string-contains))
2373
2374(OR (eqv? 0
2375          (string-cursor->index ABCDEFFFFOO
2376                                (string-contains ABCDEFFFFOO EMPTY)))
2377    (fail 'string-contains))
2378
2379(OR (eqv? 0
2380          (string-cursor->index ABCDEFFFFOO
2381                                (string-contains ABCDEFFFFOO "a")))
2382    (fail 'string-contains))
2383
2384(OR (eqv? 5
2385          (string-cursor->index ABCDEFFFFOO
2386                                (string-contains ABCDEFFFFOO "ff")))
2387    (fail 'string-contains))
2388
2389(OR (eqv? 4
2390          (string-cursor->index ABCDEFFFFOO
2391                                (string-contains ABCDEFFFFOO "eff")))
2392    (fail 'string-contains))
2393
2394(OR (eqv? 8
2395          (string-cursor->index ABCDEFFFFOO
2396                                (string-contains ABCDEFFFFOO "foo")))
2397    (fail 'string-contains))
2398
2399(OR (eqv? #f
2400          (string-contains ABCDEFFFFOO "efffoo"))
2401    (fail 'string-contains))
2402
2403(OR (eqv? 0
2404          (string-cursor->index EMPTY
2405                                (string-contains-right EMPTY EMPTY)))
2406    (fail 'string-contains-right))
2407
2408(OR (eqv? 11
2409          (string-cursor->index ABCDEFFFFOO
2410                                (string-contains-right ABCDEFFFFOO EMPTY)))
2411    (fail 'string-contains-right))
2412
2413(OR (eqv? 0
2414          (string-cursor->index ABCDEFFFFOO
2415                                (string-contains-right ABCDEFFFFOO "a")))
2416    (fail 'string-contains-right))
2417
2418(OR (eqv? 7
2419          (string-cursor->index ABCDEFFFFOO
2420                                (string-contains-right ABCDEFFFFOO "ff")))
2421    (fail 'string-contains-right))
2422
2423(OR (eqv? 4
2424          (string-cursor->index ABCDEFFFFOO
2425                                (string-contains-right ABCDEFFFFOO "eff")))
2426    (fail 'string-contains-right))
2427
2428(OR (eqv? 8
2429          (string-cursor->index ABCDEFFFFOO
2430                                (string-contains-right ABCDEFFFFOO "foo")))
2431    (fail 'string-contains-right))
2432
2433(OR (eqv? #f
2434          (string-contains-right ABCDEFFFFOO
2435                                 "efffoo"))
2436    (fail 'string-contains-right))
2437
2438(OR (eqv? 0
2439          (string-cursor->index EMPTY
2440                                (string-contains EMPTY EMPTY 0)))
2441    (fail 'string-contains))
2442
2443(OR (eqv? 2
2444          (string-cursor->index ABCDEFFFFOO
2445                                (string-contains ABCDEFFFFOO EMPTY 2)))
2446    (fail 'string-contains))
2447
2448(OR (eqv? #f (string-contains ABCDEFFFFOO "a" 2))
2449    (fail 'string-contains))
2450
2451(OR (eqv? 5
2452          (string-cursor->index ABCDEFFFFOO
2453                                (string-contains ABCDEFFFFOO "ff" 2)))
2454    (fail 'string-contains))
2455
2456(OR (eqv? 4
2457          (string-cursor->index ABCDEFFFFOO
2458                                (string-contains ABCDEFFFFOO "eff" 2)))
2459    (fail 'string-contains))
2460
2461(OR (eqv? 8
2462          (string-cursor->index ABCDEFFFFOO
2463                                (string-contains ABCDEFFFFOO "foo" 2)))
2464    (fail 'string-contains))
2465
2466(OR (eqv? #f (string-contains ABCDEFFFFOO "efffoo" 2))
2467    (fail 'string-contains))
2468
2469(OR (eqv? 0
2470          (string-cursor->index EMPTY
2471                                (string-contains-right EMPTY EMPTY 0)))
2472    (fail 'string-contains-right))
2473
2474(OR (eqv? 11
2475          (string-cursor->index ABCDEFFFFOO
2476                                (string-contains-right ABCDEFFFFOO
2477                                                       EMPTY 2)))
2478    (fail 'string-contains-right))
2479
2480(OR (eqv? #f
2481          (string-contains-right ABCDEFFFFOO
2482                                 "a" 2))
2483    (fail 'string-contains-right))
2484
2485(OR (eqv? 7
2486          (string-cursor->index ABCDEFFFFOO
2487                                (string-contains-right ABCDEFFFFOO
2488                                                       "ff" 2)))
2489    (fail 'string-contains-right))
2490
2491(OR (eqv? 4
2492          (string-cursor->index ABCDEFFFFOO
2493                                (string-contains-right ABCDEFFFFOO
2494                                                       "eff" 2)))
2495    (fail 'string-contains-right))
2496
2497(OR (eqv? 8
2498          (string-cursor->index ABCDEFFFFOO
2499                                (string-contains-right ABCDEFFFFOO
2500                                                       "foo" 2)))
2501    (fail 'string-contains-right))
2502
2503(OR (eqv? #f
2504          (string-contains-right ABCDEFFFFOO
2505                                 "efffoo" 2))
2506    (fail 'string-contains-right))
2507
2508
2509(OR (eqv? 0
2510          (string-cursor->index EMPTY
2511                                (string-contains EMPTY EMPTY 0 0)))
2512    (fail 'string-contains))
2513
2514(OR (eqv? 2
2515          (string-cursor->index ABCDEFFFFOO
2516                                (string-contains ABCDEFFFFOO
2517                                                 EMPTY 2 10)))
2518    (fail 'string-contains))
2519
2520(OR (eqv? #f
2521          (string-contains ABCDEFFFFOO
2522                           "a" 2 10))
2523    (fail 'string-contains))
2524
2525(OR (eqv? 5
2526          (string-cursor->index ABCDEFFFFOO
2527                                (string-contains ABCDEFFFFOO
2528                                                 "ff" 2 10)))
2529    (fail 'string-contains))
2530
2531(OR (eqv? 4
2532          (string-cursor->index ABCDEFFFFOO
2533                                (string-contains ABCDEFFFFOO
2534                                                 "eff" 2 10)))
2535    (fail 'string-contains))
2536
2537(OR (eqv? #f (string-contains ABCDEFFFFOO "foo" 2 10))
2538    (fail 'string-contains))
2539
2540(OR (eqv? #f (string-contains ABCDEFFFFOO "efffoo" 2 10))
2541    (fail 'string-contains))
2542
2543
2544(OR (eqv? 0
2545          (string-cursor->index EMPTY
2546                                (string-contains-right EMPTY EMPTY 0 0)))
2547    (fail 'string-contains-right))
2548
2549(OR (eqv? 10
2550          (string-cursor->index ABCDEFFFFOO
2551                                (string-contains-right ABCDEFFFFOO
2552                                                       EMPTY 2 10)))
2553    (fail 'string-contains-right))
2554
2555(OR (eqv? #f
2556          (string-contains-right ABCDEFFFFOO
2557                                 "a" 2 10))
2558    (fail 'string-contains-right))
2559
2560(OR (eqv? 7
2561          (string-cursor->index ABCDEFFFFOO
2562                                (string-contains-right ABCDEFFFFOO
2563                                                       "ff" 2 10)))
2564    (fail 'string-contains-right))
2565
2566(OR (eqv? 4
2567          (string-cursor->index ABCDEFFFFOO
2568                                (string-contains-right ABCDEFFFFOO
2569                                                       "eff" 2 10)))
2570    (fail 'string-contains-right))
2571
2572(OR (eqv? #f
2573          (string-contains-right ABCDEFFFFOO
2574                                 "foo" 2 10))
2575    (fail 'string-contains-right))
2576
2577(OR (eqv? #f
2578          (string-contains-right ABCDEFFFFOO
2579                                 "efffoo" 2 10))
2580    (fail 'string-contains-right))
2581
2582(OR (eqv? 0
2583          (string-cursor->index EMPTY
2584                                (string-contains EMPTY EMPTY 0 0 0)))
2585    (fail 'string-contains))
2586
2587(OR (eqv? 2
2588          (string-cursor->index ABCDEFFFFOO
2589                                (string-contains ABCDEFFFFOO
2590                                                 EMPTY 2 10 0)))
2591    (fail 'string-contains))
2592
2593(OR (eqv? 2
2594          (string-cursor->index ABCDEFFFFOO
2595                                (string-contains ABCDEFFFFOO
2596                                                 "a" 2 10 1)))
2597    (fail 'string-contains))
2598
2599(OR (eqv? 5
2600          (string-cursor->index ABCDEFFFFOO
2601                                (string-contains ABCDEFFFFOO
2602                                                 "ff" 2 10 1)))
2603    (fail 'string-contains))
2604
2605(OR (eqv? 5
2606          (string-cursor->index ABCDEFFFFOO
2607                                (string-contains ABCDEFFFFOO
2608                                                 "eff" 2 10 1)))
2609    (fail 'string-contains))
2610
2611(OR (eqv? #f (string-contains ABCDEFFFFOO "foo" 2 10 1))
2612    (fail 'string-contains))
2613
2614(OR (eqv? #f (string-contains ABCDEFFFFOO "efffoo" 2 10 1))
2615    (fail 'string-contains))
2616
2617(OR (eqv? 0
2618          (string-cursor->index EMPTY
2619                                (string-contains-right EMPTY EMPTY 0 0 0)))
2620    (fail 'string-contains-right))
2621
2622(OR (eqv? 10
2623          (string-cursor->index ABCDEFFFFOO
2624                                (string-contains-right ABCDEFFFFOO
2625                                                       EMPTY 2 10 0)))
2626    (fail 'string-contains-right))
2627
2628(OR (eqv? 10
2629          (string-cursor->index ABCDEFFFFOO
2630                                (string-contains-right ABCDEFFFFOO
2631                                                       "a" 2 10 1)))
2632    (fail 'string-contains-right))
2633
2634(OR (eqv? 8
2635          (string-cursor->index ABCDEFFFFOO
2636                                (string-contains-right ABCDEFFFFOO
2637                                                       "ff" 2 10 1)))
2638    (fail 'string-contains-right))
2639
2640(OR (eqv? 7
2641          (string-cursor->index ABCDEFFFFOO
2642                                (string-contains-right ABCDEFFFFOO
2643                                                       "eff" 2 10 1)))
2644    (fail 'string-contains-right))
2645
2646(OR (eqv? #f
2647          (string-contains-right ABCDEFFFFOO
2648                                 "foo" 2 10 1))
2649    (fail 'string-contains-right))
2650
2651(OR (eqv? #f
2652          (string-contains-right ABCDEFFFFOO
2653                                 "efffoo" 2 10 1))
2654    (fail 'string-contains-right))
2655
2656(OR (eqv? 0
2657          (string-cursor->index EMPTY
2658                                (string-contains EMPTY EMPTY 0 0 0 0)))
2659    (fail 'string-contains))
2660
2661(OR (eqv? 2
2662          (string-cursor->index ABCDEFFFFOO
2663                                (string-contains ABCDEFFFFOO
2664                                                 EMPTY 2 10 0 0)))
2665    (fail 'string-contains))
2666
2667(OR (eqv? 2
2668          (string-cursor->index ABCDEFFFFOO
2669                                (string-contains ABCDEFFFFOO
2670                                                 "a" 2 10 1 1)))
2671    (fail 'string-contains))
2672
2673(OR (eqv? 5
2674          (string-cursor->index ABCDEFFFFOO
2675                                (string-contains ABCDEFFFFOO
2676                                                 "ff" 2 10 1 2)))
2677    (fail 'string-contains))
2678
2679(OR (eqv? 5
2680          (string-cursor->index ABCDEFFFFOO
2681                                (string-contains ABCDEFFFFOO
2682                                                 "eff" 2 10 1 2)))
2683    (fail 'string-contains))
2684
2685(OR (eqv? 9
2686          (string-cursor->index ABCDEFFFFOO
2687                                (string-contains ABCDEFFFFOO
2688                                                 "foo" 2 10 1 2)))
2689    (fail 'string-contains))
2690
2691(OR (eqv? 4
2692          (string-cursor->index ABCDEFFFFOO
2693                                (string-contains ABCDEFFFFOO
2694                                                 "efffoo" 2 10 0 2)))
2695    (fail 'string-contains))
2696
2697(OR (eqv? 0
2698          (string-cursor->index EMPTY
2699                                (string-contains-right EMPTY EMPTY 0 0 0 0)))
2700    (fail 'string-contains-right))
2701
2702(OR (eqv? 10
2703          (string-cursor->index ABCDEFFFFOO
2704                                (string-contains-right ABCDEFFFFOO
2705                                                       EMPTY 2 10 0 0)))
2706    (fail 'string-contains-right))
2707
2708(OR (eqv? 10
2709          (string-cursor->index ABCDEFFFFOO
2710                                (string-contains-right ABCDEFFFFOO
2711                                                       "a" 2 10 1 1)))
2712    (fail 'string-contains-right))
2713
2714(OR (eqv? 8
2715          (string-cursor->index ABCDEFFFFOO
2716                                (string-contains-right ABCDEFFFFOO
2717                                                       "ff" 2 10 1 2)))
2718    (fail 'string-contains-right))
2719
2720(OR (eqv? 8
2721          (string-cursor->index ABCDEFFFFOO
2722                                (string-contains-right ABCDEFFFFOO
2723                                                       "eff" 2 10 1 2)))
2724    (fail 'string-contains-right))
2725
2726(OR (eqv? 9
2727          (string-cursor->index ABCDEFFFFOO
2728                                (string-contains-right ABCDEFFFFOO
2729                                                       "foo" 2 10 1 2)))
2730    (fail 'string-contains-right))
2731
2732(OR (eqv? 7
2733          (string-cursor->index ABCDEFFFFOO
2734                                (string-contains-right ABCDEFFFFOO
2735                                                       "efffoo" 2 10 1 3)))
2736    (fail 'string-contains-right))
2737
2738;;-----------------------------------------------------------------------
2739(test-section "The whole string")
2740
2741(OR (string=? "" (string-reverse ""))
2742    (fail 'string-reverse))
2743
2744(OR (string=? "fedcba" (string-reverse "abcdef"))
2745    (fail 'string-reverse))
2746
2747(OR (string=? "" (string-reverse "" 0))
2748    (fail 'string-reverse))
2749
2750(OR (string=? "fedcba" (string-reverse "abcdef" 0))
2751    (fail 'string-reverse))
2752
2753(OR (string=? "fedc" (string-reverse "abcdef" 2))
2754    (fail 'string-reverse))
2755
2756(OR (string=? "" (string-reverse "" 0 0))
2757    (fail 'string-reverse))
2758
2759(OR (string=? "fedcba" (string-reverse "abcdef" 0 6))
2760    (fail 'string-reverse))
2761
2762(OR (string=? "edc" (string-reverse "abcdef" 2 5))
2763    (fail 'string-reverse))
2764
2765
2766(OR (string=? "" (string-concatenate '()))
2767    (fail 'string-concatenate))
2768
2769(OR (string=? "abcdef" (string-concatenate '("" "a" "bcd" "" "ef" "" "")))
2770    (fail 'string-concatenate))
2771
2772(OR (string=? "" (string-concatenate-reverse '()))
2773    (fail 'string-concatenate-reverse))
2774
2775(OR (string=? "efbcda"
2776              (string-concatenate-reverse '("" "a" "bcd" "" "ef" "" "")))
2777    (fail 'string-concatenate-reverse))
2778
2779(OR (string=? "huh?" (string-concatenate-reverse '() "huh?"))
2780    (fail 'string-concatenate-reverse))
2781
2782(OR (string=? "efbcdaxy"
2783              (string-concatenate-reverse '("" "a" "bcd" "" "ef" "" "") "xy"))
2784    (fail 'string-concatenate-reverse))
2785
2786(OR (string=? "huh" (string-concatenate-reverse '() "huh?" 3))
2787    (fail 'string-concatenate-reverse))
2788
2789(OR (string=? "efbcdax"
2790              (string-concatenate-reverse '("" "a" "bcd" "" "ef" "" "") "x" 1))
2791    (fail 'string-concatenate-reverse))
2792
2793
2794(OR (= 8
2795       (string-fold (lambda (c count)
2796                      (if (char-whitespace? c)
2797                          (+ count 1)
2798                          count))
2799                    0
2800                    " ...a couple of spaces in this one... "))
2801    (fail 'string-fold))
2802
2803(OR (= 7
2804       (string-fold (lambda (c count)
2805                      (if (char-whitespace? c)
2806                          (+ count 1)
2807                          count))
2808                    0
2809                    " ...a couple of spaces in this one... "
2810                    1))
2811    (fail 'string-fold))
2812
2813(OR (= 6
2814       (string-fold (lambda (c count)
2815                      (if (char-whitespace? c)
2816                          (+ count 1)
2817                          count))
2818                    0
2819                    " ...a couple of spaces in this one... "
2820                    1
2821                    32))
2822    (fail 'string-fold))
2823
2824(OR (equal? (string->list "abcdef")
2825            (string-fold-right cons '() "abcdef"))
2826    (fail 'string-fold-right))
2827
2828(OR (equal? (string->list "def")
2829            (string-fold-right cons '() "abcdef" 3))
2830    (fail 'string-fold-right))
2831
2832(OR (equal? (string->list "cde")
2833            (string-fold-right cons '() "abcdef" 2 5))
2834    (fail 'string-fold-right))
2835
2836(OR (string=? "aabraacaadaabraa"
2837              (let* ((s "abracadabra")
2838                     (ans-len (string-fold (lambda (c sum)
2839                                             (+ sum (if (char=? c #\a) 2 1)))
2840                                           0 s))
2841                     (ans (make-string ans-len)))
2842                (string-fold (lambda (c i)
2843                               (let ((i (if (char=? c #\a)
2844                                            (begin (string-set! ans i #\a)
2845                                                   (+ i 1))
2846                                            i)))
2847                                 (string-set! ans i c)
2848                                 (+ i 1)))
2849                             0 s)
2850                ans))
2851    (fail 'string-fold))
2852
2853
2854(OR (equal? '(101 100 99 98 97)
2855            (let ((s "abcde") (v '()))
2856              (string-for-each-cursor
2857               (lambda (cur)
2858                 (set! v (cons (char->integer (string-ref/cursor s cur)) v)))
2859               s)
2860              v))
2861    (fail 'string-for-each-cursor))
2862
2863(OR (string=? "cdefabcdefabcd"
2864              (string-replicate "abcdef" -4 10))
2865    (fail 'string-replicate))
2866
2867(OR (string=? "bcdefbcdefbcd"
2868              (string-replicate "abcdef" 90 103 1))
2869    (fail 'string-replicate))
2870
2871(OR (string=? "ecdecdecde"
2872              (string-replicate "abcdef" -13 -3 2 5))
2873    (fail 'string-replicate))
2874
2875(test* "string-replicate" "ecdecdecde"
2876       (let ([s "abcdef"])
2877         (string-replicate s -13 -3 (string-index->cursor s 2) (string-index->cursor s 5))))
2878
2879(OR (= 6 (string-count "abcdef" char?))
2880    (fail 'string-count))
2881
2882(OR (= 4 (string-count "counting  whitespace, again " char-whitespace? 5))
2883    (fail 'string-count))
2884
2885(OR (= 3 (string-count "abcdefwxyz"
2886                       (lambda (c) (odd? (char->integer c)))
2887                       2 8))
2888    (fail 'string-count))
2889
2890
2891(OR (string=? "It's lots of fun to code it up in Scheme."
2892              (string-replace "It's easy to code it up in Scheme."
2893                              "lots of fun"
2894                              5 9))
2895    (fail 'string-replace))
2896
2897(OR (string=? "The miserable perl programmer endured daily ridicule."
2898              (string-replace "The TCL programmer endured daily ridicule."
2899                              "another miserable perl drone"
2900                              4 7 8 22))
2901    (fail 'string-replace))
2902
2903(OR (string=? "It's really easy to code it up in Scheme."
2904              (string-replace "It's easy to code it up in Scheme."
2905                              "really "
2906                              5 5))
2907    (fail 'string-replace))
2908
2909
2910(OR (equal? '() (string-split "" ""))
2911    (fail 'string-split))
2912
2913(OR (equal? '("a" "b" "c") (string-split "abc" ""))
2914    (fail 'string-split))
2915
2916(OR (equal? '("too" "" "much" "" "data")
2917            (string-split "too  much  data" " "))
2918    (fail 'string-split))
2919
2920(OR (equal? '("" "there" "ya" "go" "")
2921            (string-split "***there***ya***go***" "***"))
2922    (fail 'string-split))
2923
2924(OR (equal? '() (string-split "" "" 'infix))
2925    (fail 'string-split))
2926
2927(OR (equal? '("a" "b" "c") (string-split "abc" "" 'infix))
2928    (fail 'string-split))
2929
2930(OR (equal? '("too" "" "much" "" "data")
2931            (string-split "too  much  data" " " 'infix))
2932    (fail 'string-split))
2933
2934(OR (equal? '("" "there" "ya" "go" "")
2935            (string-split "***there***ya***go***" "***" 'infix))
2936    (fail 'string-split))
2937
2938(OR (equal? 'error
2939            (guard (exn (else 'error))
2940             (string-split "" "" 'strict-infix)))
2941    (fail 'string-split))
2942
2943(OR (equal? '("a" "b" "c") (string-split "abc" "" 'strict-infix))
2944    (fail 'string-split))
2945
2946(OR (equal? '("too" "" "much" "" "data")
2947            (string-split "too  much  data" " " 'strict-infix))
2948    (fail 'string-split))
2949
2950(OR (equal? '("" "there" "ya" "go" "")
2951            (string-split "***there***ya***go***" "***" 'strict-infix))
2952    (fail 'string-split))
2953
2954(OR (equal? '() (string-split "" "" 'prefix))
2955    (fail 'string-split))
2956
2957(OR (equal? '("a" "b" "c") (string-split "abc" "" 'prefix))
2958    (fail 'string-split))
2959
2960(OR (equal? '("too" "" "much" "" "data")
2961            (string-split "too  much  data" " " 'prefix))
2962    (fail 'string-split))
2963
2964(OR (equal? '("there" "ya" "go" "")
2965            (string-split "***there***ya***go***" "***" 'prefix))
2966    (fail 'string-split))
2967
2968(OR (equal? '() (string-split "" "" 'suffix))
2969    (fail 'string-split))
2970
2971(OR (equal? '("a" "b" "c") (string-split "abc" "" 'suffix))
2972    (fail 'string-split))
2973
2974(OR (equal? '("too" "" "much" "" "data")
2975            (string-split "too  much  data" " " 'suffix))
2976    (fail 'string-split))
2977
2978(OR (equal? '("" "there" "ya" "go")
2979            (string-split "***there***ya***go***" "***" 'suffix))
2980    (fail 'string-split))
2981
2982
2983(OR (equal? '() (string-split "" "" 'infix #f))
2984    (fail 'string-split))
2985
2986(OR (equal? '("a" "b" "c") (string-split "abc" "" 'infix #f))
2987    (fail 'string-split))
2988
2989(OR (equal? '("too" "" "much" "" "data")
2990            (string-split "too  much  data" " " 'infix #f))
2991    (fail 'string-split))
2992
2993(OR (equal? '("" "there" "ya" "go" "")
2994            (string-split "***there***ya***go***" "***" 'infix #f))
2995    (fail 'string-split))
2996
2997(OR (equal? 'error
2998            (guard (exn (else 'error))
2999             (string-split "" "" 'strict-infix #f)))
3000    (fail 'string-split))
3001
3002(OR (equal? '("a" "b" "c") (string-split "abc" "" 'strict-infix #f))
3003    (fail 'string-split))
3004
3005(OR (equal? '("too" "" "much" "" "data")
3006            (string-split "too  much  data" " " 'strict-infix #f))
3007    (fail 'string-split))
3008
3009(OR (equal? '("" "there" "ya" "go" "")
3010            (string-split "***there***ya***go***" "***" 'strict-infix #f))
3011    (fail 'string-split))
3012
3013(OR (equal? '() (string-split "" "" 'prefix #f))
3014    (fail 'string-split))
3015
3016(OR (equal? '("a" "b" "c") (string-split "abc" "" 'prefix #f))
3017    (fail 'string-split))
3018
3019(OR (equal? '("too" "" "much" "" "data")
3020            (string-split "too  much  data" " " 'prefix #f))
3021    (fail 'string-split))
3022
3023(OR (equal? '("there" "ya" "go" "")
3024            (string-split "***there***ya***go***" "***" 'prefix #f))
3025    (fail 'string-split))
3026
3027(OR (equal? '() (string-split "" "" 'suffix #f))
3028    (fail 'string-split))
3029
3030(OR (equal? '("a" "b" "c") (string-split "abc" "" 'suffix #f))
3031    (fail 'string-split))
3032
3033(OR (equal? '("too" "" "much" "" "data")
3034            (string-split "too  much  data" " " 'suffix #f))
3035    (fail 'string-split))
3036
3037(OR (equal? '("" "there" "ya" "go")
3038            (string-split "***there***ya***go***" "***" 'suffix #f))
3039    (fail 'string-split))
3040
3041
3042(OR (equal? 'error
3043            (guard (exn (else 'error))
3044             (string-split "" "" 'strict-infix 3)))
3045    (fail 'string-split))
3046
3047(OR (equal? '("a" "b" "c") (string-split "abc" "" 'strict-infix 3))
3048    (fail 'string-split))
3049
3050(OR (equal? '("too" "" "much" " data")
3051            (string-split "too  much  data" " " 'strict-infix 3))
3052    (fail 'string-split))
3053
3054(OR (equal? '("" "there" "ya" "go***")
3055            (string-split "***there***ya***go***" "***" 'strict-infix 3))
3056    (fail 'string-split))
3057
3058(OR (equal? '() (string-split "" "" 'prefix 3))
3059    (fail 'string-split))
3060
3061(OR (equal? '("a" "b" "c") (string-split "abc" "" 'prefix 3))
3062    (fail 'string-split))
3063
3064(OR (equal? '("too" "" "much" " data")
3065            (string-split "too  much  data" " " 'prefix 3))
3066    (fail 'string-split))
3067
3068(OR (equal? '("there" "ya" "go***")
3069            (string-split "***there***ya***go***" "***" 'prefix 3))
3070    (fail 'string-split))
3071
3072(OR (equal? '() (string-split "" "" 'suffix 3))
3073    (fail 'string-split))
3074
3075(OR (equal? '("a" "b" "c") (string-split "abc" "" 'suffix 3))
3076    (fail 'string-split))
3077
3078(OR (equal? '("too" "" "much" " data")
3079            (string-split "too  much  data" " " 'suffix 3))
3080    (fail 'string-split))
3081
3082(OR (equal? '("" "there" "ya" "go***")
3083            (string-split "***there***ya***go***" "***" 'suffix 3))
3084    (fail 'string-split))
3085
3086
3087(OR (equal? 'error
3088            (guard (exn (else 'error))
3089             (string-split "" "" 'strict-infix 3 0)))
3090    (fail 'string-split))
3091
3092(OR (equal? '("b" "c") (string-split "abc" "" 'strict-infix 3 1))
3093    (fail 'string-split))
3094
3095(OR (equal? '("oo" "" "much" " data")
3096            (string-split "too  much  data" " " 'strict-infix 3 1))
3097    (fail 'string-split))
3098
3099(OR (equal? '("**there" "ya" "go" "")
3100            (string-split "***there***ya***go***" "***" 'strict-infix 3 1))
3101    (fail 'string-split))
3102
3103(OR (equal? '() (string-split "" "" 'prefix 3 0))
3104    (fail 'string-split))
3105
3106(OR (equal? '("b" "c") (string-split "abc" "" 'prefix 3 1))
3107    (fail 'string-split))
3108
3109(OR (equal? '("oo" "" "much" " data")
3110            (string-split "too  much  data" " " 'prefix 3 1))
3111    (fail 'string-split))
3112
3113(OR (equal? '("**there" "ya" "go" "")
3114            (string-split "***there***ya***go***" "***" 'prefix 3 1))
3115    (fail 'string-split))
3116
3117(OR (equal? '() (string-split "" "" 'suffix 3 0))
3118    (fail 'string-split))
3119
3120(OR (equal? '("b" "c") (string-split "abc" "" 'suffix 3 1))
3121    (fail 'string-split))
3122
3123(OR (equal? '("oo" "" "much" " data")
3124            (string-split "too  much  data" " " 'suffix 3 1))
3125    (fail 'string-split))
3126
3127(OR (equal? '("**there" "ya" "go")
3128            (string-split "***there***ya***go***" "***" 'suffix 3 1))
3129    (fail 'string-split))
3130
3131
3132(OR (equal? 'error
3133            (guard (exn (else 'error))
3134             (string-split "" "" 'strict-infix 3 0 0)))
3135    (fail 'string-split))
3136
3137(OR (equal? '("b") (string-split "abc" "" 'strict-infix 3 1 2))
3138    (fail 'string-split))
3139
3140(OR (equal? '("oo" "" "much" " ")
3141            (string-split "too  much  data" " " 'strict-infix 3 1 11))
3142    (fail 'string-split))
3143
3144(test* "string-split"
3145       '("oo" "" "much" " ")
3146       (let ([s "too  much  data"])
3147         (string-split s " " 'strict-infix 3
3148                       (string-index->cursor s 1)
3149                       (string-index->cursor s 11))))
3150
3151(OR (equal? '() (string-split "" "" 'prefix 3 0 0))
3152    (fail 'string-split))
3153
3154(OR (equal? '("b") (string-split "abc" "" 'prefix 3 1 2))
3155    (fail 'string-split))
3156
3157(OR (equal? '("oo" "" "much" " ")
3158            (string-split "too  much  data" " " 'prefix 3 1 11))
3159    (fail 'string-split))
3160
3161(OR (equal? '() (string-split "" "" 'suffix 3 0 0))
3162    (fail 'string-split))
3163
3164(OR (equal? '("b") (string-split "abc" "" 'suffix 3 1 2))
3165    (fail 'string-split))
3166
3167(OR (equal? '("oo" "" "much" " ")
3168            (string-split "too  much  data" " " 'suffix 3 1 11))
3169    (fail 'string-split))
3170
3171
3172(OR (string=? "aiueaaaoi"
3173              (string-filter (lambda (c) (memv c (string->list "aeiou")))
3174                             "What is number, that man may know it?"))
3175    (fail 'string-filter))
3176
3177(OR (string=? "And wmn, tht sh my knw nmbr?"
3178              (string-remove (lambda (c) (memv c (string->list "aeiou")))
3179                             "And woman, that she may know number?"))
3180    (fail 'string-remove))
3181
3182(OR (string=? "iueaaaoi"
3183              (string-filter (lambda (c) (memv c (string->list "aeiou")))
3184                             "What is number, that man may know it?"
3185                             4))
3186    (fail 'string-filter))
3187
3188(OR (string=? "mn, tht sh my knw nmbr?"
3189              (string-remove (lambda (c) (memv c (string->list "aeiou")))
3190                             "And woman, that she may know number?"
3191                             6))
3192    (fail 'string-remove))
3193
3194(OR (string=? "aaao"
3195              (string-filter (lambda (c) (memv c (string->list "aeiou")))
3196                             "What is number, that man may know it?"
3197                             16 32))
3198    (fail 'string-filter))
3199
3200(OR (string=? "And woman, that sh may know"
3201              (string-remove (lambda (c) (memv c (string->list "eiu")))
3202                             "And woman, that she may know number?"
3203                             0 28))
3204    (fail 'string-remove))
3205