File Coverage

blib/lib/Test/Alien/CPP.pm
Criterion Covered Total %
statement 41 43 95.3
branch 8 16 50.0
condition 1 3 33.3
subroutine 8 8 100.0
pod 1 1 100.0
total 59 71 83.1


line stmt bran cond sub pod time code
1             package Test::Alien::CPP;
2              
3 2     2   414815 use strict;
  2         17  
  2         55  
4 2     2   9 use warnings;
  2         3  
  2         44  
5 2     2   53 use 5.008001;
  2         7  
6 2     2   852 use ExtUtils::CppGuess;
  2         53509  
  2         85  
7 2     2   1155 use Test::Alien 1.88 ();
  2         54415  
  2         61  
8 2     2   19 use Text::ParseWords qw( shellwords );
  2         6  
  2         121  
9 2     2   14 use base qw( Exporter );
  2         3  
  2         914  
10              
11             # ABSTRACT: Testing tools for Alien modules for projects that use C++
12             our $VERSION = '1.03'; # VERSION
13              
14              
15             our @EXPORT = @Test::Alien::EXPORT;
16              
17             Test::Alien->import(grep !/^xs_ok$/, @EXPORT);
18              
19              
20             sub xs_ok
21             {
22 4     4 1 949285 my $cb;
23 4 50 33     58 $cb = pop if defined $_[-1] && ref $_[-1] eq 'CODE';
24 4         15 my($xs, $message) = @_;
25              
26 4 50       15 if(ref($xs))
27             {
28 4         20 my %xs = %$xs;
29 4         12 $xs = \%xs;
30             }
31             else
32             {
33 0 0       0 $xs = { xs => $xs } unless ref $xs;
34             }
35 4         15 $xs->{pxs}->{'C++'} = 1;
36 4         16 $xs->{c_ext} = 'cpp';
37              
38 4         17 my %stage = (
39             extra_compiler_flags => 'cbuilder_compile',
40             extra_linker_flags => 'cbuilder_link',
41             );
42              
43 4         69 my %cppguess = ExtUtils::CppGuess->new->module_build_options;
44 4         175880 foreach my $name (qw( extra_compiler_flags extra_linker_flags ))
45             {
46 8 50       55 next unless defined $cppguess{$name};
47 8 50       184 my @new = ref($cppguess{$name}) eq 'ARRAY' ? @{ delete $cppguess{$name} } : shellwords(delete $cppguess{$name});
  0         0  
48 8         875 my @old = do {
49 8         99 my $value = delete $xs->{$stage{$name}}->{$name};
50 8 100       65 ref($value) eq 'ARRAY' ? @$value : shellwords($value);
51             };
52 8         223 $xs->{$stage{$name}}->{$name} = [@old, @new];
53             }
54              
55 4 50       32 $xs->{cbuilder_config} = delete $cppguess{config} if defined $cppguess{config};
56 4         57 $xs->{cbuilder_check} = 'have_cplusplus';
57              
58 4         21 warn "extra Module::Build option: $_" for keys %cppguess;
59              
60 4 50       82 $cb ? Test::Alien::xs_ok($xs, $message, $cb) : Test::Alien::xs_ok($xs, $message);
61             }
62              
63             1;
64              
65             __END__