From 8f58c7f49e04b07b93f10cb5b53686c6c0ba77b4 Mon Sep 17 00:00:00 2001
From: "Edward Z. Yang" <edwardzyang@thewritingpot.com>
Date: Wed, 8 Aug 2007 05:38:52 +0000
Subject: [PATCH] [2.1.2?] Final migration for Injectors, deprecate the config
 and context parameters in assertResult

git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1378 48356398-32a2-884e-a903-53898d9a118a
---
 NEWS                                          |   3 +
 tests/HTMLPurifier/ComplexHarness.php         |  49 ++---
 .../Injector/AutoParagraphTest.php            | 176 +++++++++++++-----
 tests/HTMLPurifier/Injector/LinkifyTest.php   |  21 ++-
 .../Injector/PurifierLinkifyTest.php          |  32 +++-
 5 files changed, 184 insertions(+), 97 deletions(-)

diff --git a/NEWS b/NEWS
index 5e03cbe1..e80d03c5 100644
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ NEWS ( CHANGELOG and HISTORY )                                     HTMLPurifier
 ! Implemented Object module for trusted users
 - Fix non-visible parsing error in DirectLex with empty tags that have
   slashes inside attribute values.
+. Unit test refactoring for one logical test per test function
+. Config and context parameters in ComplexHarness deprecated: instead, edit
+  the $config and $context member variables
 
 2.1.1, released 2007-08-04
 - Fix show-stopper bug in %URI.MakeAbsolute functionality
diff --git a/tests/HTMLPurifier/ComplexHarness.php b/tests/HTMLPurifier/ComplexHarness.php
index 8ea7378d..19a4a480 100644
--- a/tests/HTMLPurifier/ComplexHarness.php
+++ b/tests/HTMLPurifier/ComplexHarness.php
@@ -67,41 +67,20 @@ class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness
      * @param $context_array Context array in form of Key => Value or an actual
      *                       context object.
      */
-    function assertResult($input, $expect = true,
-        $config_array = array(), $context_array = array()
-    ) {
-        
-        // setup config 
-        if ($this->config) {
-            $config = HTMLPurifier_Config::create($this->config);
-            $config->autoFinalize = false;
-            $config->loadArray($config_array);
-        } else {
-            $config = HTMLPurifier_Config::create($config_array);
-        }
-        
-        // setup context object. Note that we are operating on a copy of it!
-        // When necessary, extend the test harness to allow post-tests
-        // on the context object
-        if (empty($this->context)) {
-            $context = new HTMLPurifier_Context();
-            $context->loadArray($context_array);
-        } else {
-            $context =& $this->context;
-        }
+    function assertResult($input, $expect = true) {
         
         if ($this->to_tokens && is_string($input)) {
             // $func may cause $input to change, so "clone" another copy
             // to sacrifice
-            $input   = $this->lexer->tokenizeHTML($s = $input, $config, $context);
-            $input_c = $this->lexer->tokenizeHTML($s, $config, $context);
+            $input   = $this->tokenize($temp = $input);
+            $input_c = $this->tokenize($temp);
         } else {
             $input_c = $input;
         }
         
         // call the function
         $func = $this->func;
-        $result = $this->obj->$func($input_c, $config, $context);
+        $result = $this->obj->$func($input_c, $this->config, $this->context);
         
         // test a bool result
         if (is_bool($result)) {
@@ -112,11 +91,9 @@ class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness
         }
         
         if ($this->to_html) {
-            $result = $this->generator->
-              generateFromTokens($result, $config, $context);
+            $result = $this->generate($result);
             if (is_array($expect)) {
-                $expect = $this->generator->
-                  generateFromTokens($expect, $config, $context);
+                $expect = $this->generate($expect);
             }
         }
         
@@ -124,6 +101,20 @@ class HTMLPurifier_ComplexHarness extends HTMLPurifier_Harness
         
     }
     
+    /**
+     * Tokenize HTML into tokens, uses member variables for common variables
+     */
+    function tokenize($html) {
+        return $this->lexer->tokenizeHTML($html, $this->config, $this->context);
+    }
+    
+    /**
+     * Generate textual HTML from tokens
+     */
+    function generate($tokens) {
+        return $this->generator->generateFromTokens($tokens, $this->config, $this->context);
+    }
+    
 }
 
 
diff --git a/tests/HTMLPurifier/Injector/AutoParagraphTest.php b/tests/HTMLPurifier/Injector/AutoParagraphTest.php
index 0f0b5e5e..23743dff 100644
--- a/tests/HTMLPurifier/Injector/AutoParagraphTest.php
+++ b/tests/HTMLPurifier/Injector/AutoParagraphTest.php
@@ -8,29 +8,35 @@ class HTMLPurifier_Injector_AutoParagraphTest extends HTMLPurifier_InjectorHarne
     
     function setup() {
         parent::setup();
-        $this->config = array('AutoFormat.AutoParagraph' => true);
+        $this->config->set('AutoFormat', 'AutoParagraph', true);
     }
     
-    function test() {
+    function testSingleParagraph() {
         $this->assertResult(
             'Foobar',
             '<p>Foobar</p>'
         );
-        
+    }
+    
+    function testSingleMultiLineParagraph() {
         $this->assertResult(
 'Par 1
 Par 1 still',
 '<p>Par 1
 Par 1 still</p>'
         );
-        
+    }
+    
+    function testTwoParagraphs() {
         $this->assertResult(
 'Par1
 
 Par2',
             '<p>Par1</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testTwoParagraphsWithLotsOfSpace() {
         $this->assertResult(
 'Par1
 
@@ -39,15 +45,18 @@ Par2',
 Par2',
             '<p>Par1</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testTwoParagraphsWithInlineElements() {
         $this->assertResult(
 '<b>Par1</b>
 
 <i>Par2</i>',
             '<p><b>Par1</b></p><p><i>Par2</i></p>'
         );
-        
-        
+    }
+    
+    function testSingleParagraphThatLooksLikeTwo() {
         $this->assertResult(
 '<b>Par1
 
@@ -56,29 +65,40 @@ Par2</b>',
 
 Par2</b></p>'
         );
-        
+    }
+    
+    function testAddParagraphAdjacentToParagraph() {
         $this->assertResult(
             'Par1<p>Par2</p>',
             '<p>Par1</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testParagraphUnclosedInlineElement() {
         $this->assertResult(
             '<b>Par1',
             '<p><b>Par1</b></p>'
         );
-        
+    }
+    
+    function testPreservePreTags() {
         $this->assertResult(
 '<pre>Par1
 
 Par1</pre>'
         );
-        
+    }
+    
+    function testIgnoreTrailingWhitespace() {
         $this->assertResult(
 'Par1
 
   ',
 '<p>Par1</p>'
         );
+    }
+    
+    function testDoNotParagraphBlockElements() {
         $this->assertResult(
 'Par1
 
@@ -87,19 +107,25 @@ Par1</pre>'
 Par3',
 '<p>Par1</p><div>Par2</div><p>Par3</p>'
         );
-        
+    }
+    
+    function testParagraphTextAndInlineNodes() {
         $this->assertResult(
 'Par<b>1</b>',
             '<p>Par<b>1</b></p>'
         );
-        
+    }
+    
+    function testIgnoreLeadingWhitespace() {
         $this->assertResult(
 '
 
 Par',
             '<p>Par</p>'
         );
-        
+    }
+    
+    function testIgnoreSurroundingWhitespace() {
         $this->assertResult(
 '
 
@@ -108,69 +134,90 @@ Par
 ',
             '<p>Par</p>'
         );
-        
+    }
+    
+    function testParagraphInsideBlockNode() {
         $this->assertResult(
 '<div>Par1
 
 Par2</div>',
             '<div><p>Par1</p><p>Par2</p></div>'
         );
-        
+    }
+    
+    function testParagraphInlineNodeInsideBlockNode() {
         $this->assertResult(
 '<div><b>Par1</b>
 
 Par2</div>',
             '<div><p><b>Par1</b></p><p>Par2</p></div>'
         );
-        
+    }
+    
+    function testNoParagraphWhenOnlyOneInsideBlockNode() {
         $this->assertResult('<div>Par1</div>');
-        
+    }
+    
+    function testParagraphTwoInlineNodesInsideBlockNode() {
         $this->assertResult(
 '<div><b>Par1</b>
 
 <i>Par2</i></div>',
             '<div><p><b>Par1</b></p><p><i>Par2</i></p></div>'
         );
-        
+    }
+    
+    function testPreserveInlineNodesInPreTag() {
         $this->assertResult(
 '<pre><b>Par1</b>
 
-<i>Par2</i></pre>',
-            true
+<i>Par2</i></pre>'
         );
-        
+    }
+    
+    function testSplitUpInternalsOfPTagInBlockNode() {
         $this->assertResult(
 '<div><p>Foo
 
 Bar</p></div>',
             '<div><p>Foo</p><p>Bar</p></div>'
         );
-        
+    }
+    
+    function testSplitUpInlineNodesInPTagInBlockNode() {
         $this->assertResult(
 '<div><p><b>Foo</b>
 
 <i>Bar</i></p></div>',
             '<div><p><b>Foo</b></p><p><i>Bar</i></p></div>'
         );
-        
+    }
+    
+    function testNoParagraphSingleInlineNodeInBlockNode() {
         $this->assertResult(
 '<div><b>Foo</b></div>',
             '<div><b>Foo</b></div>'
         );
-        
+    }
+    
+    function testParagraphInBlockquote() {
         $this->assertResult(
 '<blockquote>Par1
 
 Par2</blockquote>',
             '<blockquote><p>Par1</p><p>Par2</p></blockquote>'
         );
-        
+    }
+    
+    function testNoParagraphBetweenListItem() {
         $this->assertResult(
 '<ul><li>Foo</li>
 
-<li>Bar</li></ul>', true
+<li>Bar</li></ul>'
         );
-        
+    }
+    
+    function testParagraphSingleElementWithSurroundingSpace() {
         $this->assertResult(
 '<div>
 
@@ -179,7 +226,9 @@ Bar
 </div>', 
         '<div><p>Bar</p></div>'
         );
-        
+    }
+    
+    function testIgnoreExtraSpaceWithLeadingInlineNode() {
         $this->assertResult(
 '<b>Par1</b>a
 
@@ -188,99 +237,124 @@ Bar
 Par2', 
         '<p><b>Par1</b>a</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testAbsorbExtraEndingPTag() {
         $this->assertResult(
 'Par1
 
 Par2</p>', 
         '<p>Par1</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testAbsorbExtraEndingDivTag() {
         $this->assertResult(
 'Par1
 
 Par2</div>', 
         '<p>Par1</p><p>Par2</p>'
         );
-        
+    }
+    
+    function testDoNotParagraphSingleSurroundingSpaceInBlockNode() {
         $this->assertResult(
 '<div>
 Par1
-</div>', true
+</div>'
         );
-        
+    }
+    
+    function testBlockNodeTextDelimeterInBlockNode() {
         $this->assertResult(
 '<div>Par1
 
 <div>Par2</div></div>',
 '<div><p>Par1</p><div>Par2</div></div>'
         );
-        
+    }
+    
+    function testBlockNodeTextDelimeterWithoutDoublespaceInBlockNode() {
         $this->assertResult(
 '<div>Par1
 <div>Par2</div></div>',
 '<div><p>Par1
 </p><div>Par2</div></div>'
         );
-        
+    }
+    
+    function testBlockNodeTextDelimeterWithoutDoublespace() {
         $this->assertResult(
 'Par1
 <div>Par2</div>',
 '<p>Par1
 </p><div>Par2</div>'
         );
-        
+    }
+    
+    function testTwoParagraphsOfTextAndInlineNode() {
         $this->assertResult(
 'Par1
 
 <b>Par2</b>',
 '<p>Par1</p><p><b>Par2</b></p>'
         );
-        
+    }
+    
+    function testLeadingInlineNodeParagraph() {
         $this->assertResult(
 '<img /> Foo',
 '<p><img /> Foo</p>'
         );
-        
+    }
+    
+    function testTrailingInlineNodeParagraph() {
         $this->assertResult(
 '<li>Foo <a>bar</a></li>'
         );
-        
+    }
+    
+    function testTwoInlineNodeParagraph() {
         $this->assertResult(
 '<li><b>baz</b><a>bar</a></li>'
         );
-        
+    }
+    
+    function testNoParagraphTrailingBlockNodeInBlockNode() {
         $this->assertResult(
 '<div><div>asdf</div><b>asdf</b></div>'
         );
-        
+    }
+    
+    function testParagraphTrailingBlockNodeWithDoublespaceInBlockNode() {
         $this->assertResult(
 '<div><div>asdf</div>
 
 <b>asdf</b></div>',
 '<div><div>asdf</div><p><b>asdf</b></p></div>'
         );
-        
+    }
+    
+    function testParagraphTwoInlineNodesAndWhitespaceNode() {
         $this->assertResult(
 '<b>One</b> <i>Two</i>',
 '<p><b>One</b> <i>Two</i></p>'
         );
-        
     }
     
-    function testInlineRootNode() {
+    function testNoParagraphWithInlineRootNode() {
+        $this->config->set('HTML', 'Parent', 'span');
         $this->assertResult(
 'Par
 
-Par2',
-            true,
-            array('AutoFormat.AutoParagraph' => true, 'HTML.Parent' => 'span')
+Par2'
         );
     }
     
-    function testNeeded() {
+    function testErrorNeeded() {
+        $this->config->set('HTML', 'Allowed', 'b');
         $this->expectError('Cannot enable AutoParagraph injector because p is not allowed');
-        $this->assertResult('<b>foobar</b>', true, array('AutoFormat.AutoParagraph' => true, 'HTML.Allowed' => 'b'));
+        $this->assertResult('<b>foobar</b>');
     }
     
 }
diff --git a/tests/HTMLPurifier/Injector/LinkifyTest.php b/tests/HTMLPurifier/Injector/LinkifyTest.php
index 66a06956..777cac9a 100644
--- a/tests/HTMLPurifier/Injector/LinkifyTest.php
+++ b/tests/HTMLPurifier/Injector/LinkifyTest.php
@@ -8,35 +8,40 @@ class HTMLPurifier_Injector_LinkifyTest extends HTMLPurifier_InjectorHarness
     
     function setup() {
         parent::setup();
-        $this->config = array('AutoFormat.Linkify' => true);
+        $this->config->set('AutoFormat', 'Linkify', true);
     }
     
-    function testLinkify() {
-        
+    function testLinkifyURLInRootNode() {
         $this->assertResult(
             'http://example.com',
             '<a href="http://example.com">http://example.com</a>'
         );
-        
+    }
+    
+    function testLinkifyURLInInlineNode() {
         $this->assertResult(
             '<b>http://example.com</b>',
             '<b><a href="http://example.com">http://example.com</a></b>'
         );
-        
+    }
+    
+    function testBasicUsageCase() {
         $this->assertResult(
             'This URL http://example.com is what you need',
             'This URL <a href="http://example.com">http://example.com</a> is what you need'
         );
-        
+    }
+    
+    function testIgnoreURLInATag() {
         $this->assertResult(
             '<a>http://example.com/</a>'
         );
-        
     }
     
     function testNeeded() {
+        $this->config->set('HTML', 'Allowed', 'b');
         $this->expectError('Cannot enable Linkify injector because a is not allowed');
-        $this->assertResult('http://example.com/', true, array('AutoFormat.Linkify' => true, 'HTML.Allowed' => 'b'));
+        $this->assertResult('http://example.com/');
     }
     
 }
diff --git a/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php b/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php
index e820d677..309733f3 100644
--- a/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php
+++ b/tests/HTMLPurifier/Injector/PurifierLinkifyTest.php
@@ -8,39 +8,53 @@ class HTMLPurifier_Injector_PurifierLinkifyTest extends HTMLPurifier_InjectorHar
     
     function setup() {
         parent::setup();
-        $this->config = array(
-            'AutoFormat.PurifierLinkify' => true,
-            'AutoFormatParam.PurifierLinkifyDocURL' => '#%s'
-        );
+        $this->config->set('AutoFormat', 'PurifierLinkify', true);
+        $this->config->set('AutoFormatParam', 'PurifierLinkifyDocURL', '#%s');
     }
     
-    function testLinkify() {
-        
+    function testNoTriggerCharacer() {
         $this->assertResult('Foobar');
+    }
+    
+    function testTriggerCharacterInIrrelevantContext() {
         $this->assertResult('20% off!');
+    }
+    
+    function testPreserveNamespace() {
         $this->assertResult('%Core namespace (not recognized)');
+    }
+    
+    function testLinkifyBasic() {
         $this->assertResult(
           '%Namespace.Directive',
           '<a href="#Namespace.Directive">%Namespace.Directive</a>'
         );
+    }
+    
+    function testLinkifyWithAdjacentTextNodes() {
         $this->assertResult(
           'This %Namespace.Directive thing',
           'This <a href="#Namespace.Directive">%Namespace.Directive</a> thing'
         );
+    }
+    
+    function testLinkifyInBlock() {
         $this->assertResult(
           '<div>This %Namespace.Directive thing</div>',
           '<div>This <a href="#Namespace.Directive">%Namespace.Directive</a> thing</div>'
         );
+    }
+    
+    function testPreserveInATag() {
         $this->assertResult(
           '<a>%Namespace.Directive</a>'
         );
-        
-        
     }
     
     function testNeeded() {
+        $this->config->set('HTML', 'Allowed', 'b');
         $this->expectError('Cannot enable PurifierLinkify injector because a is not allowed');
-        $this->assertResult('%Namespace.Directive', true, array('AutoFormat.PurifierLinkify' => true, 'HTML.Allowed' => 'b'));
+        $this->assertResult('%Namespace.Directive');
     }
     
 }