1#!perl
2
3use strict;
4use warnings;
5use Perl::Lint::Policy::Subroutines::ProhibitAmpersandSigils;
6use t::Policy::Util qw/fetch_violations/;
7use Test::Base::Less;
8
9my $class_name = 'Subroutines::ProhibitAmpersandSigils';
10
11filters {
12    params => [qw/eval/], # TODO wrong!
13};
14
15for my $block (blocks) {
16    my $violations = fetch_violations($class_name, $block->input, $block->params);
17    is scalar @$violations, $block->failures, $block->dscr;
18}
19
20done_testing;
21
22__DATA__
23
24===
25--- dscr: basic failures
26--- failures: 7
27--- params:
28--- input
29&function_call();
30&my_package::function_call();
31&function_call( $args );
32&my_package::function_call( %args );
33&function_call( &other_call( @foo ), @bar );
34&::function_call();
35
36===
37--- dscr: basic passing
38--- failures: 0
39--- params:
40--- input
41defined &function_call;
42\ &function_call;
43\&function_call;
44exists &my_package::function_call;
45defined &my_package::function_call;
46\ &my_package::function_call;
47\&my_package::function_call;
48$$foo; # for Devel::Cover; skip non-backslash casts
49
50===
51--- dscr: RT #38855 passing with parens
52--- failures: 0
53--- params:
54--- input
55defined( &function_call );
56exists( &function_call );
57
58===
59--- dscr: RT #49609 recognize reference-taking distributes over parens
60--- failures: 0
61--- params:
62--- input
63\( &function_call );
64\( &function_call, &another_function );
65
66===
67--- dscr: more passing
68--- failures: 0
69--- params:
70--- input
71my_package::function_call();
72function_call( $args );
73my_package::function_call( %args );
74function_call( other_call( @foo ), @bar );
75\&my_package::function_call;
76\&function_call;
77goto &foo;
78
79===
80--- dscr: handle that the first bareword after "sort" is the comparator function
81--- failures: 0
82--- params:
83--- input
84sort &foo($x)
85
86===
87--- dscr: no lint
88--- failures: 5
89--- params:
90--- input
91&function_call();
92&my_package::function_call();
93&function_call( $args );
94&my_package::function_call( %args );
95&function_call( &other_call( @foo ), @bar ); ## no lint
96&::function_call();
97
98