This is an automated email from the git hooks/post-receive script.

js pushed a commit to tag 0.043_03
in repository libtype-tiny-perl.

commit 096177bf4789010b8b293531131171299cf2720f
Author: Toby Inkster <m...@tobyinkster.co.uk>
Date:   Tue May 6 21:37:13 2014 +0100

    need to get this working
---
 t/20-unit/Eval-TypeTiny/fallback-aliases.t | 212 +++++++++++++++++++++++++++++
 1 file changed, 212 insertions(+)

diff --git a/t/20-unit/Eval-TypeTiny/fallback-aliases.t 
b/t/20-unit/Eval-TypeTiny/fallback-aliases.t
new file mode 100644
index 0000000..1cc861a
--- /dev/null
+++ b/t/20-unit/Eval-TypeTiny/fallback-aliases.t
@@ -0,0 +1,212 @@
+=pod
+
+=encoding utf-8
+
+=head1 PURPOSE
+
+Tests L<Eval::TypeTiny> supports alias=>1 even when L<Devel::LexAlias>
+is unavailable.
+
+=head1 DEPENDENCIES
+
+Requires L<Test::Without::Module>.
+
+=head1 AUTHOR
+
+Toby Inkster E<lt>toby...@cpan.orge<gt>.
+
+=head1 COPYRIGHT AND LICENCE
+
+This software is copyright (c) 2013-2014 by Toby Inkster.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
+
+use strict;
+use warnings;
+use lib qw( ./lib ./t/lib ../inc ./inc );
+
+use Test::More;
+
+BEGIN { plan skip_all => "test currently not working (TODO)" };
+
+use Test::Requires 'Test::Without::Module';
+use Test::Without::Module 'Devel::LexAlias';
+
+use Eval::TypeTiny;
+
+my %env = (
+       '$foo' => do { my $x = "foo"; \$x },
+       '@bar' => [ "bar" ],
+       '%baz' => { "baz" => "1" },
+);
+
+my $source = <<'SRC';
+sub {
+       return $foo if $_[0] eq '$foo';
+       return @bar if $_[0] eq '@bar';
+       return %baz if $_[0] eq '%baz';
+       return;
+}
+SRC
+
+my $closure = eval_closure(source => $source, environment => \%env);
+
+is_deeply(
+       [ $closure->('$foo') ],
+       [ 'foo' ],
+       'closure over scalar',
+);
+
+is_deeply(
+       [ $closure->('@bar') ],
+       [ 'bar' ],
+       'closure over array',
+);
+
+is_deeply(
+       [ $closure->('%baz') ],
+       [ 'baz' => 1 ],
+       'closure over hash',
+);
+
+my $external = 40;
+my $closure2 = eval_closure(
+       source      => 'sub { $xxx += 2 }',
+       environment => { '$xxx' => \$external },
+       alias       => 1,
+);
+
+$closure2->();
+is($external, 42, 'closing over variables really really really works!');
+
+{
+       my $destroyed = 0;
+       
+       {
+               package MyIndicator;
+               sub DESTROY { $destroyed++ }
+       }
+       
+       {
+               my $number = bless \(my $foo), "MyIndicator";
+               $$number = 40;
+               my $closure = eval_closure(
+                       source       => 'sub { $$xxx += 2 }',
+                       environment  => { '$xxx' => \$number },
+                       alias        => 1,
+               );
+               
+               $closure->();
+               
+               is($$number, 42);
+               is($destroyed, 0);
+       }
+       
+       is($destroyed, 1, 'closed over variables disappear on cue');
+}
+
+{
+       my @store;
+       
+       {
+               package MyTie;
+               use Tie::Scalar ();
+               our @ISA = 'Tie::StdScalar';
+               sub STORE {
+                       my $self = shift;
+                       push @store, $_[0];
+                       $self->SUPER::STORE(@_);
+               }
+               sub method_of_mine { 42 }
+       }
+       
+       tie(my($var), 'MyTie');
+       
+       $var = 1;
+       
+       my $closure = eval_closure(
+               source       => 'sub { $xxx = $_[0]; tied($xxx)->method_of_mine 
}',
+               environment  => { '$xxx' => \$var },
+               alias        => 1,
+       );
+       
+       is($closure->(2), 42, 'can close over tied variables ... AUTOLOAD 
stuff');
+       $closure->(3);
+       
+       my $nother_closure = eval_closure(
+               source       => 'sub { tied($xxx)->can(@_) }',
+               environment  => { '$xxx' => \$var },
+               alias        => 1,
+       );
+       
+       ok( $nother_closure->('method_of_mine'), '... can');
+       ok(!$nother_closure->('your_method'), '... !can');
+
+       is_deeply(
+               \@store,
+               [ 1 .. 3],
+               '... tie still works',
+       );
+
+       {
+               package OtherTie;
+               our @ISA = 'MyTie';
+               sub method_of_mine { 666 }
+       }
+       
+       tie($var, 'OtherTie');
+       is($closure->(4), 666, '... can be retied');
+
+       untie($var);
+       my $e = exception { $closure->(5) };
+       like($e, qr{^Can't call method "method_of_mine" on an undefined value}, 
'... can be untied');
+}
+
+my $e = exception { eval_closure(source => 'sub { 1 ]') };
+
+isa_ok(
+       $e,
+       'Error::TypeTiny::Compilation',
+       '$e',
+);
+
+like(
+       $e,
+       qr{^Failed to compile source because: syntax error},
+       'throw exception when code does not compile',
+);
+
+like(
+       $e->errstr,
+       qr{^syntax error},
+       '$e->errstr',
+);
+
+like(
+       $e->code,
+       qr{sub \{ 1 \]},
+       '$e->code',
+);
+
+my $c1 = eval_closure(source => 'sub { die("BANG") }', description => 'test1');
+my $e1 = exception { $c1->() };
+
+like(
+       $e1,
+       qr{^BANG at test1 line 1},
+       '"description" option works',
+);
+
+my $c2 = eval_closure(source => 'sub { die("BANG") }', description => 'test2', 
line => 222);
+my $e2 = exception { $c2->() };
+
+like(
+       $e2,
+       qr{^BANG at test2 line 222},
+       '"line" option works',
+);
+
+done_testing;

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-perl/packages/libtype-tiny-perl.git

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to