#!perl -T use strict; use warnings; use Test::More tests => 14 + 6; { package Lexical::Types::Test::LTT; sub TYPEDSCALAR { $_[1] = (caller(0))[2]; local $Test::Builder::Level = $Test::Builder::Level + 1; Test::More::is($_[2], 'LTT', 'original type is ok'); (); } no warnings 'once'; *TS = \&TYPEDSCALAR; } { package Lexical::Types::Test::LTT2; sub TYPEDSCALAR { 1 .. 2 } } { package Lexical::Types::Test::LTT3; sub TYPEDSCALAR { die 'coconut' } } { package LTT; no warnings 'once'; *ts = \&Lexical::Types::Test::LTT::TYPEDSCALAR } { use Lexical::Types as => 'Lexical::Types::Test'; my LTT $x; is $x, __LINE__-1, 'as => string, without trailing ::'; no Lexical::Types; my LTT $y; is $y, undef, 'after no'; } { use Lexical::Types as => 'Lexical::Types::Test::'; my LTT $x; is $x, __LINE__-1, 'as => string, with trailing ::'; } { use Lexical::Types as => sub { return }; my LTT $x; is $x, undef, 'as => code, returning nothing'; } { use Lexical::Types as => sub { 'Lexical::Types::Test::LTT' }; my LTT $x; is $x, __LINE__-1, 'as => code, returning package name'; } { use Lexical::Types as => sub { 'Lexical::Types::Test::LTT', undef }; my LTT $x; is $x, __LINE__-1, 'as => code, returning package name and undef'; } { use Lexical::Types as => sub { undef, 'ts' }; my LTT $x; is $x, __LINE__-1, 'as => code, returning undef and method name'; } { use Lexical::Types as => sub { 'Lexical::Types::Test::LTT', 'TS' }; my LTT $x; is $x, __LINE__-1, 'as => code, returning package and method name'; } { my $expect = qr/^Invalid ARRAY reference/; local $@; eval q[ use Lexical::Types as => [ qw ]; my LTT $x; ]; like $@, $expect, 'as => array'; } { my $expect = qr/^Lexical::Types mangler should return zero, one or two scalars, but got 3/; diag 'This will throw two warnings' if "$]" >= 5.008008 and "$]" < 5.009; local $@; eval q[ use Lexical::Types as => sub { qw }; my LTT $x; ]; like $@, $expect, 'as => code, returning three scalars'; } { my $expect = qr/^Typed scalar initializer method should return zero or one scalar, but got 2/; local $@; eval q[ use Lexical::Types as => sub { 'Lexical::Types::Test::LTT2' }; my LTT $x; ]; like $@, $expect, 'as => code, initializing by returning two scalars'; } { my $expect = qr/^banana at \(eval \d+\) line 2/; diag 'This will throw two more warnings' if "$]" >= 5.008008 and "$]" < 5.009; local $@; eval q[ use Lexical::Types as => sub { die 'banana' }; my LTT $x; ]; like $@, $expect, 'as => sub { die }'; } { my $expect = qr/^coconut at \Q$0\E line 31/; local $@; eval q[ use Lexical::Types; my Lexical::Types::Test::LTT3 $x; ]; like $@, $expect, 'die in TYPEDSCALAR'; } my LTT $x; is $x, undef, 'out of scope';