Merge branch 'MDL-69583-master' of git://github.com/ferranrecio/moodle
[moodle.git] / admin / tool / customlang / tests / local / mlang / phpparser_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * PHP lang parser test.
19  *
20  * @package    tool_customlang
21  * @copyright  2015 Damyon Wiese
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace tool_customlang\local\mlang;
27 use advanced_testcase;
28 use moodle_exception;
30 /**
31  * PHP lang parser test class.
32  *
33  * @package    tool_customlang
34  * @copyright  2015 Damyon Wiese
35  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
36  */
37 class phpparser_testcase extends advanced_testcase {
40     /**
41      * Test get instance static method.
42      *
43      */
44     public function test_get_instance(): void {
46         $instance = phpparser::get_instance();
48         $this->assertInstanceOf('tool_customlang\local\mlang\phpparser', $instance);
49         $this->assertEquals($instance, phpparser::get_instance());
50     }
52     /**
53      * Test get instance parse method.
54      *
55      * @dataProvider parse_provider
56      * @param string $phpcode PHP code to test
57      * @param array $expected Expected result
58      * @param bool $exception if an exception is expected
59      */
60     public function test_parse(string $phpcode, array $expected, bool $exception): void {
62         $instance = phpparser::get_instance();
64         if ($exception) {
65             $this->expectException(moodle_exception::class);
66         }
68         $strings = $instance->parse($phpcode);
70         $this->assertEquals(count($expected), count($strings));
71         foreach ($strings as $key => $langstring) {
72             $this->assertEquals($expected[$key][0], $langstring->id);
73             $this->assertEquals($expected[$key][1], $langstring->text);
74         }
75     }
77     /**
78      * Data provider for the test_parse.
79      *
80      * @return  array
81      */
82     public function parse_provider() : array {
83         return [
84             'Invalid PHP code' => [
85                 'No PHP code', [], false
86             ],
87             'No PHP open tag' => [
88                 "\$string['example'] = 'text';\n", [], false
89             ],
90             'One string code' => [
91                 "<?php \$string['example'] = 'text';\n", [['example', 'text']], false
92             ],
93             'Extra spaces' => [
94                 "<?php \$string['example']   =   'text';\n", [['example', 'text']], false
95             ],
96             'Extra tabs' => [
97                 "<?php \$string['example']\t=\t'text';\n", [['example', 'text']], false
98             ],
99             'Double quote string' => [
100                 "<?php
101                     \$string['example'] = \"text\";
102                     \$string[\"example2\"] = 'text2';
103                     \$string[\"example3\"] = \"text3\";
104                 ", [
105                     ['example', 'text'],
106                     ['example2', 'text2'],
107                     ['example3', 'text3'],
108                 ], false
109             ],
110             'Multiple lines strings' => [
111                 "<?php
112                     \$string['example'] = 'First line\nsecondline';
113                     \$string['example2'] = \"First line\nsecondline2\";
114                 ", [
115                     ['example', "First line\nsecondline"],
116                     ['example2', "First line\nsecondline2"],
117                 ], false
118             ],
119             'Two strings code' => [
120                 "<?php
121                     \$string['example'] = 'text';
122                     \$string['example2'] = 'text2';
123                 ", [
124                     ['example', 'text'],
125                     ['example2', 'text2'],
126                 ], false
127             ],
128             'Scaped characters' => [
129                 "<?php
130                     \$string['example'] = 'Thos are \\' quotes \" 1';
131                     \$string['example2'] = \"Thos are ' quotes \\\" 2\";
132                 ", [
133                     ['example', "Thos are ' quotes \" 1"],
134                     ['example2', "Thos are ' quotes \" 2"],
135                 ], false
136             ],
137             'PHP with single line comments' => [
138                 "<?php
139                     // This is a comment.
140                     \$string['example'] = 'text';
141                     // This is another commment.
142                 ", [
143                     ['example', 'text'],
144                 ], false
145             ],
146             'PHP with block comments' => [
147                 "<?php
148                     /* This is a block comment. */
149                     \$string['example'] = 'text';
150                     /* This is another
151                     block comment. */
152                 ", [
153                     ['example', 'text'],
154                 ], false
155             ],
156             'Wrong variable name' => [
157                 "<?php
158                     \$stringwrong['example'] = 'text';
159                     \$wringstring['example'] = 'text';
160                 ", [], false
161             ],
162             'Single line commented valid line' => [
163                 "<?php
164                     // \$string['example'] = 'text';
165                 ", [], false
166             ],
167             'Block commented valid line' => [
168                 "<?php
169                     /*
170                     \$string['example'] = 'text';
171                     */
172                 ", [], false
173             ],
174             'Syntax error 1 (double assignation)' => [
175                 "<?php
176                     \$string['example'] = 'text' = 'wrong';
177                 ", [], true
178             ],
179             'Syntax error 2 (no closing string)' => [
180                 "<?php
181                     \$string['example'] = 'wrong;
182                 ", [], true
183             ],
184             'Syntax error 3 (Array without key)' => [
185                 "<?php
186                     \$string[] = 'wrong';
187                 ", [], true
188             ],
189             'Syntax error 4 (Array not open)' => [
190                 "<?php
191                     \$string'example'] = 'wrong';
192                 ", [], true
193             ],
194             'Syntax error 5 (Array not closed)' => [
195                 "<?php
196                     \$string['example' = 'wrong';
197                 ", [], true
198             ],
199             'Syntax error 6 (Missing assignment)' => [
200                 "<?php
201                     \$string['example'] 'wrong';
202                 ", [], true
203             ],
204         ];
205     }