PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/FluentDOM/Nodes/BuilderTest.php

http://github.com/ThomasWeinert/FluentDOM
PHP | 441 lines | 300 code | 36 blank | 105 comment | 0 complexity | 57a935fbfffc369a44540dd341a74d67 MD5 | raw file
  1. <?php
  2. /*
  3. * FluentDOM
  4. *
  5. * @link https://thomas.weinert.info/FluentDOM/
  6. * @copyright Copyright 2009-2021 FluentDOM Contributors
  7. * @license http://www.opensource.org/licenses/mit-license.php The MIT License
  8. *
  9. */
  10. namespace FluentDOM\Nodes {
  11. use FluentDOM\DOM\Document;
  12. use FluentDOM\Exceptions;
  13. use FluentDOM\Exceptions\LoadingError;
  14. use FluentDOM\TestCase;
  15. use FluentDOM\Nodes;
  16. require_once __DIR__.'/../TestCase.php';
  17. class BuilderTest extends TestCase {
  18. /**
  19. * @covers \FluentDOM\Nodes\Builder
  20. */
  21. public function testConstructor(): void {
  22. $nodes = $this->createMock(Nodes::class);
  23. $builder = new Builder($nodes);
  24. $this->assertSame(
  25. $nodes,
  26. $builder->getOwner()
  27. );
  28. }
  29. /**
  30. * @covers \FluentDOM\Nodes\Builder
  31. */
  32. public function testGetTargetNodesFromElementNode(): void {
  33. $nodes = new Nodes(self::XML);
  34. $builder = new Builder($nodes);
  35. $this->assertSame(
  36. [$nodes->document->documentElement],
  37. $builder->getTargetNodes($nodes->document->documentElement)
  38. );
  39. }
  40. /**
  41. * @covers \FluentDOM\Nodes\Builder
  42. */
  43. public function testGetTargetNodesFromTextNode(): void {
  44. $nodes = new Nodes();
  45. $node = $nodes->document->createTextNode('success');
  46. $builder = new Builder($nodes);
  47. $this->assertSame(
  48. [$node],
  49. $builder->getTargetNodes($node)
  50. );
  51. }
  52. /**
  53. * @covers \FluentDOM\Nodes\Builder
  54. */
  55. public function testGetTargetNodesFromNodes(): void {
  56. $nodes = (new Nodes(self::XML))->find('/*');
  57. $builder = new Builder($nodes);
  58. $this->assertSame(
  59. [$nodes->document->documentElement],
  60. $builder->getTargetNodes($nodes)
  61. );
  62. }
  63. /**
  64. * @covers \FluentDOM\Nodes\Builder
  65. */
  66. public function testGetTargetNodesFromCallbackReturningNodesAsArray(): void {
  67. $nodes = (new Nodes(self::XML))->find('/*');
  68. $builder = new Builder($nodes);
  69. $this->assertSame(
  70. [$nodes->document->documentElement],
  71. $builder->getTargetNodes(
  72. function() use ($nodes) {
  73. return $nodes->toArray();
  74. }
  75. )
  76. );
  77. }
  78. /**
  79. * @covers \FluentDOM\Nodes\Builder
  80. */
  81. public function testGetTargetNodesUsingSelector(): void {
  82. $nodes = new Nodes(self::XML);
  83. $builder = new Builder($nodes);
  84. $this->assertSame(
  85. $nodes->find('//item')->toArray(),
  86. $builder->getTargetNodes('//item')
  87. );
  88. }
  89. /**
  90. * @covers \FluentDOM\Nodes\Builder
  91. */
  92. public function testGetTargetNodesUsingSelectorAndContext(): void {
  93. $nodes = new Nodes(self::XML);
  94. $builder = new Builder($nodes);
  95. $this->assertSame(
  96. $nodes->find('//item')->toArray(),
  97. $builder->getTargetNodes('group/item', $nodes->document->documentElement)
  98. );
  99. }
  100. /**
  101. * @covers \FluentDOM\Nodes\Builder
  102. */
  103. public function testGetTargetNodesUsingSelectorReturningScalarExpectingException(): void {
  104. $nodes = new Nodes(self::XML);
  105. $builder = new Builder($nodes);
  106. $this->expectException(\InvalidArgumentException::class);
  107. $this->expectErrorMessage('Given selector did not return an node list');
  108. $builder->getTargetNodes('count(//item)');
  109. }
  110. /**
  111. * @covers \FluentDOM\Nodes\Builder
  112. */
  113. public function testGetTargetNodesUsingInvalidSelectorExpectingException(): void {
  114. $nodes = new Nodes(self::XML);
  115. $builder = new Builder($nodes);
  116. $this->expectException(\InvalidArgumentException::class);
  117. $this->expectErrorMessage('Invalid selector');
  118. $builder->getTargetNodes(NULL);
  119. }
  120. /**
  121. * @covers \FluentDOM\Nodes\Builder
  122. */
  123. public function testGetContentNodesWithElementNode(): void {
  124. $nodes = new Nodes(self::XML);
  125. $builder = new Builder($nodes);
  126. $this->assertSame(
  127. [$nodes->document->documentElement],
  128. $builder->getContentNodes($nodes->document->documentElement)
  129. );
  130. }
  131. /**
  132. * @covers \FluentDOM\Nodes\Builder
  133. */
  134. public function testGetContentNodesWithTextNode(): void {
  135. $nodes = new Nodes(self::XML);
  136. $node = $nodes->document->createTextNode("success");
  137. $builder = new Builder($nodes);
  138. $this->assertSame(
  139. [$node],
  140. $builder->getContentNodes($node)
  141. );
  142. }
  143. /**
  144. * @covers \FluentDOM\Nodes\Builder
  145. */
  146. public function testGetContentNodesWithTextNodeIgnoringTextNodes(): void {
  147. $nodes = new Nodes(self::XML);
  148. $node = $nodes->document->createTextNode("success");
  149. $builder = new Builder($nodes);
  150. $this->expectException(
  151. LoadingError::class
  152. );
  153. $this->assertSame(
  154. [$node],
  155. $builder->getContentNodes($node, FALSE)
  156. );
  157. }
  158. /**
  159. * @covers \FluentDOM\Nodes\Builder
  160. */
  161. public function testGetContentNodesWithLimit(): void {
  162. $nodes = new Nodes(self::XML);
  163. $builder = new Builder($nodes);
  164. $array = $nodes->find('//item')->toArray();
  165. $this->assertSame(
  166. [$array[0]],
  167. $builder->getContentNodes($array, TRUE, 1)
  168. );
  169. }
  170. /**
  171. * @covers \FluentDOM\Nodes\Builder
  172. */
  173. public function testGetContentNodesFromNodeListWithLimit(): void {
  174. $nodes = new Nodes(self::XML);
  175. $builder = new Builder($nodes);
  176. $array = $nodes->find('//item')->toArray();
  177. $this->assertSame(
  178. [$array[0]],
  179. $builder->getContentNodes(
  180. $nodes->xpath()->evaluate('//item'), TRUE, 1
  181. )
  182. );
  183. }
  184. /**
  185. * @covers \FluentDOM\Nodes\Builder
  186. */
  187. public function testGetContentNodesWithXml(): void {
  188. $nodes = new Nodes();
  189. $builder = new Builder($nodes);
  190. $array = $builder->getContentNodes('<test/>');
  191. $nodes->document->appendChild(
  192. $array[0]
  193. );
  194. $this->assertXmlStringEqualsXmlString(
  195. '<test/>',
  196. (string)$nodes
  197. );
  198. }
  199. /**
  200. * @covers \FluentDOM\Nodes\Builder
  201. */
  202. public function testGetContentNodesWithHtml(): void {
  203. $nodes = new Nodes();
  204. $nodes->contentType = 'text/html';
  205. $builder = new Builder($nodes);
  206. $array = $builder->getContentNodes('<input>');
  207. $nodes->document->appendChild(
  208. $array[0]
  209. );
  210. $this->assertEquals(
  211. "<input>\n",
  212. (string)$nodes
  213. );
  214. }
  215. /**
  216. * @covers \FluentDOM\Nodes\Builder
  217. */
  218. public function testGetContentNodesImportingNodes(): void {
  219. $document = new Document();
  220. $document->loadXml(self::XML);
  221. $nodes = new Nodes();
  222. $builder = new Builder($nodes);
  223. $array = $builder->getContentNodes($document->xpath()->evaluate('//item'), TRUE, 1);
  224. $nodes->document->appendChild($array[0]);
  225. $this->assertXmlStringEqualsXmlString(
  226. '<item index="0">text1</item>',
  227. (string)$nodes
  228. );
  229. }
  230. /**
  231. * @covers \FluentDOM\Nodes\Builder
  232. */
  233. public function testGetContentNodesFromEmptyArrayExpectingException(): void {
  234. $document = new Document();
  235. $nodes = new Nodes();
  236. $builder = new Builder($nodes);
  237. $this->expectException(
  238. LoadingError::class
  239. );
  240. $builder->getContentNodes($document->xpath()->evaluate('//item'));
  241. }
  242. /**
  243. * @covers \FluentDOM\Nodes\Builder
  244. */
  245. public function testGetContentNodesFromEmptyStringExpectingException(): void {
  246. $nodes = new Nodes();
  247. $builder = new Builder($nodes);
  248. $this->expectException(
  249. LoadingError::class
  250. );
  251. $builder->getContentNodes('');
  252. }
  253. /**
  254. * @covers \FluentDOM\Nodes\Builder
  255. */
  256. public function testGetContentElement(): void {
  257. $nodes = new Nodes();
  258. $builder = new Builder($nodes);
  259. $node = $builder->getContentElement('<test/>');
  260. $nodes->document->appendChild($node);
  261. $this->assertXmlStringEqualsXmlString(
  262. '<test/>',
  263. (string)$nodes
  264. );
  265. }
  266. /**
  267. * @covers \FluentDOM\Nodes\Builder
  268. */
  269. public function testGetXmlFragment(): void {
  270. $nodes = new Nodes();
  271. $builder = new Builder($nodes);
  272. $this->assertXmlNodesArrayEqualsXmlStrings(
  273. ['<one/>', '<two/>', 'three'],
  274. $builder->getFragment('<one/><two/>three')
  275. );
  276. }
  277. /**
  278. * @covers \FluentDOM\Nodes\Builder
  279. */
  280. public function testGetXmlFragmentFromEmptyString(): void {
  281. $nodes = new Nodes();
  282. $builder = new Builder($nodes);
  283. $this->assertEquals(
  284. [], $builder->getFragment('')
  285. );
  286. }
  287. /**
  288. * @covers \FluentDOM\Nodes\Builder
  289. */
  290. public function testGetXmlFragmentWithInvalidFragment(): void {
  291. $nodes = new Nodes();
  292. $builder = new Builder($nodes);
  293. $this->expectException(
  294. Exceptions\LoadingError\EmptySource::class
  295. );
  296. $builder->getFragment(NULL);
  297. }
  298. /**
  299. * @covers \FluentDOM\Nodes\Builder
  300. */
  301. public function testGetXmlFragmentWithInvalidContentType(): void {
  302. $nodes = new Nodes();
  303. $builder = new Builder($nodes);
  304. $this->expectException(
  305. Exceptions\InvalidFragmentLoader::class
  306. );
  307. $builder->getFragment('', 'invalid');
  308. }
  309. /**
  310. * @covers \FluentDOM\Nodes\Builder
  311. */
  312. public function testGetXmlFragmentWithInvalidFragmentBlockingErrors(): void {
  313. $nodes = new Nodes();
  314. $builder = new Builder($nodes);
  315. $this->assertEquals(
  316. [],
  317. @$builder->getFragment('')
  318. );
  319. }
  320. /**
  321. * @covers \FluentDOM\Nodes\Builder
  322. */
  323. public function testGetHtmlFragment(): void {
  324. $nodes = new Nodes();
  325. $builder = new Builder($nodes);
  326. $this->assertXmlNodesArrayEqualsXmlStrings(
  327. ['<br/>', 'TEXT', '<br/>'],
  328. $builder->getFragment('<br/>TEXT<br/>', 'text/html')
  329. );
  330. }
  331. /**
  332. * @covers \FluentDOM\Nodes\Builder
  333. */
  334. public function testGetHtmlFragmentFromEmptyString(): void {
  335. $nodes = new Nodes();
  336. $builder = new Builder($nodes);
  337. $this->assertEquals(
  338. [], $builder->getFragment('', 'text/html')
  339. );
  340. }
  341. /**
  342. * @covers \FluentDOM\Nodes\Builder
  343. */
  344. public function testGetHtmlFragmentWithInvalidFragment(): void {
  345. $nodes = new Nodes();
  346. $builder = new Builder($nodes);
  347. $this->expectException(
  348. Exceptions\LoadingError\EmptySource::class
  349. );
  350. $builder->getFragment(NULL, 'text/html');
  351. }
  352. /**
  353. * @covers \FluentDOM\Nodes\Builder
  354. */
  355. public function testGetInnerXml(): void {
  356. $nodes = new Nodes(self::XML);
  357. $builder = new Builder($nodes);
  358. $this->assertEquals(
  359. '<item index="0">text1</item><item index="1">text2</item><item index="2">text3</item>',
  360. $builder->getInnerXml($nodes->xpath()->evaluate('//group')->item(0))
  361. );
  362. }
  363. /**
  364. * @covers \FluentDOM\Nodes\Builder
  365. */
  366. public function testGetWrapperNodesSimple(): void {
  367. $nodes = new Nodes();
  368. $builder = new Builder($nodes);
  369. $template = $builder->getContentElement('<simple/>');
  370. $simple = FALSE;
  371. $this->assertXmlNodesArrayEqualsXmlStrings(
  372. ['<simple/>', '<simple/>'],
  373. $builder->getWrapperNodes($template, $simple)
  374. );
  375. $this->assertTrue($simple);
  376. }
  377. /**
  378. * @covers \FluentDOM\Nodes\Builder
  379. */
  380. public function testGetWrapperNodesComplex(): void {
  381. $nodes = new Nodes();
  382. $builder = new Builder($nodes);
  383. $template = $builder->getContentElement(
  384. '<outer><between><inner/></between></outer>'
  385. );
  386. $simple = FALSE;
  387. $this->assertXmlNodesArrayEqualsXmlStrings(
  388. ['<inner/>', '<outer><between><inner/></between></outer>'],
  389. $builder->getWrapperNodes($template, $simple)
  390. );
  391. $this->assertFalse($simple);
  392. }
  393. /**
  394. * @param array $expected
  395. * @param iterable $nodes
  396. */
  397. public function assertXmlNodesArrayEqualsXmlStrings(array $expected, iterable $nodes): void {
  398. $actual = [];
  399. foreach ($nodes as $node) {
  400. $actual[] = $node->ownerDocument->saveXml($node);
  401. }
  402. $this->assertEquals($expected, $actual);
  403. }
  404. }
  405. }