Current File : //opt/RZphp73/includes/test/File_Fortune/tests/File_FortuneTest.php
<?php
// Call File_FortuneTest::main() if this source file is executed directly.
if (!defined("PHPUnit_MAIN_METHOD")) {
    set_include_path(dirname(dirname(__FILE__)) . ':' . get_include_path());
    define("PHPUnit_MAIN_METHOD", "File_FortuneTest::main");
}

require_once "PHPUnit/Framework/TestCase.php";
require_once "PHPUnit/Framework/TestSuite.php";

require_once 'File/Fortune.php';

/**
 * Test class for File_Fortune.
 */
class File_FortuneTest extends PHPUnit_Framework_TestCase 
{
    /**
     * Array of fortune files to use in testing (including header files)
     * @var array
     */
    public $fortuneFiles = array('ftest', 'ftest.dat', 'ftest2', 'ftest2.dat');

    /**
     * @var File_Fortune
     */
    public $fortunes;

    /**
     * Base files directory
     * @var string
     */
    public $base;

    /**
     * Runs the test methods of this class.
     */
    public static function main()
    {
        require_once "PHPUnit/TextUI/TestRunner.php";

        $suite  = new PHPUnit_Framework_TestSuite("File_FortuneTest");
        $result = PHPUnit_TextUI_TestRunner::run($suite);
    }

    /**
     * Sets up the fixture, for example, open a network connection.
     * This method is called before a test is executed.
     */
    public function setUp()
    {
        $this->base = $base = dirname(__FILE__) . '/_files/';
        $origBase = $base . '/orig/';
        foreach ($this->fortuneFiles as $file) {
            copy($origBase . $file, $base . $file);
        }

        $this->fortunes = new File_Fortune();
    }

    /**
     * Tears down the fixture, for example, close a network connection.
     * This method is called after a test is executed.
     */
    public function tearDown()
    {
        foreach ($this->fortuneFiles as $file) {
            unlink($this->base . $file);
        }

        if (file_exists($this->base . 'footest')) {
            unlink($this->base . 'footest');
        }
        if (file_exists($this->base . 'footest.dat')) {
            unlink($this->base . 'footest.dat');
        }
    }

    public function testIteratorAccess()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        try {
            foreach ($this->fortunes as $key => $fortune) {
                $this->assertTrue(is_int($key));
                $this->assertTrue(is_string($fortune));
            }
        } catch (Exception $e) {
            $this->fail('Iterating through fortunes should not throw exceptions');
        }
    }

    public function testCountable()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        try {
            $count = count($this->fortunes);
        } catch (Exception $e) {
            $this->fail('count() on fortunes object should not throw exceptions');
        }

        $this->assertTrue(is_int($count));
        $this->assertTrue($count > 0);
    }

    public function testGetFileInitiallyNull()
    {
        $this->assertNull($this->fortunes->getFile());
    }

    public function testSetAndGetFile()
    {
        $file = $this->base . $this->fortuneFiles[0];
        $this->fortunes->setFile($file);
        $this->assertEquals($file, $this->fortunes->getFile());
    }

    public function testSetFileSetsHeaderFileWhenProvided()
    {
        $file   = $this->base . $this->fortuneFiles[0];
        $header = $this->base . $this->fortuneFiles[1];
        $this->fortunes->setFile($file, $header);
        $this->assertEquals($header, $this->fortunes->getHeaderFile());
    }

    public function testSetFilesInitiallyNull()
    {
        $this->assertNull($this->fortunes->getFiles());
    }

    public function testSetAndGetFilesAsIndividualArguments()
    {
        $this->fortunes->setFiles(dirname(__FILE__) . '/foo', dirname(__FILE__) . '/bar');
        $files = $this->fortunes->getFiles();
        $expected = array(dirname(__FILE__) . '/foo', dirname(__FILE__) . '/bar');
        $this->assertEquals($expected, $files);
    }

    public function testSetAndGetFilesAsArray()
    {
        $expected = array(dirname(__FILE__) . '/foo', dirname(__FILE__) . '/bar');
        $this->fortunes->setFiles($expected);
        $files = $this->fortunes->getFiles();
        $this->assertEquals($expected, $files);
    }

    public function testGetFilesAfterDirectorySet()
    {
        $this->fortunes->setDirectory($this->base);
        $files = $this->fortunes->getFiles();
        $this->assertTrue(count($files) >= 1);
    }

    public function testSetFilesUnsetsFilename()
    {
        $file = $this->base . $this->fortuneFiles[0];
        $this->fortunes->setFile($file);

        $files = array(dirname(__FILE__) . '/foo', dirname(__FILE__) . '/bar');
        $this->fortunes->setFiles($files);
        $this->assertNull($this->fortunes->getFile());
    }

    public function testSetFilesUnsetsDirectory()
    {
        $this->fortunes->setDirectory($this->base);

        $files = array(dirname(__FILE__) . '/foo', dirname(__FILE__) . '/bar');
        $this->fortunes->setFiles($files);
        $this->assertNull($this->fortunes->getDirectory());
    }

    public function testGetHeaderFileInitiallyNull()
    {
        $this->assertNull($this->fortunes->getHeaderFile());
    }

    public function testSetAndGetHeaderFile()
    {
        $file = $this->base . $this->fortuneFiles[1];
        $this->fortunes->setHeaderFile($file);
        $this->assertEquals($file, $this->fortunes->getHeaderFile());
    }

    public function testGetDirectoryInitiallyNull()
    {
        $this->assertNull($this->fortunes->getDirectory());
    }

    public function testGetAndSetDirectory()
    {
        $this->fortunes->setDirectory($this->base);
        $this->assertEquals($this->base, $this->fortunes->getDirectory());
    }

    public function testSetDirectoryUnsetsFilename()
    {
        $file = $this->base . $this->fortuneFiles[0];
        $this->fortunes->setFile($file);
        $this->fortunes->setDirectory($this->base);
        $this->assertNull($this->fortunes->getFile());
    }

    public function testAddFortuneAppends()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $count = count($this->fortunes);
        $this->fortunes->add('This is a new fortune');
        $this->assertEquals($count + 1, count($this->fortunes));
        $fortune = $this->fortunes[$count];
        $this->assertTrue(is_string($fortune));
    }

    public function testUpdate()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $text  = 'Updated fortune';
        $count = count($this->fortunes);
        $this->assertNotEquals($text, $this->fortunes[2]);
        $this->fortunes->update(2, $text);
        $this->assertEquals($text, $this->fortunes[2]);
        $this->assertEquals($count, count($this->fortunes));
    }

    public function testDelete()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $count = count($this->fortunes);
        $text  = $this->fortunes[2];
        $this->assertFalse(empty($text));
        $this->fortunes->delete(2);
        $this->assertEquals($count - 1, count($this->fortunes));
        $fortune = $this->fortunes[2];
        $this->assertNotEquals($text, $fortune);
    }

    public function testOffsetExists()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $this->assertTrue($this->fortunes->offsetExists(2));
    }

    public function testOffsetExistsViaArrayAccess()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $this->assertTrue(isset($this->fortunes[2]));
    }

    public function testOffsetGet()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $fortune = $this->fortunes->offsetGet(2);
        $this->assertTrue(is_string($fortune));
        $this->assertTrue(0 < strlen($fortune));
    }

    public function testRetrieveByIndexSameWhenReadingFromFileAsFromArray()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $readFortune = $this->fortunes->offsetGet(2);
        $this->fortunes->getAll();
        $arrayFortune = $this->fortunes->offsetGet(2);
        $this->assertEquals($readFortune, $arrayFortune);
    }

    public function testOffsetGetViaArrayAccess()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $fortune = $this->fortunes[2];
        $this->assertTrue(is_string($fortune));
        $this->assertTrue(0 < strlen($fortune));
    }

    public function testOffsetSet()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $text  = 'Updated fortune';
        $count = count($this->fortunes);
        $this->assertNotEquals($text, $this->fortunes[2]);
        $this->fortunes->offsetSet(2, $text);
        $this->assertEquals($text, $this->fortunes[2]);
        $this->assertEquals($count, count($this->fortunes));
    }

    public function testOffsetSetViaArrayAccess()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $text  = 'Updated fortune';
        $count = count($this->fortunes);
        $this->assertNotEquals($text, $this->fortunes[2]);
        $this->fortunes[2] = $text;
        $this->assertEquals($text, $this->fortunes[2]);
        $this->assertEquals($count, count($this->fortunes));
    }

    public function testOffsetUnset()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $count = count($this->fortunes);
        $text  = $this->fortunes[2];
        $this->fortunes->offsetUnset(2);
        $this->assertEquals($count - 1, count($this->fortunes));
        $fortune = $this->fortunes[2];
        $this->assertNotEquals($text, $fortune);
    }

    public function testOffsetUnsetViaArrayAccess()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $count = count($this->fortunes);
        $text  = $this->fortunes[2];
        unset($this->fortunes[2]);
        $this->assertEquals($count - 1, count($this->fortunes));
        $fortune = $this->fortunes[2];
        $this->assertNotEquals($text, $fortune);
    }

    public function testGetRandom()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $fortune = $this->fortunes->getRandom();
        $this->assertTrue(is_string($fortune));
        $this->assertFalse(empty($fortune));
    }

    public function testGetRandomWithDirectorySetShouldWork()
    {
        $this->fortunes->setDirectory($this->base);
        $fortune = $this->fortunes->getRandom();
        $this->assertTrue(is_string($fortune));
        $this->assertFalse(empty($fortune));
    }

    public function testGetAll()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $fortunes = $this->fortunes->getAll();
        $this->assertTrue(is_array($fortunes));
        $this->assertFalse(empty($fortunes));
    }

    public function testGetAllWhenDirectorySetRetrievesAllFortunes()
    {
        $count = $this->_countAll();
        $this->fortunes->setDirectory($this->base);
        $discovered = $this->fortunes->getAll();
        $found      = count($discovered);
        $this->assertEquals($count, $found, "Found $found fortunes; discovered $count");
    }

    public function testSavingChangesToFile()
    {
        $this->fortunes->setFile($this->base . $this->fortuneFiles[0]);
        $expected = 'Changed fortune';
        $this->fortunes[2] = $expected;
        $this->fortunes->save();
        $this->assertEquals($expected, $this->fortunes[2]);
    }

    public function testCreateNewFortuneFile()
    {
        $fortunes = array(
            'Fortune 1',
            'Fortune 2',
            'Fortune 3',
        );
        $this->fortunes->setFile($this->base . 'footest');
        $this->fortunes->create($fortunes);
        $this->assertTrue(file_exists($this->base . 'footest'));
        $this->assertTrue(file_exists($this->base . 'footest.dat'));
        $this->assertEquals(3, count($this->fortunes));
        $this->assertEquals($fortunes, $this->fortunes->getAll());
        $this->assertEquals('%', $this->fortunes->delim);
    }

    public function testIteratorOverDirectoryThrowsException()
    {
        $this->fortunes->setDirectory($this->base);
        try {
            foreach ($this->fortunes as $file) {}
            $this->fail('Iteration over a directory should throw exception');
        } catch (File_Fortune_Exception $e) {}
    }

    public function testIteratorOverFilesThrowsException()
    {
        $this->fortunes->setFiles($this->base . $this->fortuneFiles[0], $this->base . $this->fortuneFiles[2]);
        try {
            foreach ($this->fortunes as $file) {}
            $this->fail('Iteration over multiple files should throw exception');
        } catch (File_Fortune_Exception $e) {}
    }

    public function testCountAccumulatesAllWhenDirectorySet()
    {
        $expected = $this->_countAll();
        $this->fortunes->setDirectory($this->base);
        $this->assertEquals($expected, count($this->fortunes));
    }

    public function testCountAccumulatesAllWhenMultipleFilesSet()
    {
        $expected = $this->_countAll();
        $files    = array();
        $di       = new DirectoryIterator($this->base);
        foreach ($di as $file) {
            if ($file->isDot() || $file->isDir() || ('.dat' == substr($file->getFilename(), -4))) {
                continue;
            }
            $files[] = $file->getPathName();
        }
        $this->fortunes->setFiles($files);
        $this->assertEquals($expected, count($this->fortunes));
    }

    public function testArrayAccessThrowsExceptionWithDirectorySet()
    {
        $this->fortunes->setDirectory($this->base);
        $this->_tryArrayAccess('directory');
    }

    public function testArrayAccessThrowsExceptionWithMultipleFilesSet()
    {
        $this->fortunes->setDirectory($this->base);
        $this->_tryArrayAccess('multiple files');
    }

    protected function _tryArrayAccess($type)
    {
        try {
            isset($this->fortunes[1]);
            $this->fail("Array access (exists) when $type set should throw exception");
        } catch (File_Fortune_Exception $e) {}
        try {
            $fortune = $this->fortunes[1];
            $this->fail("Array access (read) when $type set should throw exception");
        } catch (File_Fortune_Exception $e) {}
        try {
            $this->fortunes[1] = 'This should fail';
            $this->fail("Array access (update) when $type set should throw exception");
        } catch (File_Fortune_Exception $e) {}
        try {
            unset($this->fortunes[1]);
            $this->fail("Array access (delete) when $type set should throw exception");
        } catch (File_Fortune_Exception $e) {}
    }

    protected function _countAll()
    {
        $count = 0;
        $di    = new DirectoryIterator($this->base);
        foreach ($di as $file) {
            if ($file->isDot() || $file->isDir() || ('.dat' == substr($file->getFilename(), -4))) {
                continue;
            }
            $this->fortunes->setFile($file->getPathName());
            $count += count($this->fortunes);
        }
        return $count;
    }
}

// Call File_FortuneTest::main() if this source file is executed directly.
if (PHPUnit_MAIN_METHOD == "File_FortuneTest::main") {
    File_FortuneTest::main();
}