diff options
author | andi <andi@splitbrain.org> | 2005-04-03 09:45:21 +0200 |
---|---|---|
committer | andi <andi@splitbrain.org> | 2005-04-03 09:45:21 +0200 |
commit | 3ae0dd35df72193095029d06f5459b5243430140 (patch) | |
tree | ee4a1c86f3d881bd3656df2e5a292f57e9cc23c2 | |
parent | 0e1c636e20bd809a1d388e0c6f630b0ecda7086b (diff) | |
download | rpg-3ae0dd35df72193095029d06f5459b5243430140.tar.gz rpg-3ae0dd35df72193095029d06f5459b5243430140.tar.bz2 |
added unit tests
darcs-hash:20050403074521-9977f-d1a3c3a1200cab2d28789490ab3b49cd48691688.gz
20 files changed, 4808 insertions, 0 deletions
diff --git a/inc/parser/tests/.htaccess b/inc/parser/tests/.htaccess new file mode 100644 index 000000000..38539a1a2 --- /dev/null +++ b/inc/parser/tests/.htaccess @@ -0,0 +1,3 @@ +## no access to the inc directory
+order allow,deny
+allow from all
diff --git a/inc/parser/tests/alltests.all.php b/inc/parser/tests/alltests.all.php new file mode 100644 index 000000000..993553eb2 --- /dev/null +++ b/inc/parser/tests/alltests.all.php @@ -0,0 +1,48 @@ +<?php +/** +* @version $Id: alltests.all.php,v 1.2 2005/03/25 21:00:22 harryf Exp $ +* @package Dokuwiki +* @subpackage Tests +*/ +/** +* Init +*/ +require_once('./testconfig.php'); + +define("TEST_RUNNING", true); + +/** +* @package Dokuwiki +* @subpackage Tests +*/ +class AllTests extends GroupTest { + + function AllTests() { + $this->GroupTest('All Dokuwiki PHP Tests'); + $this->loadGroups(); + } + + function loadGroups() { + if ( $d = opendir('.') ) { + while (($file = readdir($d)) !== false) { + if ( is_file('./'.$file) ) { + $farray = explode('.',$file); + if ( $farray[1] == 'group' ) { + $classname = ucfirst($farray[0]).'GroupTest'; + require_once './'.$file; + $this->AddTestCase(new $classname); + } + } + } + closedir($d); + } + } + +} + +/** +* Run the tests +*/ +$test = &new AllTests(); +$test->run(new HtmlReporter()); +?> diff --git a/inc/parser/tests/lexer.group.php b/inc/parser/tests/lexer.group.php new file mode 100644 index 000000000..623cf6af5 --- /dev/null +++ b/inc/parser/tests/lexer.group.php @@ -0,0 +1,34 @@ +<?php +/** +* @version $Id: lexer.group.php,v 1.2 2005/03/25 21:00:22 harryf Exp $ +* @package JPSpan +* @subpackage Tests +*/ + +/** +* Init +*/ +require_once('./testconfig.php'); + +/** +* @package JPSpan +* @subpackage Tests +*/ +class LexerGroupTest extends GroupTest { + + function LexerGroupTest() { + $this->GroupTest('LexerGroupTest'); + $this->addTestFile('lexer.test.php'); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new LexerGroupTest(); + $test->run(new HtmlReporter()); +} +?> diff --git a/inc/parser/tests/lexer.test.php b/inc/parser/tests/lexer.test.php new file mode 100644 index 000000000..daf438fdf --- /dev/null +++ b/inc/parser/tests/lexer.test.php @@ -0,0 +1,611 @@ +<?php +/** +* @version $Id: lexer.test.php,v 1.2 2005/03/25 21:00:22 harryf Exp $ +* @package Doku +* @subpackage Tests +*/ + +/** +* Includes +*/ +require_once('./testconfig.php'); +require_once DOKU_INC . 'inc/parser/lexer.php'; + +/** +* @package Doku +* @subpackage Tests +*/ +class TestOfLexerParallelRegex extends UnitTestCase { + function TestOfLexerParallelRegex() { + $this->UnitTestCase(); + } + function testNoPatterns() { + $regex = &new Doku_LexerParallelRegex(false); + $this->assertFalse($regex->match("Hello", $match)); + $this->assertEqual($match, ""); + } + function testNoSubject() { + $regex = &new Doku_LexerParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("", $match)); + $this->assertEqual($match, ""); + } + function testMatchAll() { + $regex = &new Doku_LexerParallelRegex(false); + $regex->addPattern(".*"); + $this->assertTrue($regex->match("Hello", $match)); + $this->assertEqual($match, "Hello"); + } + function testCaseSensitive() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "abc"); + } + function testCaseInsensitive() { + $regex = &new Doku_LexerParallelRegex(false); + $regex->addPattern("abc"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + } + function testMatchMultiple() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("abc"); + $regex->addPattern("ABC"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + $this->assertFalse($regex->match("Hello", $match)); + } + function testPatternLabels() { + $regex = &new Doku_LexerParallelRegex(false); + $regex->addPattern("abc", "letter"); + $regex->addPattern("123", "number"); + $this->assertIdentical($regex->match("abcdef", $match), "letter"); + $this->assertEqual($match, "abc"); + $this->assertIdentical($regex->match("0123456789", $match), "number"); + $this->assertEqual($match, "123"); + } + function testMatchMultipleWithLookaheadNot() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("abc"); + $regex->addPattern("ABC"); + $regex->addPattern("a(?!\n).{1}"); + $this->assertTrue($regex->match("abcdef", $match)); + $this->assertEqual($match, "abc"); + $this->assertTrue($regex->match("AAABCabcdef", $match)); + $this->assertEqual($match, "ABC"); + $this->assertTrue($regex->match("a\nab", $match)); + $this->assertEqual($match, "ab"); + $this->assertFalse($regex->match("Hello", $match)); + } + function testMatchSetOptionCaseless() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("a(?i)b(?i)c"); + $this->assertTrue($regex->match("aBc", $match)); + $this->assertEqual($match, "aBc"); + } + function testMatchSetOptionUngreedy() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("(?U)\w+"); + $this->assertTrue($regex->match("aaaaaa", $match)); + $this->assertEqual($match, "a"); + } + function testMatchLookaheadEqual() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("\w(?=c)"); + $this->assertTrue($regex->match("xbyczd", $match)); + $this->assertEqual($match, "y"); + } + function testMatchLookaheadNot() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("\w(?!b|c)"); + $this->assertTrue($regex->match("xbyczd", $match)); + $this->assertEqual($match, "b"); + } + function testMatchLookbehindEqual() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("(?<=c)\w"); + $this->assertTrue($regex->match("xbyczd", $match)); + $this->assertEqual($match, "z"); + } + function testMatchLookbehindNot() { + $regex = &new Doku_LexerParallelRegex(true); + $regex->addPattern("(?<!\A|x|b)\w"); + $this->assertTrue($regex->match("xbyczd", $match)); + $this->assertEqual($match, "c"); + } +} + + +class TestOfLexerStateStack extends UnitTestCase { + function TestOfLexerStateStack() { + $this->UnitTestCase(); + } + function testStartState() { + $stack = &new Doku_LexerStateStack("one"); + $this->assertEqual($stack->getCurrent(), "one"); + } + function testExhaustion() { + $stack = &new Doku_LexerStateStack("one"); + $this->assertFalse($stack->leave()); + } + function testStateMoves() { + $stack = &new Doku_LexerStateStack("one"); + $stack->enter("two"); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("three"); + $this->assertEqual($stack->getCurrent(), "three"); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "two"); + $stack->enter("third"); + $this->assertEqual($stack->getCurrent(), "third"); + $this->assertTrue($stack->leave()); + $this->assertTrue($stack->leave()); + $this->assertEqual($stack->getCurrent(), "one"); + } +} + +class TestParser { + function TestParser() { + } + function accept() { + } + function a() { + } + function b() { + } +} +Mock::generate('TestParser'); + +class TestOfLexer extends UnitTestCase { + function TestOfLexer() { + $this->UnitTestCase(); + } + function testNoPatterns() { + $handler = &new MockTestParser($this); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $lexer = &new Doku_Lexer($handler); + $this->assertFalse($lexer->parse("abcdef")); + } + function testEmptyPage() { + $handler = &new MockTestParser($this); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $handler->expectNever("accept"); + $handler->setReturnValue("accept", true); + $lexer = &new Doku_Lexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("")); + } + function testSinglePattern() { + $handler = &new MockTestParser($this); + $handler->expectArgumentsAt(0, "accept", array("aaa", DOKU_LEXER_MATCHED, 0)); + $handler->expectArgumentsAt(1, "accept", array("x", DOKU_LEXER_UNMATCHED, 3)); + $handler->expectArgumentsAt(2, "accept", array("a", DOKU_LEXER_MATCHED, 4)); + $handler->expectArgumentsAt(3, "accept", array("yyy", DOKU_LEXER_UNMATCHED, 5)); + $handler->expectArgumentsAt(4, "accept", array("a", DOKU_LEXER_MATCHED, 8)); + $handler->expectArgumentsAt(5, "accept", array("x", DOKU_LEXER_UNMATCHED, 9)); + $handler->expectArgumentsAt(6, "accept", array("aaa", DOKU_LEXER_MATCHED, 10)); + $handler->expectArgumentsAt(7, "accept", array("z", DOKU_LEXER_UNMATCHED, 13)); + $handler->expectCallCount("accept", 8); + $handler->setReturnValue("accept", true); + $lexer = &new Doku_Lexer($handler); + $lexer->addPattern("a+"); + $this->assertTrue($lexer->parse("aaaxayyyaxaaaz")); + $handler->tally(); + } + function testMultiplePattern() { + $handler = &new MockTestParser($this); + $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x"); + $positions = array(0,1,2,3,5,6,7,8,14,15); + for ($i = 0; $i < count($target); $i++) { + $handler->expectArgumentsAt($i, "accept", array($target[$i], '*', $positions[$i])); + } + $handler->expectCallCount("accept", count($target)); + $handler->setReturnValue("accept", true); + $lexer = &new Doku_Lexer($handler); + $lexer->addPattern("a+"); + $lexer->addPattern("b+"); + $this->assertTrue($lexer->parse("ababbxbaxxxxxxax")); + $handler->tally(); + } +} + +class TestOfLexerModes extends UnitTestCase { + function TestOfLexerModes() { + $this->UnitTestCase(); + } + function testIsolatedPattern() { + $handler = &new MockTestParser($this); + $handler->expectArgumentsAt(0, "a", array("a", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,1)); + $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,2)); + $handler->expectArgumentsAt(3, "a", array("bxb", DOKU_LEXER_UNMATCHED,4)); + $handler->expectArgumentsAt(4, "a", array("aaa", DOKU_LEXER_MATCHED,7)); + $handler->expectArgumentsAt(5, "a", array("x", DOKU_LEXER_UNMATCHED,10)); + $handler->expectArgumentsAt(6, "a", array("aaaa", DOKU_LEXER_MATCHED,11)); + $handler->expectArgumentsAt(7, "a", array("x", DOKU_LEXER_UNMATCHED,15)); + $handler->expectCallCount("a", 8); + $handler->setReturnValue("a", true); + $lexer = &new Doku_Lexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabxbaaaxaaaax")); + $handler->tally(); + } + function testModeChange() { + $handler = &new MockTestParser($this); + $handler->expectArgumentsAt(0, "a", array("a", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,1)); + $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,2)); + $handler->expectArgumentsAt(3, "a", array("b", DOKU_LEXER_UNMATCHED,4)); + $handler->expectArgumentsAt(4, "a", array("aaa", DOKU_LEXER_MATCHED,5)); + $handler->expectArgumentsAt(0, "b", array(":", DOKU_LEXER_ENTER,8)); + $handler->expectArgumentsAt(1, "b", array("a", DOKU_LEXER_UNMATCHED,9)); + $handler->expectArgumentsAt(2, "b", array("b", DOKU_LEXER_MATCHED, 10)); + $handler->expectArgumentsAt(3, "b", array("a", DOKU_LEXER_UNMATCHED,11)); + $handler->expectArgumentsAt(4, "b", array("bb", DOKU_LEXER_MATCHED,12)); + $handler->expectArgumentsAt(5, "b", array("a", DOKU_LEXER_UNMATCHED,14)); + $handler->expectArgumentsAt(6, "b", array("bbb", DOKU_LEXER_MATCHED,15)); + $handler->expectArgumentsAt(7, "b", array("a", DOKU_LEXER_UNMATCHED,18)); + $handler->expectCallCount("a", 5); + $handler->expectCallCount("b", 8); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $lexer = &new Doku_Lexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern(":", "a", "b"); + $lexer->addPattern("b+", "b"); + $this->assertTrue($lexer->parse("abaabaaa:ababbabbba")); + $handler->tally(); + } + function testNesting() { + $handler = &new MockTestParser($this); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array("b", DOKU_LEXER_UNMATCHED,2)); + $handler->expectArgumentsAt(2, "a", array("aa", DOKU_LEXER_MATCHED,3)); + $handler->expectArgumentsAt(3, "a", array("b", DOKU_LEXER_UNMATCHED,5)); + $handler->expectArgumentsAt(0, "b", array("(", DOKU_LEXER_ENTER,6)); + $handler->expectArgumentsAt(1, "b", array("bb", DOKU_LEXER_MATCHED,7)); + $handler->expectArgumentsAt(2, "b", array("a", DOKU_LEXER_UNMATCHED,9)); + $handler->expectArgumentsAt(3, "b", array("bb", DOKU_LEXER_MATCHED,10)); + $handler->expectArgumentsAt(4, "b", array(")", DOKU_LEXER_EXIT,12)); + $handler->expectArgumentsAt(4, "a", array("aa", DOKU_LEXER_MATCHED,13)); + $handler->expectArgumentsAt(5, "a", array("b", DOKU_LEXER_UNMATCHED,15)); + $handler->expectCallCount("a", 6); + $handler->expectCallCount("b", 5); + $lexer = &new Doku_Lexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addEntryPattern("(", "a", "b"); + $lexer->addPattern("b+", "b"); + $lexer->addExitPattern(")", "b"); + $this->assertTrue($lexer->parse("aabaab(bbabb)aab")); + $handler->tally(); + } + function testSingular() { + $handler = &new MockTestParser($this); + $handler->setReturnValue("a", true); + $handler->setReturnValue("b", true); + $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array("aa", DOKU_LEXER_MATCHED,3)); + $handler->expectArgumentsAt(2, "a", array("xx", DOKU_LEXER_UNMATCHED,5)); + $handler->expectArgumentsAt(3, "a", array("xx", DOKU_LEXER_UNMATCHED,10)); + $handler->expectArgumentsAt(0, "b", array("b", DOKU_LEXER_SPECIAL,2)); + $handler->expectArgumentsAt(1, "b", array("bbb", DOKU_LEXER_SPECIAL,7)); + $handler->expectCallCount("a", 4); + $handler->expectCallCount("b", 2); + $lexer = &new Doku_Lexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addSpecialPattern("b+", "a", "b"); + $this->assertTrue($lexer->parse("aabaaxxbbbxx")); + $handler->tally(); + } + function testUnwindTooFar() { + $handler = &new MockTestParser($this); + $handler->setReturnValue("a", true); + $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array(")", DOKU_LEXER_EXIT,2)); + $handler->expectCallCount("a", 2); + $lexer = &new Doku_Lexer($handler, "a"); + $lexer->addPattern("a+", "a"); + $lexer->addExitPattern(")", "a"); + $this->assertFalse($lexer->parse("aa)aa")); + $handler->tally(); + } +} + +class TestOfLexerHandlers extends UnitTestCase { + function TestOfLexerHandlers() { + $this->UnitTestCase(); + } + function testModeMapping() { + $handler = &new MockTestParser($this); + $handler->setReturnValue("a", true); + $handler->expectArgumentsAt(0, "a", array("aa", DOKU_LEXER_MATCHED,0)); + $handler->expectArgumentsAt(1, "a", array("(", DOKU_LEXER_ENTER,2)); + $handler->expectArgumentsAt(2, "a", array("bb", DOKU_LEXER_MATCHED,3)); + $handler->expectArgumentsAt(3, "a", array("a", DOKU_LEXER_UNMATCHED,5)); + $handler->expectArgumentsAt(4, "a", array("bb", DOKU_LEXER_MATCHED,6)); + $handler->expectArgumentsAt(5, "a", array(")", DOKU_LEXER_EXIT,8)); + $handler->expectArgumentsAt(6, "a", array("b", DOKU_LEXER_UNMATCHED,9)); + $handler->expectCallCount("a", 7); + $lexer = &new Doku_Lexer($handler, "mode_a"); + $lexer->addPattern("a+", "mode_a"); + $lexer->addEntryPattern("(", "mode_a", "mode_b"); + $lexer->addPattern("b+", "mode_b"); + $lexer->addExitPattern(")", "mode_b"); + $lexer->mapHandler("mode_a", "a"); + $lexer->mapHandler("mode_b", "a"); + $this->assertTrue($lexer->parse("aa(bbabb)b")); + $handler->tally(); + } +} + +class TestParserByteIndex { + + function TestParserByteIndex() {} + + function ignore() {} + + function catch() {} +} + +Mock::generate('TestParserByteIndex'); + +class TestOfLexerByteIndices extends UnitTestCase { + + function TestOfLexerByteIndices() { + $this->UnitTestCase(); + } + + function testIndex() { + $doc = "aaa<file>bcd</file>eee"; + + $handler = &new MockTestParserByteIndex($this); + $handler->setReturnValue("ignore", true); + $handler->setReturnValue("catch", true); + + $handler->expectArgumentsAt( + 0, + "catch", + array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>')) + ); + $handler->expectArgumentsAt( + 1, + "catch", + array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b')) + ); + $handler->expectArgumentsAt( + 2, + "catch", + array("c", DOKU_LEXER_MATCHED, strpos($doc,'c')) + ); + $handler->expectArgumentsAt( + 3, + "catch", + array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d')) + ); + $handler->expectArgumentsAt( + 4, + "catch", + array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>')) + ); + $handler->expectCallCount("catch", 5); + + $lexer = &new Doku_Lexer($handler, "ignore"); + $lexer->addEntryPattern("<file>", "ignore", "catch"); + $lexer->addExitPattern("</file>", "catch"); + $lexer->addSpecialPattern('b','catch','special'); + $lexer->mapHandler('special','catch'); + $lexer->addPattern('c','catch'); + + $this->assertTrue($lexer->parse($doc)); + $handler->tally(); + } + + function testIndexLookaheadEqual() { + $doc = "aaa<file>bcd</file>eee"; + + $handler = &new MockTestParserByteIndex($this); + $handler->setReturnValue("ignore", true); + $handler->setReturnValue("catch", true); + + $handler->expectArgumentsAt( + 0, + "catch", + array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>')) + ); + $handler->expectArgumentsAt( + 1, + "catch", + array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b')) + ); + $handler->expectArgumentsAt( + 2, + "catch", + array("c", DOKU_LEXER_MATCHED, strpos($doc,'c')) + ); + $handler->expectArgumentsAt( + 3, + "catch", + array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d')) + ); + $handler->expectArgumentsAt( + 4, + "catch", + array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>')) + ); + $handler->expectCallCount("catch", 5); + + $lexer = &new Doku_Lexer($handler, "ignore"); + $lexer->addEntryPattern('<file>(?=.*\x3C/file\x3E)', "ignore", "catch"); + $lexer->addExitPattern("</file>", "catch"); + $lexer->addSpecialPattern('b','catch','special'); + $lexer->mapHandler('special','catch'); + $lexer->addPattern('c','catch'); + + $this->assertTrue($lexer->parse($doc)); + $handler->tally(); + } + + function testIndexLookaheadNotEqual() { + $doc = "aaa<file>bcd</file>eee"; + + $handler = &new MockTestParserByteIndex($this); + $handler->setReturnValue("ignore", true); + $handler->setReturnValue("catch", true); + + $handler->expectArgumentsAt( + 0, + "catch", + array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>')) + ); + $handler->expectArgumentsAt( + 1, + "catch", + array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b')) + ); + $handler->expectArgumentsAt( + 2, + "catch", + array("c", DOKU_LEXER_MATCHED, strpos($doc,'c')) + ); + $handler->expectArgumentsAt( + 3, + "catch", + array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d')) + ); + $handler->expectArgumentsAt( + 4, + "catch", + array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>')) + ); + $handler->expectCallCount("catch", 5); + + $lexer = &new Doku_Lexer($handler, "ignore"); + $lexer->addEntryPattern('<file>(?!foo)', "ignore", "catch"); + $lexer->addExitPattern("</file>", "catch"); + $lexer->addSpecialPattern('b','catch','special'); + $lexer->mapHandler('special','catch'); + $lexer->addPattern('c','catch'); + + $this->assertTrue($lexer->parse($doc)); + $handler->tally(); + } + + function testIndexLookbehindEqual() { + $doc = "aaa<file>bcd</file>eee"; + + $handler = &new MockTestParserByteIndex($this); + $handler->setReturnValue("ignore", true); + $handler->setReturnValue("catch", true); + + $handler->expectArgumentsAt( + 0, + "catch", + array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>')) + ); + $handler->expectArgumentsAt( + 1, + "catch", + array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b')) + ); + $handler->expectArgumentsAt( + 2, + "catch", + array("c", DOKU_LEXER_MATCHED, strpos($doc,'c')) + ); + $handler->expectArgumentsAt( + 3, + "catch", + array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d')) + ); + $handler->expectArgumentsAt( + 4, + "catch", + array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>')) + ); + $handler->expectCallCount("catch", 5); + + $lexer = &new Doku_Lexer($handler, "ignore"); + $lexer->addEntryPattern('<file>', "ignore", "catch"); + $lexer->addExitPattern("(?<=d)</file>", "catch"); + $lexer->addSpecialPattern('b','catch','special'); + $lexer->mapHandler('special','catch'); + $lexer->addPattern('c','catch'); + + $this->assertTrue($lexer->parse($doc)); + $handler->tally(); + } + + function testIndexLookbehindNotEqual() { + $doc = "aaa<file>bcd</file>eee"; + + $handler = &new MockTestParserByteIndex($this); + $handler->setReturnValue("ignore", true); + $handler->setReturnValue("catch", true); + + $handler->expectArgumentsAt( + 0, + "catch", + array("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>')) + ); + $handler->expectArgumentsAt( + 1, + "catch", + array("b", DOKU_LEXER_SPECIAL, strpos($doc,'b')) + ); + $handler->expectArgumentsAt( + 2, + "catch", + array("c", DOKU_LEXER_MATCHED, strpos($doc,'c')) + ); + $handler->expectArgumentsAt( + 3, + "catch", + array("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d')) + ); + $handler->expectArgumentsAt( + 4, + "catch", + array("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>')) + ); + $handler->expectCallCount("catch", 5); + + $lexer = &new Doku_Lexer($handler, "ignore"); + $lexer->addEntryPattern('<file>', "ignore", "catch"); + $lexer->addExitPattern("(?<!c)</file>", "catch"); + $lexer->addSpecialPattern('b','catch','special'); + $lexer->mapHandler('special','catch'); + $lexer->addPattern('c','catch'); + + $this->assertTrue($lexer->parse($doc)); + $handler->tally(); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = & new GroupTest('LexerTests'); + $test->addTestCase(new TestOfLexerParallelRegex()); + $test->addTestCase(new TestOfLexerStateStack()); + $test->addTestCase(new TestOfLexer()); + $test->addTestCase(new TestOfLexerModes()); + $test->addTestCase(new TestOfLexerHandlers()); + $test->addTestCase(new TestOfLexerByteIndices()); + $test->run(new HtmlReporter()); +} +?> diff --git a/inc/parser/tests/parser.group.php b/inc/parser/tests/parser.group.php new file mode 100644 index 000000000..ca9084127 --- /dev/null +++ b/inc/parser/tests/parser.group.php @@ -0,0 +1,46 @@ +<?php +/** +* @version $Id: parser.group.php,v 1.3 2005/03/30 13:42:10 harryf Exp $ +* @package Dokuwiki +* @subpackage Tests +*/ + +/** +* Init +*/ +require_once('./testconfig.php'); + +/** +* @package Dokuwiki +* @subpackage Tests +*/ +class ParserGroupTest extends GroupTest { + + function ParserGroupTest() { + $this->GroupTest('ParserGroupTest'); + $this->addTestFile('parser_eol.test.php'); + $this->addTestFile('parser_footnote.test.php'); + $this->addTestFile('parser_formatting.test.php'); + $this->addTestFile('parser_headers.test.php'); + $this->addTestFile('parser_i18n.test.php'); + $this->addTestFile('parser_links.test.php'); + $this->addTestFile('parser_lists.test.php'); + $this->addTestFile('parser_preformatted.test.php'); + $this->addTestFile('parser_quote.test.php'); + $this->addTestFile('parser_replacements.test.php'); + $this->addTestFile('parser_table.test.php'); + $this->addTestFile('parser_tocsections.test.php'); + $this->addTestFile('parser_unformatted.test.php'); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new ParserGroupTest(); + $test->run(new HtmlReporter()); +} +?> diff --git a/inc/parser/tests/parser.test.php b/inc/parser/tests/parser.test.php new file mode 100644 index 000000000..53ac650d8 --- /dev/null +++ b/inc/parser/tests/parser.test.php @@ -0,0 +1,47 @@ +<?php +/** +* @version $Id: parser.test.php,v 1.2 2005/03/25 21:00:22 harryf Exp $ +* @package Doku +* @subpackage Tests +*/ + +/** +* Includes +*/ +require_once('./testconfig.php'); +require_once DOKU_INC . 'inc/parser/parser.php'; +require_once DOKU_INC . 'inc/parser/handler.php'; +//require_once DOKU . 'parser/renderer.php'; + +//Mock::generate('Doku_Renderer'); + +/** +* @package Doku +* @subpackage Tests +*/ +class TestOfDoku_Parser extends UnitTestCase { + + var $P; + var $H; + + function TestOfDoku_Parser() { + $this->UnitTestCase('TestOfDoku_Parser'); + } + + function setup() { + $this->P = & new Doku_Parser(); + $this->H = & new Doku_Handler(); + $this->P->Handler = & $this->H; + } + + function tearDown() { + unset($this->P); + unset($this->H); + } +} + +function stripByteIndex($call) { + unset($call[2]); + return $call; +} + diff --git a/inc/parser/tests/parser_eol.test.php b/inc/parser/tests/parser_eol.test.php new file mode 100644 index 000000000..44ade3dda --- /dev/null +++ b/inc/parser/tests/parser_eol.test.php @@ -0,0 +1,127 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Eol extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Eol() { + $this->UnitTestCase('TestOfDoku_Parser_Eol'); + } + + function testEol() { + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo\nBar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("Bar")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testEolMultiple() { + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo\n\nbar\nFoo"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("bar")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testWinEol() { + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo\r\nBar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("Bar")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testLinebreak() { + $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); + $this->P->parse('Foo\\\\ Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo")), + array('linebreak',array()), + array('cdata',array("Bar\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testLinebreakPlusEol() { + $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('Foo\\\\'."\n\n".'Bar'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('linebreak',array()), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("Bar")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testLinebreakInvalid() { + $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); + $this->P->parse('Foo\\\\Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo\\\\Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Eol(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_footnote.test.php b/inc/parser/tests/parser_footnote.test.php new file mode 100644 index 000000000..2bcfb3472 --- /dev/null +++ b/inc/parser/tests/parser_footnote.test.php @@ -0,0 +1,384 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Footnote() { + $this->UnitTestCase('TestOfDoku_Parser_Footnote'); + } + + function setup() { + parent::setup(); + $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote()); + } + + function testFootnote() { + $this->P->parse('Foo (( testing )) Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' testing ')), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotAFootnote() { + $this->P->parse("Foo (( testing\n Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo (( testing\n Bar\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteLinefeed() { + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo (( testing\ntesting )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array('Foo ')), + array('footnote_open',array()), + array('cdata',array(" testing\ntesting ")), + array('footnote_close',array()), + array('cdata',array(' Bar')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteNested() { + $this->P->parse('Foo (( x((y))z )) Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' x')), + array('footnote_open',array()), + array('cdata',array('y')), + array('footnote_close',array()), + array('cdata',array('z ')), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteEol() { + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo \nX(( test\ning ))Y\n Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array('Foo ')), + array('p_close',array()), + array('p_open',array()), + array('cdata',array('X')), + array('footnote_open',array()), + array('cdata',array(" test\ning ")), + array('footnote_close',array()), + array('cdata',array('Y')), + array('p_close',array()), + array('p_open',array()), + array('cdata',array(' Bar')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteStrong() { + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse('Foo (( **testing** )) Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('strong_open',array()), + array('cdata',array('testing')), + array('strong_close',array()), + array('cdata',array(' ')), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteHr() { + $this->P->addMode('hr',new Doku_Parser_Mode_HR()); + $this->P->parse("Foo (( \n ---- \n )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('hr',array()), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteCode() { + $this->P->addMode('code',new Doku_Parser_Mode_Code()); + $this->P->parse("Foo (( <code>Test</code> )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('code',array('Test',NULL)), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnotePreformatted() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->parse("Foo (( \n Test\n )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('preformatted',array('Test')), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnotePreformattedEol() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("Foo (( \n Test\n )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array('Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('preformatted',array('Test')), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteUnformatted() { + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse("Foo (( <nowiki>Test</nowiki> )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('unformatted',array('Test')), + array('cdata',array(' ')), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteNotHeader() { + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse("Foo (( \n====Test====\n )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(" \n====Test====\n ")), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteTable() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse("Foo (( +| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | + )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteList() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse("Foo (( + *A + * B + * C + )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testFootnoteQuote() { + $this->P->addMode('quote',new Doku_Parser_Mode_Quote()); + $this->P->parse("Foo (( +> def +>>ghi + )) Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('footnote_open',array()), + array('cdata',array(' ')), + array('quote_open',array()), + array('cdata',array(" def")), + array('quote_open',array()), + array('cdata',array("ghi")), + array('quote_close',array()), + array('quote_close',array()), + array('p_open',array()), + array('cdata',array(' ')), + array('p_close',array()), + array('footnote_close',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Footnote(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_formatting.test.php b/inc/parser/tests/parser_formatting.test.php new file mode 100644 index 000000000..ca89813db --- /dev/null +++ b/inc/parser/tests/parser_formatting.test.php @@ -0,0 +1,271 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Formatting extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Formatting() { + $this->UnitTestCase('TestOfDoku_Parser_Formatting'); + } + + function testStrong() { + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse('abc **bar** def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('strong_open',array()), + array('cdata',array('bar')), + array('strong_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotStrong() { + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse('abc **bar def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc **bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testEm() { + $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis')); + $this->P->parse('abc //bar// def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('emphasis_open',array()), + array('cdata',array('bar')), + array('emphasis_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotEm() { + $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis')); + $this->P->parse('abc //bar def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc //bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testUnderline() { + $this->P->addMode('underline',new Doku_Parser_Mode_Formatting('underline')); + $this->P->parse('abc __bar__ def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('underline_open',array()), + array('cdata',array('bar')), + array('underline_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotUnderline() { + $this->P->addMode('underline',new Doku_Parser_Mode_Formatting('underline')); + $this->P->parse('abc __bar def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc __bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMonospace() { + $this->P->addMode('monospace',new Doku_Parser_Mode_Formatting('monospace')); + $this->P->parse("abc ''bar'' def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('monospace_open',array()), + array('cdata',array('bar')), + array('monospace_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotMonospace() { + $this->P->addMode('monospace',new Doku_Parser_Mode_Formatting('monospace')); + $this->P->parse("abc ''bar def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc ''bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSubscript() { + $this->P->addMode('subscript',new Doku_Parser_Mode_Formatting('subscript')); + $this->P->parse('abc <sub>bar</sub> def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('subscript_open',array()), + array('cdata',array('bar')), + array('subscript_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotSubscript() { + $this->P->addMode('subscript',new Doku_Parser_Mode_Formatting('subscript')); + $this->P->parse('abc <sub>bar def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc <sub>bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSuperscript() { + $this->P->addMode('superscript',new Doku_Parser_Mode_Formatting('superscript')); + $this->P->parse("abc <sup>bar</sup> def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('superscript_open',array()), + array('cdata',array('bar')), + array('superscript_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotSuperscript() { + $this->P->addMode('superscript',new Doku_Parser_Mode_Formatting('superscript')); + $this->P->parse("abc <sup>bar def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc <sup>bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testDeleted() { + $this->P->addMode('deleted',new Doku_Parser_Mode_Formatting('deleted')); + $this->P->parse('abc <del>bar</del> def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('deleted_open',array()), + array('cdata',array('bar')), + array('deleted_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotDeleted() { + $this->P->addMode('deleted',new Doku_Parser_Mode_Formatting('deleted')); + $this->P->parse('abc <del>bar def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc <del>bar def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNestedFormatting() { + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->addMode('emphasis',new Doku_Parser_Mode_Formatting('emphasis')); + $this->P->parse('abc **a//b//c** def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('strong_open',array()), + array('cdata',array('a')), + array('emphasis_open',array()), + array('cdata',array('b')), + array('emphasis_close',array()), + array('cdata',array('c')), + array('strong_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testIllegalNestedFormatting() { + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse('abc **a**b**c** def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('strong_open',array()), + array('cdata',array('a')), + array('strong_close',array()), + array('cdata',array('b')), + array('strong_open',array()), + array('cdata',array('c')), + array('strong_close',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Formatting(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_headers.test.php b/inc/parser/tests/parser_headers.test.php new file mode 100644 index 000000000..b8de6983b --- /dev/null +++ b/inc/parser/tests/parser_headers.test.php @@ -0,0 +1,236 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Headers extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Headers() { + $this->UnitTestCase('TestOfDoku_Parser_Headers'); + } + + function testHeader1() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n ====== Header ====== \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' Header ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeader2() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n ===== Header ===== \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' Header ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeader3() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n ==== Header ==== \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' Header ',3)), + array('section_open',array(3)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeader4() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n === Header === \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' Header ',4)), + array('section_open',array(4)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeader5() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n == Header == \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' Header ',5)), + array('section_open',array(5)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + + function testHeaderLarge() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n ======= Header ======= \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array('= Header =',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeaderSmall() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n= Header =\n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n= Header =\n def\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + + function testHeader1Mixed() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n====== == Header == ======\n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' == Header == ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeader5Mixed() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n== ====== Header ====== ==\n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n")), + array('p_close',array()), + array('header',array(' ====== Header ====== ',5)), + array('section_open',array(5)), + array('p_open',array()), + array('cdata',array(' def'."\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testHeaderMultiline() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("abc \n== ====== Header\n ====== ==\n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc \n== ====== Header\n")), + array('p_close',array()), + array('header',array('',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array(" def\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testNoToc() { + $this->P->addMode('notoc',new Doku_Parser_Mode_NoToc()); + $this->P->parse('abc ~~NOTOC~~ def'); + $this->assertFalse($this->H->meta['toc']); + } + + function testHeader1Eol() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("abc \n ====== Header ====== \n def"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array('abc ')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' Header ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array(' def')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Headers(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_i18n.test.php b/inc/parser/tests/parser_i18n.test.php new file mode 100644 index 000000000..f9609b07e --- /dev/null +++ b/inc/parser/tests/parser_i18n.test.php @@ -0,0 +1,180 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_i18n extends TestOfDoku_Parser { + + function TestOfDoku_Parser_i18n() { + $this->UnitTestCase('TestOfDoku_Parser_i18n'); + } + + function testFormatting() { + $formats = array ( + 'strong', 'emphasis', 'underline', 'monospace', + 'subscript', 'superscript', 'deleted', + ); + foreach ( $formats as $format ) { + $this->P->addMode($format,new Doku_Parser_Mode_Formatting($format)); + } + $this->P->parse("I**ñ**t__ë__r//n//â<sup>t</sup>i<sub>ô</sub>n''à''liz<del>æ</del>tiøn"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nI")), + array('strong_open',array()), + array('cdata',array('ñ')), + array('strong_close',array()), + array('cdata',array('t')), + array('underline_open',array()), + array('cdata',array('ë')), + array('underline_close',array()), + array('cdata',array('r')), + array('emphasis_open',array()), + array('cdata',array('n')), + array('emphasis_close',array()), + array('cdata',array('â')), + array('superscript_open',array()), + array('cdata',array('t')), + array('superscript_close',array()), + array('cdata',array('i')), + array('subscript_open',array()), + array('cdata',array('ô')), + array('subscript_close',array()), + array('cdata',array('n')), + array('monospace_open',array()), + array('cdata',array('à')), + array('monospace_close',array()), + array('cdata',array('liz')), + array('deleted_open',array()), + array('cdata',array('æ')), + array('deleted_close',array()), + array('cdata',array("tiøn\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testHeader() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->parse("Foo\n ==== Iñtërnâtiônàlizætiøn ==== \n Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo\n")), + array('p_close',array()), + array('header',array(' Iñtërnâtiônàlizætiøn ',3)), + array('section_open',array(3)), + array('p_open',array()), + array('cdata',array(" Bar\n")), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testTable() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +| Row 0 Col 1 | Iñtërnâtiônàlizætiøn | Row 0 Col 3 | +| Row 1 Col 1 | Iñtërnâtiônàlizætiøn | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Iñtërnâtiônàlizætiøn')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Iñtërnâtiônàlizætiøn')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testAcronym() { + $t = array('Iñtërnâtiônàlizætiøn'); + $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym($t)); + $this->P->parse("Foo Iñtërnâtiônàlizætiøn Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo ")), + array('acronym',array('Iñtërnâtiônàlizætiøn')), + array('cdata',array(" Bar\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testInterwiki() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[wp>Iñtërnâtiônàlizætiøn|Iñtërnâtiônàlizætiøn]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('interwikilink',array('wp>Iñtërnâtiônàlizætiøn','Iñtërnâtiônàlizætiøn','wp','Iñtërnâtiônàlizætiøn')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInternalLink() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[x:Iñtërnâtiônàlizætiøn:y:foo_bar:z|Iñtërnâtiônàlizætiøn]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('x:Iñtërnâtiônàlizætiøn:y:foo_bar:z','Iñtërnâtiônàlizætiøn')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_i18n(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_links.test.php b/inc/parser/tests/parser_links.test.php new file mode 100644 index 000000000..4609c399b --- /dev/null +++ b/inc/parser/tests/parser_links.test.php @@ -0,0 +1,522 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Links extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Links() { + $this->UnitTestCase('TestOfDoku_Parser_Links'); + } + + + function testExternalLinkSimple() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo http://www.google.com Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('http://www.google.com ', NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalLinkCase() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo HTTP://WWW.GOOGLE.COM Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('HTTP://WWW.GOOGLE.COM ', NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalLinkJavascript() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo javascript:alert('XSS'); Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo javascript:alert('XSS'); Bar\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalWWWLink() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo www.google.com Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('www.google.com ', NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalFTPLink() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo ftp.sunsite.com Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('ftp.sunsite.com ', NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testEmail() { + $this->P->addMode('email',new Doku_Parser_Mode_Email()); + $this->P->parse("Foo <bugs@php.net> Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('email',array('bugs@php.net', NULL)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInternalLinkOneChar() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[l]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('l',NULL)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInternalLinkNamespaceNoTitle() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[foo:bar]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('foo:bar',NULL)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInternalLinkNamespace() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[x:1:y:foo_bar:z|Test]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('x:1:y:foo_bar:z','Test')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInternalLinkSectionRef() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[wiki:syntax#internal|Syntax]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('wiki:syntax#internal','Syntax')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalInInternalLink() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[http://www.google.com|Google]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('http://www.google.com','Google')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInterwikiLink() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[iw>somepage|Some Page]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('interwikilink',array('iw>somepage','Some Page','iw','somepage')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInterwikiLinkCase() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[IW>somepage|Some Page]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('interwikilink',array('IW>somepage','Some Page','iw','somepage')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testInterwikiPedia() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[wp>Callback_(computer_science)|callbacks]] Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('interwikilink',array('wp>Callback_(computer_science)','callbacks','wp','Callback_(computer_science)')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testCamelCase() { + $this->P->addMode('camelcaselink',new Doku_Parser_Mode_CamelCaseLink()); + $this->P->parse("Foo FooBar Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('camelcaselink',array('FooBar')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testFileLink() { + $this->P->addMode('filelink',new Doku_Parser_Mode_FileLink()); + $this->P->parse('Foo file://temp/file.txt Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('filelink',array('file://temp/file.txt ',NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testFileLinkInternal() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse('Foo [[file://temp/file.txt|Some File]] Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('filelink',array('file://temp/file.txt','Some File')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testWindowsShareLink() { + $this->P->addMode('windowssharelink',new Doku_Parser_Mode_WindowsShareLink()); + $this->P->parse('Foo \\\server\share Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo')), + array('windowssharelink',array(' \\\server\share ',NULL)), + array('cdata',array('Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testWindowsShareLinkInternal() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse('Foo [[\\\server\share|My Documents]] Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('windowssharelink',array('\\\server\share','My Documents')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternal() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{img.gif}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif',NULL,NULL,NULL,NULL,TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaNotImage() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{foo.txt?10x10|Some File}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('foo.txt','Some File')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternalLAlign() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{img.gif }} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif',NULL,'left',NULL,NULL,TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternalRAlign() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{ img.gif}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif',NULL,'right',NULL,NULL,TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternalCenter() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{ img.gif }} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif',NULL,'center',NULL,NULL,TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternalParams() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{img.gif?50x100nocache}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif',NULL,NULL,'50','100',FALSE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInternalTitle() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{img.gif?50x100|Some Image}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia',array('img.gif','Some Image',NULL,'50','100',TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaExternal() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{http://www.google.com/img.gif}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,NULL,NULL,TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaExternalParams() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{http://www.google.com/img.gif?50x100nocache}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externalmedia',array('http://www.google.com/img.gif',NULL,NULL,'50','100',FALSE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaExternalTitle() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{http://www.google.com/img.gif?50x100|Some Image}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externalmedia', + array('http://www.google.com/img.gif','Some Image',NULL,'50','100',TRUE)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaInInternalLink() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[x:1:y:foo_bar:z|{{img.gif?10x20nocache|Some Image}}]] Bar"); + + $image = array( + 'type'=>'internalmedia', + 'src'=>'img.gif', + 'title'=>'Some Image', + 'align'=>NULL, + 'width'=>10, + 'height'=>20, + 'cache'=>FALSE, + ); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('x:1:y:foo_bar:z',$image)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testMediaNoImageInInternalLink() { + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->parse("Foo [[x:1:y:foo_bar:z|{{foo.txt?10x20nocache|Some Image}}]] Bar"); + + $image = array( + 'type'=>'internalmedia', + 'src'=>'img.gif', + 'title'=>'Some Image', + 'align'=>NULL, + 'width'=>10, + 'height'=>20, + 'cache'=>FALSE, + ); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internallink',array('x:1:y:foo_bar:z','{{foo.txt?10x20nocache|Some Image}}')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testNestedMedia() { + $this->P->addMode('media',new Doku_Parser_Mode_Media()); + $this->P->parse('Foo {{img.gif|{{foo.gif|{{bar.gif|Bar}}}}}} Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('internalmedia', + array('img.gif','{{foo.gif|{{bar.gif|Bar',NULL,NULL,NULL,TRUE)), + array('cdata',array('}}}} Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Links(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_lists.test.php b/inc/parser/tests/parser_lists.test.php new file mode 100644 index 000000000..92bef7812 --- /dev/null +++ b/inc/parser/tests/parser_lists.test.php @@ -0,0 +1,422 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Lists extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Lists() { + $this->UnitTestCase('TestOfDoku_Parser_Lists'); + } + + function testUnorderedList() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse(' + *A + * B + * C +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testOrderedList() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse(' + -A + - B + - C +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listo_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listo_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + + function testMixedList() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse(' + -A + * B + - C +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listo_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testUnorderedListWinEOL() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse("\r\n *A\r\n * B\r\n * C\r\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testOrderedListWinEOL() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse("\r\n -A\r\n - B\r\n - C\r\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listo_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listo_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testNotAList() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse("Foo -bar *foo Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nFoo -bar *foo Bar\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testUnorderedListParagraph() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('Foo + *A + * B + * C +Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("Foo")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("Bar")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // This is really a failing test - formatting able to spread across list items + // Problem is fixing it would mean a major rewrite of lists + function testUnorderedListStrong() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse(' + ***A** + *** B + * C** +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('strong_open',array()), + array('cdata',array("A")), + array('strong_close',array()), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('strong_open',array()), + array('cdata',array(" B\n * C")), + array('strong_close',array()), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // This is really a failing test - unformatted able to spread across list items + // Problem is fixing it would mean a major rewrite of lists + function testUnorderedListUnformatted() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse(' + *%%A%% + *%% B + * C%% +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('unformatted',array("A")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('unformatted',array(" B\n * C")), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testUnorderedListLinebreak() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); + $this->P->parse(' + *A\\\\ D + * B + * C +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array("A")), + array('linebreak',array()), + array('cdata',array("D")), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('cdata',array(' B')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(' C')), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // Huh? + function testUnorderedListFootnote() { + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote()); + $this->P->parse(' + *((A)) + *(( B + * C )) + +'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('footnote_open',array()), + array('cdata',array("A")), + array('footnote_close',array()), + array('listcontent_close',array()), + array('listu_open',array()), + array('listitem_open',array(2)), + array('listcontent_open',array()), + array('footnote_open',array()), + array('cdata',array(" B\n * C")), + array('footnote_close',array()), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Lists(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_preformatted.test.php b/inc/parser/tests/parser_preformatted.test.php new file mode 100644 index 000000000..2b5746216 --- /dev/null +++ b/inc/parser/tests/parser_preformatted.test.php @@ -0,0 +1,244 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Preformatted extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Preformatted() { + $this->UnitTestCase('TestOfDoku_Parser_Preformatted'); + } + + function testFile() { + $this->P->addMode('file',new Doku_Parser_Mode_File()); + $this->P->parse('Foo <file>testing</file> Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('file',array('testing')), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testCode() { + $this->P->addMode('code',new Doku_Parser_Mode_Code()); + $this->P->parse('Foo <code>testing</code> Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('code',array('testing', NULL)), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testCodeWhitespace() { + $this->P->addMode('code',new Doku_Parser_Mode_Code()); + $this->P->parse("Foo <code \n>testing</code> Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('code',array('testing', NULL)), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testCodeLang() { + $this->P->addMode('code',new Doku_Parser_Mode_Code()); + $this->P->parse("Foo <code php>testing</code> Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('code',array('testing', 'php')), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformatted() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->parse("F oo\n x \n y \nBar\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nF oo")), + array('p_close',array()), + array('preformatted',array("x \n y ")), + array('p_open',array()), + array('cdata',array('Bar'."\n\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformattedWinEOL() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->parse("F oo\r\n x \r\n y \r\nBar\r\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nF oo")), + array('p_close',array()), + array('preformatted',array("x \n y ")), + array('p_open',array()), + array('cdata',array('Bar'."\n\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformattedTab() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->parse("F oo\n\tx\t\n\t\ty\t\nBar\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nF oo")), + array('p_close',array()), + array('preformatted',array("x\t\n\ty\t")), + array('p_open',array()), + array('cdata',array("Bar\n\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformattedTabWinEOL() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->parse("F oo\r\n\tx\t\r\n\t\ty\t\r\nBar\r\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nF oo")), + array('p_close',array()), + array('preformatted',array("x\t\n\ty\t")), + array('p_open',array()), + array('cdata',array("Bar\n\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformattedList() { + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->addMode('listblock',new Doku_Parser_Mode_ListBlock()); + $this->P->parse(" - x \n * y \nF oo\n x \n y \n -X\n *Y\nBar\n"); + $calls = array ( + array('document_start',array()), + array('listo_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(" x ")), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listo_close',array()), + array('listu_open',array()), + array('listitem_open',array(1)), + array('listcontent_open',array()), + array('cdata',array(" y ")), + array('listcontent_close',array()), + array('listitem_close',array()), + array('listu_close',array()), + array('p_open',array()), + array('cdata',array("F oo")), + array('p_close',array()), + array('preformatted',array("x \n y \n-X\n*Y")), + array('p_open',array()), + array('cdata',array("Bar\n\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPHP() { + $this->P->addMode('php',new Doku_Parser_Mode_PHP()); + $this->P->parse('Foo <php>testing</php> Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('php',array('testing')), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testHTML() { + $this->P->addMode('html',new Doku_Parser_Mode_HTML()); + $this->P->parse('Foo <html>testing</html> Bar'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('html',array('testing')), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testPreformattedPlusHeaderAndEol() { + // Note that EOL must come after preformatted! + $this->P->addMode('preformatted',new Doku_Parser_Mode_Preformatted()); + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("F oo\n ==Test==\n y \nBar\n"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("F oo")), + array('p_close',array()), + array('preformatted',array("==Test==\n y ")), + array('p_open',array()), + array('cdata',array('Bar')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Preformatted(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_quote.test.php b/inc/parser/tests/parser_quote.test.php new file mode 100644 index 000000000..ccee56062 --- /dev/null +++ b/inc/parser/tests/parser_quote.test.php @@ -0,0 +1,114 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Quote extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Quote() { + $this->UnitTestCase('TestOfDoku_Parser_Quote'); + } + + function testQuote() { + $this->P->addMode('quote',new Doku_Parser_Mode_Quote()); + $this->P->parse("abc\n> def\n>>ghi\nklm"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc")), + array('p_close',array()), + array('quote_open',array()), + array('cdata',array(" def")), + array('quote_open',array()), + array('cdata',array("ghi")), + array('quote_close',array()), + array('quote_close',array()), + array('p_open',array()), + array('cdata',array("klm\n")), + array('p_close',array()), + array('document_end',array()), + + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testQuoteWinCr() { + $this->P->addMode('quote',new Doku_Parser_Mode_Quote()); + $this->P->parse("abc\r\n> def\r\n>>ghi\r\nklm"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\nabc")), + array('p_close',array()), + array('quote_open',array()), + array('cdata',array(" def")), + array('quote_open',array()), + array('cdata',array("ghi")), + array('quote_close',array()), + array('quote_close',array()), + array('p_open',array()), + array('cdata',array("klm\n")), + array('p_close',array()), + array('document_end',array()), + + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testQuoteMinumumContext() { + $this->P->addMode('quote',new Doku_Parser_Mode_Quote()); + $this->P->parse("\n> def\n>>ghi\n "); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n")), + array('p_close',array()), + array('quote_open',array()), + array('cdata',array(" def")), + array('quote_open',array()), + array('cdata',array("ghi")), + array('quote_close',array()), + array('quote_close',array()), + array('p_open',array()), + array('cdata',array(" \n")), + array('p_close',array()), + array('document_end',array()), + + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testQuoteEol() { + $this->P->addMode('quote',new Doku_Parser_Mode_Quote()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse("abc\n> def\n>>ghi\nklm"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('quote_open',array()), + array('cdata',array(" def")), + array('quote_open',array()), + array('cdata',array("ghi")), + array('quote_close',array()), + array('quote_close',array()), + array('p_open',array()), + array('cdata',array("klm")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Quote(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_replacements.test.php b/inc/parser/tests/parser_replacements.test.php new file mode 100644 index 000000000..0aae4496b --- /dev/null +++ b/inc/parser/tests/parser_replacements.test.php @@ -0,0 +1,377 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Replacements() { + $this->UnitTestCase('TestOfDoku_Parser_Replacements'); + } + + + function testSingleAcronym() { + $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR'))); + $this->P->parse('abc FOOBAR xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('acronym',array('FOOBAR')), + array('cdata',array(' xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testAlmostAnAcronym() { + $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOOBAR'))); + $this->P->parse('abcFOOBARxyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abcFOOBARxyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMultipleAcronyms() { + $this->P->addMode('acronym',new Doku_Parser_Mode_Acronym(array('FOO','BAR'))); + $this->P->parse('abc FOO def BAR xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('acronym',array('FOO')), + array('cdata',array(' def ')), + array('acronym',array('BAR')), + array('cdata',array(' xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + + } + // + + function testSingleSmiley() { + $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)'))); + $this->P->parse('abc:-)xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc')), + array('smiley',array(':-)')), + array('cdata',array('xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMultipleSmileys() { + $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-)','^_^'))); + $this->P->parse('abc:-)x^_^yz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc')), + array('smiley',array(':-)')), + array('cdata',array('x')), + array('smiley',array('^_^')), + array('cdata',array('yz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + + } + + function testBackslashSmiley() { + // This smiley is really :-\\ but escaping makes like interesting + $this->P->addMode('smiley',new Doku_Parser_Mode_Smiley(array(':-\\\\'))); + $this->P->parse('abc:-\\\xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc')), + array('smiley',array(':-\\\\')), + array('cdata',array('xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSingleWordblock() { + $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT'))); + $this->P->parse('abc CAT xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('wordblock',array('CAT')), + array('cdata',array(' xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testWordblockCase() { + $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT'))); + $this->P->parse('abc cat xyz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('wordblock',array('cat')), + array('cdata',array(' xyz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMultipleWordblock() { + $this->P->addMode('wordblock',new Doku_Parser_Mode_Wordblock(array('CAT','dog'))); + $this->P->parse('abc cat x DOG yz'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'abc ')), + array('wordblock',array('cat')), + array('cdata',array(' x ')), + array('wordblock',array('DOG')), + array('cdata',array(' yz'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSingleEntity() { + $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->'))); + $this->P->parse('x -> y'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'x ')), + array('entity',array('->')), + array('cdata',array(' y'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMultipleEntities() { + $this->P->addMode('entity',new Doku_Parser_Mode_Entity(array('->','<-'))); + $this->P->parse('x -> y <- z'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'x ')), + array('entity',array('->')), + array('cdata',array(' y ')), + array('entity',array('<-')), + array('cdata',array(' z'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testMultiplyEntity() { + $this->P->addMode('multiplyentity',new Doku_Parser_Mode_MultiplyEntity()); + $this->P->parse('Foo 10x20 Bar'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('multiplyentity',array(10,20)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSingleQuoteOpening() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse("Foo 'hello Bar"); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('singlequoteopening',array()), + array('cdata',array('hello Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSingleQuoteClosing() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse("Foo hello' Bar"); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo hello')), + array('singlequoteclosing',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testSingleQuotes() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse("Foo 'hello' Bar"); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('singlequoteopening',array()), + array('cdata',array('hello')), + array('singlequoteclosing',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testDoubleQuoteOpening() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse('Foo "hello Bar'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('doublequoteopening',array()), + array('cdata',array('hello Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testDoubleQuoteClosing() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse('Foo hello" Bar'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo hello')), + array('doublequoteclosing',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testDoubleQuotes() { + $this->P->addMode('quotes',new Doku_Parser_Mode_Quotes()); + $this->P->parse('Foo "hello" Bar'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('doublequoteopening',array()), + array('cdata',array('hello')), + array('doublequoteclosing',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testHR() { + $this->P->addMode('hr',new Doku_Parser_Mode_HR()); + $this->P->parse("Foo \n ---- \n Bar"); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('hr',array()), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testHREol() { + $this->P->addMode('hr',new Doku_Parser_Mode_HR()); + $this->P->parse("Foo \n----\n Bar"); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('p_close',array()), + array('hr',array()), + array('p_open',array()), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Replacements(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_table.test.php b/inc/parser/tests/parser_table.test.php new file mode 100644 index 000000000..0f04dbeee --- /dev/null +++ b/inc/parser/tests/parser_table.test.php @@ -0,0 +1,558 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Table extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Table() { + $this->UnitTestCase('TestOfDoku_Parser_Table'); + } + + function testTable() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testTableWinEOL() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse("\r\nabc\r\n| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 |\r\n| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 |\r\ndef"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testEmptyTable() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +| +def'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(0,1)), + array('tablerow_open',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testTableHeaders() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +^ X | Y ^ Z | +def'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,1)), + array('tablerow_open',array()), + array('tableheader_open',array(1,NULL)), + array('cdata',array(' X ')), + array('tableheader_close',array()), + array('tablecell_open',array(1,NULL)), + array('cdata',array(' Y ')), + array('tablecell_close',array()), + array('tableheader_open',array(1,NULL)), + array('cdata',array(' Z ')), + array('tableheader_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + + } + + function testCellAlignment() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +| X | Y ^ Z | +def'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,1)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'right')), + array('cdata',array(' ')), + array('cdata',array('X ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Y')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tableheader_open',array(1,'center')), + array('cdata',array(' ')), + array('cdata',array('Z')), + array('cdata',array(' ')), + array('tableheader_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testCellSpan() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->parse(' +abc +| d || e | +| f ^ ^| +|||| +def'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,3)), + array('tablerow_open',array()), + array('tablecell_open',array(2,'right')), + array('cdata',array(' ')), + array('cdata',array('d ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,NULL)), + array('cdata',array(' e ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(3,NULL)), + array('cdata',array(' f ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testCellAlignmentFormatting() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse(' +abc +| **X** | Y ^ Z | +def'); + + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,1)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'right')), + array('cdata',array(' ')), + array('strong_open',array()), + array('cdata',array('X')), + array('strong_close',array()), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Y')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tableheader_open',array(1,'center')), + array('cdata',array(' ')), + array('cdata',array('Z')), + array('cdata',array(' ')), + array('tableheader_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + + } + + function testTableEol() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse(' +abc +| Row 0 Col 1 | Row 0 Col 2 | Row 0 Col 3 | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def')), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // This is really a failing test - formatting able to spread across cols + // Problem is fixing it would mean a major rewrite of table handling + function testTableStrong() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('strong',new Doku_Parser_Mode_Formatting('strong')); + $this->P->parse(' +abc +| **Row 0 Col 1** | **Row 0 Col 2 | Row 0 Col 3** | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('strong_open',array()), + array('cdata',array('Row 0 Col 1')), + array('strong_close',array()), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('strong_open',array()), + array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), + array('strong_close',array()), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // This is really a failing test - unformatted able to spread across cols + // Problem is fixing it would mean a major rewrite of table handling + function testTableUnformatted() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse(' +abc +| <nowiki>Row 0 Col 1</nowiki> | <nowiki>Row 0 Col 2 | Row 0 Col 3</nowiki> | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('unformatted',array('Row 0 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('unformatted',array('Row 0 Col 2 | Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + function testTableLinebreak() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('linebreak',new Doku_Parser_Mode_Linebreak()); + $this->P->parse(' +abc +| Row 0\\\\ Col 1 | Row 0 Col 2 | Row 0 Col 3 | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0')), + array('linebreak',array()), + array('cdata',array('Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 0 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } + + // This is really a failing test - footnote able to spread across cols + // Problem is fixing it would mean a major rewrite of table handling + function testTableFootnote() { + $this->P->addMode('table',new Doku_Parser_Mode_Table()); + $this->P->addMode('footnote',new Doku_Parser_Mode_Footnote()); + $this->P->parse(' +abc +| ((Row 0 Col 1)) | ((Row 0 Col 2 | Row 0 Col 3)) | +| Row 1 Col 1 | Row 1 Col 2 | Row 1 Col 3 | +def'); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n\nabc")), + array('p_close',array()), + array('table_open',array(3,2)), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('footnote_open',array()), + array('cdata',array('Row 0 Col 1')), + array('footnote_close',array()), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('footnote_open',array()), + array('cdata',array('Row 0 Col 2 | Row 0 Col 3')), + array('footnote_close',array()), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('tablerow_open',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 1')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 2')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablecell_open',array(1,'left')), + array('cdata',array(' Row 1 Col 3')), + array('cdata',array(' ')), + array('tablecell_close',array()), + array('tablerow_close',array()), + array('table_close',array()), + array('p_open',array()), + array('cdata',array('def'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripbyteindex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Table(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_tocsections.test.php b/inc/parser/tests/parser_tocsections.test.php new file mode 100644 index 000000000..64051e2ad --- /dev/null +++ b/inc/parser/tests/parser_tocsections.test.php @@ -0,0 +1,516 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_TocSections extends TestOfDoku_Parser { + + function TestOfDoku_Parser_TocSections() { + $this->UnitTestCase('TestOfDoku_Parser_TocSections'); + } + + + function testNoToc() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('notoc',new Doku_Parser_Mode_NoToc()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +~~NOTOC~~ +def +====== HeaderX ====== +X +====== HeaderY ====== +Y +====== HeaderZ ====== +Z +'); + $calls = array( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocSameLevel() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +====== HeaderX ====== +X +====== HeaderY ====== +Y +====== HeaderZ ====== +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderX ')), + array('tocitem_close',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderY ')), + array('tocitem_close',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderZ ')), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocDeepening() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +====== HeaderX ====== +X +===== HeaderY ===== +Y +==== HeaderZ ==== +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderX ')), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderY ')), + array('tocbranch_open',array(3)), + array('tocitem_open',array(3)), + array('tocelement',array(3,' HeaderZ ')), + array('tocitem_close',array(3)), + array('tocbranch_close',array(3)), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',3)), + array('section_open',array(3)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocShallower() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +==== HeaderX ==== +X +===== HeaderY ===== +Y +====== HeaderZ ====== +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1,TRUE)), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2,TRUE)), + array('tocbranch_open',array(3)), + array('tocitem_open',array(3)), + array('tocelement',array(3,' HeaderX ')), + array('tocitem_close',array(3)), + array('tocbranch_close',array(3)), + array('tocitem_close',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderY ')), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderZ ')), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',3)), + array('section_open',array(3)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocNesting() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +====== HeaderX ====== +X +===== HeaderY ===== +Y +====== HeaderZ ====== +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderX ')), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderY ')), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderZ ')), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocNestingInverted() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +===== HeaderX ===== +X +====== HeaderY ====== +Y +===== HeaderZ ===== +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1,TRUE)), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderX ')), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderY ')), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderZ ')), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderX ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testTocAllLevels() { + $this->P->addMode('header',new Doku_Parser_Mode_Header()); + $this->P->addMode('eol',new Doku_Parser_Mode_Eol()); + $this->P->parse('abc +def +====== HeaderV ====== +V +===== HeaderW ===== +W +==== HeaderX ==== +X +=== HeaderY === +Y +== HeaderZ == +Z +'); + $calls = array( + array('document_start',array()), + array('toc_open',array()), + array('tocbranch_open',array(1)), + array('tocitem_open',array(1)), + array('tocelement',array(1,' HeaderV ')), + array('tocbranch_open',array(2)), + array('tocitem_open',array(2)), + array('tocelement',array(2,' HeaderW ')), + array('tocbranch_open',array(3)), + array('tocitem_open',array(3)), + array('tocelement',array(3,' HeaderX ')), + array('tocitem_close',array(3)), + array('tocbranch_close',array(3)), + array('tocitem_close',array(2)), + array('tocbranch_close',array(2)), + array('tocitem_close',array(1)), + array('tocbranch_close',array(1)), + array('toc_close',array()), + array('p_open',array()), + array('cdata',array("abc")), + array('p_close',array()), + array('p_open',array()), + array('cdata',array("def")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('header',array(' HeaderV ',1)), + array('section_open',array(1)), + array('p_open',array()), + array('cdata',array("V")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderW ',2)), + array('section_open',array(2)), + array('p_open',array()), + array('cdata',array("W")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderX ',3)), + array('section_open',array(3)), + array('p_open',array()), + array('cdata',array("X")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderY ',4)), + array('section_open',array(4)), + array('p_open',array()), + array('cdata',array("Y")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('header',array(' HeaderZ ',5)), + array('section_open',array(5)), + array('p_open',array()), + array('cdata',array("Z")), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('p_open',array()), + array('p_close',array()), + array('section_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_TocSections(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/parser_unformatted.test.php b/inc/parser/tests/parser_unformatted.test.php new file mode 100644 index 000000000..e9c1fce70 --- /dev/null +++ b/inc/parser/tests/parser_unformatted.test.php @@ -0,0 +1,49 @@ +<?php +require_once 'parser.test.php'; + +class TestOfDoku_Parser_Unformatted extends TestOfDoku_Parser { + + function TestOfDoku_Parser_Unformatted() { + $this->UnitTestCase('TestOfDoku_Parser_Unformatted'); + } + + function testNowiki() { + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse("Foo <nowiki>testing</nowiki> Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('unformatted',array('testing')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + + } + + function testDoublePercent() { + $this->P->addMode('unformatted',new Doku_Parser_Mode_Unformatted()); + $this->P->parse("Foo %%testing%% Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('unformatted',array('testing')), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } +} + +/** +* Conditional test runner +*/ +if (!defined('TEST_RUNNING')) { + define('TEST_RUNNING', true); + $test = &new TestOfDoku_Parser_Unformatted(); + $test->run(new HtmlReporter()); +} diff --git a/inc/parser/tests/testconfig.php b/inc/parser/tests/testconfig.php new file mode 100644 index 000000000..d855be8fb --- /dev/null +++ b/inc/parser/tests/testconfig.php @@ -0,0 +1,19 @@ +<?php +if (!defined('SIMPLE_TEST')) { + // Should point at SimpleTest + //(absolute path recommended with trailing slash) + define('SIMPLE_TEST', '/var/www/simpletest/'); +} + +// Load SimpleTest +if ( @include_once SIMPLE_TEST . 'unit_tester.php' ) { + require_once SIMPLE_TEST . 'mock_objects.php'; + require_once SIMPLE_TEST . 'reporter.php'; +} else { + trigger_error('Unable to load SimpleTest: '. + 'configure SIMPLE_TEST in config.php'); +} + +// Modify this as needed +define('DOKU_INC',realpath(dirname(__FILE__).'/../../../').'/'); +?> |