forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			486 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			486 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 sensitive 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 sensitive 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 sensitive 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 sensitive so these should all fail. But, there is duplication
 | |
|             // html5 and SVG. Since html5 is case insensitive 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->assertEquals(0, 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',
 | |
|             '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));
 | |
|         }
 | |
|     }
 | |
| }
 |