1*898184e3Ssthen#!/usr/bin/perl 2*898184e3Ssthenuse strict; 3*898184e3Ssthenuse warnings; 4*898184e3Ssthen 5*898184e3Ssthen# tests for the quick-n-dirty interface for XS inclusion 6*898184e3Ssthen 7*898184e3Ssthenuse Test::More tests => 6; 8*898184e3Ssthenuse File::Spec; 9*898184e3Ssthenuse ExtUtils::Typemaps::Cmd; 10*898184e3Ssthen 11*898184e3Ssthenmy $datadir = -d 't' ? File::Spec->catdir(qw/t data/) : 'data'; 12*898184e3Ssthenmy $libdir = -d 't' ? File::Spec->catdir(qw/t lib/) : 'lib'; 13*898184e3Ssthen 14*898184e3Ssthenunshift @INC, $libdir; 15*898184e3Ssthen 16*898184e3Ssthensub slurp { 17*898184e3Ssthen my $file = shift; 18*898184e3Ssthen open my $fh, '<', $file 19*898184e3Ssthen or die "Cannot open file '$file' for reading: $!"; 20*898184e3Ssthen local $/ = undef; 21*898184e3Ssthen return <$fh>; 22*898184e3Ssthen} 23*898184e3Ssthen 24*898184e3Ssthensub permute (&@) { 25*898184e3Ssthen my $code = shift; 26*898184e3Ssthen my @idx = 0..$#_; 27*898184e3Ssthen while ( $code->(@_[@idx]) ) { 28*898184e3Ssthen my $p = $#idx; 29*898184e3Ssthen --$p while $idx[$p-1] > $idx[$p]; 30*898184e3Ssthen my $q = $p or return; 31*898184e3Ssthen push @idx, reverse splice @idx, $p; 32*898184e3Ssthen ++$q while $idx[$p-1] > $idx[$q]; 33*898184e3Ssthen @idx[$p-1,$q]=@idx[$q,$p-1]; 34*898184e3Ssthen } 35*898184e3Ssthen} 36*898184e3Ssthen 37*898184e3Ssthen 38*898184e3SsthenSCOPE: { 39*898184e3Ssthen no warnings 'once'; 40*898184e3Ssthen ok(defined(*embeddable_typemap{CODE}), "function exported"); 41*898184e3Ssthen} 42*898184e3Ssthen 43*898184e3Ssthenmy $start = "TYPEMAP: <<END_TYPEMAP;\n"; 44*898184e3Ssthenmy $end = "\nEND_TYPEMAP\n"; 45*898184e3Ssthenis( 46*898184e3Ssthen embeddable_typemap(), 47*898184e3Ssthen "${start}TYPEMAP\n$end", 48*898184e3Ssthen "empty call to embeddable_typemap" 49*898184e3Ssthen); 50*898184e3Ssthen 51*898184e3Ssthenmy $typemap_file = File::Spec->catfile($datadir, "simple.typemap"); 52*898184e3Ssthenis( 53*898184e3Ssthen embeddable_typemap($typemap_file), 54*898184e3Ssthen $start . slurp($typemap_file) . $end, 55*898184e3Ssthen "embeddable typemap from file" 56*898184e3Ssthen); 57*898184e3Ssthen 58*898184e3Ssthenmy $foo_content = <<HERE; 59*898184e3SsthenTYPEMAP 60*898184e3Ssthenmyfoo* T_PV 61*898184e3SsthenHERE 62*898184e3Ssthenis( 63*898184e3Ssthen embeddable_typemap("TypemapTest::Foo"), 64*898184e3Ssthen "$start$foo_content$end", 65*898184e3Ssthen "embeddable typemap from full module name" 66*898184e3Ssthen); 67*898184e3Ssthen 68*898184e3Ssthen 69*898184e3Ssthenmy $test_content = <<HERE; 70*898184e3SsthenTYPEMAP 71*898184e3Ssthenmytype* T_SV 72*898184e3SsthenHERE 73*898184e3Ssthenis( 74*898184e3Ssthen embeddable_typemap("Test"), 75*898184e3Ssthen "$start$test_content$end", 76*898184e3Ssthen "embeddable typemap from relative module name" 77*898184e3Ssthen); 78*898184e3Ssthen 79*898184e3SsthenSCOPE: { 80*898184e3Ssthen my $combined = embeddable_typemap("Test", "TypemapTest::Foo"); 81*898184e3Ssthen my @lines = ( 82*898184e3Ssthen 'myfoo* T_PV', 83*898184e3Ssthen 'mytype* T_SV', 84*898184e3Ssthen ); 85*898184e3Ssthen my @exp = map {"TYPEMAP\n" . join("\n", @$_) . "\n"} 86*898184e3Ssthen (\@lines, [reverse @lines]); 87*898184e3Ssthen ok(scalar(grep "$start$_$end" eq $combined, @exp), "combined both modules") 88*898184e3Ssthen or note("Actual output: '$combined'"); 89*898184e3Ssthen} 90*898184e3Ssthen 91*898184e3Ssthen# in theory, we should test 92*898184e3Ssthen# embeddable_typemap($typemap_file, "Test", "TypemapTest::Foo"), 93*898184e3Ssthen# but I can't be bothered. 94