90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								namespace JmesPath\Tests;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use JmesPath\Lexer;
							 | 
						||
| 
								 | 
							
								use JmesPath\SyntaxErrorException;
							 | 
						||
| 
								 | 
							
								use PHPUnit\Framework\TestCase;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @covers JmesPath\Lexer
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class LexerTest extends TestCase
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    public function inputProvider()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        return [
							 | 
						||
| 
								 | 
							
								            ['0', 'number'],
							 | 
						||
| 
								 | 
							
								            ['1', 'number'],
							 | 
						||
| 
								 | 
							
								            ['2', 'number'],
							 | 
						||
| 
								 | 
							
								            ['3', 'number'],
							 | 
						||
| 
								 | 
							
								            ['4', 'number'],
							 | 
						||
| 
								 | 
							
								            ['5', 'number'],
							 | 
						||
| 
								 | 
							
								            ['6', 'number'],
							 | 
						||
| 
								 | 
							
								            ['7', 'number'],
							 | 
						||
| 
								 | 
							
								            ['8', 'number'],
							 | 
						||
| 
								 | 
							
								            ['9', 'number'],
							 | 
						||
| 
								 | 
							
								            ['-1', 'number'],
							 | 
						||
| 
								 | 
							
								            ['-1.5', 'number'],
							 | 
						||
| 
								 | 
							
								            ['109.5', 'number'],
							 | 
						||
| 
								 | 
							
								            ['.', 'dot'],
							 | 
						||
| 
								 | 
							
								            ['{', 'lbrace'],
							 | 
						||
| 
								 | 
							
								            ['}', 'rbrace'],
							 | 
						||
| 
								 | 
							
								            ['[', 'lbracket'],
							 | 
						||
| 
								 | 
							
								            [']', 'rbracket'],
							 | 
						||
| 
								 | 
							
								            [':', 'colon'],
							 | 
						||
| 
								 | 
							
								            [',', 'comma'],
							 | 
						||
| 
								 | 
							
								            ['||', 'or'],
							 | 
						||
| 
								 | 
							
								            ['*', 'star'],
							 | 
						||
| 
								 | 
							
								            ['foo', 'identifier'],
							 | 
						||
| 
								 | 
							
								            ['"foo"', 'quoted_identifier'],
							 | 
						||
| 
								 | 
							
								            ['`true`', 'literal'],
							 | 
						||
| 
								 | 
							
								            ['`false`', 'literal'],
							 | 
						||
| 
								 | 
							
								            ['`null`', 'literal'],
							 | 
						||
| 
								 | 
							
								            ['`"true"`', 'literal']
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @dataProvider inputProvider
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function testTokenizesInput($input, $type)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $l = new Lexer();
							 | 
						||
| 
								 | 
							
								        $tokens = $l->tokenize($input);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals($tokens[0]['type'], $type);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testTokenizesJsonLiterals()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $l = new Lexer();
							 | 
						||
| 
								 | 
							
								        $tokens = $l->tokenize('`null`, `false`, `true`, `"abc"`, `"ab\\"c"`,'
							 | 
						||
| 
								 | 
							
								            . '`0`, `0.45`, `-0.5`');
							 | 
						||
| 
								 | 
							
								        $this->assertNull($tokens[0]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertFalse($tokens[2]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertTrue($tokens[4]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('abc', $tokens[6]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('ab"c', $tokens[8]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertSame(0, $tokens[10]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertSame(0.45, $tokens[12]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertSame(-0.5, $tokens[14]['value']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testTokenizesJsonNumbers()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $l = new Lexer();
							 | 
						||
| 
								 | 
							
								        $tokens = $l->tokenize('`10`, `1.2`, `-10.20e-10`, `1.2E+2`');
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(10, $tokens[0]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(1.2, $tokens[2]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(-1.02E-9, $tokens[4]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals(120, $tokens[6]['value']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function testCanWorkWithElidedJsonLiterals()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $l = new Lexer();
							 | 
						||
| 
								 | 
							
								        $tokens = $l->tokenize('`foo`');
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('foo', $tokens[0]['value']);
							 | 
						||
| 
								 | 
							
								        $this->assertEquals('literal', $tokens[0]['type']);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |