File: inline-assert.t

package info (click to toggle)
libtype-tiny-perl 2.002001-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 3,948 kB
  • sloc: perl: 14,610; makefile: 2; sh: 1
file content (104 lines) | stat: -rw-r--r-- 2,855 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
=pod

=encoding utf-8

=head1 PURPOSE

Tests for Type::Tiny's C<inline_assert> method.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2019-2023 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

use strict;
use warnings;
use lib qw( ./lib ./t/lib ../inc ./inc );

use Test::More;
use Test::Fatal;
use Types::Standard qw( Int );

# Exceptions do seem to work on older Perls, but checking them with like()
# seems to break stuff, so just skip.
use constant SANE_PERL => ($] ge '5.008001');

my ($inline_assert, @VALUE, $r);
local $@;

note("INLINE ASSERTION, INLINABLE TYPE, NO TYPEVAR");
note($inline_assert = Int->inline_assert('$VALUE[0]'));

@VALUE = (12);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, 1234, 'successful check');

@VALUE = (1.2);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, undef, 'successful throw');
like($@, qr/Value "1.2" did not pass type constraint "Int"/, '... with correct exception') if SANE_PERL;

note("INLINE ASSERTION, INLINABLE TYPE, WITH TYPEVAR");
my $type = Int;
note($inline_assert = $type->inline_assert('$VALUE[0]', '$type'));

@VALUE = (12);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, 1234, 'successful check');

@VALUE = (1.2);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, undef, 'successful throw');
like($@, qr/Value "1.2" did not pass type constraint "Int"/, '... with correct exception') if SANE_PERL;

undef $type;
@VALUE = (1.2);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, undef, 'successful throw even when $type is undef');
like($@, qr/Value "1.2" did not pass type constraint "Int"/, '... with correct exception') if SANE_PERL;
is($@->type, undef, '... but the exception does not know which type it was thrown by') if SANE_PERL;

note("INLINE ASSERTION, NON-INLINABLE TYPE, NO TYPEVAR");
$type = Int->where(sub {1});  # cannot be inlined
undef $inline_assert;
my $e = exception {
	$inline_assert = $type->inline_assert('$VALUE[0]');
};
isnt($e, undef, 'cannot be done!');

note("INLINE ASSERTION, NON-INLINABLE TYPE, WITH TYPEVAR");
note($inline_assert = $type->inline_assert('$VALUE[0]', '$type'));

@VALUE = (12);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, 1234, 'successful check');

@VALUE = (1.2);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($r, undef, 'successful throw');
like($@, qr/Value "1.2" did not pass type constraint "Int"/, '... with correct exception') if SANE_PERL;

note("INLINE ASSERTION, NON-INLINABLE TYPE, WITH TYPEVAR AND EXTRAS");
note($inline_assert = $type->inline_assert('$VALUE[0]', '$type', foo => "bar"));
@VALUE = (1.2);
$@ = undef;
$r = eval "$inline_assert; 1234";
is($@->{foo}, 'bar', 'extras work') if SANE_PERL;

done_testing;