<?php 
/** 
 * Formatter test suite 
 * @author Alexander Krasheninnikov <[email protected]> 
 */ 
require_once __DIR__ . '/../src/init.php'; 
 
class PHPCFTest extends PHPUnit_Framework_TestCase 
{ 
    private static $files; 
 
    private $FormatterPure; 
    private $FormatterExtension; 
 
    const ORIGINAL = "/original/"; 
    const EXPECTED = "/expected/"; 
 
    public static function setUpBeforeClass() 
    { 
        self::getFiles(); // to prevent time-waste on concrete test 
    } 
 
    protected function setUp() 
    { 
        chdir(dirname(dirname(__DIR__))); 
    } 
 
    public function toString() 
    { 
        $class = new ReflectionClass($this); 
 
        $buffer = sprintf( 
            '%s::%s', 
            $class->name, 
            $this->getName(false) 
        ); 
 
        return $buffer . $this->getDataSetAsString(true); 
    } 
 
    /** 
     * Test the pure implementation behaviour 
     * @dataProvider providerFiles 
     */ 
    public function testPure($file) 
    { 
        $this->execTest($this->getFormatter(true), $file); 
    } 
 
    /** 
     * Test the pure implementation behaviour 
     * @dataProvider providerFiles 
     */ 
    public function testExtension($file) 
    { 
        try { 
            $Formatter = $this->getFormatter(false); 
        } catch (\Exception $Error) { 
            $this->markTestSkipped($Error->getMessage()); 
        } 
        $this->execTest($Formatter, $file); 
    } 
 
    /** 
     * Test, that extension usage does not affect different instances 
     */ 
    public function testExtensionMutual() 
    { 
        $files = self::getFiles(); 
 
        try { 
            $FormatterOne = $this->createFormatter(false); 
            $FormatterTwo = $this->createFormatter(false); 
        } catch (\Exception $Error) { 
            $this->markTestSkipped($Error->getMessage()); 
        } 
 
        foreach ($files as $index => $file) { 
            $Formatter = $index % 2 == 0 ? $FormatterOne : $FormatterTwo; 
            $this->execTest($Formatter, $file[0]); 
        } 
    } 
 
    private function execTest(\Phpcf\Formatter $Formatter, $file) 
    { 
        $source_file = $file; 
 
        if (strpos($file, ':') !== false) { 
            list($file,) = explode(':', $file); 
        } 
 
        $expected_content = null; 
        $expected = __DIR__ . self::EXPECTED . $file; 
        if (!file_exists($expected)) { 
            $this->fail("File {$expected} does not exists"); 
        } else if (false === ($expected_content = file_get_contents($expected))) { 
            $this->fail("Failed to get content of {$expected}"); 
        } 
 
        $original = __DIR__ . self::ORIGINAL . $source_file; 
 
        $FormatResult = $Formatter->formatFile($original); 
        $this->assertNull($FormatResult->getError()); // we expect no error 
 
        $this->assertEquals($expected_content, $FormatResult->getContent()); 
    } 
 
    /** 
     * @param $pure 
     * @return \Phpcf\Formatter 
     */ 
    private function getFormatter($pure) 
    { 
        if ($pure && $this->FormatterPure) { 
            return $this->FormatterPure; 
        } else if (!$pure && $this->FormatterExtension) { 
            return $this->FormatterExtension; 
        } 
 
        $Formatter = $this->createFormatter($pure); 
        if ($pure) { 
            $this->FormatterPure = $Formatter; 
        } else { 
            $this->FormatterExtension = $Formatter; 
        } 
        return $Formatter; 
    } 
 
    private function createFormatter($pure) 
    { 
        $Options = new \Phpcf\Options(); 
        $Options->usePure($pure); 
        return new \Phpcf\Formatter($Options); 
    } 
 
    /** 
     * Data provider with files from test/original directory 
     * @return array 
     */ 
    public function providerFiles() 
    { 
        return self::getFiles(); 
    } 
 
    /** 
     * @return array 
     */ 
    private static function getFiles() 
    { 
        if (null === self::$files) { 
            $files = []; 
            $dh = opendir(__DIR__ . self::ORIGINAL); 
            while ($file = readdir($dh)) { 
                if ($file[0] == '.') { 
                    continue; 
                } 
 
                $files[$file] = [$file]; 
            } 
            closedir($dh); 
            self::$files = $files; 
        } 
 
        return self::$files; 
    } 
} 
 
 |