2
;;;; Author: Paul Dietz
3
;;;; Created: Sat Oct 5 19:36:00 2002
4
;;;; Contains: Tests of character comparison functions
8
;;; The character comparisons should throw a PROGRAM-ERROR when
9
;;; safe-called with no arguments
10
(deftest char-compare-no-args
11
(loop for f in '(char= char/= char< char> char<= char>=
12
char-lessp char-greaterp char-equal
13
char-not-lessp char-not-greaterp char-not-equal)
14
collect (eval `(signals-error (funcall ',f) program-error)))
15
(t t t t t t t t t t t t))
18
(is-ordered-by +code-chars+ #'(lambda (c1 c2) (not (char= c1 c2))))
22
(loop for c across +code-chars+
27
(every #'char= +code-chars+)
31
(is-ordered-by +rev-code-chars+
32
#'(lambda (c1 c2) (not (char= c1 c2))))
35
(deftest char=.order.1
37
(values (not (char= (progn (incf i) #\a))) i))
40
(deftest char=.order.2
42
(values (char= (progn (setf a (incf i)) #\a)
43
(progn (setf b (incf i)) #\b))
47
(deftest char=.order.3
50
(char= (progn (setq a (incf i)) #\a)
51
(progn (setq b (incf i)) #\a)
52
(progn (setq c (incf i)) #\b))
59
(is-ordered-by +code-chars+ #'char/=)
63
(loop for c across +code-chars+
68
(every #'char/= +code-chars+)
72
(is-ordered-by +rev-code-chars+ #'char/=)
75
(deftest char/=.order.1
77
(values (not (char/= (progn (incf i) #\a))) i))
80
(deftest char/=.order.2
82
(values (not (char/= (progn (setf a (incf i)) #\a)
83
(progn (setf b (incf i)) #\b)))
87
(deftest char/=.order.3
90
(char/= (progn (setq a (incf i)) #\a)
91
(progn (setq b (incf i)) #\b)
92
(progn (setq c (incf i)) #\b))
99
(loop for c across +code-chars+
104
(every #'char<= +code-chars+)
108
(is-antisymmetrically-ordered-by +code-chars+ #'char<=)
112
(is-antisymmetrically-ordered-by +lower-case-chars+ #'char<=)
116
(is-antisymmetrically-ordered-by +upper-case-chars+ #'char<=)
120
(is-antisymmetrically-ordered-by +digit-chars+ #'char<=)
124
(notnot-mv (or (char<= #\9 #\A) (char<= #\Z #\0)))
128
(notnot-mv (or (char<= #\9 #\a) (char<= #\z #\0)))
131
(deftest char<=.order.1
133
(values (not (char<= (progn (incf i) #\a))) i))
136
(deftest char<=.order.2
138
(values (not (char<= (progn (setf a (incf i)) #\a)
139
(progn (setf b (incf i)) #\b)))
143
(deftest char<=.order.3
146
(char<= (progn (setq a (incf i)) #\a)
147
(progn (setq b (incf i)) #\b)
148
(progn (setq c (incf i)) #\a))
155
(loop for c across +code-chars+
160
(every #'char< +code-chars+)
164
(is-antisymmetrically-ordered-by +code-chars+ #'char<)
168
(is-antisymmetrically-ordered-by +lower-case-chars+ #'char<)
172
(is-antisymmetrically-ordered-by +upper-case-chars+ #'char<)
176
(is-antisymmetrically-ordered-by +digit-chars+ #'char<)
180
(notnot-mv (or (char< #\9 #\A) (char< #\Z #\0)))
184
(notnot-mv (or (char< #\9 #\a) (char< #\z #\0)))
187
(deftest char<.order.1
189
(values (not (char< (progn (incf i) #\a))) i))
192
(deftest char<.order.2
194
(values (not (char< (progn (setf a (incf i)) #\a)
195
(progn (setf b (incf i)) #\b)))
199
(deftest char<.order.3
202
(char< (progn (setq a (incf i)) #\a)
203
(progn (setq b (incf i)) #\b)
204
(progn (setq c (incf i)) #\a))
208
(deftest char<.order.4
211
(char< (progn (setq a (incf i)) #\b)
212
(progn (setq b (incf i)) #\a)
213
(progn (setq c (incf i)) #\b))
220
(loop for c across +code-chars+
225
(every #'char>= +code-chars+)
229
(is-antisymmetrically-ordered-by +rev-code-chars+ #'char>=)
233
(is-antisymmetrically-ordered-by (reverse +lower-case-chars+) #'char>=)
237
(is-antisymmetrically-ordered-by (reverse +upper-case-chars+) #'char>=)
241
(is-antisymmetrically-ordered-by (reverse +digit-chars+) #'char>=)
245
(notnot-mv (or (char>= #\A #\9) (char>= #\0 #\Z)))
249
(notnot-mv (or (char>= #\a #\9) (char>= #\0 #\z)))
252
(deftest char>=.order.1
254
(values (not (char>= (progn (incf i) #\a))) i))
257
(deftest char>=.order.2
259
(values (not (char>= (progn (setf a (incf i)) #\b)
260
(progn (setf b (incf i)) #\a)))
264
(deftest char>=.order.3
267
(char>= (progn (setq a (incf i)) #\b)
268
(progn (setq b (incf i)) #\a)
269
(progn (setq c (incf i)) #\b))
273
(deftest char>=.order.4
276
(char>= (progn (setq a (incf i)) #\a)
277
(progn (setq b (incf i)) #\b)
278
(progn (setq c (incf i)) #\a))
285
(loop for c across +code-chars+
290
(every #'char> +code-chars+)
294
(is-antisymmetrically-ordered-by +rev-code-chars+ #'char>)
298
(is-antisymmetrically-ordered-by (reverse +lower-case-chars+) #'char>)
302
(is-antisymmetrically-ordered-by (reverse +upper-case-chars+) #'char>)
306
(is-antisymmetrically-ordered-by (reverse +digit-chars+) #'char>)
310
(notnot-mv (or (char> #\A #\9) (char> #\0 #\Z)))
314
(notnot-mv (or (char> #\a #\9) (char> #\0 #\z)))
317
(deftest char>.order.1
319
(values (not (char> (progn (incf i) #\a))) i))
322
(deftest char>.order.2
324
(values (not (char> (progn (setf a (incf i)) #\b)
325
(progn (setf b (incf i)) #\a)))
329
(deftest char>.order.3
332
(char> (progn (setq a (incf i)) #\b)
333
(progn (setq b (incf i)) #\a)
334
(progn (setq c (incf i)) #\b))
338
(deftest char>.order.4
341
(char> (progn (setq a (incf i)) #\a)
342
(progn (setq b (incf i)) #\b)
343
(progn (setq c (incf i)) #\a))
347
;;; Case-insensitive comparisons
349
(deftest char-equal.1
350
(is-ordered-by +code-chars+
352
(or (char= (char-downcase c1)
354
(not (char-equal c1 c2)))))
357
(deftest char-equal.2
358
(loop for c across +code-chars+
359
always (char-equal c c))
362
(deftest char-equal.3
363
(loop for c across +code-chars+
364
always (char-equal c))
367
(deftest char-equal.4
368
(is-ordered-by +rev-code-chars+
370
(or (char= (char-downcase c1)
372
(not (char-equal c1 c2)))))
375
(deftest char-equal.order.1
377
(values (not (char-equal (progn (incf i) #\a))) i))
380
(deftest char-equal.order.2
382
(values (char-equal (progn (setf a (incf i)) #\b)
383
(progn (setf b (incf i)) #\a))
387
(deftest char-equal.order.3
390
(char-equal (progn (setq a (incf i)) #\a)
391
(progn (setq b (incf i)) #\a)
392
(progn (setq c (incf i)) #\b))
396
(deftest char-equal.order.4
399
(char-equal (progn (setq a (incf i)) #\a)
400
(progn (setq b (incf i)) #\b)
401
(progn (setq c (incf i)) #\a))
407
(deftest char-not-equal.1
408
(is-ordered-by +code-chars+ #'(lambda (c1 c2)
409
(or (char= (char-downcase c1)
411
(char-not-equal c1 c2))))
414
(deftest char-not-equal.2
415
(loop for c across +code-chars+
416
never (char-not-equal c c))
419
(deftest char-not-equal.3
420
(every #'char-not-equal +code-chars+)
423
(deftest char-not-equal.4
424
(is-ordered-by +rev-code-chars+ #'(lambda (c1 c2)
425
(or (char= (char-downcase c1)
427
(char-not-equal c1 c2))))
430
(deftest char-not-equal.order.1
432
(values (not (char-not-equal (progn (incf i) #\a))) i))
435
(deftest char-not-equal.order.2
437
(values (not (char-not-equal (progn (setf a (incf i)) #\b)
438
(progn (setf b (incf i)) #\a)))
442
(deftest char-not-equal.order.3
445
(char-not-equal (progn (setq a (incf i)) #\a)
446
(progn (setq b (incf i)) #\b)
447
(progn (setq c (incf i)) #\b))
451
(deftest char-not-equal.order.4
454
(char-not-equal (progn (setq a (incf i)) #\a)
455
(progn (setq b (incf i)) #\a)
456
(progn (setq c (incf i)) #\b))
462
(deftest char-not-greaterp.1
463
(loop for c across +code-chars+
464
always (char-not-greaterp c c))
467
(deftest char-not-greaterp.2
468
(every #'char-not-greaterp +code-chars+)
471
(deftest char-not-greaterp.3
472
(is-case-insensitive #'char-not-greaterp)
475
(deftest char-not-greaterp.4
476
(is-antisymmetrically-ordered-by +lower-case-chars+ #'char-not-greaterp)
479
(deftest char-not-greaterp.5
480
(is-antisymmetrically-ordered-by +upper-case-chars+ #'char-not-greaterp)
483
(deftest char-not-greaterp.6
484
(is-antisymmetrically-ordered-by +digit-chars+ #'char-not-greaterp)
487
(deftest char-not-greaterp.7
488
(notnot-mv (or (char-not-greaterp #\9 #\A) (char-not-greaterp #\Z #\0)))
491
(deftest char-not-greaterp.8
492
(notnot-mv (or (char-not-greaterp #\9 #\a) (char-not-greaterp #\z #\0)))
495
(deftest char-not-greaterp.order.1
497
(values (not (char-not-greaterp (progn (incf i) #\a))) i))
500
(deftest char-not-greaterp.order.2
502
(values (not (char-not-greaterp (progn (setf a (incf i)) #\a)
503
(progn (setf b (incf i)) #\b)))
507
(deftest char-not-greaterp.order.3
510
(char-not-greaterp (progn (setq a (incf i)) #\a)
511
(progn (setq b (incf i)) #\b)
512
(progn (setq c (incf i)) #\a))
516
(deftest char-not-greaterp.order.4
519
(char-not-greaterp (progn (setq a (incf i)) #\b)
520
(progn (setq b (incf i)) #\a)
521
(progn (setq c (incf i)) #\a))
527
(deftest char-lessp.1
528
(loop for c across +code-chars+
529
never (char-lessp c c))
532
(deftest char-lessp.2
533
(every #'char-lessp +code-chars+)
536
(deftest char-lessp.3
537
(is-case-insensitive #'char-lessp)
540
(deftest char-lessp.4
541
(is-antisymmetrically-ordered-by +lower-case-chars+ #'char-lessp)
544
(deftest char-lessp.5
545
(is-antisymmetrically-ordered-by +upper-case-chars+ #'char-lessp)
548
(deftest char-lessp.6
549
(is-antisymmetrically-ordered-by +digit-chars+ #'char-lessp)
552
(deftest char-lessp.7
553
(notnot-mv (or (char-lessp #\9 #\A) (char-lessp #\Z #\0)))
556
(deftest char-lessp.8
557
(notnot-mv (or (char-lessp #\9 #\a) (char-lessp #\z #\0)))
560
(deftest char-lessp.order.1
562
(values (not (char-lessp (progn (incf i) #\a))) i))
565
(deftest char-lessp.order.2
567
(values (not (char-lessp (progn (setf a (incf i)) #\a)
568
(progn (setf b (incf i)) #\b)))
572
(deftest char-lessp.order.3
575
(char-lessp (progn (setq a (incf i)) #\a)
576
(progn (setq b (incf i)) #\b)
577
(progn (setq c (incf i)) #\a))
581
(deftest char-lessp.order.4
584
(char-lessp (progn (setq a (incf i)) #\b)
585
(progn (setq b (incf i)) #\a)
586
(progn (setq c (incf i)) #\a))
592
(deftest char-not-lessp.1
593
(loop for c across +code-chars+
594
always (char-not-lessp c c))
597
(deftest char-not-lessp.2
598
(every #'char-not-lessp +code-chars+)
601
(deftest char-not-lessp.3
602
(is-case-insensitive #'char-not-lessp)
605
(deftest char-not-lessp.4
606
(is-antisymmetrically-ordered-by (reverse +lower-case-chars+)
610
(deftest char-not-lessp.5
611
(is-antisymmetrically-ordered-by (reverse +upper-case-chars+) #'char-not-lessp)
614
(deftest char-not-lessp.6
615
(is-antisymmetrically-ordered-by (reverse +digit-chars+) #'char-not-lessp)
618
(deftest char-not-lessp.7
619
(notnot-mv (or (char-not-lessp #\A #\9) (char-not-lessp #\0 #\Z)))
622
(deftest char-not-lessp.8
623
(notnot-mv (or (char-not-lessp #\a #\9) (char-not-lessp #\0 #\z)))
626
(deftest char-not-lessp.order.1
628
(values (not (char-not-lessp (progn (incf i) #\a))) i))
631
(deftest char-not-lessp.order.2
633
(values (not (char-not-lessp (progn (setf a (incf i)) #\b)
634
(progn (setf b (incf i)) #\a)))
638
(deftest char-not-lessp.order.3
641
(char-not-lessp (progn (setq a (incf i)) #\b)
642
(progn (setq b (incf i)) #\a)
643
(progn (setq c (incf i)) #\b))
647
(deftest char-not-lessp.order.4
650
(char-not-lessp (progn (setq a (incf i)) #\a)
651
(progn (setq b (incf i)) #\b)
652
(progn (setq c (incf i)) #\b))
658
(deftest char-greaterp.1
659
(loop for c across +code-chars+
660
never (char-greaterp c c))
663
(deftest char-greaterp.2
664
(every #'char-greaterp +code-chars+)
667
(deftest char-greaterp.3
668
(is-case-insensitive #'char-greaterp)
671
(deftest char-greaterp.4
672
(is-antisymmetrically-ordered-by (reverse +lower-case-chars+)
676
(deftest char-greaterp.5
677
(is-antisymmetrically-ordered-by (reverse +upper-case-chars+) #'char-greaterp)
680
(deftest char-greaterp.6
681
(is-antisymmetrically-ordered-by (reverse +digit-chars+) #'char-greaterp)
684
(deftest char-greaterp.7
685
(notnot-mv (or (char-greaterp #\A #\9) (char-greaterp #\0 #\Z)))
688
(deftest char-greaterp.8
689
(notnot-mv (or (char-greaterp #\a #\9) (char-greaterp #\0 #\z)))
692
(deftest char-greaterp.order.1
694
(values (not (char-greaterp (progn (incf i) #\a))) i))
697
(deftest char-greaterp.order.2
699
(values (not (char-greaterp (progn (setf a (incf i)) #\b)
700
(progn (setf b (incf i)) #\a)))
704
(deftest char-greaterp.order.3
707
(char-greaterp (progn (setq a (incf i)) #\b)
708
(progn (setq b (incf i)) #\a)
709
(progn (setq c (incf i)) #\b))
713
(deftest char-greaterp.order.4
716
(char-greaterp (progn (setq a (incf i)) #\a)
717
(progn (setq b (incf i)) #\b)
718
(progn (setq c (incf i)) #\a))