247 ! |
245 ! |
248 |
246 |
249 testMemoized |
247 testMemoized |
250 | count parser twice | |
248 | count parser twice | |
251 count := 0. |
249 count := 0. |
252 parser := [ :s | count := count + 1. s next ] asParser memoized. |
250 parser := [ :s | |
|
251 count := count + 1. |
|
252 s next ] asParser memoized. |
253 twice := parser and , parser. |
253 twice := parser and , parser. |
254 |
|
255 count := 0. |
254 count := 0. |
256 self assert: parser parse: 'a' to: $a. |
255 self assert: parser parse: 'a' to: $a. |
257 self assert: count = 1. |
256 self assert: count equals: 1. |
258 |
|
259 count := 0. |
257 count := 0. |
260 self assert: twice parse: 'a' to: #($a $a). |
258 self assert: twice parse: 'a' to: #($a $a). |
261 self assert: count = 1. |
259 self assert: count equals: 1. |
262 |
260 self assert: parser memoized equals: parser |
263 self assert: parser memoized = parser |
|
264 ! |
261 ! |
265 |
262 |
266 testMin |
263 testMin |
267 | parser | |
264 | parser | |
268 parser := $a asParser min: 2. |
265 parser := $a asParser min: 2. |
269 self assert: parser min = 2. |
266 self assert: parser min equals: 2. |
270 self assert: parser max > parser min. |
267 self assert: parser max > parser min. |
271 |
|
272 self assert: parser fail: ''. |
268 self assert: parser fail: ''. |
273 self assert: parser fail: 'a'. |
269 self assert: parser fail: 'a'. |
274 self assert: parser parse: 'aa' to: #($a $a). |
270 self assert: parser parse: 'aa' to: #($a $a). |
275 self assert: parser parse: 'aaa' to: #($a $a $a). |
271 self assert: parser parse: 'aaa' to: #($a $a $a). |
276 self assert: parser parse: 'aaaa' to: #($a $a $a $a). |
272 self assert: parser parse: 'aaaa' to: #($a $a $a $a). |
277 |
|
278 self assert: (parser printString endsWith: '[2, *]') |
273 self assert: (parser printString endsWith: '[2, *]') |
279 ! |
274 ! |
280 |
275 |
281 testMinGreedy |
276 testMinGreedy |
282 | parser | |
277 | parser | |
476 |
477 |
477 testPluggable |
478 testPluggable |
478 | block parser | |
479 | block parser | |
479 block := [ :stream | stream position ]. |
480 block := [ :stream | stream position ]. |
480 parser := block asParser. |
481 parser := block asParser. |
481 self assert: parser block = block |
482 self assert: parser block equals: block |
482 ! |
483 ! |
483 |
484 |
484 testPlus |
485 testPlus |
485 | parser | |
486 | parser | |
486 parser := $a asParser plus. |
487 parser := $a asParser plus. |
487 |
488 self assert: parser min equals: 1. |
488 self assert: parser min = 1. |
|
489 self assert: parser max > parser min. |
489 self assert: parser max > parser min. |
490 |
|
491 self assert: parser parse: 'a' to: #($a). |
490 self assert: parser parse: 'a' to: #($a). |
492 self assert: parser parse: 'aa' to: #($a $a). |
491 self assert: parser parse: 'aa' to: #($a $a). |
493 self assert: parser parse: 'aaa' to: #($a $a $a). |
492 self assert: parser parse: 'aaa' to: #($a $a $a). |
494 |
493 self |
495 self assert: parser parse: 'ab' to: #($a) end: 1. |
494 assert: parser |
496 self assert: parser parse: 'aab' to: #($a $a) end: 2. |
495 parse: 'ab' |
497 self assert: parser parse: 'aaab' to: #($a $a $a) end: 3. |
496 to: #($a) |
498 |
497 end: 1. |
|
498 self |
|
499 assert: parser |
|
500 parse: 'aab' |
|
501 to: #($a $a) |
|
502 end: 2. |
|
503 self |
|
504 assert: parser |
|
505 parse: 'aaab' |
|
506 to: #($a $a $a) |
|
507 end: 3. |
499 self assert: parser fail: ''. |
508 self assert: parser fail: ''. |
500 self assert: parser fail: 'b'. |
509 self assert: parser fail: 'b'. |
501 self assert: parser fail: 'ba' |
510 self assert: parser fail: 'ba' |
502 ! |
511 ! |
503 |
512 |
504 testPlusGreedy |
513 testPlusGreedy |
505 | limit parser | |
514 | limit parser | |
506 limit := #digit asParser. |
515 limit := #digit asParser. |
507 parser := #word asParser plusGreedy: limit. |
516 parser := #word asParser plusGreedy: limit. |
508 |
517 self assert: parser min equals: 1. |
509 self assert: parser min = 1. |
518 self assert: parser max > parser min. |
510 self assert: parser max > parser min. |
519 self assert: parser limit equals: limit. |
511 self assert: parser limit = limit. |
520 self assert: parser children size equals: 2. |
512 self assert: parser children size = 2. |
521 self assert: parser children last equals: limit. |
513 self assert: parser children last = limit. |
|
514 |
|
515 self assert: parser fail: ''. |
522 self assert: parser fail: ''. |
516 self assert: parser fail: '1'. |
523 self assert: parser fail: '1'. |
517 self assert: parser fail: 'a'. |
524 self assert: parser fail: 'a'. |
518 self assert: parser fail: 'ab'. |
525 self assert: parser fail: 'ab'. |
519 |
526 self |
520 self assert: parser parse: 'a1' to: #($a) end: 1. |
527 assert: parser |
521 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
528 parse: 'a1' |
522 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
529 to: #($a) |
523 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
530 end: 1. |
524 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
531 self |
525 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
532 assert: parser |
526 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
533 parse: 'ab1' |
527 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
534 to: #($a $b) |
528 self assert: parser parse: 'abc123' to: #($a $b $c $1 $2) end: 5. |
535 end: 2. |
|
536 self |
|
537 assert: parser |
|
538 parse: 'abc1' |
|
539 to: #($a $b $c) |
|
540 end: 3. |
|
541 self |
|
542 assert: parser |
|
543 parse: 'a12' |
|
544 to: #($a $1) |
|
545 end: 2. |
|
546 self |
|
547 assert: parser |
|
548 parse: 'ab12' |
|
549 to: #($a $b $1) |
|
550 end: 3. |
|
551 self |
|
552 assert: parser |
|
553 parse: 'abc12' |
|
554 to: #($a $b $c $1) |
|
555 end: 4. |
|
556 self |
|
557 assert: parser |
|
558 parse: 'a123' |
|
559 to: #($a $1 $2) |
|
560 end: 3. |
|
561 self |
|
562 assert: parser |
|
563 parse: 'ab123' |
|
564 to: #($a $b $1 $2) |
|
565 end: 4. |
|
566 self |
|
567 assert: parser |
|
568 parse: 'abc123' |
|
569 to: #($a $b $c $1 $2) |
|
570 end: 5 |
529 ! |
571 ! |
530 |
572 |
531 testPlusLazy |
573 testPlusLazy |
532 | limit parser | |
574 | limit parser | |
533 limit := #digit asParser. |
575 limit := #digit asParser. |
534 parser := #word asParser plusLazy: limit. |
576 parser := #word asParser plusLazy: limit. |
535 |
577 self assert: parser min equals: 1. |
536 self assert: parser min = 1. |
578 self assert: parser max > parser min. |
537 self assert: parser max > parser min. |
579 self assert: parser limit equals: limit. |
538 self assert: parser limit = limit. |
580 self assert: parser children size equals: 2. |
539 self assert: parser children size = 2. |
581 self assert: parser children last equals: limit. |
540 self assert: parser children last = limit. |
|
541 |
|
542 self assert: parser fail: ''. |
582 self assert: parser fail: ''. |
543 self assert: parser fail: '1'. |
583 self assert: parser fail: '1'. |
544 self assert: parser fail: 'a'. |
584 self assert: parser fail: 'a'. |
545 self assert: parser fail: 'ab'. |
585 self assert: parser fail: 'ab'. |
546 |
586 self |
547 self assert: parser parse: 'a1' to: #($a) end: 1. |
587 assert: parser |
548 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
588 parse: 'a1' |
549 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
589 to: #($a) |
550 self assert: parser parse: 'a12' to: #($a) end: 1. |
590 end: 1. |
551 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
591 self |
552 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
592 assert: parser |
553 self assert: parser parse: 'a123' to: #($a) end: 1. |
593 parse: 'ab1' |
554 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
594 to: #($a $b) |
555 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3 |
595 end: 2. |
|
596 self |
|
597 assert: parser |
|
598 parse: 'abc1' |
|
599 to: #($a $b $c) |
|
600 end: 3. |
|
601 self |
|
602 assert: parser |
|
603 parse: 'a12' |
|
604 to: #($a) |
|
605 end: 1. |
|
606 self |
|
607 assert: parser |
|
608 parse: 'ab12' |
|
609 to: #($a $b) |
|
610 end: 2. |
|
611 self |
|
612 assert: parser |
|
613 parse: 'abc12' |
|
614 to: #($a $b $c) |
|
615 end: 3. |
|
616 self |
|
617 assert: parser |
|
618 parse: 'a123' |
|
619 to: #($a) |
|
620 end: 1. |
|
621 self |
|
622 assert: parser |
|
623 parse: 'ab123' |
|
624 to: #($a $b) |
|
625 end: 2. |
|
626 self |
|
627 assert: parser |
|
628 parse: 'abc123' |
|
629 to: #($a $b $c) |
|
630 end: 3 |
556 ! |
631 ! |
557 |
632 |
558 testSeparatedBy |
633 testSeparatedBy |
559 | parser | |
634 | parser | |
560 parser := $a asParser separatedBy: $b asParser. |
635 parser := $a asParser separatedBy: $b asParser. |
607 ! |
682 ! |
608 |
683 |
609 testStar |
684 testStar |
610 | parser | |
685 | parser | |
611 parser := $a asParser star. |
686 parser := $a asParser star. |
612 |
687 self assert: parser min equals: 0. |
613 self assert: parser min = 0. |
|
614 self assert: parser max > parser min. |
688 self assert: parser max > parser min. |
615 |
|
616 self assert: parser parse: '' to: #(). |
689 self assert: parser parse: '' to: #(). |
617 self assert: parser parse: 'a' to: #($a). |
690 self assert: parser parse: 'a' to: #($a). |
618 self assert: parser parse: 'aa' to: #($a $a). |
691 self assert: parser parse: 'aa' to: #($a $a). |
619 self assert: parser parse: 'aaa' to: #($a $a $a). |
692 self assert: parser parse: 'aaa' to: #($a $a $a). |
620 |
693 self |
621 self assert: parser parse: 'b' to: #() end: 0. |
694 assert: parser |
622 self assert: parser parse: 'ab' to: #($a) end: 1. |
695 parse: 'b' |
623 self assert: parser parse: 'aab' to: #($a $a) end: 2. |
696 to: #() |
624 self assert: parser parse: 'aaab' to: #($a $a $a) end: 3 |
697 end: 0. |
|
698 self |
|
699 assert: parser |
|
700 parse: 'ab' |
|
701 to: #($a) |
|
702 end: 1. |
|
703 self |
|
704 assert: parser |
|
705 parse: 'aab' |
|
706 to: #($a $a) |
|
707 end: 2. |
|
708 self |
|
709 assert: parser |
|
710 parse: 'aaab' |
|
711 to: #($a $a $a) |
|
712 end: 3 |
625 ! |
713 ! |
626 |
714 |
627 testStarGreedy |
715 testStarGreedy |
628 | limit parser | |
716 | limit parser | |
629 limit := #digit asParser. |
717 limit := #digit asParser. |
630 parser := #word asParser starGreedy: limit. |
718 parser := #word asParser starGreedy: limit. |
631 |
719 self assert: parser min equals: 0. |
632 self assert: parser min = 0. |
|
633 self assert: parser max > parser min. |
720 self assert: parser max > parser min. |
634 self assert: parser limit = limit. |
721 self assert: parser limit equals: limit. |
635 self assert: parser children size = 2. |
722 self assert: parser children size equals: 2. |
636 self assert: parser children last = limit. |
723 self assert: parser children last equals: limit. |
637 |
|
638 self assert: parser fail: ''. |
724 self assert: parser fail: ''. |
639 self assert: parser fail: 'a'. |
725 self assert: parser fail: 'a'. |
640 self assert: parser fail: 'ab'. |
726 self assert: parser fail: 'ab'. |
641 |
727 self |
642 self assert: parser parse: '1' to: #() end: 0. |
728 assert: parser |
643 self assert: parser parse: 'a1' to: #($a) end: 1. |
729 parse: '1' |
644 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
730 to: #() |
645 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
731 end: 0. |
646 self assert: parser parse: '12' to: #($1) end: 1. |
732 self |
647 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
733 assert: parser |
648 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
734 parse: 'a1' |
649 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
735 to: #($a) |
650 self assert: parser parse: '123' to: #($1 $2) end: 2. |
736 end: 1. |
651 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
737 self |
652 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
738 assert: parser |
653 self assert: parser parse: 'abc123' to: #($a $b $c $1 $2) end: 5 |
739 parse: 'ab1' |
|
740 to: #($a $b) |
|
741 end: 2. |
|
742 self |
|
743 assert: parser |
|
744 parse: 'abc1' |
|
745 to: #($a $b $c) |
|
746 end: 3. |
|
747 self |
|
748 assert: parser |
|
749 parse: '12' |
|
750 to: #($1) |
|
751 end: 1. |
|
752 self |
|
753 assert: parser |
|
754 parse: 'a12' |
|
755 to: #($a $1) |
|
756 end: 2. |
|
757 self |
|
758 assert: parser |
|
759 parse: 'ab12' |
|
760 to: #($a $b $1) |
|
761 end: 3. |
|
762 self |
|
763 assert: parser |
|
764 parse: 'abc12' |
|
765 to: #($a $b $c $1) |
|
766 end: 4. |
|
767 self |
|
768 assert: parser |
|
769 parse: '123' |
|
770 to: #($1 $2) |
|
771 end: 2. |
|
772 self |
|
773 assert: parser |
|
774 parse: 'a123' |
|
775 to: #($a $1 $2) |
|
776 end: 3. |
|
777 self |
|
778 assert: parser |
|
779 parse: 'ab123' |
|
780 to: #($a $b $1 $2) |
|
781 end: 4. |
|
782 self |
|
783 assert: parser |
|
784 parse: 'abc123' |
|
785 to: #($a $b $c $1 $2) |
|
786 end: 5 |
654 ! |
787 ! |
655 |
788 |
656 testStarLazy |
789 testStarLazy |
657 | limit parser | |
790 | limit parser | |
658 limit := #digit asParser. |
791 limit := #digit asParser. |
659 parser := #word asParser starLazy: limit. |
792 parser := #word asParser starLazy: limit. |
660 |
793 self assert: parser min equals: 0. |
661 self assert: parser min = 0. |
|
662 self assert: parser max > parser min. |
794 self assert: parser max > parser min. |
663 self assert: parser limit = limit. |
795 self assert: parser limit equals: limit. |
664 self assert: parser children size = 2. |
796 self assert: parser children size equals: 2. |
665 self assert: parser children last = limit. |
797 self assert: parser children last equals: limit. |
666 |
|
667 self assert: parser fail: ''. |
798 self assert: parser fail: ''. |
668 self assert: parser fail: 'a'. |
799 self assert: parser fail: 'a'. |
669 self assert: parser fail: 'ab'. |
800 self assert: parser fail: 'ab'. |
670 |
801 self |
671 self assert: parser parse: '1' to: #() end: 0. |
802 assert: parser |
672 self assert: parser parse: 'a1' to: #($a) end: 1. |
803 parse: '1' |
673 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
804 to: #() |
674 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
805 end: 0. |
675 self assert: parser parse: '12' to: #() end: 0. |
806 self |
676 self assert: parser parse: 'a12' to: #($a) end: 1. |
807 assert: parser |
677 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
808 parse: 'a1' |
678 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
809 to: #($a) |
679 self assert: parser parse: '123' to: #() end: 0. |
810 end: 1. |
680 self assert: parser parse: 'a123' to: #($a) end: 1. |
811 self |
681 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
812 assert: parser |
682 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3 |
813 parse: 'ab1' |
|
814 to: #($a $b) |
|
815 end: 2. |
|
816 self |
|
817 assert: parser |
|
818 parse: 'abc1' |
|
819 to: #($a $b $c) |
|
820 end: 3. |
|
821 self |
|
822 assert: parser |
|
823 parse: '12' |
|
824 to: #() |
|
825 end: 0. |
|
826 self |
|
827 assert: parser |
|
828 parse: 'a12' |
|
829 to: #($a) |
|
830 end: 1. |
|
831 self |
|
832 assert: parser |
|
833 parse: 'ab12' |
|
834 to: #($a $b) |
|
835 end: 2. |
|
836 self |
|
837 assert: parser |
|
838 parse: 'abc12' |
|
839 to: #($a $b $c) |
|
840 end: 3. |
|
841 self |
|
842 assert: parser |
|
843 parse: '123' |
|
844 to: #() |
|
845 end: 0. |
|
846 self |
|
847 assert: parser |
|
848 parse: 'a123' |
|
849 to: #($a) |
|
850 end: 1. |
|
851 self |
|
852 assert: parser |
|
853 parse: 'ab123' |
|
854 to: #($a $b) |
|
855 end: 2. |
|
856 self |
|
857 assert: parser |
|
858 parse: 'abc123' |
|
859 to: #($a $b $c) |
|
860 end: 3 |
683 ! |
861 ! |
684 |
862 |
685 testTimes |
863 testTimes |
686 | parser | |
864 | parser | |
687 parser := $a asParser times: 2. |
865 parser := $a asParser times: 2. |
744 |
922 |
745 testNamed |
923 testNamed |
746 | parser | |
924 | parser | |
747 parser := PPSequenceParser new. |
925 parser := PPSequenceParser new. |
748 self assert: parser name isNil. |
926 self assert: parser name isNil. |
749 |
|
750 parser := PPChoiceParser named: 'choice'. |
927 parser := PPChoiceParser named: 'choice'. |
751 self assert: parser name = 'choice'. |
928 self assert: parser name equals: 'choice'. |
752 |
|
753 parser := $* asParser name: 'star'. |
929 parser := $* asParser name: 'star'. |
754 self assert: parser name = 'star' |
930 self assert: parser name equals: 'star' |
755 ! |
931 ! |
756 |
932 |
757 testPrint |
933 testPrint |
758 | parser | |
934 | parser | |
759 parser := PPParser new. |
935 parser := PPParser new. |
760 self assert: (parser printString findString: 'PPParser') > 0. |
936 self assert: (parser printString includesSubstring: 'PPParser'). |
761 |
937 |
762 parser := PPParser named: 'choice'. |
938 parser := PPParser named: 'choice'. |
763 self assert: (parser printString findString: 'PPParser(choice') > 0. |
939 self assert: (parser printString includesSubstring: 'PPParser(choice'). |
764 |
940 |
765 parser := PPLiteralObjectParser on: $a. |
941 parser := PPLiteralObjectParser on: $a. |
766 self assert: (parser printString findString: '$a') > 0. |
942 self assert: (parser printString includesSubstring: '$a'). |
767 |
943 |
768 parser := PPFailingParser message: 'error'. |
944 parser := PPFailingParser message: 'error'. |
769 self assert: (parser printString findString: 'error') > 0. |
945 self assert: (parser printString includesSubstring: 'error'). |
770 |
946 |
771 parser := PPPredicateObjectParser on: [ :c | true ] message: 'error'. |
947 parser := PPPredicateObjectParser on: [ :c | true ] message: 'error'. |
772 self assert: (parser printString findString: 'error') > 0 |
948 self assert: (parser printString includesSubstring: 'error') |
773 ! ! |
949 ! ! |
774 |
950 |
775 !PPParserTest methodsFor:'testing-fixtures'! |
951 !PPParserTest methodsFor:'testing-fixtures'! |
776 |
952 |
777 testSideEffectChoice |
953 testSideEffectChoice |
1159 p1 := #lowercase asParser. |
1335 p1 := #lowercase asParser. |
1160 p2 := p1 ==> #asUppercase. |
1336 p2 := p1 ==> #asUppercase. |
1161 p3 := PPUnresolvedParser new. |
1337 p3 := PPUnresolvedParser new. |
1162 p3 def: p2 / p3. |
1338 p3 def: p2 / p3. |
1163 self assert: p1 children isEmpty. |
1339 self assert: p1 children isEmpty. |
1164 self assert: p2 children size = 1. |
1340 self assert: p2 children size equals: 1. |
1165 self assert: p3 children size = 2 |
1341 self assert: p3 children size equals: 2 |
1166 ! |
1342 ! |
1167 |
1343 |
1168 testFailure |
1344 testFailure |
1169 | failure | |
1345 | failure | |
1170 failure := PPFailure message: 'Error' at: 3. |
1346 failure := PPFailure message: 'Error' context: PPContext new at: 3. |
1171 |
1347 self assert: failure message equals: 'Error'. |
1172 self assert: failure message = 'Error'. |
1348 self assert: failure position equals: 3. |
1173 self assert: failure position = 3. |
|
1174 self assert: failure isPetitFailure. |
1349 self assert: failure isPetitFailure. |
1175 |
|
1176 self deny: 4 isPetitFailure. |
1350 self deny: 4 isPetitFailure. |
1177 self deny: 'foo' isPetitFailure |
1351 self deny: 'foo' isPetitFailure |
1178 ! |
1352 ! |
1179 |
1353 |
1180 testListConstructor |
1354 testListConstructor |
1181 | p1 p2 p3 | |
1355 | p1 p2 p3 | |
1182 p1 := PPChoiceParser with: $a asParser. |
1356 p1 := PPChoiceParser with: $a asParser. |
1183 p2 := PPChoiceParser with: $a asParser with: $b asParser. |
1357 p2 := PPChoiceParser with: $a asParser with: $b asParser. |
1184 p3 := PPChoiceParser withAll: (Array with: $a asParser with: $b asParser with: $c asParser). |
1358 p3 := PPChoiceParser withAll: (Array with: $a asParser with: $b asParser with: $c asParser). |
1185 |
1359 self assert: p1 children size equals: 1. |
1186 self assert: p1 children size = 1. |
1360 self assert: p2 children size equals: 2. |
1187 self assert: p2 children size = 2. |
1361 self assert: p3 children size equals: 3 |
1188 self assert: p3 children size = 3 |
|
1189 ! |
1362 ! |
1190 |
1363 |
1191 testMatches |
1364 testMatches |
1192 | parser | |
1365 | parser | |
1193 parser := $a asParser. |
1366 parser := $a asParser. |
1200 ! |
1373 ! |
1201 |
1374 |
1202 testMatchesIn |
1375 testMatchesIn |
1203 | parser result | |
1376 | parser result | |
1204 parser := $a asParser. |
1377 parser := $a asParser. |
1205 |
|
1206 result := parser matchesIn: 'abba'. |
1378 result := parser matchesIn: 'abba'. |
1207 self assert: result size = 2. |
1379 self assert: result size equals: 2. |
1208 self assert: result first = $a. |
1380 self assert: result first equals: $a. |
1209 self assert: result last = $a. |
1381 self assert: result last equals: $a. |
1210 |
|
1211 result := parser matchesIn: 'baaah'. |
1382 result := parser matchesIn: 'baaah'. |
1212 self assert: result size = 3. |
1383 self assert: result size equals: 3. |
1213 self assert: result first = $a. |
1384 self assert: result first equals: $a. |
1214 self assert: result last = $a |
1385 self assert: result last equals: $a |
1215 ! |
1386 ! |
1216 |
1387 |
1217 testMatchesInEmpty |
1388 testMatchesInEmpty |
1218 "Empty matches should properly advance and match at each position and at the end." |
1389 "Empty matches should properly advance and match at each position and at the end." |
1219 |
1390 |
1220 | parser result | |
1391 | parser result | |
1221 parser := [ :stream | stream position ] asParser. |
1392 parser := [ :stream | stream position ] asParser. |
1222 |
|
1223 result := parser matchesIn: '123'. |
1393 result := parser matchesIn: '123'. |
1224 self assert: result asArray = #(0 1 2 3) |
1394 self assert: result asArray equals: #(0 1 2 3) |
1225 ! |
1395 ! |
1226 |
1396 |
1227 testMatchesInOverlapping |
1397 testMatchesInOverlapping |
1228 "Matches that overlap should be properly reported." |
1398 "Matches that overlap should be properly reported." |
1229 |
1399 |
1230 | parser result | |
1400 | parser result | |
1231 parser := #digit asParser , #digit asParser. |
1401 parser := #digit asParser , #digit asParser. |
1232 |
|
1233 result := parser matchesIn: 'a123b'. |
1402 result := parser matchesIn: 'a123b'. |
1234 self assert: result size = 2. |
1403 self assert: result size equals: 2. |
1235 self assert: result first = #($1 $2). |
1404 self assert: result first equals: #($1 $2). |
1236 self assert: result last = #($2 $3) |
1405 self assert: result last equals: #($2 $3) |
1237 ! |
1406 ! |
1238 |
1407 |
1239 testMatchesSkipIn |
1408 testMatchesSkipIn |
1240 | parser result | |
1409 | parser result | |
1241 parser := $a asParser. |
1410 parser := $a asParser. |
1242 |
|
1243 result := parser matchesSkipIn: 'abba'. |
1411 result := parser matchesSkipIn: 'abba'. |
1244 self assert: result size = 2. |
1412 self assert: result size equals: 2. |
1245 self assert: result first = $a. |
1413 self assert: result first equals: $a. |
1246 self assert: result last = $a. |
1414 self assert: result last equals: $a. |
1247 |
|
1248 result := parser matchesSkipIn: 'baaah'. |
1415 result := parser matchesSkipIn: 'baaah'. |
1249 self assert: result size = 3. |
1416 self assert: result size equals: 3. |
1250 self assert: result first = $a. |
1417 self assert: result first equals: $a. |
1251 self assert: result last = $a |
1418 self assert: result last equals: $a |
1252 ! |
1419 ! |
1253 |
1420 |
1254 testMatchesSkipInOverlapping |
1421 testMatchesSkipInOverlapping |
1255 "Matches that overlap should be properly reported." |
1422 "Matches that overlap should be properly reported." |
1256 |
1423 |
1257 | parser result | |
1424 | parser result | |
1258 parser := #digit asParser , #digit asParser. |
1425 parser := #digit asParser , #digit asParser. |
1259 |
|
1260 result := parser matchesSkipIn: 'a123b'. |
1426 result := parser matchesSkipIn: 'a123b'. |
1261 self assert: result size = 1. |
1427 self assert: result size equals: 1. |
1262 self assert: result first = #($1 $2) |
1428 self assert: result first equals: #($1 $2) |
1263 ! |
1429 ! |
1264 |
1430 |
1265 testMatchingRangesIn |
1431 testMatchingRangesIn |
1266 | input parser result | |
1432 | input parser result | |
1267 input := 'a12b3'. |
1433 input := 'a12b3'. |
1268 parser := #digit asParser plus. |
1434 parser := #digit asParser plus. |
1269 result := parser matchingRangesIn: input. |
1435 result := parser matchingRangesIn: input. |
1270 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
1436 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
1271 self assert: result size = 3. |
1437 self assert: result size equals: 3. |
1272 self assert: result first = '12'. |
1438 self assert: result first equals: '12'. |
1273 self assert: result second = '2'. |
1439 self assert: result second equals: '2'. |
1274 self assert: result last = '3' |
1440 self assert: result last equals: '3' |
1275 ! |
1441 ! |
1276 |
1442 |
1277 testMatchingSkipRangesIn |
1443 testMatchingSkipRangesIn |
1278 | input parser result | |
1444 | input parser result | |
1279 input := 'a12b3'. |
1445 input := 'a12b3'. |
1280 parser := #digit asParser plus. |
1446 parser := #digit asParser plus. |
1281 result := parser matchingSkipRangesIn: input. |
1447 result := parser matchingSkipRangesIn: input. |
1282 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
1448 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
1283 self assert: result size = 2. |
1449 self assert: result size equals: 2. |
1284 self assert: result first = '12'. |
1450 self assert: result first equals: '12'. |
1285 self assert: result last = '3' |
1451 self assert: result last equals: '3' |
1286 ! |
1452 ! |
1287 |
1453 |
1288 testParse |
1454 testParse |
1289 | parser result | |
1455 | parser result | |
1290 parser := $a asParser. |
1456 parser := $a asParser. |
1291 |
1457 self assert: (parser parse: 'a') equals: $a. |
1292 self assert: (parser parse: 'a') = $a. |
|
1293 self assert: (result := parser parse: 'b') isPetitFailure. |
1458 self assert: (result := parser parse: 'b') isPetitFailure. |
1294 self assert: (result message findString: '$a') > 0. |
1459 self assert: (result message includesSubstring: '$a'). |
1295 self assert: (result message findString: 'expected') > 0. |
1460 self assert: (result message includesSubstring: 'expected'). |
1296 self assert: (result position = 0). |
1461 self assert: result position equals: 0. |
1297 |
1462 self assert: (parser parse: 'a' readStream) equals: $a. |
1298 self assert: (parser parse: 'a' readStream) = $a. |
|
1299 self assert: (result := parser parse: 'b' readStream) isPetitFailure. |
1463 self assert: (result := parser parse: 'b' readStream) isPetitFailure. |
1300 self assert: (result message findString: '$a') > 0. |
1464 self assert: (result message includesSubstring: '$a'). |
1301 self assert: (result message findString: 'expected') > 0. |
1465 self assert: (result message includesSubstring: 'expected'). |
1302 self assert: (result position = 0) |
1466 self assert: result position equals: 0 |
1303 ! |
1467 ! |
1304 |
1468 |
1305 testParseOnError0 |
1469 testParseOnError0 |
1306 | parser result seen | |
1470 | parser result seen | |
1307 parser := $a asParser. |
1471 parser := $a asParser. |
1308 |
|
1309 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1472 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1310 self assert: result = $a. |
1473 self assert: result equals: $a. |
1311 |
|
1312 result := parser parse: 'b' onError: [ seen := true ]. |
1474 result := parser parse: 'b' onError: [ seen := true ]. |
1313 self assert: result. |
1475 self assert: result. |
1314 self assert: seen |
1476 self assert: seen |
1315 ! |
1477 ! |
1316 |
1478 |
1317 testParseOnError1 |
1479 testParseOnError1 |
1318 | parser result seen | |
1480 | parser result seen | |
1319 parser := $a asParser. |
1481 parser := $a asParser. |
1320 |
|
1321 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1482 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1322 self assert: result = $a. |
1483 self assert: result equals: $a. |
1323 |
1484 result := parser |
1324 result := parser parse: 'b' onError: [ :failure | |
1485 parse: 'b' |
1325 self assert: (failure position = 0). |
1486 onError: [ :failure | |
1326 self assert: (failure message findString: '$a') > 0. |
1487 self assert: failure position equals: 0. |
1327 self assert: (failure message findString: 'expected') > 0. |
1488 self assert: (failure message includesSubstring: '$a'). |
1328 seen := true ]. |
1489 self assert: (failure message includesSubstring: 'expected'). |
|
1490 seen := true ]. |
1329 self assert: result. |
1491 self assert: result. |
1330 self assert: seen |
1492 self assert: seen |
1331 ! |
1493 ! |
1332 |
1494 |
1333 testParseOnError2 |
1495 testParseOnError2 |
1334 | parser result seen | |
1496 | parser result seen | |
1335 parser := $a asParser. |
1497 parser := $a asParser. |
1336 |
|
1337 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1498 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
1338 self assert: result = $a. |
1499 self assert: result equals: $a. |
1339 |
1500 result := parser |
1340 result := parser parse: 'b' onError: [ :msg :pos | |
1501 parse: 'b' |
1341 self assert: (msg findString: '$a') > 0. |
1502 onError: [ :msg :pos | |
1342 self assert: (msg findString: 'expected') > 0. |
1503 self assert: (msg includesSubstring: '$a'). |
1343 self assert: pos = 0. |
1504 self assert: (msg includesSubstring: 'expected'). |
1344 seen := true ]. |
1505 self assert: pos equals: 0. |
|
1506 seen := true ]. |
1345 self assert: result. |
1507 self assert: result. |
1346 self assert: seen |
1508 self assert: seen |
1347 ! |
1509 ! |
1348 |
1510 |
1349 testParser |
1511 testParser |