-
Notifications
You must be signed in to change notification settings - Fork 0
/
07_has_args.t
110 lines (91 loc) · 1.7 KB
/
07_has_args.t
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
105
106
107
108
109
110
#!perl -w
# Test for macro::compiler::_has_args():
# It is not a public API,
# but it requires many tests, because of its complexity.
use strict;
use Test::More;
use macro::compiler;
use PPI::Lexer;
our $Lexer = PPI::Lexer->new();
sub has_args{
my($src) = @_;
my $document = $Lexer->lex_source($src);
# macro::compiler::_has_args() is called in _want_use_macro()
my $result = $document->find_any(\¯o::compiler::_want_use_macro);
if($@){
die $@;
}
return $result;
}
my @true_cases = (
'foo',
q("foo"),
q('foo'),
q(qq(foo)),
q(qq/foo/),
q(q(foo)),
q(q/foo/),
'+foo',
'+"foo"',
'(foo)',
'+(foo)',
'(+foo)',
'(+(foo))',
'( + (+ foo ) )',
'((), foo)',
'qw(foo)',
'qw/foo/',
'+ qw(foo)',
'(qw(foo))',
'1.0 foo',
'1.0 +foo',
'1.0 (foo)',
'1 foo',
'1 qw(foo)',
'((qw(foo)))',
'(), foo',
'(()), foo',
'+(), foo',
'+(()), foo',
'+(+(+())),foo',
"+(+(+())),\n\tfoo",
"\n\tfoo",
"\n=pod\n\n=cut\n\tfoo",
);
my @false_cases = (
'',
' ',
"\n=pod\n\n=cut\n",
'1.0',
'1',
'1.0.0',
'()',
'( )',
'+()',
'+( )',
'(())',
"+ ( + (\n) )",
'qw()',
'qw( )',
"qw( \n )",
'+ qw( )',
'(),(),()',
'+(), +(), +()',
'1.0 ()',
'1.0 (), +()',
'1.0 (), (), ()',
);
plan tests => (scalar(@true_cases) + scalar(@false_cases) + 2);
for my $arg (@true_cases){
my $case = "use macro $arg => sub{};";
(my $msg = $case) =~ s/\n/\\n/msxg;
ok has_args($case), 'T: ' . $msg;
}
for my $arg (@false_cases){
my $case = "use macro $arg;";
(my $msg = $case) =~ s/\n/\\n/msxg;
ok !has_args($case), 'F: ' . $msg;
}
# special cases: no semicolon
ok has_args('use macro foo => sub{}'), 'T: no semicolon with arguments';
ok !has_args('use macro ()'), 'F: no semicolon without arguments';