You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

192 lines
5.6 KiB

<?php
include_once dirname(__FILE__).'/../sfvinfo.php';
/**
* Test case for SfvInfo.
*
* @group sfv
*/
class SfvInfoTest extends PHPUnit_Framework_TestCase
{
protected $fixturesDir;
/**
* This method is called before each test is executed.
*/
protected function setUp()
{
$this->fixturesDir = realpath(dirname(__FILE__).'/fixtures/sfv');
}
/**
* SFV files can cover individual files and whole directory trees with simple
* CRC32 checksums, and can include comments. Parsing should handle spaces and
* different directory separators, and all line ending types.
*
* @dataProvider providerSfvFileRecords
* @param string $filename sample sfv filename
* @param string $filelist parsed file list
*/
public function testListsAllFilesWithChecksums($filename, $filelist)
{
$source = $this->fixturesDir.DIRECTORY_SEPARATOR.$filename;
$filecount = count($filelist);
$sfv = new SfvInfo;
$sfv->open($source);
$this->assertEmpty($sfv->error, $sfv->error);
$this->assertSame($filecount, $sfv->fileCount);
// Comments should be stored
$this->assertNotEmpty($sfv->comments);
// With full file paths, including dirs
$list = $sfv->getFileList();
for ($i = 0; $i < $filecount; $i++)
{
$this->assertSame($filelist[$i][0], $list[$i]['name']);
$this->assertSame($filelist[$i][1], $list[$i]['checksum']);
}
// With filenames only, ignoring dirs
$list = $sfv->getFileList(true);
for ($i = 0; $i < $filecount; $i++)
{
$this->assertSame($filelist[$i][2], $list[$i]['name']);
$this->assertSame($filelist[$i][1], $list[$i]['checksum']);
}
// Summary should return the same list with source info
$summary = $sfv->getSummary(true, true);
$this->assertSame($source, $summary['file_name']);
$this->assertSame($list, $summary['file_list']);
$this->assertSame($filecount, $summary['file_count']);
$this->assertSame(filesize($source), $summary['file_size']);
$this->assertSame('0-'.($summary['file_size'] - 1), $summary['use_range']);
$this->assertEmpty($summary['data_size']);
// The same results should be returned when data is set directly
$sfv = new SfvInfo;
$data = file_get_contents($source);
$sfv->setData($data);
$this->assertSame($filecount, $sfv->fileCount);
$summary = $sfv->getSummary(true, true);
$this->assertEmpty($summary['file_name']);
$this->assertSame($list, $summary['file_list']);
$this->assertSame($filecount, $summary['file_count']);
$this->assertEmpty($summary['file_size']);
$this->assertSame(filesize($source), $summary['data_size']);
$this->assertSame('0-'.($summary['data_size'] - 1), $summary['use_range']);
}
/**
* Provides test data for comparison with sample files.
*/
public function providerSfvFileRecords()
{
return array(
array('test001.sfv', array(
array('testrar.r00', 'f6d8c75f', 'testrar.r00'),
array('testrar.r01', '1e9ba708', 'testrar.r01'),
array('testrar.r02', 'fb171746', 'testrar.r02'),
array('testrar.r03', '1ddbb63a', 'testrar.r03'),
array('testrar.rar', '36fbdd27', 'testrar.rar'))
),
array('test002.sfv', array(
array('test 1.txt', 'f6d8c75f', 'test 1.txt'),
array('subdir\test_2.txt', '1e9ba708', 'test_2.txt'),
array('subdir\test 3.txt', 'fb171746', 'test 3.txt'),
array('subdir/test 4.txt', '1ddbb63a', 'test 4.txt'),
array('subdir1/subdir 2/test 5.txt', '36fbdd27', 'test 5.txt'))
),
);
}
/**
* We should be able to verify simply that any passed data or file only
* contains valid SFV info.
*/
public function testNonSfvDataShouldReturnError()
{
$sfv = new SfvInfo;
$sfv->setData(";could be a comment\r\ninvalid sfv daT4GHIJ\r\n");
$this->assertSame('Not a valid SFV file', $sfv->error);
// RAR
$source = $this->fixturesDir.'/../rar/4mb.rar';
$sfv = new SfvInfo;
$sfv->open($source);
$this->assertSame('Not a valid SFV file', $sfv->error);
// PAR2
$source = $this->fixturesDir.'/../par2/testdata.par2';
$sfv = new SfvInfo;
$sfv->open($source);
$this->assertSame('Not a valid SFV file', $sfv->error);
// ZIP (contains readable uncompressed SFV file)
$source = $this->fixturesDir.'/test002.zip';
$sfv = new SfvInfo;
$sfv->open($source);
$this->assertSame('Not a valid SFV file', $sfv->error);
}
/**
* All line ending types, including mixed types, should be supported.
*
* @dataProvider providerSfvMixedLineEndings
* @param string $data sample sfv data
*/
public function testSupportsAllLineEndingTypes($data)
{
$sfv = new SfvInfo;
$sfv->setData($data);
$this->assertEmpty($sfv->error, $sfv->error);
$this->assertSame(2, $sfv->fileCount);
$this->assertSame("example comment\n", $sfv->comments);
$this->assertEquals(array(
array(
'name' => 'testrar.r00',
'checksum' => 'f6d8c75f'
),
array(
'name' => 'testrar.r01',
'checksum' => '1e9ba708'
),
), $sfv->getFileList());
}
/**
* Provides test data with different line ending types.
*/
public function providerSfvMixedLineEndings()
{
return array(
// Unix
array("; example comment\ntestrar.r00 f6d8c75f\ntestrar.r01 1e9ba708\n"),
// Windows
array("; example comment\r\ntestrar.r00 f6d8c75f\r\ntestrar.r01 1e9ba708\r\n"),
// Mac
array("; example comment\rtestrar.r00 f6d8c75f\rtestrar.r01 1e9ba708\r"),
// Mixed
array("; example comment\ntestrar.r00 f6d8c75f\r\ntestrar.r01 1e9ba708\r"),
);
}
/**
* We should be able to access any file comments simply, stripped of ; and padding.
*/
public function testStoresFileComments()
{
$source = $this->fixturesDir.'/test002.sfv';
$sfv = new SfvInfo;
$sfv->open($source);
$comments = "filenames with spaces\nfiles in subdirectories\n";
$this->assertSame($comments, $sfv->comments);
}
} // End SfvInfoTest