* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace SebastianBergmann\Exporter; /** * @covers SebastianBergmann\Exporter\Exporter */ class ExporterTest extends \PHPUnit_Framework_TestCase { /** * @var Exporter */ private $exporter; protected function setUp() { $this->exporter = new Exporter; } public function exportProvider() { $obj2 = new \stdClass; $obj2->foo = 'bar'; $obj3 = (object)array(1,2,"Test\r\n",4,5,6,7,8); $obj = new \stdClass; //@codingStandardsIgnoreStart $obj->null = null; //@codingStandardsIgnoreEnd $obj->boolean = true; $obj->integer = 1; $obj->double = 1.2; $obj->string = '1'; $obj->text = "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext"; $obj->object = $obj2; $obj->objectagain = $obj2; $obj->array = array('foo' => 'bar'); $obj->self = $obj; $storage = new \SplObjectStorage; $storage->attach($obj2); $storage->foo = $obj2; return array( array(null, 'null'), array(true, 'true'), array(false, 'false'), array(1, '1'), array(1.0, '1.0'), array(1.2, '1.2'), array(fopen('php://memory', 'r'), 'resource(%d) of type (stream)'), array('1', "'1'"), array(array(array(1,2,3), array(3,4,5)), << Array &1 ( 0 => 1 1 => 2 2 => 3 ) 1 => Array &2 ( 0 => 3 1 => 4 2 => 5 ) ) EOF ), // \n\r and \r is converted to \n array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", << null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x ( 'foo' => 'bar' ) 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => stdClass Object &%x ) EOF ), array(array(), 'Array &%d ()'), array($storage, << stdClass Object &%x ( 'foo' => 'bar' ) '%x' => Array &0 ( 'obj' => stdClass Object &%x 'inf' => null ) ) EOF ), array($obj3, << 1 1 => 2 2 => 'Test\n' 3 => 4 4 => 5 5 => 6 6 => 7 7 => 8 ) EOF ), array( chr(0) . chr(1) . chr(2) . chr(3) . chr(4) . chr(5), 'Binary String: 0x000102030405' ), array( implode('', array_map('chr', range(0x0e, 0x1f))), 'Binary String: 0x0e0f101112131415161718191a1b1c1d1e1f' ), array( chr(0x00) . chr(0x09), 'Binary String: 0x0009' ), array( '', "''" ), ); } /** * @dataProvider exportProvider */ public function testExport($value, $expected) { $this->assertStringMatchesFormat( $expected, $this->trimNewline($this->exporter->export($value)) ); } public function testExport2() { if (PHP_VERSION === '5.3.3') { $this->markTestSkipped('Skipped due to "Nesting level too deep - recursive dependency?" fatal error'); } $obj = new \stdClass; $obj->foo = 'bar'; $array = array( 0 => 0, 'null' => null, 'boolean' => true, 'integer' => 1, 'double' => 1.2, 'string' => '1', 'text' => "this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", 'object' => $obj, 'objectagain' => $obj, 'array' => array('foo' => 'bar'), ); $array['self'] = &$array; $expected = << 0 'null' => null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x ( 'foo' => 'bar' ) 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => Array &%d ( 0 => 0 'null' => null 'boolean' => true 'integer' => 1 'double' => 1.2 'string' => '1' 'text' => 'this is a very very very very very very long text' 'object' => stdClass Object &%x 'objectagain' => stdClass Object &%x 'array' => Array &%d ( 'foo' => 'bar' ) 'self' => Array &%d ) ) EOF; $this->assertStringMatchesFormat( $expected, $this->trimNewline($this->exporter->export($array)) ); } public function shortenedExportProvider() { $obj = new \stdClass; $obj->foo = 'bar'; $array = array( 'foo' => 'bar', ); return array( array(null, 'null'), array(true, 'true'), array(1, '1'), array(1.0, '1.0'), array(1.2, '1.2'), array('1', "'1'"), // \n\r and \r is converted to \n array("this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery\\nvery...g\\ntext'"), array(new \stdClass, 'stdClass Object ()'), array($obj, 'stdClass Object (...)'), array(array(), 'Array ()'), array($array, 'Array (...)'), ); } /** * @dataProvider shortenedExportProvider */ public function testShortenedExport($value, $expected) { $this->assertSame( $expected, $this->trimNewline($this->exporter->shortenedExport($value)) ); } public function provideNonBinaryMultibyteStrings() { return array( array(implode('', array_map('chr', range(0x09, 0x0d))), 5), array(implode('', array_map('chr', range(0x20, 0x7f))), 96), array(implode('', array_map('chr', range(0x80, 0xff))), 128), ); } /** * @dataProvider provideNonBinaryMultibyteStrings */ public function testNonBinaryStringExport($value, $expectedLength) { $this->assertRegExp( "~'.{{$expectedLength}}'\$~s", $this->exporter->export($value) ); } public function testNonObjectCanBeReturnedAsArray() { $this->assertEquals(array(true), $this->exporter->toArray(true)); } private function trimNewline($string) { return preg_replace('/[ ]*\n/', "\n", $string); } }