The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! /usr/bin/perl -w
## ----------------------------------------------------------------------------
#  t/01-basic.t
# -----------------------------------------------------------------------------
# Mastering programmed by YAMASHINA Hio
#
# Copyright 2006 YAMASHINA Hio
# -----------------------------------------------------------------------------
# $Id$
# -----------------------------------------------------------------------------
use strict;
use warnings FATAL => 'all';
use Test::More tests => 9;

use Sub::ScopeFinalizer qw(scope_finalizer);

&test01_basic;
&test02_raise;
&test03_wrong;

# -----------------------------------------------------------------------------
# test01_basic.
#
sub test01_basic
{
	my $invoked = 0;
	{
		is($invoked, 0, "[basic] initial state");
		
		my $o = scope_finalizer { $invoked = 1; };
		is($invoked, 0, "[basic] code has delayed");
	};
	is($invoked, 1, "[basic] code is invoked with exiting scope");
}

# -----------------------------------------------------------------------------
# test02_raise.
#
sub test02_raise
{
	my $invoked = 0;
	{
		is($invoked, 0, "[raise] initial state");
		
		my $o = scope_finalizer { $invoked += shift || 1; };
		is($invoked, 0, "[raise] code has delayed");
		
		$o->raise({ args => [2] });
		is($invoked, 2, "[raise] wake up");
	};
	is($invoked, 2, "[raise] invoked only once");
}

# -----------------------------------------------------------------------------
# test03_wrong.
#
sub test03_wrong
{
	my $invoked = 0;
	{
		is($invoked, 0, "[wrong] initial state");
		
		scope_finalizer { $invoked = 1; }; # no bind. this is wrong.
		is($invoked, 1, "[wrong] without bind, code wake up immediately");
	};
}

# -----------------------------------------------------------------------------
# End of File.
# -----------------------------------------------------------------------------