This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
A typemap is a file, not a directory.
[perl5.git] / dist / ExtUtils-ParseXS / t / 113-check_cond_preproc_statements.t
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4 use Carp;
5 use Cwd;
6 use File::Spec;
7 use File::Temp qw( tempdir );
8 use Test::More tests => 13;
9 use lib qw( lib t/lib );
10 use ExtUtils::ParseXS;
11 use ExtUtils::ParseXS::Utilities qw(
12     check_conditional_preprocessor_statements
13 );
14 use PrimitiveCapture;
15
16 my $self = bless({} => 'ExtUtils::ParseXS');
17 $self->{line} = [];
18 $self->{XSStack} = [];
19 $self->{XSStack}->[0] = {};
20
21 {
22     $self->{line} = [
23         "#if this_is_an_if_statement",
24         "Alpha this is not an if/elif/elsif/endif",
25         "#elif this_is_an_elif_statement",
26         "Beta this is not an if/elif/elsif/endif",
27         "#else this_is_an_else_statement",
28         "Gamma this is not an if/elif/elsif/endif",
29         "#endif this_is_an_endif_statement",
30     ];
31     $self->{line_no} = [ 17 .. 23 ];
32     $self->{XSStack}->[-1]{type} = 'if';
33     $self->{filename} = 'myfile1';
34
35     my $rv;
36     my $stderr = PrimitiveCapture::capture_stderr(sub {
37         $rv = check_conditional_preprocessor_statements($self);
38     });
39         
40     is( $rv, 0, "Basic case: returned 0: all ifs resolved" );
41     ok( ! $stderr, "No warnings captured, as expected" );
42 }
43
44 {
45     $self->{line} = [
46         "#if this_is_an_if_statement",
47         "Alpha this is not an if/elif/elsif/endif",
48         "#if this_is_a_different_if_statement",
49         "Beta this is not an if/elif/elsif/endif",
50         "#endif this_is_a_different_endif_statement",
51         "Gamma this is not an if/elif/elsif/endif",
52         "#endif this_is_an_endif_statement",
53     ];
54     $self->{line_no} = [ 17 .. 23 ];
55     $self->{XSStack}->[-1]{type} = 'if';
56     $self->{filename} = 'myfile1';
57
58     my $rv;
59     my $stderr = PrimitiveCapture::capture_stderr(sub {
60         $rv = check_conditional_preprocessor_statements($self);
61     });
62     is( $rv, 0, "One nested if case: returned 0: all ifs resolved" );
63     ok( ! $stderr, "No warnings captured, as expected" );
64 }
65
66 {
67     $self->{line} = [
68         "Alpha this is not an if/elif/elsif/endif",
69         "#elif this_is_an_elif_statement",
70         "Beta this is not an if/elif/elsif/endif",
71         "#else this_is_an_else_statement",
72         "Gamma this is not an if/elif/elsif/endif",
73         "#endif this_is_an_endif_statement",
74     ];
75     $self->{line_no} = [ 17 .. 22 ];
76     $self->{XSStack}->[-1]{type} = 'if';
77     $self->{filename} = 'myfile1';
78
79     my $rv;
80     my $stderr = PrimitiveCapture::capture_stderr(sub {
81         $rv = check_conditional_preprocessor_statements($self);
82     });
83     is( $rv, undef,
84         "Missing 'if' case: returned undef: all ifs resolved" );
85     like( $stderr,
86         qr/Warning: #else\/elif\/endif without #if in this function/,
87         "Got expected warning: lack of #if"
88     );
89     like( $stderr,
90         qr/precede it with a blank line/s,
91         "Got expected warning: advice re blank line"
92     );
93 }
94
95 {
96     $self->{line} = [
97         "Alpha this is not an if/elif/elsif/endif",
98         "#elif this_is_an_elif_statement",
99         "Beta this is not an if/elif/elsif/endif",
100         "#else this_is_an_else_statement",
101         "Gamma this is not an if/elif/elsif/endif",
102         "#endif this_is_an_endif_statement",
103     ];
104     $self->{line_no} = [ 17 .. 22 ];
105     $self->{XSStack}->[-1]{type} = 'file';
106     $self->{filename} = 'myfile1';
107
108     my $rv;
109     my $stderr = PrimitiveCapture::capture_stderr(sub {
110         $rv = check_conditional_preprocessor_statements($self);
111     });
112     is( $rv, undef,
113         "Missing 'if' case: returned undef: all ifs resolved" );
114     like( $stderr,
115         qr/Warning: #else\/elif\/endif without #if in this function/,
116         "Got expected warning: lack of #if"
117     );
118     unlike( $stderr,
119         qr/precede it with a blank line/s,
120         "Did not get unexpected stderr"
121     );
122 }
123
124 {
125     $self->{line} = [
126         "#if this_is_an_if_statement",
127         "Alpha this is not an if/elif/elsif/endif",
128         "#elif this_is_an_elif_statement",
129         "Beta this is not an if/elif/elsif/endif",
130         "#else this_is_an_else_statement",
131         "Gamma this is not an if/elif/elsif/endif",
132     ];
133     $self->{line_no} = [ 17 .. 22 ];
134     $self->{XSStack}->[-1]{type} = 'if';
135     $self->{filename} = 'myfile1';
136
137     my $rv;
138     my $stderr = PrimitiveCapture::capture_stderr(sub {
139         $rv = check_conditional_preprocessor_statements($self);
140     });
141     isnt( $rv, 0,
142         "Missing 'endif' case: returned non-zero as expected" );
143     like( $stderr,
144         qr/Warning: #if without #endif in this function/s,
145         "Got expected warning: lack of #endif"
146     );
147 }
148
149 pass("Passed all tests in $0");