Don't disable 'once' warnings in the whole test
[gitmo/Moose.git] / t / type_constraints / util_std_type_constraints.t
CommitLineData
a15dff8d 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
a28e50e4 6use Test::More;
a15dff8d 7
94ab1609 8use IO::File;
964294c1 9use Moose::Util::TypeConstraints;
94ab1609 10use Scalar::Util qw( blessed openhandle );
a15dff8d 11
94ab1609 12my $ZERO = 0;
13my $ONE = 1;
14my $INT = 100;
15my $NEG_INT = -100;
16my $NUM = 42.42;
17my $NEG_NUM = -42.42;
18
19my $EMPTY_STRING = q{};
20my $STRING = 'foo';
21my $NUM_IN_STRING = 'has 42 in it';
743ec002 22my $INT_WITH_NL1 = "1\n";
23my $INT_WITH_NL2 = "\n1";
94ab1609 24
25my $SCALAR_REF = \( my $var );
26my $SCALAR_REF_REF = \$SCALAR_REF;
27my $ARRAY_REF = [];
28my $HASH_REF = {};
29my $CODE_REF = sub { };
30
4ba256d5 31my $GLOB = do { no warnings 'once'; *GLOB_REF };
94ab1609 32my $GLOB_REF = \$GLOB;
33
34open my $FH, '<', $0 or die "Could not open $0 for the test";
a15dff8d 35
94ab1609 36my $FH_OBJECT = IO::File->new( $0, 'r' )
37 or die "Could not open $0 for the test";
38
4ba256d5 39my $REGEX = qr/../;
40my $REGEX_OBJ = bless qr/../, 'BlessedQR';
94ab1609 41
42my $OBJECT = bless {}, 'Foo';
43
44my $UNDEF = undef;
5030b52f 45
46{
94ab1609 47 package Thing;
5d776bdf 48
94ab1609 49 sub foo { }
5030b52f 50}
51
94ab1609 52my $CLASS_NAME = 'Thing';
f0cac16f 53
54{
94ab1609 55 package Role;
56 use Moose::Role;
57
58 sub foo { }
f0cac16f 59}
60
94ab1609 61my $ROLE_NAME = 'Role';
62
63my %tests = (
64 Any => {
65 accept => [
66 $ZERO,
67 $ONE,
68 $INT,
69 $NEG_INT,
70 $NUM,
71 $NEG_NUM,
72 $EMPTY_STRING,
73 $STRING,
74 $NUM_IN_STRING,
743ec002 75 $INT_WITH_NL1,
76 $INT_WITH_NL2,
94ab1609 77 $SCALAR_REF,
78 $SCALAR_REF_REF,
79 $ARRAY_REF,
80 $HASH_REF,
81 $CODE_REF,
82 $GLOB,
83 $GLOB_REF,
84 $FH,
85 $FH_OBJECT,
86 $REGEX,
87 $REGEX_OBJ,
88 $OBJECT,
89 $UNDEF,
90 ],
91 },
92 Item => {
93 accept => [
94 $ZERO,
95 $ONE,
96 $INT,
97 $NEG_INT,
98 $NUM,
99 $NEG_NUM,
100 $EMPTY_STRING,
101 $STRING,
102 $NUM_IN_STRING,
743ec002 103 $INT_WITH_NL1,
104 $INT_WITH_NL2,
94ab1609 105 $SCALAR_REF,
106 $SCALAR_REF_REF,
107 $ARRAY_REF,
108 $HASH_REF,
109 $CODE_REF,
110 $GLOB,
111 $GLOB_REF,
112 $FH,
113 $FH_OBJECT,
114 $REGEX,
115 $REGEX_OBJ,
116 $OBJECT,
117 $UNDEF,
118 ],
119 },
120 Defined => {
121 accept => [
122 $ZERO,
123 $ONE,
124 $INT,
125 $NEG_INT,
126 $NUM,
127 $NEG_NUM,
128 $EMPTY_STRING,
129 $STRING,
130 $NUM_IN_STRING,
743ec002 131 $INT_WITH_NL1,
132 $INT_WITH_NL2,
94ab1609 133 $SCALAR_REF,
134 $SCALAR_REF_REF,
135 $ARRAY_REF,
136 $HASH_REF,
137 $CODE_REF,
138 $GLOB,
139 $GLOB_REF,
140 $FH,
141 $FH_OBJECT,
142 $REGEX,
143 $REGEX_OBJ,
144 $OBJECT,
145 ],
146 reject => [
147 $UNDEF,
148 ],
149 },
150 Undef => {
151 accept => [
152 $UNDEF,
153 ],
154 reject => [
155 $ZERO,
156 $ONE,
157 $INT,
158 $NEG_INT,
159 $NUM,
160 $NEG_NUM,
161 $EMPTY_STRING,
162 $STRING,
163 $NUM_IN_STRING,
743ec002 164 $INT_WITH_NL1,
165 $INT_WITH_NL2,
94ab1609 166 $SCALAR_REF,
167 $SCALAR_REF_REF,
168 $ARRAY_REF,
169 $HASH_REF,
170 $CODE_REF,
171 $GLOB,
172 $GLOB_REF,
173 $FH,
174 $FH_OBJECT,
175 $REGEX,
176 $REGEX_OBJ,
177 $OBJECT,
178 ],
179 },
180 Bool => {
181 accept => [
182 $ZERO,
183 $ONE,
184 $EMPTY_STRING,
185 $UNDEF,
186 ],
187 reject => [
188 $INT,
189 $NEG_INT,
190 $NUM,
191 $NEG_NUM,
192 $STRING,
193 $NUM_IN_STRING,
743ec002 194 $INT_WITH_NL1,
195 $INT_WITH_NL2,
94ab1609 196 $SCALAR_REF,
197 $SCALAR_REF_REF,
198 $ARRAY_REF,
199 $HASH_REF,
200 $CODE_REF,
201 $GLOB,
202 $GLOB_REF,
203 $FH,
204 $FH_OBJECT,
205 $REGEX,
206 $REGEX_OBJ,
207 $OBJECT,
208 ],
209 },
7fb4b360 210 Maybe => {
211 accept => [
212 $ZERO,
213 $ONE,
214 $INT,
215 $NEG_INT,
216 $NUM,
217 $NEG_NUM,
218 $EMPTY_STRING,
219 $STRING,
220 $NUM_IN_STRING,
743ec002 221 $INT_WITH_NL1,
222 $INT_WITH_NL2,
7fb4b360 223 $SCALAR_REF,
224 $SCALAR_REF_REF,
225 $ARRAY_REF,
226 $HASH_REF,
227 $CODE_REF,
228 $GLOB,
229 $GLOB_REF,
230 $FH,
231 $FH_OBJECT,
232 $REGEX,
233 $REGEX_OBJ,
234 $OBJECT,
235 $UNDEF,
236 ],
237 },
94ab1609 238 Value => {
239 accept => [
240 $ZERO,
241 $ONE,
242 $INT,
243 $NEG_INT,
244 $NUM,
245 $NEG_NUM,
246 $EMPTY_STRING,
247 $STRING,
248 $NUM_IN_STRING,
743ec002 249 $INT_WITH_NL1,
250 $INT_WITH_NL2,
94ab1609 251 $GLOB,
252 ],
253 reject => [
254 $SCALAR_REF,
255 $SCALAR_REF_REF,
256 $ARRAY_REF,
257 $HASH_REF,
258 $CODE_REF,
259 $GLOB_REF,
260 $FH,
261 $FH_OBJECT,
262 $REGEX,
263 $REGEX_OBJ,
264 $OBJECT,
265 $UNDEF,
266 ],
267 },
268 Ref => {
269 accept => [
270 $SCALAR_REF,
271 $SCALAR_REF_REF,
272 $ARRAY_REF,
273 $HASH_REF,
274 $CODE_REF,
275 $GLOB_REF,
276 $FH,
277 $FH_OBJECT,
278 $REGEX,
279 $REGEX_OBJ,
280 $OBJECT,
281 ],
282 reject => [
283 $ZERO,
284 $ONE,
285 $INT,
286 $NEG_INT,
287 $NUM,
288 $NEG_NUM,
289 $EMPTY_STRING,
290 $STRING,
291 $NUM_IN_STRING,
743ec002 292 $INT_WITH_NL1,
293 $INT_WITH_NL2,
94ab1609 294 $GLOB,
295 $UNDEF,
296 ],
297 },
298 Num => {
299 accept => [
300 $ZERO,
301 $ONE,
302 $INT,
303 $NEG_INT,
304 $NUM,
305 $NEG_NUM,
743ec002 306 $INT_WITH_NL1,
307 $INT_WITH_NL2,
94ab1609 308 ],
309 reject => [
310 $EMPTY_STRING,
311 $STRING,
312 $NUM_IN_STRING,
313 $SCALAR_REF,
314 $SCALAR_REF_REF,
315 $ARRAY_REF,
316 $HASH_REF,
317 $CODE_REF,
318 $GLOB,
319 $GLOB_REF,
320 $FH,
321 $FH_OBJECT,
322 $REGEX,
323 $REGEX_OBJ,
324 $OBJECT,
325 $UNDEF,
326 ],
327 },
328 Int => {
329 accept => [
330 $ZERO,
331 $ONE,
332 $INT,
333 $NEG_INT,
334 ],
335 reject => [
336 $NUM,
337 $NEG_NUM,
338 $EMPTY_STRING,
339 $STRING,
340 $NUM_IN_STRING,
743ec002 341 $INT_WITH_NL1,
342 $INT_WITH_NL2,
94ab1609 343 $SCALAR_REF,
344 $SCALAR_REF_REF,
345 $ARRAY_REF,
346 $HASH_REF,
347 $CODE_REF,
348 $GLOB,
349 $GLOB_REF,
350 $FH,
351 $FH_OBJECT,
352 $REGEX,
353 $REGEX_OBJ,
354 $OBJECT,
355 $UNDEF,
356 ],
357 },
358 Str => {
359 accept => [
360 $ZERO,
361 $ONE,
362 $INT,
363 $NEG_INT,
364 $NUM,
365 $NEG_NUM,
366 $EMPTY_STRING,
367 $STRING,
368 $NUM_IN_STRING,
743ec002 369 $INT_WITH_NL1,
370 $INT_WITH_NL2,
94ab1609 371 ],
372 reject => [
373 $SCALAR_REF,
374 $SCALAR_REF_REF,
375 $ARRAY_REF,
376 $HASH_REF,
377 $CODE_REF,
378 $GLOB,
379 $GLOB_REF,
380 $FH,
381 $FH_OBJECT,
382 $REGEX,
383 $REGEX_OBJ,
384 $OBJECT,
385 $UNDEF,
386 ],
387 },
388 ScalarRef => {
389 accept => [
390 $SCALAR_REF,
391 $SCALAR_REF_REF,
392 ],
393 reject => [
394 $ZERO,
395 $ONE,
396 $INT,
397 $NEG_INT,
398 $NUM,
399 $NEG_NUM,
400 $EMPTY_STRING,
401 $STRING,
402 $NUM_IN_STRING,
743ec002 403 $INT_WITH_NL1,
404 $INT_WITH_NL2,
94ab1609 405 $ARRAY_REF,
406 $HASH_REF,
407 $CODE_REF,
408 $GLOB,
409 $GLOB_REF,
410 $FH,
411 $FH_OBJECT,
412 $REGEX,
413 $REGEX_OBJ,
414 $OBJECT,
415 $UNDEF,
416 ],
417 },
418 ArrayRef => {
419 accept => [
420 $ARRAY_REF,
421 ],
422 reject => [
423 $ZERO,
424 $ONE,
425 $INT,
426 $NEG_INT,
427 $NUM,
428 $NEG_NUM,
429 $EMPTY_STRING,
430 $STRING,
431 $NUM_IN_STRING,
743ec002 432 $INT_WITH_NL1,
433 $INT_WITH_NL2,
94ab1609 434 $SCALAR_REF,
435 $SCALAR_REF_REF,
436 $HASH_REF,
437 $CODE_REF,
438 $GLOB,
439 $GLOB_REF,
440 $FH,
441 $FH_OBJECT,
442 $REGEX,
443 $REGEX_OBJ,
444 $OBJECT,
445 $UNDEF,
446 ],
447 },
448 HashRef => {
449 accept => [
450 $HASH_REF,
451 ],
452 reject => [
453 $ZERO,
454 $ONE,
455 $INT,
456 $NEG_INT,
457 $NUM,
458 $NEG_NUM,
459 $EMPTY_STRING,
460 $STRING,
461 $NUM_IN_STRING,
743ec002 462 $INT_WITH_NL1,
463 $INT_WITH_NL2,
94ab1609 464 $SCALAR_REF,
465 $SCALAR_REF_REF,
466 $ARRAY_REF,
467 $CODE_REF,
468 $GLOB,
469 $GLOB_REF,
470 $FH,
471 $FH_OBJECT,
472 $REGEX,
473 $REGEX_OBJ,
474 $OBJECT,
475 $UNDEF,
476 ],
477 },
478 CodeRef => {
479 accept => [
480 $CODE_REF,
481 ],
482 reject => [
483 $ZERO,
484 $ONE,
485 $INT,
486 $NEG_INT,
487 $NUM,
488 $NEG_NUM,
489 $EMPTY_STRING,
490 $STRING,
491 $NUM_IN_STRING,
743ec002 492 $INT_WITH_NL1,
493 $INT_WITH_NL2,
94ab1609 494 $SCALAR_REF,
495 $SCALAR_REF_REF,
496 $ARRAY_REF,
497 $HASH_REF,
498 $GLOB,
499 $GLOB_REF,
500 $FH,
501 $FH_OBJECT,
502 $REGEX,
503 $REGEX_OBJ,
504 $OBJECT,
505 $UNDEF,
506 ],
507 },
508 RegexpRef => {
509 accept => [
510 $REGEX,
511 $REGEX_OBJ,
512 ],
513 reject => [
514 $ZERO,
515 $ONE,
516 $INT,
517 $NEG_INT,
518 $NUM,
519 $NEG_NUM,
520 $EMPTY_STRING,
521 $STRING,
522 $NUM_IN_STRING,
743ec002 523 $INT_WITH_NL1,
524 $INT_WITH_NL2,
94ab1609 525 $SCALAR_REF,
526 $SCALAR_REF_REF,
527 $ARRAY_REF,
528 $HASH_REF,
529 $CODE_REF,
530 $GLOB,
531 $GLOB_REF,
532 $FH,
533 $FH_OBJECT,
534 $OBJECT,
535 $UNDEF,
536 ],
537 },
538 GlobRef => {
539 accept => [
540 $GLOB_REF,
541 $FH,
542 ],
543 reject => [
544 $ZERO,
545 $ONE,
546 $INT,
547 $NEG_INT,
548 $NUM,
549 $NEG_NUM,
550 $EMPTY_STRING,
551 $STRING,
552 $NUM_IN_STRING,
743ec002 553 $INT_WITH_NL1,
554 $INT_WITH_NL2,
94ab1609 555 $SCALAR_REF,
556 $SCALAR_REF_REF,
557 $ARRAY_REF,
558 $HASH_REF,
559 $CODE_REF,
560 $GLOB,
561 $FH_OBJECT,
562 $OBJECT,
563 $REGEX,
564 $REGEX_OBJ,
565 $UNDEF,
566 ],
567 },
568 FileHandle => {
569 accept => [
570 $FH,
571 $FH_OBJECT,
572 ],
573 reject => [
574 $ZERO,
575 $ONE,
576 $INT,
577 $NEG_INT,
578 $NUM,
579 $NEG_NUM,
580 $EMPTY_STRING,
581 $STRING,
582 $NUM_IN_STRING,
743ec002 583 $INT_WITH_NL1,
584 $INT_WITH_NL2,
94ab1609 585 $SCALAR_REF,
586 $SCALAR_REF_REF,
587 $ARRAY_REF,
588 $HASH_REF,
589 $CODE_REF,
590 $GLOB,
591 $GLOB_REF,
592 $OBJECT,
593 $REGEX,
594 $REGEX_OBJ,
595 $UNDEF,
596 ],
597 },
598 Object => {
599 accept => [
600 $FH_OBJECT,
601 $REGEX,
602 $REGEX_OBJ,
603 $OBJECT,
604 ],
605 reject => [
606 $ZERO,
607 $ONE,
608 $INT,
609 $NEG_INT,
610 $NUM,
611 $NEG_NUM,
612 $EMPTY_STRING,
613 $STRING,
614 $NUM_IN_STRING,
743ec002 615 $INT_WITH_NL1,
616 $INT_WITH_NL2,
94ab1609 617 $SCALAR_REF,
618 $SCALAR_REF_REF,
619 $ARRAY_REF,
620 $HASH_REF,
621 $CODE_REF,
622 $GLOB,
623 $GLOB_REF,
624 $FH,
625 $UNDEF,
626 ],
627 },
628 ClassName => {
629 accept => [
630 $CLASS_NAME,
631 $ROLE_NAME,
632 ],
633 reject => [
634 $ZERO,
635 $ONE,
636 $INT,
637 $NEG_INT,
638 $NUM,
639 $NEG_NUM,
640 $EMPTY_STRING,
641 $STRING,
642 $NUM_IN_STRING,
743ec002 643 $INT_WITH_NL1,
644 $INT_WITH_NL2,
94ab1609 645 $SCALAR_REF,
646 $SCALAR_REF_REF,
647 $ARRAY_REF,
648 $HASH_REF,
649 $CODE_REF,
650 $GLOB,
651 $GLOB_REF,
652 $FH,
653 $FH_OBJECT,
654 $REGEX,
655 $REGEX_OBJ,
656 $OBJECT,
657 $UNDEF,
658 ],
659 },
660 RoleName => {
661 accept => [
662 $ROLE_NAME,
663 ],
664 reject => [
665 $CLASS_NAME,
666 $ZERO,
667 $ONE,
668 $INT,
669 $NEG_INT,
670 $NUM,
671 $NEG_NUM,
672 $EMPTY_STRING,
673 $STRING,
674 $NUM_IN_STRING,
743ec002 675 $INT_WITH_NL1,
676 $INT_WITH_NL2,
94ab1609 677 $SCALAR_REF,
678 $SCALAR_REF_REF,
679 $ARRAY_REF,
680 $HASH_REF,
681 $CODE_REF,
682 $GLOB,
683 $GLOB_REF,
684 $FH,
685 $FH_OBJECT,
686 $REGEX,
687 $REGEX_OBJ,
688 $OBJECT,
689 $UNDEF,
690 ],
691 },
692);
693
694for my $name ( sort keys %tests ) {
964294c1 695 test_constraint( $name, $tests{$name} );
696}
697
bb4cf777 698# We need to test that the Str constraint accepts the return val of substr() -
699# which means passing that return val directly to the checking code
700{
701 my $str = 'some string';
702
703 my $type = Moose::Util::TypeConstraints::find_type_constraint('Str');
704
705 my $unoptimized
706 = $type->has_parent
707 ? $type->_compile_subtype( $type->constraint )
708 : $type->_compile_type( $type->constraint );
709
710 my $inlined;
711 {
712 local $@;
713 $inlined = eval 'sub { ( ' . $type->_inline_check('$_[0]') . ' ) }';
714 die $@ if $@;
715 }
716
717 ok(
718 $type->check( substr( $str, 1, 3 ) ),
719 'Str accepts return val from substr using ->check'
720 );
721 ok(
722 $unoptimized->( substr( $str, 1, 3 ) ),
723 'Str accepts return val from substr using unoptimized constraint'
724 );
725 ok(
726 $inlined->( substr( $str, 1, 3 ) ),
727 'Str accepts return val from substr using inlined constraint'
728 );
729
730 ok(
731 $type->check( substr( $str, 0, 0 ) ),
732 'Str accepts empty return val from substr using ->check'
733 );
734 ok(
735 $unoptimized->( substr( $str, 0, 0 ) ),
736 'Str accepts empty return val from substr using unoptimized constraint'
737 );
738 ok(
739 $inlined->( substr( $str, 0, 0 ) ),
740 'Str accepts empty return val from substr using inlined constraint'
741 );
742}
743
964294c1 744{
745 my $class_tc = class_type('Thing');
746
747 test_constraint(
748 $class_tc, {
749 accept => [
750 ( bless {}, 'Thing' ),
751 ],
752 reject => [
753 'Thing',
754 $ZERO,
755 $ONE,
756 $INT,
757 $NEG_INT,
758 $NUM,
759 $NEG_NUM,
760 $EMPTY_STRING,
761 $STRING,
762 $NUM_IN_STRING,
743ec002 763 $INT_WITH_NL1,
764 $INT_WITH_NL2,
964294c1 765 $SCALAR_REF,
766 $SCALAR_REF_REF,
767 $ARRAY_REF,
768 $HASH_REF,
769 $CODE_REF,
770 $GLOB,
771 $GLOB_REF,
772 $FH,
773 $FH_OBJECT,
774 $REGEX,
775 $REGEX_OBJ,
776 $OBJECT,
777 $UNDEF,
778 ],
779 }
780 );
781}
782
783{
784 package Duck;
785
743ec002 786 sub quack { }
787 sub flap { }
964294c1 788}
789
790{
791 package DuckLike;
792
743ec002 793 sub quack { }
794 sub flap { }
964294c1 795}
796
797{
798 package Bird;
799
743ec002 800 sub flap { }
964294c1 801}
802
803{
804 my @methods = qw( quack flap );
805 duck_type 'Duck' => @methods;
806
807 test_constraint(
808 'Duck', {
809 accept => [
810 ( bless {}, 'Duck' ),
811 ( bless {}, 'DuckLike' ),
812 ],
813 reject => [
964294c1 814 $ZERO,
815 $ONE,
816 $INT,
817 $NEG_INT,
818 $NUM,
819 $NEG_NUM,
820 $EMPTY_STRING,
821 $STRING,
822 $NUM_IN_STRING,
743ec002 823 $INT_WITH_NL1,
824 $INT_WITH_NL2,
964294c1 825 $SCALAR_REF,
826 $SCALAR_REF_REF,
827 $ARRAY_REF,
828 $HASH_REF,
829 $CODE_REF,
830 $GLOB,
831 $GLOB_REF,
832 $FH,
833 $FH_OBJECT,
834 $REGEX,
835 $REGEX_OBJ,
836 $OBJECT,
837 ( bless {}, 'Bird' ),
838 $UNDEF,
839 ],
840 }
841 );
842}
843
844{
845 my @allowed = qw( bar baz quux );
846 enum 'Enumerated' => @allowed;
847
848 test_constraint(
849 'Enumerated', {
850 accept => \@allowed,
851 reject => [
964294c1 852 $ZERO,
853 $ONE,
854 $INT,
855 $NEG_INT,
856 $NUM,
857 $NEG_NUM,
858 $EMPTY_STRING,
859 $STRING,
860 $NUM_IN_STRING,
743ec002 861 $INT_WITH_NL1,
862 $INT_WITH_NL2,
964294c1 863 $SCALAR_REF,
864 $SCALAR_REF_REF,
865 $ARRAY_REF,
866 $HASH_REF,
867 $CODE_REF,
868 $GLOB,
869 $GLOB_REF,
870 $FH,
871 $FH_OBJECT,
872 $REGEX,
873 $REGEX_OBJ,
874 $OBJECT,
875 $UNDEF,
876 ],
877 }
878 );
879}
880
881{
09532816 882 my $union = Moose::Meta::TypeConstraint::Union->new(
883 type_constraints => [
884 find_type_constraint('Int'),
885 find_type_constraint('Object'),
886 ],
887 );
888
889 test_constraint(
890 $union, {
891 accept => [
892 $ZERO,
893 $ONE,
894 $INT,
895 $NEG_INT,
896 $FH_OBJECT,
897 $REGEX,
898 $REGEX_OBJ,
899 $OBJECT,
900 ],
901 reject => [
902 $NUM,
903 $NEG_NUM,
904 $EMPTY_STRING,
905 $STRING,
906 $NUM_IN_STRING,
743ec002 907 $INT_WITH_NL1,
908 $INT_WITH_NL2,
09532816 909 $SCALAR_REF,
910 $SCALAR_REF_REF,
911 $ARRAY_REF,
912 $HASH_REF,
913 $CODE_REF,
914 $GLOB,
915 $GLOB_REF,
916 $FH,
917 $UNDEF,
918 ],
919 }
920 );
921}
922
923{
964294c1 924 package DoesRole;
925
926 use Moose;
927
928 with 'Role';
929}
930
931# Test how $_ is used in XS implementation
932{
933 local $_ = qr/./;
934 ok(
935 Moose::Util::TypeConstraints::Builtins::_RegexpRef(),
936 '$_ is RegexpRef'
937 );
938 ok(
939 !Moose::Util::TypeConstraints::Builtins::_RegexpRef(1),
940 '$_ is not read when param provided'
941 );
942
943 $_ = bless qr/./, 'Blessed';
944
945 ok(
946 Moose::Util::TypeConstraints::Builtins::_RegexpRef(),
947 '$_ is RegexpRef'
948 );
949
950 $_ = 42;
951 ok(
952 !Moose::Util::TypeConstraints::Builtins::_RegexpRef(),
953 '$_ is not RegexpRef'
954 );
955 ok(
956 Moose::Util::TypeConstraints::Builtins::_RegexpRef(qr/./),
957 '$_ is not read when param provided'
958 );
959}
960
961close $FH
962 or warn "Could not close the filehandle $0 for test";
963$FH_OBJECT->close
964 or warn "Could not close the filehandle $0 for test";
965
966done_testing;
967
968sub test_constraint {
969 my $type = shift;
970 my $tests = shift;
971
972 local $Test::Builder::Level = $Test::Builder::Level + 1;
973
974 unless ( blessed $type ) {
975 $type = Moose::Util::TypeConstraints::find_type_constraint($type)
976 or BAIL_OUT("No such type $type!");
977 }
978
979 my $name = $type->name;
94ab1609 980
981 my $unoptimized
982 = $type->has_parent
983 ? $type->_compile_subtype( $type->constraint )
984 : $type->_compile_type( $type->constraint );
985
986 my $inlined;
987 if ( $type->has_inlined_type_constraint ) {
988 local $@;
964294c1 989 $inlined = eval 'sub { ( ' . $type->_inline_check('$_[0]') . ' ) }';
94ab1609 990 die $@ if $@;
991 }
992
964294c1 993 for my $accept ( @{ $tests->{accept} || [] } ) {
94ab1609 994 my $described = describe($accept);
995 ok(
996 $type->check($accept),
997 "$name accepts $described using ->check"
998 );
999 ok(
1000 $unoptimized->($accept),
1001 "$name accepts $described using unoptimized constraint"
1002 );
1003 if ($inlined) {
1004 ok(
1005 $inlined->($accept),
1006 "$name accepts $described using inlined constraint"
1007 );
1008 }
1009 }
1010
964294c1 1011 for my $reject ( @{ $tests->{reject} || [] } ) {
94ab1609 1012 my $described = describe($reject);
1013 ok(
1014 !$type->check($reject),
1015 "$name rejects $described using ->check"
1016 );
1017 ok(
1018 !$unoptimized->($reject),
1019 "$name rejects $described using unoptimized constraint"
1020 );
1021 if ($inlined) {
1022 ok(
1023 !$inlined->($reject),
1024 "$name rejects $described using inlined constraint"
1025 );
1026 }
1027 }
1028}
1029
94ab1609 1030sub describe {
1031 my $val = shift;
1032
1033 return 'undef' unless defined $val;
1034
1035 if ( !ref $val ) {
1036 return q{''} if $val eq q{};
94ab1609 1037
743ec002 1038 $val =~ s/\n/\\n/g;
1039
1040 return $val;
1041 }
94ab1609 1042
1043 return 'open filehandle'
1044 if openhandle $val && !blessed $val;
1045
964294c1 1046 return blessed $val
1047 ? ( ref $val ) . ' object'
1048 : ( ref $val ) . ' reference';
94ab1609 1049}