From 7a40f4354b32809af3d0cfd6e3af0eda02ab0e0a Mon Sep 17 00:00:00 2001 From: friendica Date: Sat, 12 May 2012 17:57:41 -0700 Subject: some important stuff we'll need --- .../tests/HTMLPurifier/GeneratorTest.php | 288 +++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 lib/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php (limited to 'lib/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php') diff --git a/lib/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php b/lib/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php new file mode 100644 index 000000000..46b1dcf6b --- /dev/null +++ b/lib/htmlpurifier/tests/HTMLPurifier/GeneratorTest.php @@ -0,0 +1,288 @@ +_entity_lookup = HTMLPurifier_EntityLookup::instance(); + } + + public function setUp() { + parent::setUp(); + $this->config->set('Output.Newline', "\n"); + } + + /** + * Creates a generator based on config and context member variables. + */ + protected function createGenerator() { + return new HTMLPurifier_Generator($this->config, $this->context); + } + + protected function assertGenerateFromToken($token, $html) { + $generator = $this->createGenerator(); + $result = $generator->generateFromToken($token); + $this->assertIdentical($result, $html); + } + + function test_generateFromToken_text() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Text('Foobar.<>'), + 'Foobar.<>' + ); + } + + function test_generateFromToken_startWithAttr() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Start('a', + array('href' => 'dyn?a=foo&b=bar') + ), + '' + ); + } + + function test_generateFromToken_end() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_End('b'), + '' + ); + } + + function test_generateFromToken_emptyWithAttr() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Empty('br', + array('style' => 'font-family:"Courier New";') + ), + '
' + ); + } + + function test_generateFromToken_startNoAttr() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Start('asdf'), + '' + ); + } + + function test_generateFromToken_emptyNoAttr() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Empty('br'), + '
' + ); + } + + function test_generateFromToken_error() { + $this->expectError('Cannot generate HTML from non-HTMLPurifier_Token object'); + $this->assertGenerateFromToken( null, '' ); + } + + function test_generateFromToken_unicode() { + $theta_char = $this->_entity_lookup->table['theta']; + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Text($theta_char), + $theta_char + ); + } + + function test_generateFromToken_backtick() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Start('img', array('alt' => '`foo')), + '`foo ' + ); + } + + function test_generateFromToken_backtickDisabled() { + $this->config->set('Output.FixInnerHTML', false); + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Start('img', array('alt' => '`')), + '`' + ); + } + + function test_generateFromToken_backtickNoChange() { + $this->assertGenerateFromToken( + new HTMLPurifier_Token_Start('img', array('alt' => '`foo` bar')), + '`foo` bar' + ); + } + + function assertGenerateAttributes($attr, $expect, $element = false) { + $generator = $this->createGenerator(); + $result = $generator->generateAttributes($attr, $element); + $this->assertIdentical($result, $expect); + } + + function test_generateAttributes_blank() { + $this->assertGenerateAttributes(array(), ''); + } + + function test_generateAttributes_basic() { + $this->assertGenerateAttributes( + array('href' => 'dyn?a=foo&b=bar'), + 'href="dyn?a=foo&b=bar"' + ); + } + + function test_generateAttributes_doubleQuote() { + $this->assertGenerateAttributes( + array('style' => 'font-family:"Courier New";'), + 'style="font-family:"Courier New";"' + ); + } + + function test_generateAttributes_singleQuote() { + $this->assertGenerateAttributes( + array('style' => 'font-family:\'Courier New\';'), + 'style="font-family:\'Courier New\';"' + ); + } + + function test_generateAttributes_multiple() { + $this->assertGenerateAttributes( + array('src' => 'picture.jpg', 'alt' => 'Short & interesting'), + 'src="picture.jpg" alt="Short & interesting"' + ); + } + + function test_generateAttributes_specialChar() { + $theta_char = $this->_entity_lookup->table['theta']; + $this->assertGenerateAttributes( + array('title' => 'Theta is ' . $theta_char), + 'title="Theta is ' . $theta_char . '"' + ); + } + + + function test_generateAttributes_minimized() { + $this->config->set('HTML.Doctype', 'HTML 4.01 Transitional'); + $this->assertGenerateAttributes( + array('compact' => 'compact'), 'compact', 'menu' + ); + } + + function test_generateFromTokens() { + + $this->assertGeneration( + array( + new HTMLPurifier_Token_Start('b'), + new HTMLPurifier_Token_Text('Foobar!'), + new HTMLPurifier_Token_End('b') + ), + 'Foobar!' + ); + + } + + protected function assertGeneration($tokens, $expect) { + $generator = new HTMLPurifier_Generator($this->config, $this->context); + $result = $generator->generateFromTokens($tokens); + $this->assertIdentical($expect, $result); + } + + function test_generateFromTokens_Scripting() { + $this->assertGeneration( + array( + new HTMLPurifier_Token_Start('script'), + new HTMLPurifier_Token_Text('alert(3 < 5);'), + new HTMLPurifier_Token_End('script') + ), + "" + ); + } + + function test_generateFromTokens_Scripting_missingCloseTag() { + $this->assertGeneration( + array( + new HTMLPurifier_Token_Start('script'), + new HTMLPurifier_Token_Text('alert(3 < 5);'), + ), + "" + ); + } + + function test_generateFromTokens_Scripting_disableWrapper() { + $this->config->set('Output.CommentScriptContents', false); + $this->assertGeneration( + array( + new HTMLPurifier_Token_Start('script'), + new HTMLPurifier_Token_Text('alert(3 < 5);'), + new HTMLPurifier_Token_End('script') + ), + "" + ); + } + + function test_generateFromTokens_XHTMLoff() { + $this->config->set('HTML.XHTML', false); + + // omit trailing slash + $this->assertGeneration( + array( new HTMLPurifier_Token_Empty('br') ), + '
' + ); + + // there should be a test for attribute minimization, but it is + // impossible for something like that to happen due to our current + // definitions! fix it later + + // namespaced attributes must be dropped + $this->assertGeneration( + array( new HTMLPurifier_Token_Start('p', array('xml:lang'=>'fr')) ), + '

' + ); + + } + + function test_generateFromTokens_TidyFormat() { + // abort test if tidy isn't loaded + if (!extension_loaded('tidy')) return; + + // just don't test; Tidy is exploding on me. + return; + + $this->config->set('Core.TidyFormat', true); + $this->config->set('Output.Newline', "\n"); + + // nice wrapping please + $this->assertGeneration( + array( + new HTMLPurifier_Token_Start('div'), + new HTMLPurifier_Token_Text('Text'), + new HTMLPurifier_Token_End('div') + ), + "

\n Text\n
\n" + ); + + } + + function test_generateFromTokens_sortAttr() { + $this->config->set('Output.SortAttr', true); + + $this->assertGeneration( + array( new HTMLPurifier_Token_Start('p', array('b'=>'c', 'a'=>'d')) ), + '

' + ); + + } + +} + +// vim: et sw=4 sts=4 -- cgit v1.2.3