xref: /openbsd-src/gnu/usr.bin/perl/dist/ExtUtils-ParseXS/t/515-t-cmd.t (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
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