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 = '
FooBarBaz
';
$document = new Document();
$document->loadXml($xml);
$fragmentXml = '
QuxQuuxQuuz
';
$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 = '
FooBarBaz
';
$document = new Document();
$document->loadXml($xml);
$fragmentXml = '
QuxQuuxQuuz
';
$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('
bar
');
$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 = '
One
Two
Three
';
$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 = '
One
Two
Three
';
$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 = '
One
Two
Three
';
$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 = '
One
Two
Three
';
$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 = '
Document
';
$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('hello', $element->html());
}
public function testOuterHtml()
{
$innerHtml = 'Plain text Lorem ipsum.Lorem ipsum.';
$html = "
$innerHtml
";
$document = new Document($html);
$this->assertEquals('', $document->first('#foo')->outerHtml());
}
public function testInnerHtml()
{
$innerHtml = ' Plain text Lorem ipsum.Lorem ipsum.';
$html = "
$innerHtml
";
$document = new Document($html);
$this->assertEquals($innerHtml, $document->first('#root')->innerHtml());
$html = '
Document
English language
Русский язык
اللغة العربية
漢語
Tiếng Việt
< >
';
$expectedContent = '
English language
Русский язык
اللغة العربية
漢語
Tiếng Việt
< >
';
$document = new Document($html);
$this->assertEquals($expectedContent, $document->first('body')->innerHtml());
}
public function testInnerHtmlOnXmlElement()
{
$innerXml = 'Plain text Lorem ipsum.Lorem ipsum.';
$xml = "
$innerXml
";
$document = new Document($xml, false, 'UTF-8', Document::TYPE_XML);
$expectedXml = 'Plain text Lorem ipsum.Lorem ipsum.';
$this->assertEquals($expectedXml, $document->first('#root')->innerHtml());
}
public function testInnerXml()
{
$innerXml = 'Plain text Lorem ipsum.Lorem ipsum.';
$xml = "
$innerXml
";
$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 = '
One
Two
Three
';
$this->assertEquals($list, $list->setInnerHtml($html));
$this->assertEquals(['One', 'Two', 'Three'], $list->find('li::text'));
// check inner HTML rewrite works
$html = '
Foo
Bar
Baz
';
$this->assertEquals($list, $list->setInnerHtml($html));
$this->assertEquals(['Foo', 'Bar', 'Baz'], $list->find('li::text'));
$html = '';
$innerHtml = ' Plain text Lorem ipsum.Lorem ipsum.';
$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 BarHello world!
]]>');
$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('Hello world!', trim($children[3]->textContent));
}
public function testXml()
{
$element = new Element('span', 'hello');
$prolog = ''."\n";
$this->assertEquals($prolog.'hello', $element->xml());
}
public function testXmlWithOptions()
{
$html = '';
$document = new Document();
$document->loadHtml($html);
$element = $document->find('span')[0];
$prolog = ''."\n";
$this->assertEquals($prolog.'', $element->xml());
$this->assertEquals($prolog.'', $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 Bar');
$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 Bar');
$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 BarHello world!
]]>');
$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 BarHello world!
]]>');
$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 = '
';
$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 = '
'
;
$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 = '
One
Two
Three
';
$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 = '
Foo Bar Baz
';
$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 = '
One
Two
Three
';
$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 = '
Foo Bar Baz
';
$document = new Document($html, false);
$paragraph = $document->first('p');
$firstChild = $paragraph->getNode()->firstChild;
$this->assertEquals($firstChild, $paragraph->firstChild()->getNode());
}
public function testLastChild()
{
$html = '
One
Two
Three
';
$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 = '
Foo Bar Baz
';
$document = new Document($html, false);
$paragraph = $document->first('p');
$lastChild = $paragraph->getNode()->lastChild;
$this->assertEquals($lastChild, $paragraph->lastChild()->getNode());
}
public function testHasChildren()
{
$html = '
Foo
';
$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 = '
One
Two
Three
';
$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 = '
Foo Bar Baz
';
$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 = '
Foo
';
$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 = '
FooBar
';
$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 = '
Foo
';
$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 = '
One
Two
Three
';
$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 = '
One
Two
Three
';
$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 = 'Foo Bar Baz';
$document = new Document($html, false);
$anchor = $document->first('a');
$textNode = new DOMText($anchor->text());
$anchor->replace($textNode);
}
public function testReplaceWithElementFromAnotherDocument()
{
$html = '
One
Two
Three
';
$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 = '
FooBarBaz
';
$document = new Document();
$document->loadXml($xml);
$fragmentXml = '
QuxQuuxQuuz
';
$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 = '
One
Two
Three
';
$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 = '
One
Two
Three
';
$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());
}
}