Вход Регистрация
Файл: gapps/vendor/nikic/php-parser/test/PhpParser/ParserTest.php
Строк: 221
<?php

namespace PhpParser;

use 
PhpParserComment;
use 
PhpParserNodeExpr;
use 
PhpParserNodeScalar;
use 
PhpParserNodeScalarString_;

abstract class 
ParserTest extends PHPUnit_Framework_TestCase
{
    
/** @returns Parser */
    
abstract protected function getParser(Lexer $lexer);

    
/**
     * @expectedException PhpParserError
     * @expectedExceptionMessage Syntax error, unexpected EOF on line 1
     */
    
public function testParserThrowsSyntaxError() {
        
$parser $this->getParser(new Lexer());
        
$parser->parse('<?php foo');
    }

    
/**
     * @expectedException PhpParserError
     * @expectedExceptionMessage Cannot use foo as self because 'self' is a special class name on line 1
     */
    
public function testParserThrowsSpecialError() {
        
$parser $this->getParser(new Lexer());
        
$parser->parse('<?php use foo as self;');
    }

    public function 
testAttributeAssignment() {
        
$lexer = new Lexer(array(
            
'usedAttributes' => array(
                
'comments''startLine''endLine',
                
'startTokenPos''endTokenPos',
            )
        ));

        
$code = <<<'EOC'
<?php
/** Doc comment */
function test($a) {
    // Line
    // Comments
    echo $a;
}
EOC;
        
$code canonicalize($code);

        
$parser $this->getParser($lexer);
        
$stmts $parser->parse($code);

        
/** @var PhpParserNodeStmtFunction_ $fn */
        
$fn $stmts[0];
        
$this->assertInstanceOf('PhpParserNodeStmtFunction_'$fn);
        
$this->assertEquals(array(
            
'comments' => array(
                new 
CommentDoc('/** Doc comment */'26),
            ),
            
'startLine' => 3,
            
'endLine' => 7,
            
'startTokenPos' => 3,
            
'endTokenPos' => 21,
        ), 
$fn->getAttributes());

        
$param $fn->params[0];
        
$this->assertInstanceOf('PhpParserNodeParam'$param);
        
$this->assertEquals(array(
            
'startLine' => 3,
            
'endLine' => 3,
            
'startTokenPos' => 7,
            
'endTokenPos' => 7,
        ), 
$param->getAttributes());

        
/** @var PhpParserNodeStmtEcho_ $echo */
        
$echo $fn->stmts[0];
        
$this->assertInstanceOf('PhpParserNodeStmtEcho_'$echo);
        
$this->assertEquals(array(
            
'comments' => array(
                new 
Comment("// Linen"449),
                new 
Comment("// Commentsn"561),
            ),
            
'startLine' => 6,
            
'endLine' => 6,
            
'startTokenPos' => 16,
            
'endTokenPos' => 19,
        ), 
$echo->getAttributes());

        
/** @var PhpParserNodeExprVariable $var */
        
$var $echo->exprs[0];
        
$this->assertInstanceOf('PhpParserNodeExprVariable'$var);
        
$this->assertEquals(array(
            
'startLine' => 6,
            
'endLine' => 6,
            
'startTokenPos' => 18,
            
'endTokenPos' => 18,
        ), 
$var->getAttributes());
    }

    
/**
     * @expectedException RangeException
     * @expectedExceptionMessage The lexer returned an invalid token (id=999, value=foobar)
     */
    
public function testInvalidToken() {
        
$lexer = new InvalidTokenLexer;
        
$parser $this->getParser($lexer);
        
$parser->parse('dummy');
    }

    
/**
     * @dataProvider provideTestKindAttributes
     */
    
public function testKindAttributes($code$expectedAttributes) {
        
$parser $this->getParser(new Lexer);
        
$stmts $parser->parse("<?php $code;");
        
$attributes $stmts[0]->getAttributes();
        foreach (
$expectedAttributes as $name => $value) {
            
$this->assertSame($value$attributes[$name]);
        }
    }

    public function 
provideTestKindAttributes() {
        return array(
            array(
'0', ['kind' => ScalarLNumber::KIND_DEC]),
            array(
'9', ['kind' => ScalarLNumber::KIND_DEC]),
            array(
'07', ['kind' => ScalarLNumber::KIND_OCT]),
            array(
'0xf', ['kind' => ScalarLNumber::KIND_HEX]),
            array(
'0XF', ['kind' => ScalarLNumber::KIND_HEX]),
            array(
'0b1', ['kind' => ScalarLNumber::KIND_BIN]),
            array(
'0B1', ['kind' => ScalarLNumber::KIND_BIN]),
            array(
'[]', ['kind' => ExprArray_::KIND_SHORT]),
            array(
'array()', ['kind' => ExprArray_::KIND_LONG]),
            array(
"'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
            array(
"b'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
            array(
"B'foo'", ['kind' => String_::KIND_SINGLE_QUOTED]),
            array(
'"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
'b"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
'B"foo"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
'"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
'b"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
'B"foo$bar"', ['kind' => String_::KIND_DOUBLE_QUOTED]),
            array(
"<<<'STR'nSTRn", ['kind' => String_::KIND_NOWDOC'docLabel' => 'STR']),
            array(
"<<<STRnSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"<<<"STR"nSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"b<<<'STR'nSTRn", ['kind' => String_::KIND_NOWDOC'docLabel' => 'STR']),
            array(
"B<<<'STR'nSTRn", ['kind' => String_::KIND_NOWDOC'docLabel' => 'STR']),
            array(
"<<< t 'STR'nSTRn", ['kind' => String_::KIND_NOWDOC'docLabel' => 'STR']),
            
// HHVM doesn't support this due to a lexer bug
            // (https://github.com/facebook/hhvm/issues/6970)
            // array("<<<'xff'nxffn", ['kind' => String_::KIND_NOWDOC, 'docLabel' => "xff"]),
            
array("<<<"STR"n$anSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"b<<<"STR"n$anSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"B<<<"STR"n$anSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"<<< t "STR"n$anSTRn", ['kind' => String_::KIND_HEREDOC'docLabel' => 'STR']),
            array(
"die", ['kind' => ExprExit_::KIND_DIE]),
            array(
"die('done')", ['kind' => ExprExit_::KIND_DIE]),
            array(
"exit", ['kind' => ExprExit_::KIND_EXIT]),
            array(
"exit(1)", ['kind' => ExprExit_::KIND_EXIT]),
        );
    }
}

class 
InvalidTokenLexer extends Lexer {
    public function 
getNextToken(&$value null, &$startAttributes null, &$endAttributes null) {
        
$value 'foobar';
        return 
999;
    }
}
Онлайн: 1
Реклама