#!/usr/bin/perl use strict; use warnings; use Test::More tests => 43; use ExtUtils::Typemaps; # empty typemap SCOPE: { ok(ExtUtils::Typemaps->new()->is_empty(), "This is an empty typemap"); } # typemap only SCOPE: { my $map = ExtUtils::Typemaps->new(); $map->add_typemap(ctype => 'unsigned int', xstype => 'T_IV'); ok(!$map->is_empty(), "This is not an empty typemap"); is($map->as_string(), <<'HERE', "Simple typemap matches expectations"); TYPEMAP unsigned int T_IV HERE my $type = $map->get_typemap(ctype => 'unsigned int'); isa_ok($type, 'ExtUtils::Typemaps::Type'); is($type->ctype, 'unsigned int'); is($type->xstype, 'T_IV'); is($type->tidy_ctype, 'unsigned int'); # test failure ok(!$map->get_typemap(ctype => 'foo'), "Access to nonexistent typemap doesn't die"); ok(!$map->get_inputmap(ctype => 'foo'), "Access to nonexistent inputmap via ctype doesn't die"); ok(!$map->get_outputmap(ctype => 'foo'), "Access to nonexistent outputmap via ctype doesn't die"); ok(!$map->get_inputmap(xstype => 'foo'), "Access to nonexistent inputmap via xstype doesn't die"); ok(!$map->get_outputmap(xstype => 'foo'), "Access to nonexistent outputmap via xstype doesn't die"); ok(!eval{$map->get_typemap('foo')} && $@, "Access to typemap with positional params dies"); ok(!eval{$map->get_inputmap('foo')} && $@, "Access to inputmap with positional params dies"); ok(!eval{$map->get_outputmap('foo')} && $@, "Access to outputmap with positional params dies"); } # typemap & input SCOPE: { my $map = ExtUtils::Typemaps->new(); $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);'); ok(!$map->is_empty(), "This is not an empty typemap"); $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV'); is($map->as_string(), <<'HERE', "Simple typemap (with input) matches expectations"); TYPEMAP unsigned int T_UV INPUT T_UV $var = ($type)SvUV($arg); HERE my $type = $map->get_typemap(ctype => 'unsigned int'); isa_ok($type, 'ExtUtils::Typemaps::Type'); is($type->ctype, 'unsigned int'); is($type->xstype, 'T_UV'); is($type->tidy_ctype, 'unsigned int'); my $in = $map->get_inputmap(xstype => 'T_UV'); isa_ok($in, 'ExtUtils::Typemaps::InputMap'); is($in->xstype, 'T_UV'); # test fetching inputmap by ctype my $in2 = $map->get_inputmap(ctype => 'unsigned int'); is_deeply($in2, $in, "get_inputmap returns the same typemap for ctype and xstype"); } # typemap & output SCOPE: { my $map = ExtUtils::Typemaps->new(); $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);'); ok(!$map->is_empty(), "This is not an empty typemap"); $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV'); is($map->as_string(), <<'HERE', "Simple typemap (with output) matches expectations"); TYPEMAP unsigned int T_UV OUTPUT T_UV sv_setuv($arg, (UV)$var); HERE my $type = $map->get_typemap(ctype => 'unsigned int'); isa_ok($type, 'ExtUtils::Typemaps::Type'); is($type->ctype, 'unsigned int'); is($type->xstype, 'T_UV'); is($type->tidy_ctype, 'unsigned int'); my $in = $map->get_outputmap(xstype => 'T_UV'); isa_ok($in, 'ExtUtils::Typemaps::OutputMap'); is($in->xstype, 'T_UV'); } # typemap & input & output SCOPE: { my $map = ExtUtils::Typemaps->new(); $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV'); $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);'); $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);'); ok(!$map->is_empty(), "This is not an empty typemap"); is($map->as_string(), <<'HERE', "Simple typemap (with in- & output) matches expectations"); TYPEMAP unsigned int T_UV INPUT T_UV $var = ($type)SvUV($arg); OUTPUT T_UV sv_setuv($arg, (UV)$var); HERE } # two typemaps & input & output SCOPE: { my $map = ExtUtils::Typemaps->new(); $map->add_typemap(ctype => 'unsigned int', xstype => 'T_UV'); $map->add_inputmap(xstype => 'T_UV', code => '$var = ($type)SvUV($arg);'); $map->add_outputmap(xstype => 'T_UV', code => 'sv_setuv($arg, (UV)$var);'); $map->add_typemap(ctype => 'int', xstype => 'T_IV'); $map->add_inputmap(xstype => 'T_IV', code => '$var = ($type)SvIV($arg);'); $map->add_outputmap(xstype => 'T_IV', code => 'sv_setiv($arg, (IV)$var);'); is($map->as_string(), <<'HERE', "Simple typemap (with in- & output) matches expectations"); TYPEMAP unsigned int T_UV int T_IV INPUT T_UV $var = ($type)SvUV($arg); T_IV $var = ($type)SvIV($arg); OUTPUT T_UV sv_setuv($arg, (UV)$var); T_IV sv_setiv($arg, (IV)$var); HERE my $type = $map->get_typemap(ctype => 'unsigned int'); isa_ok($type, 'ExtUtils::Typemaps::Type'); is($type->ctype, 'unsigned int'); is($type->xstype, 'T_UV'); is($type->tidy_ctype, 'unsigned int'); my $in = $map->get_outputmap(xstype => 'T_UV'); isa_ok($in, 'ExtUtils::Typemaps::OutputMap'); is($in->xstype, 'T_UV'); $in = $map->get_outputmap(xstype => 'T_IV'); isa_ok($in, 'ExtUtils::Typemaps::OutputMap'); is($in->xstype, 'T_IV'); }