--- /dev/null
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Test::More;
+use Test::Fatal;
+use Test::Requires 'Test::Output';
+
+use Eval::Closure;
+
+{
+ my $source = 'BEGIN { warn "foo\n" } sub { $foo * 2 }';
+
+ my $code;
+ my $bar = 15;
+ stderr_is {
+ $code = eval_closure(
+ source => $source,
+ environment => {
+ '$foo' => \$bar,
+ },
+ );
+ } "foo\n", "BEGIN was run";
+
+ is($code->(), 30, "got the right sub");
+
+ my $code2;
+ my $baz = 8;
+ stderr_is {
+ $code2 = eval_closure(
+ source => $source,
+ environment => {
+ '$foo' => \$baz,
+ },
+ );
+ } '', "BEGIN was not run twice";
+
+ is($code2->(), 16, "got the right sub");
+}
+
+{
+ my $source = 'BEGIN { warn "bar\n" } sub { $bar * 2 }';
+
+ my $code;
+ my $foo = 60;
+ stderr_is {
+ $code = eval_closure(
+ source => $source,
+ environment => {
+ '$bar' => \$foo,
+ },
+ description => 'foo',
+ );
+ } "bar\n", "BEGIN was run";
+
+ is($code->(), 120, "got the right sub");
+
+ my $code2;
+ my $baz = 23;
+ { local $TODO = "description breaks memoization";
+ stderr_is {
+ $code2 = eval_closure(
+ source => $source,
+ environment => {
+ '$bar' => \$baz,
+ },
+ description => 'baz',
+ );
+ } '', "BEGIN was not run twice";
+ }
+
+ is($code2->(), 46, "got the right sub");
+}
+
+{
+ my $source = 'BEGIN { warn "baz\n" } sub { Carp::confess "baz" }';
+
+ my $code;
+ stderr_is {
+ $code = eval_closure(
+ source => $source,
+ description => 'first',
+ );
+ } "baz\n", "BEGIN was run";
+
+ like(exception { $code->() }, qr/baz at first line 1/,
+ "got the right description");
+
+ my $code2;
+ { local $TODO = "description breaks memoization";
+ stderr_is {
+ $code2 = eval_closure(
+ source => $source,
+ description => 'second',
+ );
+ } '', "BEGIN was not run twice";
+ }
+
+ like(exception { $code2->() }, qr/baz at second line 1/,
+ "got the right description");
+}
+
+done_testing;