ItemsTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <?php
  2. declare(strict_types=1);
  3. namespace JsonMachineTest;
  4. use JsonMachine\Items;
  5. use JsonMachine\JsonDecoder\PassThruDecoder;
  6. /**
  7. * @covers \JsonMachine\Items
  8. */
  9. class ItemsTest extends \PHPUnit_Framework_TestCase
  10. {
  11. /**
  12. * @dataProvider data_testFactories
  13. */
  14. public function testFactories($expected, $methodName, ...$args)
  15. {
  16. $iterator = call_user_func_array(Items::class."::$methodName", [
  17. $args[0],
  18. [
  19. 'pointer' => $args[1],
  20. 'decoder' => $args[2],
  21. 'debug' => $args[3],
  22. ],
  23. ]);
  24. $this->assertSame($expected, iterator_to_array($iterator));
  25. }
  26. public function testItemsYieldsObjectItemsByDefault()
  27. {
  28. $iterator = Items::fromString('{"path": {"key":"value"}}');
  29. foreach ($iterator as $item) {
  30. $this->assertEquals((object) ['key' => 'value'], $item);
  31. }
  32. }
  33. public function data_testFactories()
  34. {
  35. $extJsonResult = ['key' => 'value'];
  36. $passThruResult = ['"key"' => '"value"'];
  37. $ptDecoder = new PassThruDecoder();
  38. foreach ([true, false] as $debug) {
  39. foreach ([
  40. [$extJsonResult, 'fromStream', fopen('data://text/plain,{"path": {"key":"value"}}', 'r'), '/path', null, $debug],
  41. [$extJsonResult, 'fromString', '{"path": {"key":"value"}}', '/path', null, $debug],
  42. [$extJsonResult, 'fromFile', __DIR__.'/ItemsTest.json', '/path', null, $debug],
  43. [$extJsonResult, 'fromIterable', ['{"path": {"key', '":"value"}}'], '/path', null, $debug],
  44. [$extJsonResult, 'fromIterable', new \ArrayIterator(['{"path": {"key', '":"value"}}']), '/path', null, $debug],
  45. [$passThruResult, 'fromStream', fopen('data://text/plain,{"path": {"key":"value"}}', 'r'), '/path', $ptDecoder, $debug],
  46. [$passThruResult, 'fromString', '{"path": {"key":"value"}}', '/path', $ptDecoder, $debug],
  47. [$passThruResult, 'fromFile', __DIR__.'/ItemsTest.json', '/path', $ptDecoder, $debug],
  48. [$passThruResult, 'fromIterable', ['{"path": {"key', '":"value"}}'], '/path', $ptDecoder, $debug],
  49. [$passThruResult, 'fromIterable', new \ArrayIterator(['{"path": {"key', '":"value"}}']), '/path', $ptDecoder, $debug],
  50. ] as $case) {
  51. yield $case;
  52. }
  53. }
  54. }
  55. public function testGetPositionDebugEnabled()
  56. {
  57. $expectedPosition = ['key1' => 9, 'key2' => 19];
  58. $items = Items::fromString('{"key1":1, "key2":2} ', ['debug' => true]);
  59. foreach ($items as $key => $val) {
  60. $this->assertSame($expectedPosition[$key], $items->getPosition());
  61. }
  62. }
  63. public function testIterationWithoutForeach()
  64. {
  65. $iterator =
  66. Items::fromString('{"key1":1, "key2":2}')
  67. ->getIterator();
  68. $iterator->rewind();
  69. $this->assertTrue($iterator->valid());
  70. $this->assertSame(['key1', 1], [$iterator->key(), $iterator->current()]);
  71. $iterator->next();
  72. $this->assertTrue($iterator->valid());
  73. $this->assertSame(['key2', 2], [$iterator->key(), $iterator->current()]);
  74. $iterator->next();
  75. $this->assertFalse($iterator->valid());
  76. }
  77. public function testIsDebugEnabled()
  78. {
  79. $items = $iterator = Items::fromString('{}');
  80. $this->assertFalse($items->isDebugEnabled());
  81. $items = $iterator = Items::fromString('{}', ['debug' => true]);
  82. $this->assertTrue($items->isDebugEnabled());
  83. }
  84. public function testGetCurrentJsonPointer()
  85. {
  86. $items = $iterator = Items::fromString(
  87. '[{"two": 2, "one": 1}]',
  88. ['pointer' => ['/-/one', '/-/two']]
  89. );
  90. $iterator = $items->getIterator();
  91. $iterator->rewind();
  92. $iterator->current();
  93. $this->assertSame('/0/two', $items->getCurrentJsonPointer());
  94. $iterator->next();
  95. $iterator->current();
  96. $this->assertSame('/0/one', $items->getCurrentJsonPointer());
  97. }
  98. public function testGetMatchedJsonPointer()
  99. {
  100. $items = $iterator = Items::fromString(
  101. '[{"two": 2, "one": 1}]',
  102. ['pointer' => ['/-/one', '/-/two']]
  103. );
  104. $iterator = $items->getIterator();
  105. $iterator->rewind();
  106. $iterator->current();
  107. $this->assertSame('/-/two', $items->getMatchedJsonPointer());
  108. $iterator->next();
  109. $iterator->current();
  110. $this->assertSame('/-/one', $items->getMatchedJsonPointer());
  111. }
  112. public function testGetJsonPointers()
  113. {
  114. $items = Items::fromString('[]', ['pointer' => ['/one', '/two']]);
  115. $this->assertSame(['/one', '/two'], $items->getJsonPointers());
  116. }
  117. public function testCountViaIteratorCount()
  118. {
  119. $items = Items::fromIterable(['{"results":', '[1,2,3]}'], ['pointer' => ['/results']]);
  120. $this->assertSame(3, iterator_count($items));
  121. }
  122. }