<?php 
 
namespace Generics\Tests; 
 
use Generics\Streams\FileOutputStream; 
use Generics\Streams\FileInputStream; 
use Generics\Streams\MemoryStream; 
 
class FileOutputStreamTest extends \PHPUnit\Framework\TestCase 
{ 
 
    private $testFile = 'output.dat'; 
 
    private $testData = "Only some test data; Purpose is to test the file output stream."; 
 
    public function setUp() 
    { 
        file_put_contents($this->testFile, $this->testData); 
    } 
 
    public function tearDown() 
    { 
        unlink($this->testFile); 
    } 
 
    public function testSimple() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fos = new FileOutputStream($this->testFile); 
 
        $fos->write($this->testData); 
        $fos->close(); 
 
        $fis = new FileInputStream($this->testFile); 
 
        $in = ""; 
        while ($fis->ready()) { 
            $in .= $fis->read(1024); 
        } 
 
        $fis->close(); 
 
        $this->assertEquals($this->testData, $in); 
    } 
 
    /** 
     * @expectedException \Generics\FileExistsException 
     */ 
    public function testError() 
    { 
        new FileOutputStream($this->testFile); 
    } 
 
    public function testAppending() 
    { 
        $fos = new FileOutputStream($this->testFile, true); 
        $fos->write($this->testData); 
 
        $fis = new FileInputStream($this->testFile); 
 
        $in = ""; 
        while ($fis->ready()) { 
            $in .= $fis->read(1024); 
        } 
 
        $this->assertEquals("{$this->testData}{$this->testData}", $in); 
 
        $fis->close(); 
        $fos->close(); 
    } 
 
    public function testWriteFromInputStream() 
    { 
        $ms = new MemoryStream(); 
        $ms->write($this->testData); 
 
        unlink($this->testFile); 
 
        $fos = new FileOutputStream($this->testFile, false); 
        $fos->write($ms); 
 
        $fos->close(); 
 
        $fis = new FileInputStream($this->testFile); 
        $this->assertEquals($ms->count(), $fis->count()); 
 
        $in = ""; 
        while ($fis->ready()) { 
            $in = $fis->read(1024); 
        } 
 
        $this->assertEquals($this->testData, $in); 
    } 
 
    public function testOtherFunctions() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fos = new FileOutputStream($this->testFile); 
        $this->assertEquals(0, $fos->count()); 
 
        $this->assertTrue($fos->isWriteable()); 
 
        $fos->write($this->testData); 
        $fos->flush(); 
 
        $this->assertEquals(strlen($this->testData), $fos->count()); 
        $fos->lock(); 
 
        $fos->unlock(); 
 
        $fos->close(); 
 
        $this->assertNotEquals($this->testFile, strval($fos)); 
    } 
 
    /** 
     * @expectedException \Generics\LockException 
     */ 
    public function testDoubleLock() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fis = new FileOutputStream($this->testFile); 
        $fis->lock(); 
        $fis->lock(); 
    } 
 
    /** 
     * @expectedException \Generics\Streams\StreamException 
     */ 
    public function testFailFlush() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fis = new FileOutputStream($this->testFile); 
        $fis->close(); 
        $fis->flush(); 
    } 
 
    /** 
     * @expectedException \Generics\LockException 
     */ 
    public function testFailUnlock() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fis = new FileOutputStream($this->testFile); 
        $fis->unlock(); 
    } 
 
    /** 
     * @expectedException \Generics\Streams\StreamException 
     */ 
    public function testFailCount() 
    { 
        if (file_exists($this->testFile)) { 
            unlink($this->testFile); 
        } 
 
        $fis = new FileOutputStream($this->testFile); 
        $fis->close(); 
        $fis->count(); 
    } 
} 
 
 |