12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255 |
- <?php
- declare(strict_types=1);
- namespace DiDom\Tests;
- use DiDom\Document;
- use DiDom\Element;
- use DiDom\Query;
- use DOMCdataSection;
- use DOMComment;
- use DOMDocument;
- use DOMElement;
- use DOMText;
- use LogicException;
- use InvalidArgumentException;
- use RuntimeException;
- class ElementTest extends TestCase
- {
- public function testConstructorWithNullTagName()
- {
- $this->expectException(InvalidArgumentException::class);
- new Element(null);
- }
- public function testConstructorWithInvalidTagNameType()
- {
- $this->expectException(InvalidArgumentException::class);
- new Element([]);
- }
- public function testConstructorWithInvalidObject()
- {
- $this->expectException(InvalidArgumentException::class);
- new Element((object) []);
- }
- public function testConstructorWithInvalidValue()
- {
- $this->expectException(InvalidArgumentException::class);
- new Element('span', []);
- }
- public function testConstructor()
- {
- $element = new Element('input', null, ['name' => 'username', 'value' => 'John']);
- $this->assertEquals('input', $element->getNode()->tagName);
- $this->assertEquals('username', $element->getNode()->getAttribute('name'));
- $this->assertEquals('John', $element->getNode()->getAttribute('value'));
- // create from DOMElement
- $node = new DOMElement('span', 'Foo');
- $element = new Element($node);
- $this->assertEquals($node, $element->getNode());
- // create from DOMText
- $node = new DOMText('Foo');
- $element = new Element($node);
- $this->assertEquals($node, $element->getNode());
- // create from DOMComment
- $node = new DOMComment('Foo');
- $element = new Element($node);
- $this->assertEquals($node, $element->getNode());
- }
- public function testCreate()
- {
- $element = Element::create('span', 'Foo', ['class' => 'bar']);
- $this->assertEquals('span', $element->getNode()->tagName);
- $this->assertEquals('Foo', $element->text());
- $this->assertEquals(['class' => 'bar'], $element->attributes());
- }
- public function testCreateBySelector()
- {
- $element = Element::createBySelector('li.item.active', 'Foo', ['data-id' => 1]);
- $this->assertEquals('li', $element->getNode()->tagName);
- $this->assertEquals('Foo', $element->text());
- $this->assertEquals(['class' => 'item active', 'data-id' => 1], $element->attributes());
- }
- public function testTagName()
- {
- $element = new Element(new DOMElement('div'));
- $this->assertEquals('div', $element->tagName());
- }
- public function testPrependChildWithInvalidArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $element = new Element('span', 'hello');
- $element->prependChild('foo');
- }
- public function testPrependChildWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not prepend a child to element without the owner document.');
- $element = new Element(new DOMElement('div'));
- $element->prependChild(new Element('div'));
- }
- public function testPrependChild()
- {
- $list = new Element('ul');
- $this->assertEquals(0, $list->getNode()->childNodes->length);
- $item = new Element('li', 'bar');
- $prependedChild = $list->prependChild($item);
- $this->assertEquals(1, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $prependedChild);
- $this->assertEquals('bar', $prependedChild->getNode()->textContent);
- $item = new Element('li', 'foo');
- $prependedChild = $list->prependChild($item);
- $this->assertEquals(2, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $prependedChild);
- $this->assertEquals('foo', $prependedChild->getNode()->textContent);
- $this->assertEquals('foo', $list->getNode()->childNodes->item(0)->textContent);
- $this->assertEquals('bar', $list->getNode()->childNodes->item(1)->textContent);
- }
- public function testPrependChildWithArrayOfNodes()
- {
- $list = new Element('ul');
- $prependedChild = $list->prependChild(new Element('li', 'foo'));
- $this->assertEquals(1, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $prependedChild);
- $this->assertEquals('foo', $prependedChild->getNode()->textContent);
- $items = [];
- $items[] = new Element('li', 'bar');
- $items[] = new Element('li', 'baz');
- $appendedChildren = $list->prependChild($items);
- $this->assertCount(2, $appendedChildren);
- $this->assertEquals(3, $list->getNode()->childNodes->length);
- foreach ($appendedChildren as $appendedChild) {
- $this->assertInstanceOf('DiDom\Element', $appendedChild);
- }
- foreach (['bar', 'baz', 'foo'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testPrependDocumentFragment()
- {
- $xml = '
- <list>
- <item>Foo</item>
- <item>Bar</item>
- <item>Baz</item>
- </list>
- ';
- $document = new Document();
- $document->loadXml($xml);
- $fragmentXml = '
- <item>Qux</item>
- <item>Quux</item>
- <item>Quuz</item>
- ';
- $documentFragment = $document->createDocumentFragment();
- $documentFragment->appendXml($fragmentXml);
- $document->first('list')->prependChild($documentFragment);
- $expectedContent = ['Qux', 'Quux', 'Quuz', 'Foo', 'Bar', 'Baz'];
- foreach ($document->find('item') as $index => $childNode) {
- $this->assertEquals('item', $childNode->getNode()->tagName);
- $this->assertEquals($expectedContent[$index], $childNode->text());
- }
- }
- public function testAppendChildWithInvalidArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $element = new Element('span', 'hello');
- $element->appendChild('foo');
- }
- public function testAppendChildWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not append a child to element without the owner document');
- $element = new Element(new DOMElement('div'));
- $element->appendChild(new Element('div'));
- }
- public function testAppendChild()
- {
- $list = new Element('ul');
- $this->assertEquals(0, $list->getNode()->childNodes->length);
- $item = new Element('li', 'foo');
- $appendedChild = $list->appendChild($item);
- $this->assertEquals(1, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $appendedChild);
- $this->assertEquals('foo', $appendedChild->getNode()->textContent);
- $item = new Element('li', 'bar');
- $appendedChild = $list->appendChild($item);
- $this->assertEquals(2, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $appendedChild);
- $this->assertEquals('bar', $appendedChild->getNode()->textContent);
- $this->assertEquals('foo', $list->getNode()->childNodes->item(0)->textContent);
- $this->assertEquals('bar', $list->getNode()->childNodes->item(1)->textContent);
- }
- public function testAppendChildWithArray()
- {
- $list = new Element('ul');
- $appendedChild = $list->appendChild(new Element('li', 'foo'));
- $this->assertEquals(1, $list->getNode()->childNodes->length);
- $this->assertInstanceOf('DiDom\Element', $appendedChild);
- $this->assertEquals('foo', $appendedChild->getNode()->textContent);
- $items = [];
- $items[] = new Element('li', 'bar');
- $items[] = new Element('li', 'baz');
- $appendedChildren = $list->appendChild($items);
- $this->assertCount(2, $appendedChildren);
- $this->assertEquals(3, $list->getNode()->childNodes->length);
- foreach ($appendedChildren as $appendedChild) {
- $this->assertInstanceOf('DiDom\Element', $appendedChild);
- }
- foreach (['foo', 'bar', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testAppendDocumentFragment()
- {
- $xml = '
- <list>
- <item>Foo</item>
- <item>Bar</item>
- <item>Baz</item>
- </list>
- ';
- $document = new Document();
- $document->loadXml($xml);
- $fragmentXml = '
- <item>Qux</item>
- <item>Quux</item>
- <item>Quuz</item>
- ';
- $documentFragment = $document->createDocumentFragment();
- $documentFragment->appendXml($fragmentXml);
- $document->first('list')->appendChild($documentFragment);
- $expectedContent = ['Foo', 'Bar', 'Baz', 'Qux', 'Quux', 'Quuz'];
- foreach ($document->find('item') as $index => $childNode) {
- $this->assertEquals('item', $childNode->getNode()->tagName);
- $this->assertEquals($expectedContent[$index], $childNode->text());
- }
- }
- public function testInsertBeforeWithInvalidNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 1 passed to DiDom\Node::insertBefore must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $list->insertBefore('foo');
- }
- public function testInsertBeforeWithInvalidReferenceNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 2 passed to DiDom\Node::insertBefore must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $list->insertBefore(new Element('li', 'foo'), 'foo');
- }
- public function testInsertBeforeWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not insert a child to an element without the owner document');
- $list = new Element(new DOMElement('ul'));
- $list->insertBefore(new Element('li', 'foo'));
- }
- public function testInsertBefore()
- {
- $list = new Element('ul');
- $insertedNode = $list->insertBefore(new Element('li', 'baz'));
- $this->assertInstanceOf('DiDom\Element', $insertedNode);
- $this->assertEquals('baz', $insertedNode->getNode()->textContent);
- foreach (['baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $list->insertBefore(new Element('li', 'foo'), $list->getNode()->childNodes->item(0));
- foreach (['foo', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $list->insertBefore(new Element('li', 'bar'), $list->getNode()->childNodes->item(1));
- foreach (['foo', 'bar', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- // without the reference node
- $list->insertBefore(new Element('li', 'qux'));
- foreach (['foo', 'bar', 'baz', 'qux'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testInsertAfterWithInvalidNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 1 passed to DiDom\Node::insertBefore must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $list->insertAfter('foo');
- }
- public function testInsertAfterWithInvalidReferenceNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 2 passed to DiDom\Node::insertAfter must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $list->insertAfter(new Element('li', 'foo'), 'foo');
- }
- public function testInsertAfterWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not insert a child to an element without the owner document');
- $list = new Element(new DOMElement('ul'));
- $list->insertAfter(new Element('li', 'foo'));
- }
- public function testInsertAfter()
- {
- $list = new Element('ul');
- $insertedNode = $list->insertAfter(new Element('li', 'foo'));
- $this->assertInstanceOf('DiDom\Element', $insertedNode);
- $this->assertEquals('foo', $insertedNode->getNode()->textContent);
- foreach (['foo'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $list->insertAfter(new Element('li', 'baz'), $list->getNode()->childNodes->item(0));
- foreach (['foo', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $list->insertAfter(new Element('li', 'bar'), $list->getNode()->childNodes->item(0));
- foreach (['foo', 'bar', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- // without the reference node
- $list->insertAfter(new Element('li', 'qux'));
- foreach (['foo', 'bar', 'baz', 'qux'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testInsertSiblingBeforeWithInvalidNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 1 passed to DiDom\Node::insertSiblingBefore must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $item = $list->appendChild(new Element('li', 'foo'));
- $item->insertSiblingBefore('foo');
- }
- public function testInsertSiblingBeforeWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not insert a child to an element without the owner document');
- $item = new Element(new DOMElement('li', 'foo'));
- $item->insertSiblingBefore(new Element('li', 'bar'));
- }
- public function testInsertSiblingBefore()
- {
- $list = new Element('ul');
- $insertedNode = $list->appendChild(new Element('li', 'baz'));
- $this->assertInstanceOf('DiDom\Element', $insertedNode);
- $this->assertEquals('baz', $insertedNode->getNode()->textContent);
- foreach (['baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $insertedNode->insertSiblingBefore(new Element('li', 'foo'));
- foreach (['foo', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $insertedNode->insertSiblingBefore(new Element('li', 'bar'));
- foreach (['foo', 'bar', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testInsertSiblingAfterWithInvalidNodeArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $this->expectExceptionMessage('Argument 1 passed to DiDom\Node::appendChild must be an instance of DiDom\Node or DOMNode, string given');
- $list = new Element('ul');
- $item = $list->appendChild(new Element('li', 'foo'));
- $item->insertSiblingAfter('foo');
- }
- public function testInsertSiblingAfterWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Can not insert a child to an element without the owner document');
- $item = new Element(new DOMElement('li', 'foo'));
- $item->insertSiblingAfter(new Element('li', 'bar'));
- }
- public function testInsertSiblingAfter()
- {
- $list = new Element('ul');
- $insertedNode = $list->appendChild(new Element('li', 'foo'));
- $this->assertInstanceOf('DiDom\Element', $insertedNode);
- $this->assertEquals('foo', $insertedNode->getNode()->textContent);
- foreach (['foo'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $insertedNode->insertSiblingAfter(new Element('li', 'baz'));
- foreach (['foo', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- $insertedNode->insertSiblingAfter(new Element('li', 'bar'));
- foreach (['foo', 'bar', 'baz'] as $index => $value) {
- $this->assertEquals($value, $list->getNode()->childNodes->item($index)->textContent);
- }
- }
- public function testHas()
- {
- $document = new DOMDocument();
- $document->loadHTML('<div><span class="foo">bar</span></div>');
- $node = $document->getElementsByTagName('div')->item(0);
- $element = new Element($node);
- $this->assertTrue($element->has('.foo'));
- $this->assertFalse($element->has('.bar'));
- }
- /**
- * @dataProvider findTests
- */
- public function testFind($html, $selector, $type, $count)
- {
- $document = new DOMDocument();
- $document->loadHTML($html);
- $domElement = $document->getElementsByTagName('body')->item(0);
- $element = new Element($domElement);
- $elements = $element->find($selector, $type);
- $this->assertTrue(is_array($elements));
- $this->assertEquals($count, count($elements));
- foreach ($elements as $element) {
- $this->assertInstanceOf('DiDom\Element', $element);
- }
- }
- public function testFindInDocumentWithoutOwnerDocument()
- {
- $this->expectException(LogicException::class);
- $element = new Element(new DOMElement('div'));
- $element->findInDocument('.foo');
- }
- public function testFindInDocument()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html);
- $items = $document->find('li');
- $list = $document->first('ul');
- foreach ($list->find('li') as $index => $item) {
- $this->assertFalse($item->is($items[$index]));
- }
- foreach ($list->findInDocument('li') as $index => $item) {
- $this->assertTrue($item->is($items[$index]));
- }
- $this->assertCount(3, $document->find('li'));
- $list->findInDocument('li')[0]->remove();
- $this->assertCount(2, $document->find('li'));
- }
- public function testFirstInDocumentWithoutOwnerDocument()
- {
- $this->expectException(LogicException::class);
- $element = new Element(new DOMElement('div'));
- $element->firstInDocument('.foo');
- }
- public function testFirstInDocument()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html);
- $item = $document->first('li');
- $list = $document->first('ul');
- $this->assertFalse($item->is($list->first('li')));
- $this->assertTrue($item->is($list->firstInDocument('li')));
- $this->assertCount(3, $document->find('li'));
- $list->findInDocument('li')[0]->remove();
- $this->assertCount(2, $document->find('li'));
- }
- public function testFirst()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $this->assertEquals($item, $list->first('li')->getNode());
- $list = new Element('ul');
- $this->assertNull($list->first('li'));
- }
- /**
- * @dataProvider findTests
- */
- public function testFindAndReturnDomElement($html, $selector, $type, $count)
- {
- $document = new DOMDocument();
- $document->loadHTML($html);
- $node = $document->getElementsByTagName('body')->item(0);
- $element = new Element($node);
- $elements = $element->find($selector, $type, false);
- $this->assertTrue(is_array($elements));
- $this->assertEquals($count, count($elements));
- foreach ($elements as $element) {
- $this->assertInstanceOf('DOMElement', $element);
- }
- }
- public function findTests()
- {
- $html = $this->loadFixture('posts.html');
- return array(
- array($html, '.post h2', Query::TYPE_CSS, 3),
- array($html, '.fake h2', Query::TYPE_CSS, 0),
- array($html, '.post h2, .post p', Query::TYPE_CSS, 6),
- array($html, "//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]", Query::TYPE_XPATH, 3),
- );
- }
- public function testXpath()
- {
- $html = $this->loadFixture('posts.html');
- $document = new DOMDocument();
- $document->loadHTML($html);
- $node = $document->getElementsByTagName('body')->item(0);
- $element = new Element($node);
- $elements = $element->xpath("//*[contains(concat(' ', normalize-space(@class), ' '), ' post ')]");
- $this->assertTrue(is_array($elements));
- $this->assertEquals(3, count($elements));
- foreach ($elements as $element) {
- $this->assertInstanceOf('DiDom\Element', $element);
- }
- }
- public function testCount()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $this->assertEquals(3, $list->count('li'));
- $document = new Element('ul');
- $this->assertEquals(0, $document->count('li'));
- }
- public function testMatchesStrictWithoutTagName()
- {
- $this->expectException(RuntimeException::class);
- $element = new Element('ul', null, ['id' => 'foo', 'class' => 'bar baz']);
- $element->matches('#foo.bar.baz', true);
- }
- public function testMatches()
- {
- $element = new Element('ul', null, ['id' => 'foo', 'class' => 'bar baz']);
- $this->assertTrue($element->matches('ul'));
- $this->assertTrue($element->matches('#foo'));
- $this->assertTrue($element->matches('.bar'));
- $this->assertTrue($element->matches('ul#foo.bar.baz'));
- $this->assertFalse($element->matches('a#foo.bar.baz'));
- // strict
- $this->assertTrue($element->matches('ul#foo.bar.baz', true));
- $this->assertFalse($element->matches('ul#foo.bar', true));
- $this->assertFalse($element->matches('ul#foo', true));
- $this->assertFalse($element->matches('ul.bar.baz', true));
- $this->assertFalse($element->matches('ul.bar.baz', true));
- $element = new Element('p');
- $this->assertTrue($element->matches('p', true));
- $html = '<!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- </head>
- <body>
- <a href="#"><img src="foo.jpg" alt="Foo"></a>
- </body>
- </html>';
- $document = new Document($html, false);
- $anchor = $document->first('a');
- $this->assertTrue($anchor->matches('a:has(img[src$=".jpg"])'));
- $this->assertTrue($anchor->matches('a img'));
- $this->assertFalse($anchor->matches('a img[alt="Bar"]'));
- $this->assertFalse($anchor->matches('img'));
- $textNode = new DOMText('Foo');
- $element = new Element($textNode);
- $this->assertFalse($element->matches('#foo'));
- $commentNode = new DOMComment('Foo');
- $element = new Element($commentNode);
- $this->assertFalse($element->matches('#foo'));
- }
- public function testHasAttribute()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $this->assertFalse($element->hasAttribute('value'));
- $node->setAttribute('value', 'test');
- $this->assertTrue($element->hasAttribute('value'));
- }
- public function testSetAttributeWithInvalidValue()
- {
- $this->expectException(InvalidArgumentException::class);
- $element = new Element('input');
- $element->setAttribute('value', []);
- }
- public function testSetAttribute()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $element->setAttribute('value', 'foo');
- $this->assertEquals('foo', $element->getNode()->getAttribute('value'));
- $element->setAttribute('value', 10);
- $this->assertEquals('10', $element->getNode()->getAttribute('value'));
- $element->setAttribute('value', 3.14);
- $this->assertEquals('3.14', $element->getNode()->getAttribute('value'));
- }
- public function testGetAttribute()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $this->assertEquals(null, $element->getAttribute('value'));
- $this->assertEquals('default', $element->getAttribute('value', 'default'));
- $node->setAttribute('value', 'test');
- $this->assertEquals('test', $element->getAttribute('value'));
- }
- public function testRemoveAttribute()
- {
- $domElement = $this->createDomElement('input', '', ['name' => 'username']);
- $element = new Element($domElement);
- $this->assertTrue($element->getNode()->hasAttribute('name'));
- $result = $element->removeAttribute('name');
- $this->assertEquals(0, $element->getNode()->attributes->length);
- $this->assertFalse($element->getNode()->hasAttribute('name'));
- $this->assertEquals($result, $element);
- }
- public function testRemoveAllAttributes()
- {
- $attributes = ['type' => 'text', 'name' => 'username'];
- $domElement = $this->createDomElement('input', '', $attributes);
- $element = new Element($domElement);
- $result = $element->removeAllAttributes();
- $this->assertEquals(0, $element->getNode()->attributes->length);
- $this->assertEquals($result, $element);
- }
- public function testRemoveAllAttributesWithExclusion()
- {
- $attributes = ['type' => 'text', 'name' => 'username'];
- $domElement = $this->createDomElement('input', '', $attributes);
- $element = new Element($domElement);
- $element->removeAllAttributes(['name']);
- $this->assertEquals(1, $element->getNode()->attributes->length);
- $this->assertEquals('username', $element->getNode()->getAttribute('name'));
- }
- public function testAttrSet()
- {
- $element = new Element('input');
- $element->attr('name', 'username');
- $this->assertEquals('username', $element->getNode()->getAttribute('name'));
- }
- public function testAttrGet()
- {
- $element = new Element('input', null, ['name' => 'username']);
- $this->assertEquals('username', $element->attr('name'));
- }
- public function testAttributes()
- {
- $attributes = ['type' => 'text', 'name' => 'username', 'value' => 'John'];
- $domElement = $this->createDomElement('input', '', $attributes);
- $element = new Element($domElement);
- $this->assertEquals($attributes, $element->attributes());
- $this->assertEquals(['name' => 'username', 'value' => 'John'], $element->attributes(['name', 'value']));
- }
- public function testAttributesWithText()
- {
- $element = new Element(new DOMText('Foo'));
- $this->assertNull($element->attributes());
- }
- public function testAttributesWithComment()
- {
- $element = new Element(new DOMComment('Foo'));
- $this->assertNull($element->attributes());
- }
- public function testStyleWithTextNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Style attribute is available only for element nodes');
- $element = new Element(new DOMText('foo'));
- $element->style();
- }
- public function testStyleWithCommentNode()
- {
- $this->expectException(LogicException::class);
- $this->expectExceptionMessage('Style attribute is available only for element nodes');
- $element = new Element(new DOMComment('foo'));
- $element->style();
- }
- public function testStyle()
- {
- $element = new Element('div');
- $styleAttribute = $element->style();
- $this->assertInstanceOf('DiDom\\StyleAttribute', $styleAttribute);
- $this->assertSame($element, $styleAttribute->getElement());
- $this->assertSame($styleAttribute, $element->style());
- $element2 = new Element('div');
- $this->assertNotSame($element->style(), $element2->style());
- }
- public function testHtml()
- {
- $element = new Element('span', 'hello');
- $this->assertEquals('<span>hello</span>', $element->html());
- }
- public function testOuterHtml()
- {
- $innerHtml = 'Plain text <span>Lorem ipsum.</span><span>Lorem ipsum.</span>';
- $html = "<div id=\"foo\" class=\"bar baz\">$innerHtml</div>";
- $document = new Document($html);
- $this->assertEquals('<div id="foo" class="bar baz"></div>', $document->first('#foo')->outerHtml());
- }
- public function testInnerHtml()
- {
- $innerHtml = ' Plain text <span>Lorem ipsum.</span><span>Lorem ipsum.</span>';
- $html = "<div id=\"root\">$innerHtml</div>";
- $document = new Document($html);
- $this->assertEquals($innerHtml, $document->first('#root')->innerHtml());
- $html = '
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- </head>
- <body>
- English language <br>
- Русский язык <br>
- اللغة العربية <br>
- 漢語 <br>
- Tiếng Việt <br>
- < >
- </body>
- </html>
- ';
- $expectedContent = '
- English language <br>
- Русский язык <br>
- اللغة العربية <br>
- 漢語 <br>
- Tiếng Việt <br>
- < >
- ';
- $document = new Document($html);
- $this->assertEquals($expectedContent, $document->first('body')->innerHtml());
- }
- public function testInnerHtmlOnXmlElement()
- {
- $innerXml = 'Plain text <span>Lorem <single-tag/> ipsum.</span><span>Lorem ipsum.</span>';
- $xml = "<div id=\"root\">$innerXml</div>";
- $document = new Document($xml, false, 'UTF-8', Document::TYPE_XML);
- $expectedXml = 'Plain text <span>Lorem <single-tag></single-tag> ipsum.</span><span>Lorem ipsum.</span>';
- $this->assertEquals($expectedXml, $document->first('#root')->innerHtml());
- }
- public function testInnerXml()
- {
- $innerXml = 'Plain text <span>Lorem <single-tag/> ipsum.</span><span>Lorem ipsum.</span>';
- $xml = "<div id=\"root\">$innerXml</div>";
- $document = new Document($xml, false, 'UTF-8', Document::TYPE_XML);
- $this->assertEquals($innerXml, $document->first('#root')->innerXml());
- }
- public function testSetInnerHtml()
- {
- $list = new Element('ul');
- $html = '<li>One</li><li>Two</li><li>Three</li>';
- $this->assertEquals($list, $list->setInnerHtml($html));
- $this->assertEquals(['One', 'Two', 'Three'], $list->find('li::text'));
- // check inner HTML rewrite works
- $html = '<li>Foo</li><li>Bar</li><li>Baz</li>';
- $this->assertEquals($list, $list->setInnerHtml($html));
- $this->assertEquals(['Foo', 'Bar', 'Baz'], $list->find('li::text'));
- $html = '<div id="root"></div>';
- $innerHtml = ' Plain text <span>Lorem ipsum.</span><span>Lorem ipsum.</span>';
- $document = new Document($html, false);
- $document->first('#root')->setInnerHtml($innerHtml);
- $this->assertEquals($innerHtml, $document->first('#root')->innerHtml());
- }
- public function testSetInnerXml()
- {
- $element = new Element('div');
- $element->setInnerXml(' Foo <span>Bar</span><!-- Baz --><![CDATA[
- <root>Hello world!</root>
- ]]>');
- $children = $element->getNode()->childNodes;
- $this->assertInstanceOf(DOMText::class, $children[0]);
- $this->assertEquals(' Foo ', $children[0]->textContent);
- $this->assertInstanceOf(DOMElement::class, $children[1]);
- $this->assertEquals('Bar', $children[1]->textContent);
- $this->assertInstanceOf(DOMComment::class, $children[2]);
- $this->assertEquals(' Baz ', $children[2]->textContent);
- $this->assertInstanceOf(DOMCdataSection::class, $children[3]);
- $this->assertEquals('<root>Hello world!</root>', trim($children[3]->textContent));
- }
- public function testXml()
- {
- $element = new Element('span', 'hello');
- $prolog = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
- $this->assertEquals($prolog.'<span>hello</span>', $element->xml());
- }
- public function testXmlWithOptions()
- {
- $html = '<html><body><span></span></body></html>';
- $document = new Document();
- $document->loadHtml($html);
- $element = $document->find('span')[0];
- $prolog = '<?xml version="1.0" encoding="UTF-8"?>'."\n";
- $this->assertEquals($prolog.'<span/>', $element->xml());
- $this->assertEquals($prolog.'<span></span>', $element->xml(LIBXML_NOEMPTYTAG));
- }
- public function testGetText()
- {
- $element = new Element('span', 'hello');
- $this->assertEquals('hello', $element->text());
- }
- public function testSetValue()
- {
- $element = new Element('span', 'hello');
- $element->setValue('test');
- $this->assertEquals('test', $element->text());
- }
- public function testIsElementNode()
- {
- $element = new Element('div');
- $element->setInnerHtml(' Foo <span>Bar</span><!-- Baz -->');
- $children = $element->children();
- $this->assertFalse($children[0]->isElementNode());
- $this->assertTrue($children[1]->isElementNode());
- $this->assertFalse($children[2]->isElementNode());
- }
- public function testIsTextNode()
- {
- $element = new Element('div');
- $element->setInnerHtml(' Foo <span>Bar</span><!-- Baz -->');
- $children = $element->children();
- $this->assertTrue($children[0]->isTextNode());
- $this->assertFalse($children[1]->isTextNode());
- $this->assertFalse($children[2]->isTextNode());
- }
- public function testIsCommentNode()
- {
- $element = new Element('div');
- $element->setInnerHtml(' Foo <span>Bar</span><!-- Baz --><![CDATA[
- <root>Hello world!</root>
- ]]>');
- $children = $element->children();
- $this->assertFalse($children[0]->isCommentNode());
- $this->assertFalse($children[1]->isCommentNode());
- $this->assertTrue($children[2]->isCommentNode());
- $this->assertFalse($children[3]->isCommentNode());
- }
- public function testIsCdataSectionNode()
- {
- $element = new Element('div');
- $element->setInnerXml(' Foo <span>Bar</span><!-- Baz --><![CDATA[
- <root>Hello world!</root>
- ]]>');
- $children = $element->children();
- $this->assertFalse($children[0]->isCdataSectionNode());
- $this->assertFalse($children[1]->isCdataSectionNode());
- $this->assertFalse($children[2]->isCdataSectionNode());
- $this->assertTrue($children[3]->isCdataSectionNode());
- }
- public function testIs()
- {
- $element = new Element('span', 'hello');
- $element2 = new Element('span', 'hello');
- $this->assertTrue($element->is($element));
- $this->assertFalse($element->is($element2));
- }
- public function testIsWithInvalidArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $element = new Element('span', 'hello');
- $element->is(null);
- }
- public function testParent()
- {
- $html = $this->loadFixture('posts.html');
- $document = new Document($html, false);
- $element = $document->createElement('span', 'value');
- $this->assertEquals($document->getDocument(), $element->ownerDocument()->getDocument());
- }
- public function testClosest()
- {
- // without body and html tags
- $html = '
- <nav>
- <ul class="menu">
- <li><a href="#">Foo</a></li>
- <li><a href="#">Bar</a></li>
- <li><a href="#">Baz</a></li>
- </ul>
- </nav>
- ';
- $document = new Document($html);
- $menu = $document->first('.menu');
- $link = $document->first('a');
- $this->assertNull($link->closest('.unknown-class'));
- $this->assertEquals($menu, $link->closest('.menu'));
- $html = '<!DOCTYPE html>
- <html>
- <body>
- <nav></nav>
- <ul class="menu">
- <li><a href="#">Foo</a></li>
- <li><a href="#">Bar</a></li>
- <li><a href="#">Baz</a></li>
- </ul>
- </body>
- </html>';
- $document = new Document($html);
- $this->assertNull($document->first('ul.menu')->closest('nav'));
- }
- // =========================
- // previousSibling
- // =========================
- public function testPreviousSibling()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul')->getNode();
- $item = $list->childNodes->item(0);
- $item = new Element($item);
- $this->assertNull($item->previousSibling());
- $item = $list->childNodes->item(1);
- $item = new Element($item);
- $expectedNode = $list->childNodes->item(0);
- $this->assertEquals($expectedNode, $item->previousSibling()->getNode());
- }
- public function testPreviousSiblingWithTextNode()
- {
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $span = $document->first('span');
- $expectedNode = $span->getNode()->previousSibling;
- $this->assertEquals($expectedNode, $span->previousSibling()->getNode());
- }
- public function testPreviousSiblingWithCommentNode()
- {
- $html = '<p><!-- Foo --><span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $span = $document->first('span');
- $expectedNode = $span->getNode()->previousSibling;
- $this->assertEquals($expectedNode, $span->previousSibling()->getNode());
- }
- public function testPreviousSiblingWithSelector()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(4);
- $item = new Element($item);
- $expectedNode = $list->getNode()->childNodes->item(2);
- $this->assertEquals($expectedNode, $item->previousSibling('li:has(a[href*="google"])')->getNode());
- }
- public function testPreviousSiblingWithSelectorElementMissed()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(4);
- $item = new Element($item);
- $this->assertNull($item->previousSibling('li:has(a[href*="acme"])'));
- }
- public function testPreviousSiblingWithNodeType()
- {
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $document->find('span')[1];
- $expectedNode = $paragraph->getNode()->childNodes->item(1);
- $this->assertEquals($expectedNode, $span->previousSibling(null, 'DOMElement')->getNode());
- $expectedNode = $paragraph->getNode()->childNodes->item(2);
- $this->assertEquals($expectedNode, $span->previousSibling(null, 'DOMComment')->getNode());
- }
- public function testPreviousSiblingWithInvalidNodeType()
- {
- $this->expectException(RuntimeException::class);
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $span = $document->find('span')[1];
- $span->previousSibling(null, 'foo');
- }
- /**
- * @dataProvider previousSiblingWithSelectorAndNotDomElementNodeTypeDataProvider
- *
- * @param string $nodeType
- */
- public function testPreviousSiblingWithSelectorAndNotDomElement($nodeType)
- {
- $this->expectException(LogicException::class);
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(4);
- $item = new Element($item);
- $item->previousSibling('li:has(a[href$=".com"])', $nodeType);
- }
- public function previousSiblingWithSelectorAndNotDomElementNodeTypeDataProvider()
- {
- return [['DOMText'], ['DOMComment']];
- }
- // =========================
- // previousSiblings
- // =========================
- public function testPreviousSiblings()
- {
- $html = '<p>Foo <span>Bar</span> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $paragraph->find('span')[1];
- $childNodes = $paragraph->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(0),
- $childNodes->item(1),
- $childNodes->item(2),
- ];
- $previousSiblings = $span->previousSiblings();
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- }
- public function testPreviousSiblingsWithSelector()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(4);
- $item = new Element($item);
- $childNodes = $list->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(0),
- $childNodes->item(1),
- $childNodes->item(2),
- ];
- $previousSiblings = $item->previousSiblings('li:has(a[href$=".com"])');
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- }
- public function testPreviousSiblingsWithNodeType()
- {
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $document->find('span')[1];
- $childNodes = $paragraph->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(1),
- ];
- $previousSiblings = $span->previousSiblings(null, 'DOMElement');
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- $expectedResult = [
- $childNodes->item(2),
- ];
- $previousSiblings = $span->previousSiblings(null, 'DOMComment');
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- }
- public function testPreviousSiblingsWithInvalidNodeType()
- {
- $this->expectException(RuntimeException::class);
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $span = $document->find('span')[1];
- $span->previousSibling(null, 'foo');
- }
- /**
- * @dataProvider previousSiblingsWithSelectorAndNotDomElementNodeTypeDataProvider
- *
- * @param string $nodeType
- */
- public function testPreviousSiblingsWithSelectorAndNotDomElement($nodeType)
- {
- $this->expectException(LogicException::class);
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(4);
- $item = new Element($item);
- $item->previousSiblings('li:has(a[href$=".com"])', $nodeType);
- }
- public function previousSiblingsWithSelectorAndNotDomElementNodeTypeDataProvider()
- {
- return [['DOMText'], ['DOMComment']];
- }
- // =========================
- // nextSibling
- // =========================
- public function testNextSibling()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(2);
- $item = new Element($item);
- $this->assertNull($item->nextSibling());
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $expectedNode = $list->getNode()->childNodes->item(1);
- $this->assertEquals($expectedNode, $item->nextSibling()->getNode());
- }
- public function testNextSiblingWithTextNode()
- {
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $paragraph->first('span');
- $expectedNode = $span->getNode()->nextSibling;
- $this->assertEquals($expectedNode, $span->nextSibling()->getNode());
- }
- public function testNextSiblingWithCommentNode()
- {
- $html = '<p>Foo <span>Bar</span><!-- Baz --></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $paragraph->first('span');
- $expectedNode = $span->getNode()->nextSibling;
- $this->assertEquals($expectedNode, $span->nextSibling()->getNode());
- }
- public function testNextSiblingWithSelector()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $expectedNode = $list->getNode()->childNodes->item(3);
- $this->assertEquals($expectedNode, $item->nextSibling('li:has(a[href*="w3"])')->getNode());
- }
- public function testNextSiblingWithSelectorElementMissed()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $this->assertNull($item->nextSibling('li:has(a[href*="acme"])'));
- }
- public function testNextSiblingWithNodeType()
- {
- $html = '<p>Foo <span>Bar</span> Baz <!--qwe--><span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $document->find('span')[0];
- $expectedNode = $paragraph->getNode()->childNodes->item(4);
- $this->assertEquals($expectedNode, $span->nextSibling(null, 'DOMElement')->getNode());
- $expectedNode = $paragraph->getNode()->childNodes->item(3);
- $this->assertEquals($expectedNode, $span->nextSibling(null, 'DOMComment')->getNode());
- }
- public function testNextSiblingWithInvalidNodeType()
- {
- $this->expectException(RuntimeException::class);
- $html = '<p>Foo <span>Bar</span> Baz <!--qwe--><span>Qux</span></p>';
- $document = new Document($html, false);
- $span = $document->find('span')[0];
- $span->nextSibling(null, 'foo');
- }
- /**
- * @dataProvider nextSiblingWithSelectorAndNotDomElementNodeTypeDataProvider
- *
- * @param string $nodeType
- */
- public function testNextSiblingWithSelectorAndNotDomElement($nodeType)
- {
- $this->expectException(LogicException::class);
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $item->nextSibling('li:has(a[href$=".com"])', $nodeType);
- }
- public function nextSiblingWithSelectorAndNotDomElementNodeTypeDataProvider()
- {
- return [['DOMText'], ['DOMComment']];
- }
- // =========================
- // nextSiblings
- // =========================
- public function testNextSiblings()
- {
- $html = '<p>Foo <span>Bar</span> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $paragraph->find('span')[0];
- $childNodes = $paragraph->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(2),
- $childNodes->item(3),
- ];
- $nextSiblings = $span->nextSiblings();
- $this->assertCount(count($expectedResult), $nextSiblings);
- foreach ($nextSiblings as $index => $nextSibling) {
- $this->assertEquals($expectedResult[$index], $nextSibling->getNode());
- }
- }
- public function testNextSiblingsWithSelector()
- {
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $childNodes = $list->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(1),
- $childNodes->item(2),
- ];
- $nextSiblings = $item->nextSiblings('li:has(a[href$=".com"])');
- $this->assertCount(count($expectedResult), $nextSiblings);
- foreach ($nextSiblings as $index => $nextSibling) {
- $this->assertEquals($expectedResult[$index], $nextSibling->getNode());
- }
- }
- public function testNextSiblingsWithNodeType()
- {
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $span = $document->find('span')[0];
- $childNodes = $paragraph->getNode()->childNodes;
- $expectedResult = [
- $childNodes->item(4),
- ];
- $previousSiblings = $span->nextSiblings(null, 'DOMElement');
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- $expectedResult = [
- $childNodes->item(2),
- ];
- $previousSiblings = $span->nextSiblings(null, 'DOMComment');
- $this->assertCount(count($expectedResult), $previousSiblings);
- foreach ($previousSiblings as $index => $previousSibling) {
- $this->assertEquals($expectedResult[$index], $previousSibling->getNode());
- }
- }
- public function testNextSiblingsWithInvalidNodeType()
- {
- $this->expectException(RuntimeException::class);
- $html = '<p>Foo <span>Bar</span><!--qwe--> Baz <span>Qux</span></p>';
- $document = new Document($html, false);
- $span = $document->find('span')[0];
- $span->nextSiblings(null, 'foo');
- }
- /**
- * @dataProvider nextSiblingsWithSelectorAndNotDomElementNodeTypeDataProvider
- *
- * @param string $nodeType
- */
- public function testNextSiblingsWithSelectorAndNotDomElement($nodeType)
- {
- $this->expectException(LogicException::class);
- $html =
- '<ul>'.
- '<li><a href="https://amazon.com">Amazon</a></li>'.
- '<li><a href="https://facebook.com">Facebook</a></li>'.
- '<li><a href="https://google.com">Google</a></li>'.
- '<li><a href="https://www.w3.org">W3C</a></li>'.
- '<li><a href="https://wikipedia.org">Wikipedia</a></li>'.
- '</ul>'
- ;
- $document = new Document($html, false);
- $list = $document->first('ul');
- $item = $list->getNode()->childNodes->item(0);
- $item = new Element($item);
- $item->nextSiblings('li:has(a[href$=".com"])', $nodeType);
- }
- public function nextSiblingsWithSelectorAndNotDomElementNodeTypeDataProvider()
- {
- return [['DOMText'], ['DOMComment']];
- }
- public function testChild()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $this->assertEquals($list->getNode()->childNodes->item(0), $list->child(0)->getNode());
- $this->assertEquals($list->getNode()->childNodes->item(2), $list->child(2)->getNode());
- $this->assertNull($list->child(3));
- // with text nodes
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $child = $paragraph->getNode()->childNodes->item(0);
- $this->assertEquals($child, $paragraph->child(0)->getNode());
- }
- public function testFirstChild()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $this->assertEquals($list->getNode()->firstChild, $list->firstChild()->getNode());
- $list = new Element('ul');
- $this->assertNull($list->firstChild());
- // with text nodes
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $firstChild = $paragraph->getNode()->firstChild;
- $this->assertEquals($firstChild, $paragraph->firstChild()->getNode());
- }
- public function testLastChild()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $this->assertEquals($list->getNode()->lastChild, $list->lastChild()->getNode());
- $list = new Element('ul');
- $this->assertNull($list->lastChild());
- // with text nodes
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $lastChild = $paragraph->getNode()->lastChild;
- $this->assertEquals($lastChild, $paragraph->lastChild()->getNode());
- }
- public function testHasChildren()
- {
- $html = '
- <p class="element"><br></p>
- <p class="text">Foo</p>
- <p class="comment"><!-- Foo --></p>
- <p class="empty"></p>
- ';
- $document = new Document($html);
- $this->assertTrue($document->first('.element')->hasChildren());
- $this->assertTrue($document->first('.text')->hasChildren());
- $this->assertTrue($document->first('.comment')->hasChildren());
- $this->assertFalse($document->first('.empty')->hasChildren());
- }
- public function testChildren()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $list = $document->first('ul');
- $children = $list->children();
- foreach ($list->getNode()->childNodes as $index => $node) {
- $this->assertEquals($node, $children[$index]->getNode());
- }
- // with text nodes
- $html = '<p>Foo <span>Bar</span> Baz</p>';
- $document = new Document($html, false);
- $paragraph = $document->first('p');
- $children = $paragraph->children();
- foreach ($paragraph->getNode()->childNodes as $index => $node) {
- $this->assertEquals($node, $children[$index]->getNode());
- }
- }
- public function testParentWithoutOwner()
- {
- $element = new Element(new DOMElement('span', 'hello'));
- $this->assertNull($element->parent());
- }
- public function testRemoveChild()
- {
- $html = '<div><span>Foo</span></div>';
- $document = new Document($html, false);
- $div = $document->first('div');
- $span = $document->first('span');
- $this->assertEquals($span->getNode(), $div->removeChild($span)->getNode());
- $this->assertCount(0, $document->find('span'));
- }
- public function testRemoveChildren()
- {
- $html = '<div><span>Foo</span>Bar<!-- Baz --></div>';
- $document = new Document($html, false);
- $div = $document->first('div');
- $span = $document->first('span');
- $childNodes = $div->children();
- $removedNodes = $div->removeChildren();
- foreach ($childNodes as $index => $childNode) {
- $this->assertEquals($childNode->getNode(), $removedNodes[$index]->getNode());
- }
- $this->assertCount(0, $document->find('span'));
- }
- public function testRemove()
- {
- $html = '<div><span>Foo</span></div>';
- $document = new Document($html, false);
- $span = $document->first('span');
- $this->assertEquals($span->getNode(), $span->remove()->getNode());
- $this->assertCount(0, $document->find('span'));
- }
- public function testRemoveWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $element = new Element('div', 'Foo');
- $element->remove();
- }
- public function testReplace()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $first = $document->find('li')[0];
- $third = $document->find('li')[2];
- $this->assertEquals($first->getNode(), $first->replace($third)->getNode());
- $this->assertEquals($third->getNode(), $document->find('li')[0]->getNode());
- $this->assertCount(3, $document->find('li'));
- // replace without cloning
- $document = new Document($html, false);
- $first = $document->find('li')[0];
- $third = $document->find('li')[2];
- $this->assertEquals($first->getNode(), $first->replace($third, false)->getNode());
- $this->assertEquals($third->getNode(), $document->find('li')[0]->getNode());
- $this->assertCount(2, $document->find('li'));
- }
- public function testReplaceWithNewElement()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $first = $document->find('li')[0];
- $newElement = new Element('li', 'Foo');
- $this->assertEquals($first->getNode(), $first->replace($newElement)->getNode());
- $this->assertEquals('Foo', $document->find('li')[0]->text());
- $this->assertCount(3, $document->find('li'));
- // replace with new node
- $html = '<span>Foo <a href="#">Bar</a> Baz</span>';
- $document = new Document($html, false);
- $anchor = $document->first('a');
- $textNode = new DOMText($anchor->text());
- $anchor->replace($textNode);
- }
- public function testReplaceWithElementFromAnotherDocument()
- {
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $document2 = new Document($html, false);
- $first = $document->find('li')[0];
- $third = $document2->find('li')[2];
- $this->assertEquals($first->getNode(), $first->replace($third)->getNode());
- $this->assertEquals('Three', $document->find('li')[0]->text());
- $this->assertCount(3, $document->find('li'));
- }
- public function testReplaceWithDocumentFragment()
- {
- $xml = '
- <list>
- <item>Foo</item>
- <item>Bar</item>
- <item>Baz</item>
- </list>
- ';
- $document = new Document();
- $document->loadXml($xml);
- $fragmentXml = '
- <item>Qux</item>
- <item>Quux</item>
- <item>Quuz</item>
- ';
- $documentFragment = $document->createDocumentFragment();
- $documentFragment->appendXml($fragmentXml);
- $document->first('item:nth-child(2)')->replace($documentFragment);
- $expectedContent = ['Foo', 'Qux', 'Quux', 'Quuz', 'Baz'];
- foreach ($document->find('item') as $index => $childNode) {
- $this->assertEquals('item', $childNode->getNode()->tagName);
- $this->assertEquals($expectedContent[$index], $childNode->text());
- }
- }
- public function testReplaceWithInvalidArgument()
- {
- $this->expectException(InvalidArgumentException::class);
- $html = '<ul><li>One</li><li>Two</li><li>Three</li></ul>';
- $document = new Document($html, false);
- $document->find('li')[0]->replace(null);
- }
- public function testReplaceElementWithoutParentNode()
- {
- $this->expectException(LogicException::class);
- $element = new Element('div', 'Foo');
- $element->replace(new Element('div', 'Bar'));
- }
- public function testGetLineNo()
- {
- $element = new Element('div');
- $this->assertEquals(0, $element->getLineNo());
- $html = '<ul>
- <li>One</li>
- <li>Two</li>
- <li>Three</li>
- </ul>';
- $document = new Document($html, false);
- $this->assertEquals(4, $document->find('li')[2]->getLineNo());
- }
- public function testCloneNode()
- {
- $element = new Element('input');
- $cloned = $element->cloneNode(true);
- $this->assertFalse($element->is($cloned));
- }
- public function testGetNode()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $this->assertEquals($node, $element->getNode());
- }
- public function testGetDocument()
- {
- $html = $this->loadFixture('posts.html');
- $document = new Document($html, false);
- $element = $document->createElement('span', 'value');
- $this->assertEquals($document->getDocument(), $element->ownerDocument()->getDocument());
- }
- public function testToDocument()
- {
- $element = new Element('input');
- $document = $element->toDocument();
- $this->assertInstanceOf('DiDom\Document', $document);
- $this->assertEquals('UTF-8', $document->getDocument()->encoding);
- $document = $element->toDocument('CP1251');
- $this->assertEquals('CP1251', $document->getDocument()->encoding);
- }
- public function testSetMagicMethod()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $element->name = 'username';
- $this->assertEquals('username', $element->getNode()->getAttribute('name'));
- }
- public function testGetMagicMethod()
- {
- $element = new Element('input', null, ['name' => 'username']);
- $this->assertEquals('username', $element->name);
- }
- public function testIssetMagicMethod()
- {
- $node = $this->createDomElement('input');
- $element = new Element($node);
- $this->assertFalse(isset($element->value));
- $node->setAttribute('value', 'test');
- $element = new Element($node);
- $this->assertTrue(isset($element->value));
- }
- public function testUnsetMagicMethod()
- {
- $element = new Element('input', null, ['name' => 'username']);
- $this->assertTrue($element->hasAttribute('name'));
- unset($element->name);
- $this->assertFalse($element->hasAttribute('name'));
- }
- public function testToString()
- {
- $element = new Element('span', 'hello');
- $this->assertEquals($element->html(), $element->__toString());
- }
- }
|