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