Modern DOM library written in PHP for HTML documents
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

230 lines
9.0 KiB

<?php
/**
* @license MIT
* Copyright 2017 Dustin Wilson, J. King, et al.
* See LICENSE and AUTHORS files for details
*/
declare(strict_types=1);
namespace MensBeam\HTML\DOM\TestCase;
use MensBeam\HTML\DOM\{
Document,
DOMException
};
/** @covers \MensBeam\HTML\DOM\TokenList */
class TestTokenList extends \PHPUnit\Framework\TestCase {
public function provideAddRemoveReplaceToggleFailures(): iterable {
return [
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->add('');
}, DOMException::SYNTAX_ERROR ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->remove('');
}, DOMException::SYNTAX_ERROR ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->replace('ack', '');
}, DOMException::SYNTAX_ERROR ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->toggle('');
}, DOMException::SYNTAX_ERROR ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->add('fail fail');
}, DOMException::INVALID_CHARACTER ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->remove('fail fail');
}, DOMException::INVALID_CHARACTER ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->replace('ack', 'fail fail');
}, DOMException::INVALID_CHARACTER ],
[ function() {
$d = new Document();
$e = $d->createElement('html');
$e->classList->toggle('fail fail');
}, DOMException::INVALID_CHARACTER ]
];
}
/**
* @dataProvider provideAddRemoveReplaceToggleFailures
* @covers \MensBeam\HTML\DOM\TokenList::add
* @covers \MensBeam\HTML\DOM\TokenList::remove
* @covers \MensBeam\HTML\DOM\TokenList::replace
* @covers \MensBeam\HTML\DOM\TokenList::toggle
*/
public function testAddRemoveReplaceFailures(\Closure $closure, int $errorCode): void {
$this->expectException(DOMException::class);
$this->expectExceptionCode($errorCode);
$closure();
}
/** @covers \MensBeam\HTML\DOM\TokenList::contains */
public function testContains(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertTrue($e->classList->contains('ack'));
$this->assertFalse($e->classList->contains('fail'));
}
/** @covers \MensBeam\HTML\DOM\TokenList::count */
public function testCount(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertSame(4, count($e->classList));
}
/** @covers \MensBeam\HTML\DOM\TokenList::item */
public function testItem(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertNull($e->classList->item(42));
}
/**
* @covers \MensBeam\HTML\DOM\TokenList::current
* @covers \MensBeam\HTML\DOM\TokenList::item
* @covers \MensBeam\HTML\DOM\TokenList::key
* @covers \MensBeam\HTML\DOM\TokenList::next
* @covers \MensBeam\HTML\DOM\TokenList::rewind
* @covers \MensBeam\HTML\DOM\TokenList::offsetExists
* @covers \MensBeam\HTML\DOM\TokenList::offsetGet
* @covers \MensBeam\HTML\DOM\TokenList::valid
*/
public function testIteration(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
foreach ($e->classList as $key => $className) {
$this->assertSame($className, $e->classList[$key]);
// test offsetExists
$this->assertTrue(isset($e->classList[$key]));
}
}
/** @covers \MensBeam\HTML\DOM\TokenList::__get_length */
public function testPropertyGetLength(): void {
// Test it with and without an attached document element
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertSame(4, $e->classList->length);
$d = new Document();
$e = $d->createElement('html');
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertSame(4, $e->classList->length);
}
/**
* @covers \MensBeam\HTML\DOM\TokenList::__get_value
* @covers \MensBeam\HTML\DOM\TokenList::__set_value
*/
public function testPropertyGetSetValue(): void {
// Test it with and without an attached document element
$d = new Document();
$e = $d->createElement('html');
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertSame('ook eek ack ookeek', $e->classList->value);
$this->assertSame('ook eek ack ookeek', $e->getAttribute('class'));
$e->classList->value = 'omg wtf bbq lol zor bor xxx';
$this->assertSame('lol', $e->classList[3]);
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->classList->value);
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->getAttribute('class'));
$e->classList->value = '';
$this->assertSame('', $e->classList->value);
$this->assertSame('', $e->getAttribute('class'));
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertSame('ook eek ack ookeek', $e->classList->value);
$this->assertSame('ook eek ack ookeek', $e->getAttribute('class'));
$e->classList->value = 'omg wtf bbq lol zor bor xxx';
$this->assertSame('lol', $e->classList[3]);
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->classList->value);
$this->assertSame('omg wtf bbq lol zor bor xxx', $e->getAttribute('class'));
$e->classList->value = '';
$this->assertSame('', $e->classList->value);
$this->assertSame('', $e->getAttribute('class'));
}
/** @covers \MensBeam\HTML\DOM\TokenList::replace */
public function testReplace(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->setAttribute('class', 'ook eek ack ookeek');
$this->assertTrue($e->classList->replace('ack', 'what'));
$this->assertSame('ook eek what ookeek', $e->classList->value);
$this->assertSame('ook eek what ookeek', $e->getAttribute('class'));
$this->assertFalse($e->classList->replace('fail', 'eekook'));
}
/** @covers \MensBeam\HTML\DOM\TokenList::remove */
public function testRemove(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->setAttribute('class', 'ook eek ack ookeek');
$e->classList->remove('ack');
$this->assertSame('ook eek ookeek', $e->classList->value);
$this->assertSame('ook eek ookeek', $e->getAttribute('class'));
}
/** @covers \MensBeam\HTML\DOM\TokenList::supports */
public function testSupports(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->classList->add('ook', 'eek', 'ack', 'ookeek');
$this->assertTrue($e->classList->supports('ack'));
}
/** @covers \MensBeam\HTML\DOM\TokenList::toggle */
public function testToggle(): void {
$d = new Document();
$e = $d->appendChild($d->createElement('html'));
$e->setAttribute('class', 'ook eek ack ookeek');
$this->assertFalse($e->classList->toggle('ack'));
$this->assertSame('ook eek ookeek', $e->classList->value);
$this->assertSame('ook eek ookeek', $e->getAttribute('class'));
$this->assertTrue($e->classList->toggle('ack'));
$this->assertSame('ook eek ookeek ack', $e->classList->value);
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class'));
$this->assertTrue($e->classList->toggle('ack', true));
$this->assertSame('ook eek ookeek ack', $e->classList->value);
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class'));
$this->assertFalse($e->classList->toggle('eekook', false));
$this->assertSame('ook eek ookeek ack', $e->classList->value);
$this->assertSame('ook eek ookeek ack', $e->getAttribute('class'));
$this->assertTrue($e->classList->toggle('eekook', true));
$this->assertSame('ook eek ookeek ack eekook', $e->classList->value);
$this->assertSame('ook eek ookeek ack eekook', $e->getAttribute('class'));
}
}