2015-08-17 17:00:26 -07:00
< ? php
2015-08-27 12:03:05 -07:00
namespace GuzzleHttp\Tests\Psr7 ;
2015-08-17 17:00:26 -07:00
2015-08-27 12:03:05 -07:00
use GuzzleHttp\Psr7 ;
use GuzzleHttp\Psr7\FnStream ;
2015-08-17 17:00:26 -07:00
/**
2015-08-27 12:03:05 -07:00
* @ covers GuzzleHttp\Psr7\FnStream
2015-08-17 17:00:26 -07:00
*/
class FnStreamTest extends \PHPUnit_Framework_TestCase
{
/**
* @ expectedException \BadMethodCallException
* @ expectedExceptionMessage seek () is not implemented in the FnStream
*/
public function testThrowsWhenNotImplemented ()
{
( new FnStream ([])) -> seek ( 1 );
}
public function testProxiesToFunction ()
{
$s = new FnStream ([
'read' => function ( $len ) {
$this -> assertEquals ( 3 , $len );
return 'foo' ;
}
]);
$this -> assertEquals ( 'foo' , $s -> read ( 3 ));
}
public function testCanCloseOnDestruct ()
{
$called = false ;
$s = new FnStream ([
'close' => function () use ( & $called ) {
$called = true ;
}
]);
unset ( $s );
$this -> assertTrue ( $called );
}
public function testDoesNotRequireClose ()
{
$s = new FnStream ([]);
unset ( $s );
}
public function testDecoratesStream ()
{
2015-08-27 12:03:05 -07:00
$a = Psr7\stream_for ( 'foo' );
2015-08-17 17:00:26 -07:00
$b = FnStream :: decorate ( $a , []);
$this -> assertEquals ( 3 , $b -> getSize ());
$this -> assertEquals ( $b -> isWritable (), true );
$this -> assertEquals ( $b -> isReadable (), true );
$this -> assertEquals ( $b -> isSeekable (), true );
$this -> assertEquals ( $b -> read ( 3 ), 'foo' );
$this -> assertEquals ( $b -> tell (), 3 );
$this -> assertEquals ( $a -> tell (), 3 );
2015-08-27 12:03:05 -07:00
$this -> assertSame ( '' , $a -> read ( 1 ));
2015-08-17 17:00:26 -07:00
$this -> assertEquals ( $b -> eof (), true );
$this -> assertEquals ( $a -> eof (), true );
$b -> seek ( 0 );
$this -> assertEquals ( 'foo' , ( string ) $b );
$b -> seek ( 0 );
$this -> assertEquals ( 'foo' , $b -> getContents ());
$this -> assertEquals ( $a -> getMetadata (), $b -> getMetadata ());
$b -> seek ( 0 , SEEK_END );
$b -> write ( 'bar' );
$this -> assertEquals ( 'foobar' , ( string ) $b );
$this -> assertInternalType ( 'resource' , $b -> detach ());
$b -> close ();
}
public function testDecoratesWithCustomizations ()
{
$called = false ;
2015-08-27 12:03:05 -07:00
$a = Psr7\stream_for ( 'foo' );
2015-08-17 17:00:26 -07:00
$b = FnStream :: decorate ( $a , [
'read' => function ( $len ) use ( & $called , $a ) {
$called = true ;
return $a -> read ( $len );
}
]);
$this -> assertEquals ( 'foo' , $b -> read ( 3 ));
$this -> assertTrue ( $called );
}
}