organizrnginxsonarrradarrplexdashboardcouchpotatonzbgetbookmarkapplication-dashboardmuximuxlandingpagestartpagelandinghtpcserverhomepagesabnzbdheimdallemby
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
7.5 KiB
268 lines
7.5 KiB
<?php
|
|
|
|
namespace Doctrine\Tests\Common\Lexer;
|
|
|
|
class AbstractLexerTest extends \PHPUnit_Framework_TestCase
|
|
{
|
|
/**
|
|
* @var ConcreteLexer
|
|
*/
|
|
private $concreteLexer;
|
|
|
|
public function setUp()
|
|
{
|
|
$this->concreteLexer = new ConcreteLexer();
|
|
}
|
|
|
|
public function dataProvider()
|
|
{
|
|
return array(
|
|
array(
|
|
'price=10',
|
|
array(
|
|
array(
|
|
'value' => 'price',
|
|
'type' => 'string',
|
|
'position' => 0,
|
|
),
|
|
array(
|
|
'value' => '=',
|
|
'type' => 'operator',
|
|
'position' => 5,
|
|
),
|
|
array(
|
|
'value' => 10,
|
|
'type' => 'int',
|
|
'position' => 6,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
public function testResetPeek()
|
|
{
|
|
$expectedTokens = array(
|
|
array(
|
|
'value' => 'price',
|
|
'type' => 'string',
|
|
'position' => 0,
|
|
),
|
|
array(
|
|
'value' => '=',
|
|
'type' => 'operator',
|
|
'position' => 5,
|
|
),
|
|
array(
|
|
'value' => 10,
|
|
'type' => 'int',
|
|
'position' => 6,
|
|
),
|
|
);
|
|
|
|
$this->concreteLexer->setInput('price=10');
|
|
|
|
$this->assertEquals($expectedTokens[0], $this->concreteLexer->peek());
|
|
$this->assertEquals($expectedTokens[1], $this->concreteLexer->peek());
|
|
$this->concreteLexer->resetPeek();
|
|
$this->assertEquals($expectedTokens[0], $this->concreteLexer->peek());
|
|
}
|
|
|
|
public function testResetPosition()
|
|
{
|
|
$expectedTokens = array(
|
|
array(
|
|
'value' => 'price',
|
|
'type' => 'string',
|
|
'position' => 0,
|
|
),
|
|
array(
|
|
'value' => '=',
|
|
'type' => 'operator',
|
|
'position' => 5,
|
|
),
|
|
array(
|
|
'value' => 10,
|
|
'type' => 'int',
|
|
'position' => 6,
|
|
),
|
|
);
|
|
|
|
$this->concreteLexer->setInput('price=10');
|
|
$this->assertNull($this->concreteLexer->lookahead);
|
|
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
$this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead);
|
|
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
$this->assertEquals($expectedTokens[1], $this->concreteLexer->lookahead);
|
|
|
|
$this->concreteLexer->resetPosition(0);
|
|
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
$this->assertEquals($expectedTokens[0], $this->concreteLexer->lookahead);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param $input
|
|
* @param $expectedTokens
|
|
*/
|
|
public function testMoveNext($input, $expectedTokens)
|
|
{
|
|
$this->concreteLexer->setInput($input);
|
|
$this->assertNull($this->concreteLexer->lookahead);
|
|
|
|
for ($i = 0; $i < count($expectedTokens); $i++) {
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
$this->assertEquals($expectedTokens[$i], $this->concreteLexer->lookahead);
|
|
}
|
|
|
|
$this->assertFalse($this->concreteLexer->moveNext());
|
|
$this->assertNull($this->concreteLexer->lookahead);
|
|
}
|
|
|
|
public function testSkipUntil()
|
|
{
|
|
$this->concreteLexer->setInput('price=10');
|
|
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
$this->concreteLexer->skipUntil('operator');
|
|
|
|
$this->assertEquals(
|
|
array(
|
|
'value' => '=',
|
|
'type' => 'operator',
|
|
'position' => 5,
|
|
),
|
|
$this->concreteLexer->lookahead
|
|
);
|
|
}
|
|
|
|
public function testUtf8Mismatch()
|
|
{
|
|
$this->concreteLexer->setInput("\xE9=10");
|
|
|
|
$this->assertTrue($this->concreteLexer->moveNext());
|
|
|
|
$this->assertEquals(
|
|
array(
|
|
'value' => "\xE9=10",
|
|
'type' => 'string',
|
|
'position' => 0,
|
|
),
|
|
$this->concreteLexer->lookahead
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param $input
|
|
* @param $expectedTokens
|
|
*/
|
|
public function testPeek($input, $expectedTokens)
|
|
{
|
|
$this->concreteLexer->setInput($input);
|
|
foreach ($expectedTokens as $expectedToken) {
|
|
$this->assertEquals($expectedToken, $this->concreteLexer->peek());
|
|
}
|
|
|
|
$this->assertNull($this->concreteLexer->peek());
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param $input
|
|
* @param $expectedTokens
|
|
*/
|
|
public function testGlimpse($input, $expectedTokens)
|
|
{
|
|
$this->concreteLexer->setInput($input);
|
|
|
|
foreach ($expectedTokens as $expectedToken) {
|
|
$this->assertEquals($expectedToken, $this->concreteLexer->glimpse());
|
|
$this->concreteLexer->moveNext();
|
|
}
|
|
|
|
$this->assertNull($this->concreteLexer->peek());
|
|
}
|
|
|
|
public function inputUntilPositionDataProvider()
|
|
{
|
|
return array(
|
|
array('price=10', 5, 'price'),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @dataProvider inputUntilPositionDataProvider
|
|
*
|
|
* @param $input
|
|
* @param $position
|
|
* @param $expectedInput
|
|
*/
|
|
public function testGetInputUntilPosition($input, $position, $expectedInput)
|
|
{
|
|
$this->concreteLexer->setInput($input);
|
|
|
|
$this->assertSame($expectedInput, $this->concreteLexer->getInputUntilPosition($position));
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param $input
|
|
* @param $expectedTokens
|
|
*/
|
|
public function testIsNextToken($input, $expectedTokens)
|
|
{
|
|
$this->concreteLexer->setInput($input);
|
|
|
|
$this->concreteLexer->moveNext();
|
|
for ($i = 0; $i < count($expectedTokens); $i++) {
|
|
$this->assertTrue($this->concreteLexer->isNextToken($expectedTokens[$i]['type']));
|
|
$this->concreteLexer->moveNext();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataProvider
|
|
*
|
|
* @param $input
|
|
* @param $expectedTokens
|
|
*/
|
|
public function testIsNextTokenAny($input, $expectedTokens)
|
|
{
|
|
$allTokenTypes = array_map(function ($token) {
|
|
return $token['type'];
|
|
}, $expectedTokens);
|
|
|
|
$this->concreteLexer->setInput($input);
|
|
|
|
$this->concreteLexer->moveNext();
|
|
for ($i = 0; $i < count($expectedTokens); $i++) {
|
|
$this->assertTrue($this->concreteLexer->isNextTokenAny(array($expectedTokens[$i]['type'])));
|
|
$this->assertTrue($this->concreteLexer->isNextTokenAny($allTokenTypes));
|
|
$this->concreteLexer->moveNext();
|
|
}
|
|
}
|
|
|
|
public function testGetLiteral()
|
|
{
|
|
$this->assertSame('Doctrine\Tests\Common\Lexer\ConcreteLexer::INT', $this->concreteLexer->getLiteral('int'));
|
|
$this->assertSame('fake_token', $this->concreteLexer->getLiteral('fake_token'));
|
|
}
|
|
|
|
public function testIsA()
|
|
{
|
|
$this->assertTrue($this->concreteLexer->isA(11, 'int'));
|
|
$this->assertTrue($this->concreteLexer->isA(1.1, 'int'));
|
|
$this->assertTrue($this->concreteLexer->isA('=', 'operator'));
|
|
$this->assertTrue($this->concreteLexer->isA('>', 'operator'));
|
|
$this->assertTrue($this->concreteLexer->isA('<', 'operator'));
|
|
$this->assertTrue($this->concreteLexer->isA('fake_text', 'string'));
|
|
}
|
|
}
|
|
|