parser_test.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 326 行

SVN-BASE
326
字号
<?php// $Id: parser_test.php 1608 2007-12-27 09:03:07Z pp11 $require_once(dirname(__FILE__) . '/../autorun.php');require_once(dirname(__FILE__) . '/../parser.php');Mock::generate('SimpleHtmlSaxParser');Mock::generate('SimpleSaxListener');class TestOfParallelRegex extends UnitTestCase {        function testNoPatterns() {        $regex = &new ParallelRegex(false);        $this->assertFalse($regex->match("Hello", $match));        $this->assertEqual($match, "");    }        function testNoSubject() {        $regex = &new ParallelRegex(false);        $regex->addPattern(".*");        $this->assertTrue($regex->match("", $match));        $this->assertEqual($match, "");    }        function testMatchAll() {        $regex = &new ParallelRegex(false);        $regex->addPattern(".*");        $this->assertTrue($regex->match("Hello", $match));        $this->assertEqual($match, "Hello");    }        function testCaseSensitive() {        $regex = &new ParallelRegex(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 ParallelRegex(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 ParallelRegex(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 ParallelRegex(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");    }}class TestOfStateStack extends UnitTestCase {        function testStartState() {        $stack = &new SimpleStateStack("one");        $this->assertEqual($stack->getCurrent(), "one");    }        function testExhaustion() {        $stack = &new SimpleStateStack("one");        $this->assertFalse($stack->leave());    }        function testStateMoves() {        $stack = &new SimpleStateStack("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 accept() {    }        function a() {    }        function b() {    }}Mock::generate('TestParser');class TestOfLexer extends UnitTestCase {        function testEmptyPage() {        $handler = &new MockTestParser();        $handler->expectNever("accept");        $handler->setReturnValue("accept", true);        $handler->expectNever("accept");        $handler->setReturnValue("accept", true);        $lexer = &new SimpleLexer($handler);        $lexer->addPattern("a+");        $this->assertTrue($lexer->parse(""));    }        function testSinglePattern() {        $handler = &new MockTestParser();        $handler->expectArgumentsAt(0, "accept", array("aaa", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "accept", array("x", LEXER_UNMATCHED));        $handler->expectArgumentsAt(2, "accept", array("a", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "accept", array("yyy", LEXER_UNMATCHED));        $handler->expectArgumentsAt(4, "accept", array("a", LEXER_MATCHED));        $handler->expectArgumentsAt(5, "accept", array("x", LEXER_UNMATCHED));        $handler->expectArgumentsAt(6, "accept", array("aaa", LEXER_MATCHED));        $handler->expectArgumentsAt(7, "accept", array("z", LEXER_UNMATCHED));        $handler->expectCallCount("accept", 8);        $handler->setReturnValue("accept", true);        $lexer = &new SimpleLexer($handler);        $lexer->addPattern("a+");        $this->assertTrue($lexer->parse("aaaxayyyaxaaaz"));    }        function testMultiplePattern() {        $handler = &new MockTestParser();        $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x");        for ($i = 0; $i < count($target); $i++) {            $handler->expectArgumentsAt($i, "accept", array($target[$i], '*'));        }        $handler->expectCallCount("accept", count($target));        $handler->setReturnValue("accept", true);        $lexer = &new SimpleLexer($handler);        $lexer->addPattern("a+");        $lexer->addPattern("b+");        $this->assertTrue($lexer->parse("ababbxbaxxxxxxax"));    }}class TestOfLexerModes extends UnitTestCase {        function testIsolatedPattern() {        $handler = &new MockTestParser();        $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));        $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "a", array("bxb", LEXER_UNMATCHED));        $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED));        $handler->expectArgumentsAt(5, "a", array("x", LEXER_UNMATCHED));        $handler->expectArgumentsAt(6, "a", array("aaaa", LEXER_MATCHED));        $handler->expectArgumentsAt(7, "a", array("x", LEXER_UNMATCHED));        $handler->expectCallCount("a", 8);        $handler->setReturnValue("a", true);        $lexer = &new SimpleLexer($handler, "a");        $lexer->addPattern("a+", "a");        $lexer->addPattern("b+", "b");        $this->assertTrue($lexer->parse("abaabxbaaaxaaaax"));    }        function testModeChange() {        $handler = &new MockTestParser();        $handler->expectArgumentsAt(0, "a", array("a", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));        $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED));        $handler->expectArgumentsAt(4, "a", array("aaa", LEXER_MATCHED));        $handler->expectArgumentsAt(0, "b", array(":", LEXER_ENTER));        $handler->expectArgumentsAt(1, "b", array("a", LEXER_UNMATCHED));        $handler->expectArgumentsAt(2, "b", array("b", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "b", array("a", LEXER_UNMATCHED));        $handler->expectArgumentsAt(4, "b", array("bb", LEXER_MATCHED));        $handler->expectArgumentsAt(5, "b", array("a", LEXER_UNMATCHED));        $handler->expectArgumentsAt(6, "b", array("bbb", LEXER_MATCHED));        $handler->expectArgumentsAt(7, "b", array("a", LEXER_UNMATCHED));        $handler->expectCallCount("a", 5);        $handler->expectCallCount("b", 8);        $handler->setReturnValue("a", true);        $handler->setReturnValue("b", true);        $lexer = &new SimpleLexer($handler, "a");        $lexer->addPattern("a+", "a");        $lexer->addEntryPattern(":", "a", "b");        $lexer->addPattern("b+", "b");        $this->assertTrue($lexer->parse("abaabaaa:ababbabbba"));    }        function testNesting() {        $handler = &new MockTestParser();        $handler->setReturnValue("a", true);        $handler->setReturnValue("b", true);        $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array("b", LEXER_UNMATCHED));        $handler->expectArgumentsAt(2, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "a", array("b", LEXER_UNMATCHED));        $handler->expectArgumentsAt(0, "b", array("(", LEXER_ENTER));        $handler->expectArgumentsAt(1, "b", array("bb", LEXER_MATCHED));        $handler->expectArgumentsAt(2, "b", array("a", LEXER_UNMATCHED));        $handler->expectArgumentsAt(3, "b", array("bb", LEXER_MATCHED));        $handler->expectArgumentsAt(4, "b", array(")", LEXER_EXIT));        $handler->expectArgumentsAt(4, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(5, "a", array("b", LEXER_UNMATCHED));        $handler->expectCallCount("a", 6);        $handler->expectCallCount("b", 5);        $lexer = &new SimpleLexer($handler, "a");        $lexer->addPattern("a+", "a");        $lexer->addEntryPattern("(", "a", "b");        $lexer->addPattern("b+", "b");        $lexer->addExitPattern(")", "b");        $this->assertTrue($lexer->parse("aabaab(bbabb)aab"));    }        function testSingular() {        $handler = &new MockTestParser();        $handler->setReturnValue("a", true);        $handler->setReturnValue("b", true);        $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(2, "a", array("xx", LEXER_UNMATCHED));        $handler->expectArgumentsAt(3, "a", array("xx", LEXER_UNMATCHED));        $handler->expectArgumentsAt(0, "b", array("b", LEXER_SPECIAL));        $handler->expectArgumentsAt(1, "b", array("bbb", LEXER_SPECIAL));        $handler->expectCallCount("a", 4);        $handler->expectCallCount("b", 2);        $lexer = &new SimpleLexer($handler, "a");        $lexer->addPattern("a+", "a");        $lexer->addSpecialPattern("b+", "a", "b");        $this->assertTrue($lexer->parse("aabaaxxbbbxx"));    }        function testUnwindTooFar() {        $handler = &new MockTestParser();        $handler->setReturnValue("a", true);        $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array(")", LEXER_EXIT));        $handler->expectCallCount("a", 2);        $lexer = &new SimpleLexer($handler, "a");        $lexer->addPattern("a+", "a");        $lexer->addExitPattern(")", "a");        $this->assertFalse($lexer->parse("aa)aa"));    }}class TestOfLexerHandlers extends UnitTestCase {        function testModeMapping() {        $handler = &new MockTestParser();        $handler->setReturnValue("a", true);        $handler->expectArgumentsAt(0, "a", array("aa", LEXER_MATCHED));        $handler->expectArgumentsAt(1, "a", array("(", LEXER_ENTER));        $handler->expectArgumentsAt(2, "a", array("bb", LEXER_MATCHED));        $handler->expectArgumentsAt(3, "a", array("a", LEXER_UNMATCHED));        $handler->expectArgumentsAt(4, "a", array("bb", LEXER_MATCHED));        $handler->expectArgumentsAt(5, "a", array(")", LEXER_EXIT));        $handler->expectArgumentsAt(6, "a", array("b", LEXER_UNMATCHED));        $handler->expectCallCount("a", 7);        $lexer = &new SimpleLexer($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"));    }}class TestOfSimpleHtmlLexer extends UnitTestCase {        function &createParser() {        $parser = &new MockSimpleHtmlSaxParser();        $parser->setReturnValue('acceptStartToken', true);        $parser->setReturnValue('acceptEndToken', true);        $parser->setReturnValue('acceptAttributeToken', true);        $parser->setReturnValue('acceptEntityToken', true);        $parser->setReturnValue('acceptTextToken', true);        $parser->setReturnValue('ignore', true);        return $parser;    }        function testNoContent() {        $parser = &$this->createParser();        $parser->expectNever('acceptStartToken');        $parser->expectNever('acceptEndToken');        $parser->expectNever('acceptAttributeToken');        $parser->expectNever('acceptEntityToken');        $parser->expectNever('acceptTextToken');        $lexer = &new SimpleHtmlLexer($parser);        $this->assertTrue($lexer->parse(''));    }        function testUninteresting() {        $parser = &$this->createParser();        $parser->expectOnce('acceptTextToken', array('<html></html>', '*'));        $lexer = &new SimpleHtmlLexer($parser);        $this->assertTrue($lexer->parse('<html></html>'));    }        function testSkipCss() {        $parser = &$this->createParser();        $parser->expectNever('acceptTextToken');        $parser->expectAtLeastOnce('ignore');        $lexer = &new SimpleHtmlLexer($parser);        $this->assertTrue($lexer->parse("<style>Lot's of styles</style>"));    }        function testSkipJavaScript() {        $parser = &$this->createParser();        $parser->expectNever('acceptTextToken');        $parser->expectAtLeastOnce('ignore');        $lexer = &new SimpleHtmlLexer($parser);        $this->assertTrue($lexer->parse("<SCRIPT>Javascript code {';:^%^%

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?