Skip to content

Commit bb608fa

Browse files
vovkasmmohawk2
authored andcommitted
Add C++ XS tests
1 parent 6f9c375 commit bb608fa

File tree

2 files changed

+104
-1
lines changed

2 files changed

+104
-1
lines changed

t/04-xscpp.t

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#!/usr/bin/perl -w
2+
3+
use strict;
4+
use warnings;
5+
use Config;
6+
BEGIN {
7+
chdir 't' or die "chdir(t): $!\n";
8+
unshift @INC, 'lib/';
9+
}
10+
use MakeMaker::Test::Utils;
11+
use MakeMaker::Test::Setup::XS;
12+
use Test::More;
13+
14+
plan skip_all => "ExtUtils::CBuilder not installed or no C++ compiler"
15+
unless have_cplusplus();
16+
plan skip_all => 'Dynaloading not enabled' if $Config{usedl} ne 'define';
17+
my @tests = list_cpp();
18+
plan skip_all => "No tests" unless @tests;
19+
plan tests => 6 * @tests;
20+
my $perl = which_perl();
21+
perl_lib;
22+
$| = 1;
23+
run_tests($perl, @$_) for @tests;

t/lib/MakeMaker/Test/Setup/XS.pm

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package MakeMaker::Test::Setup::XS;
22

33
@ISA = qw(Exporter);
44
require Exporter;
5-
@EXPORT = qw(run_tests list_dynamic list_static);
5+
@EXPORT = qw(run_tests list_dynamic list_static list_cpp);
66

77
use strict;
88
use File::Path;
@@ -224,6 +224,81 @@ ok is_odd(1);
224224
ok !is_odd(2);
225225
is XS::Other::plus1(3), 4;
226226
END
227+
228+
};
229+
230+
$label2files{cppbasic} = +{
231+
232+
'lib/XSCPP/Test.pm' => <<'END',
233+
package XSCPP::Test;
234+
require Exporter;
235+
require DynaLoader;
236+
$VERSION = 1.02;
237+
@ISA = qw(Exporter DynaLoader);
238+
@EXPORT = qw(is_even);
239+
bootstrap XSCPP::Test $VERSION;
240+
1;
241+
END
242+
243+
'Makefile.PL' => <<'END',
244+
use ExtUtils::MakeMaker;
245+
use ExtUtils::CppGuess;
246+
my $guess = ExtUtils::CppGuess->new;
247+
WriteMakefile(
248+
NAME => 'XSCPP::Test',
249+
VERSION_FROM => 'lib/XSCPP/Test.pm',
250+
XSMULTI => 1,
251+
$guess->makemaker_options,
252+
);
253+
END
254+
255+
'lib/XSCPP/Test.xscc' => <<END,
256+
extern "C" {
257+
#include "EXTERN.h"
258+
#include "perl.h"
259+
}
260+
#include "XSUB.h"
261+
class CPPTest {
262+
public:
263+
CPPTest() { }
264+
~CPPTest() { }
265+
int is_even(int num) { return (num % 2) == 0; }
266+
};
267+
\nMODULE = XSCPP::Test PACKAGE = XSCPP::Test
268+
\nPROTOTYPES: DISABLE
269+
CPPTest*
270+
CPPTest::new();
271+
\nint
272+
CPPTest::is_even(int input);
273+
\nvoid
274+
CPPTest::DESTROY();
275+
END
276+
277+
'typemap' => <<'END',
278+
TYPEMAP
279+
CPPTest * O_OBJECT
280+
OUTPUT
281+
O_OBJECT
282+
sv_setref_pv( $arg, CLASS, (void*)$var );
283+
INPUT
284+
O_OBJECT
285+
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
286+
$var = ($type)SvIV((SV*)SvRV( $arg ));
287+
else{
288+
warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
289+
XSRETURN_UNDEF;
290+
}
291+
END
292+
293+
't/is_even.t' => <<'END',
294+
#!/usr/bin/perl -w
295+
use Test::More tests => 3;
296+
use_ok "XSCPP::Test";
297+
my $o = XSCPP::Test->new;
298+
ok !$o->is_even(1);
299+
ok $o->is_even(2);
300+
END
301+
227302
};
228303

229304
sub virtual_rename {
@@ -271,6 +346,11 @@ sub list_dynamic {
271346
);
272347
}
273348

349+
sub list_cpp {
350+
(
351+
);
352+
}
353+
274354
sub run_tests {
275355
my ($perl, $label, $add_target, $add_testtarget) = @_;
276356
my $sublabel = $add_target;

0 commit comments

Comments
 (0)