Passed
Push — master ( 5f8f14...173a37 )
by William
09:55
created

ContextTest::testEscape()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 0
dl 0
loc 17
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpMyAdmin\SqlParser\Tests\Lexer;
6
7
use PhpMyAdmin\SqlParser\Context;
8
use PhpMyAdmin\SqlParser\Tests\TestCase;
9
use Throwable;
10
use function class_exists;
11
12
class ContextTest extends TestCase
13
{
14
    public function testLoad()
15
    {
16
        // Default context is 5.7.0.
17
        $this->assertEquals('\\PhpMyAdmin\\SqlParser\\Contexts\\ContextMySql50700', Context::$loadedContext);
18
        $this->assertArrayHasKey('STORED', Context::$KEYWORDS);
19
        $this->assertArrayNotHasKey('AUTHORS', Context::$KEYWORDS);
20
21
        // Restoring context.
22
        Context::load('');
23
        $this->assertEquals('\\PhpMyAdmin\\SqlParser\\Contexts\\ContextMySql50700', Context::$defaultContext);
24
        $this->assertArrayHasKey('STORED', Context::$KEYWORDS);
25
        $this->assertArrayNotHasKey('AUTHORS', Context::$KEYWORDS);
26
    }
27
28
    /**
29
     * Test for loading closest SQL context
30
     *
31
     * @dataProvider contextLoadingProvider
32
     */
33
    public function testLoadClosest(string $context, ?string $expected)
34
    {
35
        $this->assertEquals($expected, Context::loadClosest($context));
36
        if ($expected !== null) {
37
            $this->assertEquals('\\PhpMyAdmin\\SqlParser\\Contexts\\Context' . $expected, Context::$loadedContext);
38
            $this->assertTrue(class_exists(Context::$loadedContext));
39
        }
40
41
        // Restoring context.
42
        Context::load('');
43
    }
44
45
    public function contextLoadingProvider(): array
46
    {
47
        return [
48
            'MySQL match' => [
49
                'MySql50500',
50
                'MySql50500',
51
            ],
52
            'MySQL strip' => [
53
                'MySql50712',
54
                'MySql50700',
55
            ],
56
            'MySQL fallback' => [
57
                'MySql99999',
58
                'MySql50700',
59
            ],
60
            'MariaDB match' => [
61
                'MariaDb100000',
62
                'MariaDb100000',
63
            ],
64
            'MariaDB stripg' => [
65
                'MariaDb109900',
66
                'MariaDb100000',
67
            ],
68
            'MariaDB fallback' => [
69
                'MariaDb990000',
70
                'MariaDb100300',
71
            ],
72
            'Invalid' => [
73
                'Sql',
74
                null,
75
            ],
76
        ];
77
    }
78
79
    /**
80
     * @dataProvider contextNamesProvider
81
     */
82
    public function testLoadAll(string $context)
83
    {
84
        Context::load($context);
85
        $this->assertEquals('\\PhpMyAdmin\\SqlParser\\Contexts\\Context' . $context, Context::$loadedContext);
86
87
        // Restoring context.
88
        Context::load('');
89
    }
90
91
    public function contextNamesProvider(): array
92
    {
93
        return [
94
            ['MySql50000'],
95
            ['MySql50100'],
96
            ['MySql50500'],
97
            ['MySql50600'],
98
            ['MySql50700'],
99
            ['MySql80000'],
100
            ['MariaDb100000'],
101
            ['MariaDb100100'],
102
            ['MariaDb100200'],
103
            ['MariaDb100300'],
104
        ];
105
    }
106
107
    public function testLoadError(): void
108
    {
109
        $this->expectExceptionMessage(
110
            'Specified context ("\PhpMyAdmin\SqlParser\Contexts\ContextFoo") does not exist.'
111
        );
112
        $this->expectException(Throwable::class);
113
        Context::load('Foo');
114
    }
115
116
    public function testMode(): void
117
    {
118
        Context::setMode('REAL_AS_FLOAT,ANSI_QUOTES,IGNORE_SPACE');
119
        $this->assertEquals(
120
            Context::SQL_MODE_REAL_AS_FLOAT | Context::SQL_MODE_ANSI_QUOTES | Context::SQL_MODE_IGNORE_SPACE,
121
            Context::$MODE
122
        );
123
        Context::setMode('TRADITIONAL');
124
        $this->assertEquals(
125
            Context::SQL_MODE_TRADITIONAL,
126
            Context::$MODE
127
        );
128
        Context::setMode();
129
        $this->assertEquals(0, Context::$MODE);
130
    }
131
132
    public function testEscape(): void
133
    {
134
        Context::setMode('NO_ENCLOSING_QUOTES');
135
        $this->assertEquals('test', Context::escape('test'));
136
137
        Context::setMode('ANSI_QUOTES');
138
        $this->assertEquals('"test"', Context::escape('test'));
139
140
        Context::setMode();
141
        $this->assertEquals('`test`', Context::escape('test'));
142
143
        $this->assertEquals(
144
            [
145
                '`a`',
146
                '`b`',
147
            ],
148
            Context::escape(['a', 'b'])
149
        );
150
    }
151
}
152