Changeset View
Changeset View
Standalone View
Standalone View
src/filesystem/__tests__/FileFinderTestCase.php
- This file was added.
<?php | |||||
final class FileFinderTestCase extends PhutilTestCase { | |||||
private function newFinder($directory = null) { | |||||
if (!$directory) { | |||||
$directory = dirname(__FILE__).'/data'; | |||||
} | |||||
return id(new FileFinder($directory)) | |||||
->excludePath('./exclude') | |||||
->excludePath('subdir.txt'); | |||||
} | |||||
public function testFinderWithChecksums() { | |||||
$this->assertFinder( | |||||
pht('Basic Checksums'), | |||||
$this->newFinder() | |||||
->setGenerateChecksums(true) | |||||
->withType('f') | |||||
->withPath('*') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'.hidden.txt' => | |||||
'b6cfc9ce9afe12b258ee1c19c235aa27', | |||||
'file.txt' => | |||||
'725130ba6441eadb4e5d807898e0beae', | |||||
'include_dir.txt/anotherfile.txt' => | |||||
'91e5c1ad76ff229c6456ac92e74e1d9f', | |||||
'include_dir.txt/subdir.txt/alsoinclude.txt' => | |||||
'91e5c1ad76ff229c6456ac92e74e1d9f', | |||||
'test.txt' => | |||||
'aea46212fa8b8d0e0e6aa34a15c9e2f5', | |||||
)); | |||||
} | |||||
public function testFinderWithoutChecksums() { | |||||
$this->assertFinder( | |||||
pht('Basic No Checksums'), | |||||
$this->newFinder() | |||||
->withType('f') | |||||
->withPath('*') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'.hidden.txt', | |||||
'file.txt', | |||||
'include_dir.txt/anotherfile.txt', | |||||
'include_dir.txt/subdir.txt/alsoinclude.txt', | |||||
'test.txt', | |||||
)); | |||||
} | |||||
public function testFinderWithFilesAndDirectories() { | |||||
$this->assertFinder( | |||||
pht('With Files And Directories'), | |||||
$this->newFinder() | |||||
->setGenerateChecksums(true) | |||||
->withPath('*') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'.hidden.txt' => | |||||
'b6cfc9ce9afe12b258ee1c19c235aa27', | |||||
'file.txt' => | |||||
'725130ba6441eadb4e5d807898e0beae', | |||||
'include_dir.txt' => null, | |||||
'include_dir.txt/anotherfile.txt' => | |||||
'91e5c1ad76ff229c6456ac92e74e1d9f', | |||||
'include_dir.txt/subdir.txt' => null, | |||||
'include_dir.txt/subdir.txt/alsoinclude.txt' => | |||||
'91e5c1ad76ff229c6456ac92e74e1d9f', | |||||
'test.txt' => | |||||
'aea46212fa8b8d0e0e6aa34a15c9e2f5', | |||||
)); | |||||
} | |||||
public function testFinderWithDirectories() { | |||||
$this->assertFinder( | |||||
pht('Just Directories'), | |||||
$this->newFinder() | |||||
->withType('d'), | |||||
array( | |||||
'include_dir.txt', | |||||
'include_dir.txt/subdir.txt', | |||||
)); | |||||
} | |||||
public function testFinderWithPath() { | |||||
$this->assertFinder( | |||||
pht('With Path'), | |||||
$this->newFinder() | |||||
->setGenerateChecksums(true) | |||||
->withType('f') | |||||
->withPath('*/include_dir.txt/subdir.txt/alsoinclude.txt') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'include_dir.txt/subdir.txt/alsoinclude.txt' => | |||||
'91e5c1ad76ff229c6456ac92e74e1d9f', | |||||
)); | |||||
} | |||||
public function testFinderWithNames() { | |||||
$this->assertFinder( | |||||
pht('With Names'), | |||||
$this->newFinder() | |||||
->withType('f') | |||||
->withPath('*') | |||||
->withName('test'), | |||||
array( | |||||
'include_dir.txt/subdir.txt/test', | |||||
'include_dir.txt/test', | |||||
'test', | |||||
)); | |||||
} | |||||
public function testFinderWithNameAndSuffix() { | |||||
$this->assertFinder( | |||||
pht('With Name and Suffix'), | |||||
$this->newFinder() | |||||
->withType('f') | |||||
->withName('alsoinclude.txt') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'include_dir.txt/subdir.txt/alsoinclude.txt', | |||||
)); | |||||
} | |||||
public function testFinderWithGlobMagic() { | |||||
// Fill a temporary directory with all this magic garbage so we don't have | |||||
// to check a bunch of files with backslashes in their names into version | |||||
// control. | |||||
$tmp_dir = Filesystem::createTemporaryDirectory(); | |||||
$crazy_magic = array( | |||||
'backslash\\.\\*', | |||||
'star-*.*', | |||||
'star-*.txt', | |||||
'star.t*t', | |||||
'star.tesseract', | |||||
); | |||||
foreach ($crazy_magic as $sketchy_path) { | |||||
Filesystem::writeFile($tmp_dir.'/'.$sketchy_path, '.'); | |||||
} | |||||
$this->assertFinder( | |||||
pht('Glob Magic, Literal .t*t'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withSuffix('t*t'), | |||||
array( | |||||
'star.t*t', | |||||
)); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, .tesseract'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withSuffix('tesseract'), | |||||
array( | |||||
'star.tesseract', | |||||
)); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, Name'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withName('star-*'), | |||||
array()); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, Name + Suffix'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withName('star-*.*'), | |||||
array( | |||||
'star-*.*', | |||||
)); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, Backslash Suffix'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withSuffix('\\*'), | |||||
array( | |||||
'backslash\\.\\*', | |||||
)); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, With Globs'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withNameGlob('star-*'), | |||||
array( | |||||
'star-*.*', | |||||
'star-*.txt', | |||||
)); | |||||
$this->assertFinder( | |||||
pht('Glob Magic, With Globs + Suffix'), | |||||
$this->newFinder($tmp_dir) | |||||
->withType('f') | |||||
->withNameGlob('star-*') | |||||
->withSuffix('txt'), | |||||
array( | |||||
'star-*.txt', | |||||
)); | |||||
} | |||||
private function assertFinder($label, FileFinder $finder, $expect) { | |||||
$modes = array( | |||||
'php', | |||||
'shell', | |||||
); | |||||
foreach ($modes as $mode) { | |||||
$actual = id(clone $finder) | |||||
->setForceMode($mode) | |||||
->find(); | |||||
if ($finder->getGenerateChecksums()) { | |||||
ksort($actual); | |||||
} else { | |||||
sort($actual); | |||||
} | |||||
$this->assertEqual( | |||||
$expect, | |||||
$actual, | |||||
pht('Test Case "%s" in Mode "%s"', $label, $mode)); | |||||
} | |||||
} | |||||
} |