This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Make get_(in|out)putmap more flexible
[perl5.git] / dist / ExtUtils-ParseXS / t / 510-t-bare.t
1 #!/usr/bin/perl
2 use strict;
3 use warnings;
4
5 use Test::More tests => 30;
6 use ExtUtils::Typemaps;
7
8 # typemap only
9 SCOPE: {
10   my $map = ExtUtils::Typemaps->new();
11   $map->add_typemap(ctype => 'unsigned int', xstype => 'T_IV');
12   is($map->as_string(), <<'HERE', "Simple typemap matches expectations");
13 TYPEMAP
14 unsigned int    T_IV
15 HERE
16
17   my $type = $map->get_typemap(ctype => 'unsigned int');
18   isa_ok($type, 'ExtUtils::Typemaps::Type');
19   is($type->ctype, 'unsigned int');
20   is($type->xstype, 'T_IV');
21   is($type->tidy_ctype, 'unsigned int');
22 }
23
24 # typemap & input
25 SCOPE: {
26   my $map = ExtUtils::Typemaps->new();
27   $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV');
28   $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);');
29   is($map->as_string(), <<'HERE', "Simple typemap (with input) matches expectations");
30 TYPEMAP
31 unsigned int    T_UV
32
33 INPUT
34 T_UV
35         $var = ($type)SvUV($arg);
36 HERE
37
38   my $type = $map->get_typemap(ctype => 'unsigned int');
39   isa_ok($type, 'ExtUtils::Typemaps::Type');
40   is($type->ctype, 'unsigned int');
41   is($type->xstype, 'T_UV');
42   is($type->tidy_ctype, 'unsigned int');
43
44   my $in = $map->get_inputmap(xstype => 'T_UV');
45   isa_ok($in, 'ExtUtils::Typemaps::InputMap');
46   is($in->xstype, 'T_UV');
47
48   # test fetching inputmap by ctype
49   my $in2 = $map->get_inputmap(ctype => 'unsigned int');
50   is_deeply($in2, $in, "get_inputmap returns the same typemap for ctype and xstype");
51 }
52
53
54 # typemap & output
55 SCOPE: {
56   my $map = ExtUtils::Typemaps->new();
57   $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV');
58   $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);');
59   is($map->as_string(), <<'HERE', "Simple typemap (with output) matches expectations");
60 TYPEMAP
61 unsigned int    T_UV
62
63 OUTPUT
64 T_UV
65         sv_setuv($arg, (UV)$var);
66 HERE
67
68   my $type = $map->get_typemap(ctype => 'unsigned int');
69   isa_ok($type, 'ExtUtils::Typemaps::Type');
70   is($type->ctype, 'unsigned int');
71   is($type->xstype, 'T_UV');
72   is($type->tidy_ctype, 'unsigned int');
73
74   my $in = $map->get_outputmap(xstype => 'T_UV');
75   isa_ok($in, 'ExtUtils::Typemaps::OutputMap');
76   is($in->xstype, 'T_UV');
77 }
78
79 # typemap & input & output
80 SCOPE: {
81   my $map = ExtUtils::Typemaps->new();
82   $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV');
83   $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);');
84   $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);');
85   is($map->as_string(), <<'HERE', "Simple typemap (with in- & output) matches expectations");
86 TYPEMAP
87 unsigned int    T_UV
88
89 INPUT
90 T_UV
91         $var = ($type)SvUV($arg);
92
93 OUTPUT
94 T_UV
95         sv_setuv($arg, (UV)$var);
96 HERE
97 }
98
99 # two typemaps & input & output
100 SCOPE: {
101   my $map = ExtUtils::Typemaps->new();
102   $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV');
103   $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);');
104   $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);');
105
106   $map->add_typemap(ctype => 'int', xstype => 'T_IV');
107   $map->add_inputmap(xstype => 'T_IV', code => '$var = ($type)SvIV($arg);');
108   $map->add_outputmap(xstype => 'T_IV', code => 'sv_setiv($arg, (IV)$var);');
109   is($map->as_string(), <<'HERE', "Simple typemap (with in- & output) matches expectations");
110 TYPEMAP
111 unsigned int    T_UV
112 int     T_IV
113
114 INPUT
115 T_UV
116         $var = ($type)SvUV($arg);
117 T_IV
118         $var = ($type)SvIV($arg);
119
120 OUTPUT
121 T_UV
122         sv_setuv($arg, (UV)$var);
123 T_IV
124         sv_setiv($arg, (IV)$var);
125 HERE
126   my $type = $map->get_typemap(ctype => 'unsigned int');
127   isa_ok($type, 'ExtUtils::Typemaps::Type');
128   is($type->ctype, 'unsigned int');
129   is($type->xstype, 'T_UV');
130   is($type->tidy_ctype, 'unsigned int');
131
132   my $in = $map->get_outputmap(xstype => 'T_UV');
133   isa_ok($in, 'ExtUtils::Typemaps::OutputMap');
134   is($in->xstype, 'T_UV');
135   $in = $map->get_outputmap(xstype => 'T_IV');
136   isa_ok($in, 'ExtUtils::Typemaps::OutputMap');
137   is($in->xstype, 'T_IV');
138 }
139