The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use warnings;
use strict;

use lib 't/lib', 'lib';

use Frost::Test;

#use Test::More 'no_plan';
use Test::More tests => 25;

use_ok 'Frost::Asylum';

Frost::TestPath::make ( $TMP_PATH_2 );	#	must exist before creating of lock object!

#	This test shows the ability of Asylum to work with
#	a new lock class, that extends Frost::Lock...
#
{
	package PoorMansLock;

	#	THIS IS A VERY BAD IDEA...

	use Moose;
	extends 'Frost::Lock';	#	for type constraint...

	use Frost::Types;
	use Frost::Util;

	sub is_locked
	{
		my ( $self )	= @_;

		return ( -e $self->_lock_filename ? true : false );
	}

	sub lock
	{
		my ( $self )	= @_;

		return true								if -e $self->_lock_filename;

		touch $self->_lock_filename;

		return $self->is_locked;
	}

	sub unlock
	{
		my ( $self )	= @_;

		unlink $_[0]->_lock_filename		if -e $_[0]->_lock_filename;

		return not $self->is_locked;
	}

	no Moose;

	__PACKAGE__->meta->make_immutable()		unless $::MAKE_MUTABLE;
}

our $ASYL;

lives_ok		{ $ASYL =
					Frost::Asylum->new
					(
						data_root	=> $TMP_PATH,
						lock			=> PoorMansLock->new ( lock_filename => make_file_path ( $TMP_PATH, 'poor.lock' ) ),
					)
				}	'Asylum with poor lock constructed';


isa ( $ASYL->_lock,		'Frost::Lock' );

isnt $ASYL->is_locked,		true,		'Asylum is not locked';

is $ASYL->lock, 				true,		'Asylum locked';
is $ASYL->is_locked,			true,		'Asylum is locked';
is $ASYL->lock, 				true,		'Asylum re-locking ok';

is $ASYL->unlock, 			true,		'Asylum unlocked';
isnt $ASYL->is_locked,		true,		'Asylum is unlocked';

is $ASYL->unlock, 			true,		'Asylum re-unlocking ok';

is $ASYL->open, 				true,		'Asylum opened';
is $ASYL->is_locked,			true,		'Asylum is locked';
is $ASYL->open, 				true,		'Asylum re-open ok';

is $ASYL->close,	 			true,		'Asylum closed';
isnt $ASYL->is_locked,		true,		'Asylum is unlocked';

is $ASYL->close,	 			true,		'Asylum re-closing ok';

#	Here are dragons...
#
my $lock_object;

{
	{
		my $local_asyl;

		lives_ok		{ $local_asyl =
							Frost::Asylum->new
							(
								data_root	=> $TMP_PATH_2,
								lock			=> PoorMansLock->new ( lock_filename => make_file_path ( $TMP_PATH_2, 'poor.lock' ) ),
							)
						}	'Local asylum with poor lock constructed';

		$lock_object	= $local_asyl->_lock;		#	DON'T TRY THIS AT HOME

		is $local_asyl->open, 			true,		'Local asylum opened';

		is $local_asyl->is_locked,		true,		'Local asylum is locked';
	}

	is $lock_object->is_locked,		true,		'Local object still locked (outside scope without Asylum->close)';

	is $lock_object->unlock,			true,		'Local object unlocked';

	{
		my $local_asyl;

		lives_ok		{ $local_asyl =
							Frost::Asylum->new
							(
								data_root	=> $TMP_PATH_2,
								lock			=> PoorMansLock->new ( lock_filename => make_file_path ( $TMP_PATH_2, 'poor.lock' ) ),
							)
						}	'Local asylum with poor lock constructed';

		is $local_asyl->open, 			true,		'Local asylum opened';

		is $local_asyl->is_locked,		true,		'Local asylum is locked again';

		is $local_asyl->close,			true,		'Local asylum closed';
	}

	isnt $lock_object->is_locked,		true,		'Local object is unlocked (outside scope WITH Asylum->close)';
}