[TASK] Add Unit Tests for HtmlParser 52/45852/2
authorBenni Mack <benni@typo3.org>
Tue, 12 Jan 2016 22:34:18 +0000 (23:34 +0100)
committerGeorg Ringer <georg.ringer@gmail.com>
Thu, 14 Jan 2016 07:01:54 +0000 (08:01 +0100)
Make sure the core functionality is unit-tested.

Also, add some more information for some methods.

Resolves: #72664
Releases: master
Change-Id: I3fdfba215955237bc9ec8f19a6a70e2c8142236e
Reviewed-on: https://review.typo3.org/45852
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
typo3/sysext/core/Classes/Html/HtmlParser.php
typo3/sysext/core/Tests/Unit/Html/HtmlParserTest.php

index a5d049e..bb224e0 100644 (file)
@@ -258,11 +258,15 @@ class HtmlParser
      * Returns an array with all attributes as keys. Attributes are only lowercase a-z
      * If an attribute is empty (shorthand), then the value for the key is empty. You can check if it existed with isset()
      *
+     * Compared to the method in GeneralUtility::get_tag_attributes this method also returns meta data about each
+     * attribute, e.g. if it is a shorthand attribute, and what the quotation is. Also, since all attribute keys
+     * are lower-cased, the meta information contains the original attribute name.
+     *
      * @param string $tag Tag: $tag is either a whole tag (eg '<TAG OPTION ATTRIB=VALUE>') or the parameterlist (ex ' OPTION ATTRIB=VALUE>')
      * @param bool $deHSC If set, the attribute values are de-htmlspecialchar'ed. Should actually always be set!
      * @return array array(Tag attributes,Attribute meta-data)
      */
-    public function get_tag_attributes($tag, $deHSC = 0)
+    public function get_tag_attributes($tag, $deHSC = false)
     {
         list($components, $metaC) = $this->split_tag_attributes($tag);
         // Attribute name is stored here
@@ -298,8 +302,13 @@ class HtmlParser
     }
 
     /**
-     * Returns an array with the 'components' from an attribute list. The result is normally analyzed by get_tag_attributes
-     * Removes tag-name if found
+     * Returns an array with the 'components' from an attribute list.
+     * The result is normally analyzed by get_tag_attributes
+     * Removes tag-name if found.
+     *
+     * The difference between this method and the one in GeneralUtility is that this method actually determines
+     * more information on the attribute, e.g. if the value is enclosed by a " or ' character.
+     * That's why this method returns two arrays, the "components" and the "meta-information" of the "components".
      *
      * @param string $tag The tag or attributes
      * @return array
index f4bfb08..eaa7eb7 100644 (file)
@@ -436,6 +436,7 @@ class HtmlParserTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
             array('Something before<span>Wrapper<div>Some content</div></span>Something after', 'Wrapper<div>Some content</div>'),
             array('<span class="hidden">Wrapper<div>Some content</div></span>', 'Wrapper<div>Some content</div>'),
             array('<span>Wrapper<div class="hidden">Some content</div></span>', 'Wrapper<div class="hidden">Some content</div>'),
+            array('Some stuff before <span>Wrapper<div class="hidden">Some content</div></span> and after', 'Wrapper<div class="hidden">Some content</div>'),
         );
     }
 
@@ -452,4 +453,96 @@ class HtmlParserTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
     {
         $this->assertEquals($expectedResult, $this->subject->removeFirstAndLastTag($str));
     }
+
+    /**
+     * @return array
+     */
+    public function getTagAttributesDataProvider()
+    {
+        return [
+            [
+                '<a href="" data-shortCut="DXB" required>',
+                [
+                    ['href' => '', 'data-shortcut' => 'DXB', 'required' => ''],
+                    ['href' => ['origTag' => 'href', 'dashType' => '"'], 'data-shortcut' => ['origTag' => 'data-shortCut', 'dashType' => '"'], 'required' => ['origTag' => 'required']]
+                ]
+            ],
+            [
+                '<ul STYLE=\'background-image: (url: "fra.png")\' data-shortcut=FRA>',
+                [
+                    ['style' => 'background-image: (url: "fra.png")', 'data-shortcut' => 'FRA'],
+                    ['style' => ['origTag' => 'STYLE', 'dashType' => '\''], 'data-shortcut' => ['origTag' => 'data-shortcut', 'dashType' => '']]
+                ]
+            ]
+
+        ];
+    }
+
+    /**
+     * Returns an array with all attributes and its meta information from a tag.
+     * Removes tag-name if found
+     *
+     * @test
+     * @dataProvider getTagAttributesDataProvider
+     * @param string $tag String to process
+     * @param array $expectedResult
+     */
+    public function getTagAttributes($tag, $expectedResult)
+    {
+        $this->assertEquals($expectedResult, $this->subject->get_tag_attributes($tag));
+    }
+
+    /**
+     * @return array
+     */
+    public function stripEmptyTagsDataProvider()
+    {
+        return [
+            // Testing wrongly encapsulated and upper/lowercase tags
+            [
+                '<div>Denpassar</div><p> Bali</P><p></p><P></p><ul><li></li></ul>',
+                '',
+                false,
+                '<div>Denpassar</div><p> Bali</P>'
+            ],
+            // Testing incomplete tags
+            [
+                '<p><div>Klungklung</div></p><p> Semarapura<p></p><p></p><ul><li></li></ul>',
+                '',
+                false,
+                '<p><div>Klungklung</div></p><p> Semarapura'
+            ],
+            // Testing third parameter (break spaces
+            [
+                '<p><div>Badung</div></p><ul> Mangupura<p></p><p></p><ul><li>&nbsp;</li><li>Uluwatu</li></ul>',
+                '',
+                true,
+                '<p><div>Badung</div></p><ul> Mangupura<ul><li>Uluwatu</li></ul>'
+            ],
+            // Testing fourth parameter (keeping empty other tags, keeping defined used tags)
+            [
+                '<p><div>Badung</div></p><ul> Mangupura<p></p><p></p><ul><li></li></ul>',
+                'p,div',
+                true,
+                '<p><div>Badung</div></p><ul> Mangupura<ul><li></li></ul>'
+            ],
+
+        ];
+    }
+
+    /**
+     * Strips empty tags from HTML.
+     *
+     * @test
+     * @dataProvider stripEmptyTagsDataProvider
+     * @param string $content The content to be stripped of empty tags
+     * @param string $tagList The comma separated list of tags to be stripped.
+     *                        If empty, all empty tags will be stripped
+     * @param bool $treatNonBreakingSpaceAsEmpty If TRUE tags containing only &nbsp; entities will be treated as empty.
+     * @param string $expectedResult
+     */
+    public function rawStripEmptyTagsTest($content, $tagList, $treatNonBreakingSpaceAsEmpty, $expectedResult)
+    {
+        $this->assertEquals($expectedResult, $this->subject->stripEmptyTags($content, $tagList, $treatNonBreakingSpaceAsEmpty));
+    }
 }