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

use Test::More tests=>16;
use lib 'lib';
use lib 't/testlib';

use base 'MyBase';
use base 'Fry::Lib';
require Fry::Sub;
require Fry::Var;
require Fry::Obj;

my @libs = qw/:Test1 Fry::Lib::Woah/;

is_deeply([main->fullName(@libs)],[qw/Fry::Lib::Test1 Fry::Lib::Woah/],'&fullName');

main->runLibInits('Fry::Lib::SampleLib');
is_deeply(&Fry::Lib::SampleLib::_initLib,'CmdClass','&runLibInits requires library and sets shell object correctly');

#loadLib(getLibData,loadDependencies,setAllObj,addToCmdClass,setLibObj)

	is_deeply(main->_getLibData('Fry::Lib::SampleLib'),Fry::Lib::SampleLib->_default_data,
		'&_getLibData: returns _default_data');

	#setup
	Fry::Var->defaultNew(loaded_libs=>[],cmd_class=>'CmdClass');	
	require Fry::Opt;
	require Fry::Cmd;
	main->loadLib('Fry::Lib::SampleLib');

	is_deeply(main->Var('loaded_libs'),[qw/Fry::Lib::EmptyLib Fry::Lib::SampleLib/],
		'&loadDependencies/&loadLib: libs loaded in right order');
	is_deeply([@CmdClass::ISA],[qw/Fry::Lib::EmptyLib Fry::Lib::SampleLib/],'cmdclass ISA set in &loadLib'); 

	#&_readLibObj
	my ($varlist,$optlist,$cmdlist) =  main->_readLibObj(Fry::Lib::SampleLib->_default_data);
	is_deeply([sort @$varlist],[qw/var1 var2/],'&_readLibObj: correct varlist');
	is_deeply([sort @$optlist],[],'&_readLibObj: correct optlist');
	is_deeply([sort @$cmdlist],[qw/cmd1 cmd2/],'&_readLibObj: correct cmdlist and tests lib attr');

	is(main->loadLib('Blah'),0,'&loadLib: invalid lib exits early');
#other
	use Data::Dumper;
	#print Dumper(main->list);
	#print @CmdClass::ISA,"\n";
	#print @Fry::Sub::_Methods::ISA,"\n";
	ok(main->libsLoaded(':SampleLib',':EmptyLib'),'&libsLoaded: pass');
	ok(! main->libsLoaded(':PhoneyLib'),'&libsLoaded: fail');
	main->unloadLib('Fry::Lib::SampleLib');
	main->unloadLib('Fry::Lib::EmptyLib');
	is_deeply([@CmdClass::ISA],[],'unloadLib: shell ISA cleaned');
	is_deeply([@{"$Fry::Sub::LibClass\::ISA"}],[],'unloadLib: sub ISA cleaned');
	is_deeply(Fry::Cmd->list,{},'unloadLib: cmds have been deleted');
	is_deeply([sort keys %{Fry::Var->list}],[qw/cmd_class loaded_libs/],'unloadLib: vars have been deleted');
	is_deeply(main->list,{},'unloadLib: libs have been deleted');