#!/usr/bin/perl
use strict;
use warnings;
use File::Spec;
use lib (-d 't' ? File::Spec->catdir(qw(t lib)) : 'lib');
use Test::More tests => 13;
use ExtUtils::ParseXS;
use ExtUtils::ParseXS::Utilities qw(
check_conditional_preprocessor_statements
);
use PrimitiveCapture;
my $self = bless({} => 'ExtUtils::ParseXS');
$self->{line} = [];
$self->{XSStack} = [];
$self->{XSStack}->[0] = {};
{
$self->{line} = [
"#if this_is_an_if_statement",
"Alpha this is not an if/elif/elsif/endif",
"#elif this_is_an_elif_statement",
"Beta this is not an if/elif/elsif/endif",
"#else this_is_an_else_statement",
"Gamma this is not an if/elif/elsif/endif",
"#endif this_is_an_endif_statement",
];
$self->{line_no} = [ 17 .. 23 ];
$self->{XSStack}->[-1]{type} = 'if';
$self->{filename} = 'myfile1';
my $rv;
my $stderr = PrimitiveCapture::capture_stderr(sub {
$rv = check_conditional_preprocessor_statements($self);
});
is( $rv, 0, "Basic case: returned 0: all ifs resolved" );
ok( ! $stderr, "No warnings captured, as expected" );
}
{
$self->{line} = [
"#if this_is_an_if_statement",
"Alpha this is not an if/elif/elsif/endif",
"#if this_is_a_different_if_statement",
"Beta this is not an if/elif/elsif/endif",
"#endif this_is_a_different_endif_statement",
"Gamma this is not an if/elif/elsif/endif",
"#endif this_is_an_endif_statement",
];
$self->{line_no} = [ 17 .. 23 ];
$self->{XSStack}->[-1]{type} = 'if';
$self->{filename} = 'myfile1';
my $rv;
my $stderr = PrimitiveCapture::capture_stderr(sub {
$rv = check_conditional_preprocessor_statements($self);
});
is( $rv, 0, "One nested if case: returned 0: all ifs resolved" );
ok( ! $stderr, "No warnings captured, as expected" );
}
{
$self->{line} = [
"Alpha this is not an if/elif/elsif/endif",
"#elif this_is_an_elif_statement",
"Beta this is not an if/elif/elsif/endif",
"#else this_is_an_else_statement",
"Gamma this is not an if/elif/elsif/endif",
"#endif this_is_an_endif_statement",
];
$self->{line_no} = [ 17 .. 22 ];
$self->{XSStack}->[-1]{type} = 'if';
$self->{filename} = 'myfile1';
my $rv;
my $stderr = PrimitiveCapture::capture_stderr(sub {
$rv = check_conditional_preprocessor_statements($self);
});
is( $rv, undef,
"Missing 'if' case: returned undef: all ifs resolved" );
like( $stderr,
qr/Warning: #else\/elif\/endif without #if in this function/,
"Got expected warning: lack of #if"
);
like( $stderr,
qr/precede it with a blank line/s,
"Got expected warning: advice re blank line"
);
}
{
$self->{line} = [
"Alpha this is not an if/elif/elsif/endif",
"#elif this_is_an_elif_statement",
"Beta this is not an if/elif/elsif/endif",
"#else this_is_an_else_statement",
"Gamma this is not an if/elif/elsif/endif",
"#endif this_is_an_endif_statement",
];
$self->{line_no} = [ 17 .. 22 ];
$self->{XSStack}->[-1]{type} = 'file';
$self->{filename} = 'myfile1';
my $rv;
my $stderr = PrimitiveCapture::capture_stderr(sub {
$rv = check_conditional_preprocessor_statements($self);
});
is( $rv, undef,
"Missing 'if' case: returned undef: all ifs resolved" );
like( $stderr,
qr/Warning: #else\/elif\/endif without #if in this function/,
"Got expected warning: lack of #if"
);
unlike( $stderr,
qr/precede it with a blank line/s,
"Did not get unexpected stderr"
);
}
{
$self->{line} = [
"#if this_is_an_if_statement",
"Alpha this is not an if/elif/elsif/endif",
"#elif this_is_an_elif_statement",
"Beta this is not an if/elif/elsif/endif",
"#else this_is_an_else_statement",
"Gamma this is not an if/elif/elsif/endif",
];
$self->{line_no} = [ 17 .. 22 ];
$self->{XSStack}->[-1]{type} = 'if';
$self->{filename} = 'myfile1';
my $rv;
my $stderr = PrimitiveCapture::capture_stderr(sub {
$rv = check_conditional_preprocessor_statements($self);
});
isnt( $rv, 0,
"Missing 'endif' case: returned non-zero as expected" );
like( $stderr,
qr/Warning: #if without #endif in this function/s,
"Got expected warning: lack of #endif"
);
}
pass("Passed all tests in $0");