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

use strict; use warnings;

use FindBin qw/ $Bin /;
use Data::Dumper;
use Data::SCORM;
use Test::LongString;
use Path::Class 'file';

diag( "Testing Data::SCORM $Data::SCORM::VERSION, Perl $], $^X" );

my @files; 
# Should be done in config?
BEGIN {
  @files = glob("$Bin/pifs/*.zip");
}

my $json = do { local $/ = undef; <DATA> };
my %json = (
'ContentPackagingSingleSCO_SCORM20043rdEdition.zip'         => $json,
'ContentPackagingSingleSCO_SCORM20043rdEdition__MACOSX.zip' => $json, # same, but with additional __MACOSX file
);

use Test::More tests => (scalar @files * 12) + scalar keys %json;
# use Test::More 'skip_all';

for my $file (@files) {
	my $s = eval { Data::SCORM->extract_from_pif( $file ) };
	ok ($s, "Extracted Scorm $s")
		or do {
			diag "ERROR $@ parsing $file";
			skip "Couldn't even parse", 10;
		  };

	isa_ok $s, 'Data::SCORM';
	my $manifest = $s->manifest;
	isa_ok $manifest, 'Data::SCORM::Manifest';

	my $path = $s->path;
	diag "Unpacked to $path";
	isa_ok $path, 'Path::Class::Dir'
		or skip "No path", 7;

	ok ($path->file('imsmanifest.xml')->stat, "Found manifest")
		or skip "Couldn't find manifest", 6;

	my $s2 = eval { Data::SCORM->from_dir( $path ) };

	ok ($s2, "Extracted Scorm $s")
		or do {
			diag $@;
			skip "Couldn't even parse", 5;
		  };

	isa_ok $s2, 'Data::SCORM';
	my $manifest2 = $s2->manifest;
	isa_ok $manifest2, 'Data::SCORM::Manifest';

	my $path2 = $s2->path;
	isa_ok $path2, 'Path::Class::Dir'
		or skip "No path", 2;
	
	is        $path,     $path2,     "Same path";
	is_deeply $manifest, $manifest2, "Same manifest";

	my $filepart = file($file)->basename;
	if (my $json_expected = $json{$filepart}) {
		my $json = $manifest->to_json('http://test.example.com/scorms/scorm1');
		is_string ("$json\n", $json_expected, 'Manifest compares OK')
            or die $json;
	}

	diag "Deleting $path";
	system 'rm', '-rf', $path;
}

__DATA__
{"organizations":{"default":{"resources":[{"identifier":"resource_1","href":"shared/launchpage.html","file":["http://test.example.com/scorms/scorm1/Etiquette/Course.html","http://test.example.com/scorms/scorm1/Etiquette/course.jpg","http://test.example.com/scorms/scorm1/Etiquette/Distracting.html","http://test.example.com/scorms/scorm1/Etiquette/distracting.jpg","http://test.example.com/scorms/scorm1/Etiquette/Play.html","http://test.example.com/scorms/scorm1/Etiquette/play.jpg","http://test.example.com/scorms/scorm1/Etiquette/questions.js","http://test.example.com/scorms/scorm1/Handicapping/calchandi.jpg","http://test.example.com/scorms/scorm1/Handicapping/calcscore.jpg","http://test.example.com/scorms/scorm1/Handicapping/CalculatingHandicap.html","http://test.example.com/scorms/scorm1/Handicapping/CalculatingScore.html","http://test.example.com/scorms/scorm1/Handicapping/Example.html","http://test.example.com/scorms/scorm1/Handicapping/example.jpg","http://test.example.com/scorms/scorm1/Handicapping/Overview.html","http://test.example.com/scorms/scorm1/Handicapping/overview.jpg","http://test.example.com/scorms/scorm1/Handicapping/questions.js","http://test.example.com/scorms/scorm1/HavingFun/friends.jpg","http://test.example.com/scorms/scorm1/HavingFun/fun.jpg","http://test.example.com/scorms/scorm1/HavingFun/HowToBeStylish.html","http://test.example.com/scorms/scorm1/HavingFun/HowToHaveFun.html","http://test.example.com/scorms/scorm1/HavingFun/MakeFriends.html","http://test.example.com/scorms/scorm1/HavingFun/questions.js","http://test.example.com/scorms/scorm1/HavingFun/stylish.jpg","http://test.example.com/scorms/scorm1/Playing/otherscoreing.jpg","http://test.example.com/scorms/scorm1/Playing/OtherScoring.html","http://test.example.com/scorms/scorm1/Playing/Par.html","http://test.example.com/scorms/scorm1/Playing/par.jpg","http://test.example.com/scorms/scorm1/Playing/Playing.html","http://test.example.com/scorms/scorm1/Playing/playing.jpg","http://test.example.com/scorms/scorm1/Playing/questions.js","http://test.example.com/scorms/scorm1/Playing/rules.jpg","http://test.example.com/scorms/scorm1/Playing/RulesOfGolf.html","http://test.example.com/scorms/scorm1/Playing/Scoring.html","http://test.example.com/scorms/scorm1/Playing/scoring.jpg","http://test.example.com/scorms/scorm1/shared/assessmenttemplate.html","http://test.example.com/scorms/scorm1/shared/background.jpg","http://test.example.com/scorms/scorm1/shared/cclicense.png","http://test.example.com/scorms/scorm1/shared/contentfunctions.js","http://test.example.com/scorms/scorm1/shared/launchpage.html","http://test.example.com/scorms/scorm1/shared/scormfunctions.js","http://test.example.com/scorms/scorm1/shared/style.css"],"type":"webcontent"}],"identifier":"golf_sample_default_org","title":"Golf Explained - CP Single SCO","items":[{"resource":{"identifier":"resource_1","href":"shared/launchpage.html","file":[{"href":"Etiquette/Course.html"},{"href":"Etiquette/course.jpg"},{"href":"Etiquette/Distracting.html"},{"href":"Etiquette/distracting.jpg"},{"href":"Etiquette/Play.html"},{"href":"Etiquette/play.jpg"},{"href":"Etiquette/questions.js"},{"href":"Handicapping/calchandi.jpg"},{"href":"Handicapping/calcscore.jpg"},{"href":"Handicapping/CalculatingHandicap.html"},{"href":"Handicapping/CalculatingScore.html"},{"href":"Handicapping/Example.html"},{"href":"Handicapping/example.jpg"},{"href":"Handicapping/Overview.html"},{"href":"Handicapping/overview.jpg"},{"href":"Handicapping/questions.js"},{"href":"HavingFun/friends.jpg"},{"href":"HavingFun/fun.jpg"},{"href":"HavingFun/HowToBeStylish.html"},{"href":"HavingFun/HowToHaveFun.html"},{"href":"HavingFun/MakeFriends.html"},{"href":"HavingFun/questions.js"},{"href":"HavingFun/stylish.jpg"},{"href":"Playing/otherscoreing.jpg"},{"href":"Playing/OtherScoring.html"},{"href":"Playing/Par.html"},{"href":"Playing/par.jpg"},{"href":"Playing/Playing.html"},{"href":"Playing/playing.jpg"},{"href":"Playing/questions.js"},{"href":"Playing/rules.jpg"},{"href":"Playing/RulesOfGolf.html"},{"href":"Playing/Scoring.html"},{"href":"Playing/scoring.jpg"},{"href":"shared/assessmenttemplate.html"},{"href":"shared/background.jpg"},{"href":"shared/cclicense.png"},{"href":"shared/contentfunctions.js"},{"href":"shared/launchpage.html"},{"href":"shared/scormfunctions.js"},{"href":"shared/style.css"}],"type":"webcontent"},"identifier":"item_1","identifierref":"resource_1","title":"Golf Explained"}]},"golf_sample_default_org":{"resources":[{"identifier":"resource_1","href":"shared/launchpage.html","file":["http://test.example.com/scorms/scorm1/Etiquette/Course.html","http://test.example.com/scorms/scorm1/Etiquette/course.jpg","http://test.example.com/scorms/scorm1/Etiquette/Distracting.html","http://test.example.com/scorms/scorm1/Etiquette/distracting.jpg","http://test.example.com/scorms/scorm1/Etiquette/Play.html","http://test.example.com/scorms/scorm1/Etiquette/play.jpg","http://test.example.com/scorms/scorm1/Etiquette/questions.js","http://test.example.com/scorms/scorm1/Handicapping/calchandi.jpg","http://test.example.com/scorms/scorm1/Handicapping/calcscore.jpg","http://test.example.com/scorms/scorm1/Handicapping/CalculatingHandicap.html","http://test.example.com/scorms/scorm1/Handicapping/CalculatingScore.html","http://test.example.com/scorms/scorm1/Handicapping/Example.html","http://test.example.com/scorms/scorm1/Handicapping/example.jpg","http://test.example.com/scorms/scorm1/Handicapping/Overview.html","http://test.example.com/scorms/scorm1/Handicapping/overview.jpg","http://test.example.com/scorms/scorm1/Handicapping/questions.js","http://test.example.com/scorms/scorm1/HavingFun/friends.jpg","http://test.example.com/scorms/scorm1/HavingFun/fun.jpg","http://test.example.com/scorms/scorm1/HavingFun/HowToBeStylish.html","http://test.example.com/scorms/scorm1/HavingFun/HowToHaveFun.html","http://test.example.com/scorms/scorm1/HavingFun/MakeFriends.html","http://test.example.com/scorms/scorm1/HavingFun/questions.js","http://test.example.com/scorms/scorm1/HavingFun/stylish.jpg","http://test.example.com/scorms/scorm1/Playing/otherscoreing.jpg","http://test.example.com/scorms/scorm1/Playing/OtherScoring.html","http://test.example.com/scorms/scorm1/Playing/Par.html","http://test.example.com/scorms/scorm1/Playing/par.jpg","http://test.example.com/scorms/scorm1/Playing/Playing.html","http://test.example.com/scorms/scorm1/Playing/playing.jpg","http://test.example.com/scorms/scorm1/Playing/questions.js","http://test.example.com/scorms/scorm1/Playing/rules.jpg","http://test.example.com/scorms/scorm1/Playing/RulesOfGolf.html","http://test.example.com/scorms/scorm1/Playing/Scoring.html","http://test.example.com/scorms/scorm1/Playing/scoring.jpg","http://test.example.com/scorms/scorm1/shared/assessmenttemplate.html","http://test.example.com/scorms/scorm1/shared/background.jpg","http://test.example.com/scorms/scorm1/shared/cclicense.png","http://test.example.com/scorms/scorm1/shared/contentfunctions.js","http://test.example.com/scorms/scorm1/shared/launchpage.html","http://test.example.com/scorms/scorm1/shared/scormfunctions.js","http://test.example.com/scorms/scorm1/shared/style.css"],"type":"webcontent"}],"identifier":"golf_sample_default_org","title":"Golf Explained - CP Single SCO","items":[{"resource":{"identifier":"resource_1","href":"shared/launchpage.html","file":[{"href":"Etiquette/Course.html"},{"href":"Etiquette/course.jpg"},{"href":"Etiquette/Distracting.html"},{"href":"Etiquette/distracting.jpg"},{"href":"Etiquette/Play.html"},{"href":"Etiquette/play.jpg"},{"href":"Etiquette/questions.js"},{"href":"Handicapping/calchandi.jpg"},{"href":"Handicapping/calcscore.jpg"},{"href":"Handicapping/CalculatingHandicap.html"},{"href":"Handicapping/CalculatingScore.html"},{"href":"Handicapping/Example.html"},{"href":"Handicapping/example.jpg"},{"href":"Handicapping/Overview.html"},{"href":"Handicapping/overview.jpg"},{"href":"Handicapping/questions.js"},{"href":"HavingFun/friends.jpg"},{"href":"HavingFun/fun.jpg"},{"href":"HavingFun/HowToBeStylish.html"},{"href":"HavingFun/HowToHaveFun.html"},{"href":"HavingFun/MakeFriends.html"},{"href":"HavingFun/questions.js"},{"href":"HavingFun/stylish.jpg"},{"href":"Playing/otherscoreing.jpg"},{"href":"Playing/OtherScoring.html"},{"href":"Playing/Par.html"},{"href":"Playing/par.jpg"},{"href":"Playing/Playing.html"},{"href":"Playing/playing.jpg"},{"href":"Playing/questions.js"},{"href":"Playing/rules.jpg"},{"href":"Playing/RulesOfGolf.html"},{"href":"Playing/Scoring.html"},{"href":"Playing/scoring.jpg"},{"href":"shared/assessmenttemplate.html"},{"href":"shared/background.jpg"},{"href":"shared/cclicense.png"},{"href":"shared/contentfunctions.js"},{"href":"shared/launchpage.html"},{"href":"shared/scormfunctions.js"},{"href":"shared/style.css"}],"type":"webcontent"},"identifier":"item_1","identifierref":"resource_1","title":"Golf Explained"}]}},"metadata":{"schemaversion":"2004 3rd Edition","schema":"ADL SCORM"}}