123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433 |
- <?php declare(strict_types=1);
- namespace SebastianBergmann\Exporter;
- use PHPUnit\Framework\TestCase;
- use SebastianBergmann\RecursionContext\Context;
- class ExporterTest extends TestCase
- {
-
- private $exporter;
- protected function setUp()
- {
- $this->exporter = new Exporter;
- }
- public function exportProvider()
- {
- $obj2 = new \stdClass;
- $obj2->foo = 'bar';
- $obj3 = (object) [1, 2, "Test\r\n", 4, 5, 6, 7, 8];
- $obj = new \stdClass;
-
- $obj->null = null;
-
- $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 = ['foo' => 'bar'];
- $obj->self = $obj;
- $storage = new \SplObjectStorage;
- $storage->attach($obj2);
- $storage->foo = $obj2;
- return [
- 'export null' => [null, 'null'],
- 'export boolean true' => [true, 'true'],
- 'export boolean false' => [false, 'false'],
- 'export int 1' => [1, '1'],
- 'export float 1.0' => [1.0, '1.0'],
- 'export float 1.2' => [1.2, '1.2'],
- 'export stream' => [\fopen('php://memory', 'r'), 'resource(%d) of type (stream)'],
- 'export numeric string' => ['1', "'1'"],
- 'export multidimentional array' => [[[1, 2, 3], [3, 4, 5]],
- <<<EOF
- Array &0 (
- 0 => Array &1 (
- 0 => 1
- 1 => 2
- 2 => 3
- )
- 1 => Array &2 (
- 0 => 3
- 1 => 4
- 2 => 5
- )
- )
- EOF
- ],
-
- 'export multiline text' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext",
- <<<EOF
- 'this\\n
- is\\n
- a\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\r
- long\\n\\r
- text'
- EOF
- ],
- 'export empty stdclass' => [new \stdClass, 'stdClass Object &%x ()'],
- 'export non empty stdclass' => [$obj,
- <<<EOF
- stdClass Object &%x (
- 'null' => null
- 'boolean' => true
- 'integer' => 1
- 'double' => 1.2
- 'string' => '1'
- 'text' => 'this\\n
- is\\n
- a\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\r
- long\\n\\r
- text'
- 'object' => stdClass Object &%x (
- 'foo' => 'bar'
- )
- 'objectagain' => stdClass Object &%x
- 'array' => Array &%d (
- 'foo' => 'bar'
- )
- 'self' => stdClass Object &%x
- )
- EOF
- ],
- 'export empty array' => [[], 'Array &%d ()'],
- 'export splObjectStorage' => [$storage,
- <<<EOF
- SplObjectStorage Object &%x (
- 'foo' => stdClass Object &%x (
- 'foo' => 'bar'
- )
- '%x' => Array &0 (
- 'obj' => stdClass Object &%x
- 'inf' => null
- )
- )
- EOF
- ],
- 'export stdClass with numeric properties' => [$obj3,
- <<<EOF
- stdClass Object &%x (
- 0 => 1
- 1 => 2
- 2 => 'Test\\r\\n
- '
- 3 => 4
- 4 => 5
- 5 => 6
- 6 => 7
- 7 => 8
- )
- EOF
- ],
- [
- \chr(0) . \chr(1) . \chr(2) . \chr(3) . \chr(4) . \chr(5),
- 'Binary String: 0x000102030405'
- ],
- [
- \implode('', \array_map('chr', \range(0x0e, 0x1f))),
- 'Binary String: 0x0e0f101112131415161718191a1b1c1d1e1f'
- ],
- [
- \chr(0x00) . \chr(0x09),
- 'Binary String: 0x0009'
- ],
- [
- '',
- "''"
- ],
- 'export Exception without trace' => [
- new \Exception('The exception message', 42),
- <<<EOF
- Exception Object &%x (
- 'message' => 'The exception message'
- 'string' => ''
- 'code' => 42
- 'file' => '%s/tests/ExporterTest.php'
- 'line' => %d
- 'previous' => null
- )
- EOF
- ],
- 'export Error without trace' => [
- new \Error('The exception message', 42),
- <<<EOF
- Error Object &%x (
- 'message' => 'The exception message'
- 'string' => ''
- 'code' => 42
- 'file' => '%s/tests/ExporterTest.php'
- 'line' => %d
- 'previous' => null
- )
- EOF
- ],
- ];
- }
-
- 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 = [
- 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' => ['foo' => 'bar'],
- ];
- $array['self'] = &$array;
- $expected = <<<EOF
- Array &%d (
- 0 => 0
- 'null' => null
- 'boolean' => true
- 'integer' => 1
- 'double' => 1.2
- 'string' => '1'
- 'text' => 'this\\n
- is\\n
- a\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\r
- long\\n\\r
- 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\\n
- is\\n
- a\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\n
- very\\r
- long\\n\\r
- 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 = [
- 'foo' => 'bar',
- ];
- return [
- 'shortened export null' => [null, 'null'],
- 'shortened export boolean true' => [true, 'true'],
- 'shortened export integer 1' => [1, '1'],
- 'shortened export float 1.0' => [1.0, '1.0'],
- 'shortened export float 1.2' => [1.2, '1.2'],
- 'shortened export numeric string' => ['1', "'1'"],
-
- 'shortened export multilinestring' => ["this\nis\na\nvery\nvery\nvery\nvery\nvery\nvery\rlong\n\rtext", "'this\\nis\\na\\nvery\\nvery\\nvery...\\rtext'"],
- 'shortened export empty stdClass' => [new \stdClass, 'stdClass Object ()'],
- 'shortened export not empty stdClass' => [$obj, 'stdClass Object (...)'],
- 'shortened export empty array' => [[], 'Array ()'],
- 'shortened export not empty array' => [$array, 'Array (...)'],
- ];
- }
-
- public function testShortenedExport($value, $expected)
- {
- $this->assertSame(
- $expected,
- $this->trimNewline($this->exporter->shortenedExport($value))
- );
- }
-
- public function testShortenedExportForMultibyteCharacters()
- {
- $oldMbLanguage = \mb_language();
- \mb_language('Japanese');
- $oldMbInternalEncoding = \mb_internal_encoding();
- \mb_internal_encoding('UTF-8');
- try {
- $this->assertSame(
- "'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくや...しゑひもせす'",
- $this->trimNewline($this->exporter->shortenedExport('いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'))
- );
- } catch (\Exception $e) {
- \mb_internal_encoding($oldMbInternalEncoding);
- \mb_language($oldMbLanguage);
- throw $e;
- }
- \mb_internal_encoding($oldMbInternalEncoding);
- \mb_language($oldMbLanguage);
- }
- public function provideNonBinaryMultibyteStrings()
- {
- return [
- [\implode('', \array_map('chr', \range(0x09, 0x0d))), 9],
- [\implode('', \array_map('chr', \range(0x20, 0x7f))), 96],
- [\implode('', \array_map('chr', \range(0x80, 0xff))), 128],
- ];
- }
-
- public function testNonBinaryStringExport($value, $expectedLength)
- {
- $this->assertRegExp(
- "~'.{{$expectedLength}}'\$~s",
- $this->exporter->export($value)
- );
- }
- public function testNonObjectCanBeReturnedAsArray()
- {
- $this->assertEquals([true], $this->exporter->toArray(true));
- }
- public function testIgnoreKeysInValue()
- {
-
- $array = [];
- $array["\0gcdata"] = '';
- $this->assertEquals([], $this->exporter->toArray((object) $array));
- }
- private function trimNewline($string)
- {
- return \preg_replace('/[ ]*\n/', "\n", $string);
- }
-
- public function testShortenedRecursiveExport(array $value, string $expected)
- {
- $this->assertEquals($expected, $this->exporter->shortenedRecursiveExport($value));
- }
- public function shortenedRecursiveExportProvider()
- {
- return [
- 'export null' => [[null], 'null'],
- 'export boolean true' => [[true], 'true'],
- 'export boolean false' => [[false], 'false'],
- 'export int 1' => [[1], '1'],
- 'export float 1.0' => [[1.0], '1.0'],
- 'export float 1.2' => [[1.2], '1.2'],
- 'export numeric string' => [['1'], "'1'"],
- 'export with numeric array key' => [[2 => 1], '1'],
- 'export with assoc array key' => [['foo' => 'bar'], '\'bar\''],
- 'export multidimentional array' => [[[1, 2, 3], [3, 4, 5]], 'array(1, 2, 3), array(3, 4, 5)'],
- 'export object' => [[new \stdClass], 'stdClass Object ()'],
- ];
- }
- public function testShortenedRecursiveOccurredRecursion()
- {
- $recursiveValue = [1];
- $context = new Context();
- $context->add($recursiveValue);
- $value = [$recursiveValue];
- $this->assertEquals('*RECURSION*', $this->exporter->shortenedRecursiveExport($value, $context));
- }
- }
|