3 namespace Doctrine\Tests\ORM\Query;
5 use Doctrine\ORM\Query\Lexer;
7 require_once __DIR__ . '/../../TestInit.php';
9 class LexerTest extends \Doctrine\Tests\OrmTestCase
13 protected function setUp() {
16 public function testScannerRecognizesIdentifierWithLengthOfOneCharacter()
18 $lexer = new Lexer('u');
21 $token = $lexer->lookahead;
23 $this->assertEquals(Lexer::T_IDENTIFIER, $token['type']);
24 $this->assertEquals('u', $token['value']);
27 public function testScannerRecognizesIdentifierConsistingOfLetters()
29 $lexer = new Lexer('someIdentifier');
32 $token = $lexer->lookahead;
33 $this->assertEquals(Lexer::T_IDENTIFIER, $token['type']);
34 $this->assertEquals('someIdentifier', $token['value']);
37 public function testScannerRecognizesIdentifierIncludingDigits()
39 $lexer = new Lexer('s0m31d3nt1f13r');
42 $token = $lexer->lookahead;
43 $this->assertEquals(Lexer::T_IDENTIFIER, $token['type']);
44 $this->assertEquals('s0m31d3nt1f13r', $token['value']);
47 public function testScannerRecognizesIdentifierIncludingUnderscore()
49 $lexer = new Lexer('some_identifier');
51 $token = $lexer->lookahead;
52 $this->assertEquals(Lexer::T_IDENTIFIER, $token['type']);
53 $this->assertEquals('some_identifier', $token['value']);
56 public function testScannerRecognizesDecimalInteger()
58 $lexer = new Lexer('1234');
60 $token = $lexer->lookahead;
61 $this->assertEquals(Lexer::T_INTEGER, $token['type']);
62 $this->assertEquals(1234, $token['value']);
65 public function testScannerRecognizesFloat()
67 $lexer = new Lexer('1.234');
69 $token = $lexer->lookahead;
70 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
71 $this->assertEquals(1.234, $token['value']);
74 public function testScannerRecognizesFloatWithExponent()
76 $lexer = new Lexer('1.2e3');
78 $token = $lexer->lookahead;
79 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
80 $this->assertEquals(1.2e3, $token['value']);
83 public function testScannerRecognizesFloatWithExponent2()
85 $lexer = new Lexer('0.2e3');
87 $token = $lexer->lookahead;
88 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
89 $this->assertEquals(.2e3, $token['value']);
92 public function testScannerRecognizesFloatWithNegativeExponent()
94 $lexer = new Lexer('7E-10');
96 $token = $lexer->lookahead;
97 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
98 $this->assertEquals(7E-10, $token['value']);
101 public function testScannerRecognizesFloatBig()
103 $lexer = new Lexer('123456789.01');
105 $token = $lexer->lookahead;
106 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
107 $this->assertEquals(1.2345678901e8, $token['value']);
110 public function testScannerRecognizesFloatContainingWhitespace()
112 $lexer = new Lexer('- 1.234e2');
114 $token = $lexer->lookahead;
115 $this->assertEquals(Lexer::T_MINUS, $token['type']);
116 $this->assertEquals('-', $token['value']);
119 $token = $lexer->lookahead;
120 $this->assertEquals(Lexer::T_FLOAT, $token['type']);
121 $this->assertNotEquals(-1.234e2, $token['value']);
122 $this->assertEquals(1.234e2, $token['value']);
125 public function testScannerRecognizesStringContainingWhitespace()
127 $lexer = new Lexer("'This is a string.'");
129 $token = $lexer->lookahead;
130 $this->assertEquals(Lexer::T_STRING, $token['type']);
131 $this->assertEquals("This is a string.", $token['value']);
134 public function testScannerRecognizesStringContainingSingleQuotes()
136 $lexer = new Lexer("'abc''defg'''");
138 $token = $lexer->lookahead;
139 $this->assertEquals(Lexer::T_STRING, $token['type']);
140 $this->assertEquals("abc'defg'", $token['value']);
143 public function testScannerRecognizesInputParameter()
145 $lexer = new Lexer('?1');
147 $token = $lexer->lookahead;
148 $this->assertEquals(Lexer::T_INPUT_PARAMETER, $token['type']);
149 $this->assertEquals('?1', $token['value']);
152 public function testScannerRecognizesNamedInputParameter()
154 $lexer = new Lexer(':name');
156 $token = $lexer->lookahead;
157 $this->assertEquals(Lexer::T_INPUT_PARAMETER, $token['type']);
158 $this->assertEquals(':name', $token['value']);
161 public function testScannerTokenizesASimpleQueryCorrectly()
163 $dql = "SELECT u FROM My\Namespace\User u WHERE u.name = 'Jack O''Neil'";
164 $lexer = new Lexer($dql);
169 'type' => Lexer::T_SELECT,
174 'type' => Lexer::T_IDENTIFIER,
179 'type' => Lexer::T_FROM,
183 'value' => 'My\Namespace\User',
184 'type' => Lexer::T_IDENTIFIER,
189 'type' => Lexer::T_IDENTIFIER,
194 'type' => Lexer::T_WHERE,
199 'type' => Lexer::T_IDENTIFIER,
204 'type' => Lexer::T_DOT,
209 'type' => Lexer::T_IDENTIFIER,
214 'type' => Lexer::T_EQUALS,
218 'value' => "Jack O'Neil",
219 'type' => Lexer::T_STRING,
224 foreach ($tokens as $expected) {
226 $actual = $lexer->lookahead;
227 $this->assertEquals($expected['value'], $actual['value']);
228 $this->assertEquals($expected['type'], $actual['type']);
229 $this->assertEquals($expected['position'], $actual['position']);
232 $this->assertFalse($lexer->moveNext());