487 lines
12 KiB
PHP
487 lines
12 KiB
PHP
<?php
|
|
namespace Masterminds\HTML5\Tests;
|
|
|
|
use Masterminds\HTML5\Elements;
|
|
|
|
class ElementsTest extends TestCase
|
|
{
|
|
|
|
public $html5Elements = array(
|
|
"a",
|
|
"abbr",
|
|
"address",
|
|
"area",
|
|
"article",
|
|
"aside",
|
|
"audio",
|
|
"b",
|
|
"base",
|
|
"bdi",
|
|
"bdo",
|
|
"blockquote",
|
|
"body",
|
|
"br",
|
|
"button",
|
|
"canvas",
|
|
"caption",
|
|
"cite",
|
|
"code",
|
|
"col",
|
|
"colgroup",
|
|
"command",
|
|
// "data",
|
|
"datalist",
|
|
"dd",
|
|
"del",
|
|
"details",
|
|
"dfn",
|
|
"dialog",
|
|
"div",
|
|
"dl",
|
|
"dt",
|
|
"em",
|
|
"embed",
|
|
"fieldset",
|
|
"figcaption",
|
|
"figure",
|
|
"footer",
|
|
"form",
|
|
"h1",
|
|
"h2",
|
|
"h3",
|
|
"h4",
|
|
"h5",
|
|
"h6",
|
|
"head",
|
|
"header",
|
|
"hgroup",
|
|
"hr",
|
|
"html",
|
|
"i",
|
|
"iframe",
|
|
"img",
|
|
"input",
|
|
"ins",
|
|
"kbd",
|
|
"keygen",
|
|
"label",
|
|
"legend",
|
|
"li",
|
|
"link",
|
|
"map",
|
|
"mark",
|
|
"menu",
|
|
"meta",
|
|
"meter",
|
|
"nav",
|
|
"noscript",
|
|
"object",
|
|
"ol",
|
|
"optgroup",
|
|
"option",
|
|
"output",
|
|
"p",
|
|
"param",
|
|
"pre",
|
|
"progress",
|
|
"q",
|
|
"rp",
|
|
"rt",
|
|
"ruby",
|
|
"s",
|
|
"samp",
|
|
"script",
|
|
"section",
|
|
"select",
|
|
"small",
|
|
"source",
|
|
"span",
|
|
"strong",
|
|
"style",
|
|
"sub",
|
|
"summary",
|
|
"sup",
|
|
"table",
|
|
"tbody",
|
|
"td",
|
|
"textarea",
|
|
"tfoot",
|
|
"th",
|
|
"thead",
|
|
"time",
|
|
"title",
|
|
"tr",
|
|
"track",
|
|
"u",
|
|
"ul",
|
|
"var",
|
|
"video",
|
|
"wbr"
|
|
);
|
|
|
|
public $mathmlElements = array(
|
|
"maction",
|
|
"maligngroup",
|
|
"malignmark",
|
|
"math",
|
|
"menclose",
|
|
"merror",
|
|
"mfenced",
|
|
"mfrac",
|
|
"mglyph",
|
|
"mi",
|
|
"mlabeledtr",
|
|
"mlongdiv",
|
|
"mmultiscripts",
|
|
"mn",
|
|
"mo",
|
|
"mover",
|
|
"mpadded",
|
|
"mphantom",
|
|
"mroot",
|
|
"mrow",
|
|
"ms",
|
|
"mscarries",
|
|
"mscarry",
|
|
"msgroup",
|
|
"msline",
|
|
"mspace",
|
|
"msqrt",
|
|
"msrow",
|
|
"mstack",
|
|
"mstyle",
|
|
"msub",
|
|
"msup",
|
|
"msubsup",
|
|
"mtable",
|
|
"mtd",
|
|
"mtext",
|
|
"mtr",
|
|
"munder",
|
|
"munderover"
|
|
);
|
|
|
|
public $svgElements = array(
|
|
"a",
|
|
"altGlyph",
|
|
"altGlyphDef",
|
|
"altGlyphItem",
|
|
"animate",
|
|
"animateColor",
|
|
"animateMotion",
|
|
"animateTransform",
|
|
"circle",
|
|
"clipPath",
|
|
"color-profile",
|
|
"cursor",
|
|
"defs",
|
|
"desc",
|
|
"ellipse",
|
|
"feBlend",
|
|
"feColorMatrix",
|
|
"feComponentTransfer",
|
|
"feComposite",
|
|
"feConvolveMatrix",
|
|
"feDiffuseLighting",
|
|
"feDisplacementMap",
|
|
"feDistantLight",
|
|
"feFlood",
|
|
"feFuncA",
|
|
"feFuncB",
|
|
"feFuncG",
|
|
"feFuncR",
|
|
"feGaussianBlur",
|
|
"feImage",
|
|
"feMerge",
|
|
"feMergeNode",
|
|
"feMorphology",
|
|
"feOffset",
|
|
"fePointLight",
|
|
"feSpecularLighting",
|
|
"feSpotLight",
|
|
"feTile",
|
|
"feTurbulence",
|
|
"filter",
|
|
"font",
|
|
"font-face",
|
|
"font-face-format",
|
|
"font-face-name",
|
|
"font-face-src",
|
|
"font-face-uri",
|
|
"foreignObject",
|
|
"g",
|
|
"glyph",
|
|
"glyphRef",
|
|
"hkern",
|
|
"image",
|
|
"line",
|
|
"linearGradient",
|
|
"marker",
|
|
"mask",
|
|
"metadata",
|
|
"missing-glyph",
|
|
"mpath",
|
|
"path",
|
|
"pattern",
|
|
"polygon",
|
|
"polyline",
|
|
"radialGradient",
|
|
"rect",
|
|
"script",
|
|
"set",
|
|
"stop",
|
|
"style",
|
|
"svg",
|
|
"switch",
|
|
"symbol",
|
|
"text",
|
|
"textPath",
|
|
"title",
|
|
"tref",
|
|
"tspan",
|
|
"use",
|
|
"view",
|
|
"vkern"
|
|
);
|
|
|
|
public function testIsHtml5Element()
|
|
{
|
|
foreach ($this->html5Elements as $element) {
|
|
$this->assertTrue(Elements::isHtml5Element($element), 'html5 element test failed on: ' . $element);
|
|
|
|
$this->assertTrue(Elements::isHtml5Element(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
|
|
}
|
|
|
|
$nonhtml5 = array(
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
);
|
|
foreach ($nonhtml5 as $element) {
|
|
$this->assertFalse(Elements::isHtml5Element($element), 'html5 element test failed on: ' . $element);
|
|
|
|
$this->assertFalse(Elements::isHtml5Element(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
|
|
}
|
|
}
|
|
|
|
public function testIsMathMLElement()
|
|
{
|
|
foreach ($this->mathmlElements as $element) {
|
|
$this->assertTrue(Elements::isMathMLElement($element), 'MathML element test failed on: ' . $element);
|
|
|
|
// MathML is case sensetitive so these should all fail.
|
|
$this->assertFalse(Elements::isMathMLElement(strtoupper($element)), 'MathML element test failed on: ' . strtoupper($element));
|
|
}
|
|
|
|
$nonMathML = array(
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
);
|
|
foreach ($nonMathML as $element) {
|
|
$this->assertFalse(Elements::isMathMLElement($element), 'MathML element test failed on: ' . $element);
|
|
}
|
|
}
|
|
|
|
public function testIsSvgElement()
|
|
{
|
|
foreach ($this->svgElements as $element) {
|
|
$this->assertTrue(Elements::isSvgElement($element), 'SVG element test failed on: ' . $element);
|
|
|
|
// SVG is case sensetitive so these should all fail.
|
|
$this->assertFalse(Elements::isSvgElement(strtoupper($element)), 'SVG element test failed on: ' . strtoupper($element));
|
|
}
|
|
|
|
$nonSVG = array(
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
);
|
|
foreach ($nonSVG as $element) {
|
|
$this->assertFalse(Elements::isSvgElement($element), 'SVG element test failed on: ' . $element);
|
|
}
|
|
}
|
|
|
|
public function testIsElement()
|
|
{
|
|
foreach ($this->html5Elements as $element) {
|
|
$this->assertTrue(Elements::isElement($element), 'html5 element test failed on: ' . $element);
|
|
|
|
$this->assertTrue(Elements::isElement(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
|
|
}
|
|
|
|
foreach ($this->mathmlElements as $element) {
|
|
$this->assertTrue(Elements::isElement($element), 'MathML element test failed on: ' . $element);
|
|
|
|
// MathML is case sensetitive so these should all fail.
|
|
$this->assertFalse(Elements::isElement(strtoupper($element)), 'MathML element test failed on: ' . strtoupper($element));
|
|
}
|
|
|
|
foreach ($this->svgElements as $element) {
|
|
$this->assertTrue(Elements::isElement($element), 'SVG element test failed on: ' . $element);
|
|
|
|
// SVG is case sensetitive so these should all fail. But, there is duplication
|
|
// html5 and SVG. Since html5 is case insensetitive we need to make sure
|
|
// it's not a html5 element first.
|
|
if (! in_array($element, $this->html5Elements)) {
|
|
$this->assertFalse(Elements::isElement(strtoupper($element)), 'SVG element test failed on: ' . strtoupper($element));
|
|
}
|
|
}
|
|
|
|
$nonhtml5 = array(
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
);
|
|
foreach ($nonhtml5 as $element) {
|
|
$this->assertFalse(Elements::isElement($element), 'html5 element test failed on: ' . $element);
|
|
|
|
$this->assertFalse(Elements::isElement(strtoupper($element)), 'html5 element test failed on: ' . strtoupper($element));
|
|
}
|
|
}
|
|
|
|
public function testElement()
|
|
{
|
|
foreach ($this->html5Elements as $element) {
|
|
$this->assertGreaterThan(0, Elements::element($element));
|
|
}
|
|
$nonhtml5 = array(
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
);
|
|
foreach ($nonhtml5 as $element) {
|
|
$this->assertFalse(Elements::element($element));
|
|
}
|
|
}
|
|
|
|
public function testIsA()
|
|
{
|
|
$this->assertTrue(Elements::isA('script', Elements::KNOWN_ELEMENT));
|
|
$this->assertFalse(Elements::isA('scriptypoo', Elements::KNOWN_ELEMENT));
|
|
$this->assertTrue(Elements::isA('script', Elements::TEXT_RAW));
|
|
$this->assertFalse(Elements::isA('script', Elements::TEXT_RCDATA));
|
|
|
|
$voidElements = array(
|
|
'area',
|
|
'base',
|
|
'basefont',
|
|
'bgsound',
|
|
'br',
|
|
'col',
|
|
'command',
|
|
'embed',
|
|
'frame',
|
|
'hr',
|
|
'img'
|
|
);
|
|
|
|
foreach ($voidElements as $element) {
|
|
$this->assertTrue(Elements::isA($element, Elements::VOID_TAG), 'Void element test failed on: ' . $element);
|
|
}
|
|
|
|
$nonVoid = array(
|
|
'span',
|
|
'a',
|
|
'div'
|
|
);
|
|
foreach ($nonVoid as $tag) {
|
|
$this->assertFalse(Elements::isA($tag, Elements::VOID_TAG), 'Void element test failed on: ' . $tag);
|
|
}
|
|
|
|
$blockTags = array(
|
|
'address',
|
|
'article',
|
|
'aside',
|
|
'audio',
|
|
'blockquote',
|
|
'canvas',
|
|
'dd',
|
|
'div',
|
|
'dl',
|
|
'fieldset',
|
|
'figcaption',
|
|
'figure',
|
|
'footer',
|
|
'form',
|
|
'h1',
|
|
'h2',
|
|
'h3',
|
|
'h4',
|
|
'h5',
|
|
'h6',
|
|
'header',
|
|
'hgroup',
|
|
'hr',
|
|
'noscript',
|
|
'ol',
|
|
'output',
|
|
'p',
|
|
'pre',
|
|
'section',
|
|
'table',
|
|
'tfoot',
|
|
'ul',
|
|
'video'
|
|
);
|
|
|
|
foreach ($blockTags as $tag) {
|
|
$this->assertTrue(Elements::isA($tag, Elements::BLOCK_TAG), 'Block tag test failed on: ' . $tag);
|
|
}
|
|
|
|
$nonBlockTags = array(
|
|
'span',
|
|
'img',
|
|
'label'
|
|
);
|
|
foreach ($nonBlockTags as $tag) {
|
|
$this->assertFalse(Elements::isA($tag, Elements::BLOCK_TAG), 'Block tag test failed on: ' . $tag);
|
|
}
|
|
}
|
|
|
|
public function testNormalizeSvgElement()
|
|
{
|
|
$tests = array(
|
|
'foo' => 'foo',
|
|
'altglyph' => 'altGlyph',
|
|
'BAR' => 'bar',
|
|
'fespecularlighting' => 'feSpecularLighting',
|
|
'bAz' => 'baz',
|
|
'foreignobject' => 'foreignObject'
|
|
);
|
|
|
|
foreach ($tests as $input => $expected) {
|
|
$this->assertEquals($expected, Elements::normalizeSvgElement($input));
|
|
}
|
|
}
|
|
|
|
public function testNormalizeSvgAttribute()
|
|
{
|
|
$tests = array(
|
|
'foo' => 'foo',
|
|
'attributename' => 'attributeName',
|
|
'BAR' => 'bar',
|
|
'limitingconeangle' => 'limitingConeAngle',
|
|
'bAz' => 'baz',
|
|
'patterncontentunits' => 'patternContentUnits'
|
|
);
|
|
|
|
foreach ($tests as $input => $expected) {
|
|
$this->assertEquals($expected, Elements::normalizeSvgAttribute($input));
|
|
}
|
|
}
|
|
|
|
public function testNormalizeMathMlAttribute()
|
|
{
|
|
$tests = array(
|
|
'foo' => 'foo',
|
|
'definitionurl' => 'definitionURL',
|
|
'BAR' => 'bar'
|
|
);
|
|
|
|
foreach ($tests as $input => $expected) {
|
|
$this->assertEquals($expected, Elements::normalizeMathMlAttribute($input));
|
|
}
|
|
}
|
|
}
|