‪TYPO3CMS  ‪main
TreeFromLineStreamBuilderTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
37 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
38 
39 final class ‪TreeFromLineStreamBuilderTest extends FunctionalTestCase
40 {
41  protected array ‪$pathsToLinkInTestInstance = [
42  'typo3/sysext/core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/FileadminImport/Scenario1' => 'fileadmin/Scenario1',
43  'typo3/sysext/core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/FileadminImport/Scenario2' => 'fileadmin/Scenario2',
44  'typo3/sysext/core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/FileadminImport/Scenario3' => 'fileadmin/Scenario3',
45  'typo3/sysext/core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/FileadminImport/Scenario4' => 'fileadmin/Scenario4',
46  'typo3/sysext/core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/FileadminImport/Scenario5' => 'fileadmin/Scenario5',
47  ];
48 
52  protected bool ‪$initializeDatabase = false;
53 
54  public function ‪setUp(): void
55  {
56  parent::setUp();
57  // Register custom comparator to compare IncludeTree without looking at the path:
58  // They are important for the processing, but clutter the tests a lot. When
59  // all include objects exists, that's enough for the tests to know if the include tree
60  // has been calculated correctly.
61  $this->registerComparator(new ‪IncludeTreeObjectIgnoringIdentifierAndPathComparator());
62  }
63 
64  public static function ‪buildTreeConditionDataProvider(): iterable
65  {
66  $typoScript = '[foo = bar]';
67  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
68  $tree = new ‪FileInclude();
69  $tree->setLineStream($typoScriptLineStream);
70  $tree->setName('foo');
71  $expectedTree = new ‪FileInclude();
72  $expectedTree->setLineStream($typoScriptLineStream);
73  $expectedTree->setName('foo');
74  $expectedTree->setSplit();
75  $subNode = new ‪ConditionInclude();
76  $subNode->setName('foo');
77  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
78  $subNode->setSplit();
79  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize($typoScript));
80  $expectedTree->addChild($subNode);
81  yield 'condition without body' => [
82  $tree,
83  $expectedTree,
84  ];
85 
86  $typoScript = '[END]';
87  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
88  $tree = new ‪FileInclude();
89  $tree->setLineStream($typoScriptLineStream);
90  $tree->setName('foo');
91  $expectedTree = new ‪FileInclude();
92  $expectedTree->setLineStream($typoScriptLineStream);
93  $expectedTree->setName('foo');
94  yield 'condition end not in condition context is just kept' => [
95  $tree,
96  $expectedTree,
97  ];
98 
99  $typoScript = '[GLOBAL]';
100  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
101  $tree = new ‪FileInclude();
102  $tree->setLineStream($typoScriptLineStream);
103  $tree->setName('foo');
104  $expectedTree = new ‪FileInclude();
105  $expectedTree->setLineStream($typoScriptLineStream);
106  $expectedTree->setName('foo');
107  yield 'condition global not in condition context is just kept' => [
108  $tree,
109  $expectedTree,
110  ];
111 
112  $typoScript = "[foo = bar]\n" .
113  'foo';
114  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
115  $typoScriptLineStreamArray = iterator_to_array($typoScriptLineStream->getNextLine());
116  $tree = new ‪FileInclude();
117  $tree->setLineStream($typoScriptLineStream);
118  $tree->setName('foo');
119  $expectedTree = new ‪FileInclude();
120  $expectedTree->setLineStream($typoScriptLineStream);
121  $expectedTree->setName('foo');
122  $expectedTree->setSplit();
123  $subNode = new ‪ConditionInclude();
124  $subNode->setName('foo');
125  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
126  $subNode->setSplit();
127  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[0]));
128  $expectedTree->addChild($subNode);
129  $subSubNode = new ‪SegmentInclude();
130  $subSubNode->setName('foo');
131  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[1]));
132  $subNode->addChild($subSubNode);
133  yield 'condition with body without end or global' => [
134  $tree,
135  $expectedTree,
136  ];
137 
138  $typoScript = "[foo = bar]\n" .
139  "foo = fooValue\n" .
140  "[END]\n" .
141  'bar = barValue';
142  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
143  $typoScriptLineStreamArray = iterator_to_array($typoScriptLineStream->getNextLine());
144  $tree = new ‪FileInclude();
145  $tree->setLineStream($typoScriptLineStream);
146  $tree->setName('foo');
147  $expectedTree = new ‪FileInclude();
148  $expectedTree->setLineStream($typoScriptLineStream);
149  $expectedTree->setName('foo');
150  $expectedTree->setSplit();
151  $subNode = new ‪ConditionInclude();
152  $subNode->setName('foo');
153  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
154  $subNode->setSplit();
155  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[0]));
156  $expectedTree->addChild($subNode);
157  $subSubNode = new ‪SegmentInclude();
158  $subSubNode->setName('foo');
159  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[1])->append($typoScriptLineStreamArray[2]));
160  $subNode->addChild($subSubNode);
161  $subNode = new ‪SegmentInclude();
162  $subNode->setName('foo');
163  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[3]));
164  $expectedTree->addChild($subNode);
165  yield 'condition with body with end' => [
166  $tree,
167  $expectedTree,
168  ];
169 
170  $typoScript = "[foo = bar]\n" .
171  "foo\n" .
172  "[GLOBAL]\n" .
173  'bar';
174  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
175  $typoScriptLineStreamArray = iterator_to_array($typoScriptLineStream->getNextLine());
176  $tree = new ‪FileInclude();
177  $tree->setLineStream($typoScriptLineStream);
178  $tree->setName('foo');
179  $expectedTree = new ‪FileInclude();
180  $expectedTree->setLineStream($typoScriptLineStream);
181  $expectedTree->setName('foo');
182  $expectedTree->setSplit();
183  $subNode = new ‪ConditionInclude();
184  $subNode->setName('foo');
185  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
186  $subNode->setSplit();
187  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[0]));
188  $expectedTree->addChild($subNode);
189  $subSubNode = new ‪SegmentInclude();
190  $subSubNode->setName('foo');
191  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[1])->append($typoScriptLineStreamArray[2]));
192  $subNode->addChild($subSubNode);
193  $subNode = new ‪SegmentInclude();
194  $subNode->setName('foo');
195  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[3]));
196  $expectedTree->addChild($subNode);
197  yield 'condition with body with global' => [
198  $tree,
199  $expectedTree,
200  ];
201 
202  $typoScript = "[foo = bar]\n" .
203  "foo\n" .
204  "[ELSE]\n" .
205  "bar\n" .
206  "[END]\n" .
207  'baz';
208  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
209  $typoScriptLineStreamArray = iterator_to_array($typoScriptLineStream->getNextLine());
210  $tree = new ‪FileInclude();
211  $tree->setLineStream($typoScriptLineStream);
212  $tree->setName('foo');
213  $expectedTree = new ‪FileInclude();
214  $expectedTree->setLineStream($typoScriptLineStream);
215  $expectedTree->setName('foo');
216  $expectedTree->setSplit();
217  $subNode = new ‪ConditionInclude();
218  $subNode->setName('foo');
219  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
220  $subNode->setSplit();
221  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[0]));
222  $expectedTree->addChild($subNode);
223  $subSubNode = new ‪SegmentInclude();
224  $subSubNode->setName('foo');
225  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[1]));
226  $subNode->addChild($subSubNode);
227  $subNode = new ‪ConditionElseInclude();
228  $subNode->setName('foo');
229  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
230  $subNode->setSplit();
231  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[2]));
232  $expectedTree->addChild($subNode);
233  $subSubNode = new ‪SegmentInclude();
234  $subSubNode->setName('foo');
235  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[3])->append($typoScriptLineStreamArray[4]));
236  $subNode->addChild($subSubNode);
237  $subNode = new ‪SegmentInclude();
238  $subNode->setName('foo');
239  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[5]));
240  $expectedTree->addChild($subNode);
241  yield 'condition else with end' => [
242  $tree,
243  $expectedTree,
244  ];
245 
246  $typoScript = "[foo = bar]\n" .
247  "foo\n" .
248  "[foo = baz]\n" .
249  "bar\n" .
250  "[END]\n";
251  $typoScriptLineStream = (new ‪LosslessTokenizer())->tokenize($typoScript);
252  $typoScriptLineStreamArray = iterator_to_array($typoScriptLineStream->getNextLine());
253  $tree = new ‪FileInclude();
254  $tree->setLineStream($typoScriptLineStream);
255  $tree->setName('foo');
256  $expectedTree = new ‪FileInclude();
257  $expectedTree->setLineStream($typoScriptLineStream);
258  $expectedTree->setName('foo');
259  $expectedTree->setSplit();
260  $subNode = new ‪ConditionInclude();
261  $subNode->setName('foo');
262  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 1));
263  $subNode->setSplit();
264  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[0]));
265  $expectedTree->addChild($subNode);
266  $subSubNode = new ‪SegmentInclude();
267  $subSubNode->setName('foo');
268  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[1]));
269  $subNode->addChild($subSubNode);
270  $subNode = new ‪ConditionInclude();
271  $subNode->setName('foo');
272  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = baz', 2, 1));
273  $subNode->setSplit();
274  $subNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[2]));
275  $expectedTree->addChild($subNode);
276  $subSubNode = new ‪SegmentInclude();
277  $subSubNode->setName('foo');
278  $subSubNode->setLineStream((new ‪LineStream())->append($typoScriptLineStreamArray[3])->append($typoScriptLineStreamArray[4]));
279  $subNode->addChild($subSubNode);
280  yield 'second condition finishes first condition' => [
281  $tree,
282  $expectedTree,
283  ];
284  }
285 
286  #[DataProvider('buildTreeConditionDataProvider')]
287  #[Test]
288  public function ‪buildTreeCondition(‪IncludeInterface $tree, ‪IncludeInterface $expectedTree): void
289  {
290  $this->get(TreeFromLineStreamBuilder::class)->buildTree($tree, 'setup', new ‪LossyTokenizer());
291  self::assertEquals($expectedTree, $tree);
292  }
293 
294  public static function ‪buildTreeAtImportDataProvider(): iterable
295  {
296  $atImportStatement = '@import \'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript\'';
297  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
298  $expectedTree = new ‪FileInclude();
299  $expectedTree->setLineStream($atImportLineStream);
300  $expectedTree->setSplit();
301  $subNode = new ‪AtImportInclude();
302  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
303  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
304  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
305  $expectedTree->addChild($subNode);
306  yield 'atImport single file with ticks' => [
307  $atImportLineStream,
308  $expectedTree,
309  ];
310 
311  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript"';
312  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
313  $expectedTree = new ‪FileInclude();
314  $expectedTree->setLineStream($atImportLineStream);
315  $expectedTree->setSplit();
316  $subNode = new ‪AtImportInclude();
317  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
318  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
319  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
320  $expectedTree->addChild($subNode);
321  yield 'atImport single file with doubleticks' => [
322  $atImportLineStream,
323  $expectedTree,
324  ];
325 
326  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/notFoundFile.typoscript"';
327  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
328  $expectedTree = new ‪FileInclude();
329  $expectedTree->setLineStream($atImportLineStream);
330  $expectedTree->setSplit();
331  yield 'atImport with not found file' => [
332  $atImportLineStream,
333  $expectedTree,
334  ];
335 
336  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1"';
337  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
338  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
339  $expectedTree = new ‪FileInclude();
340  $expectedTree->setLineStream($atImportLineStream);
341  $expectedTree->setSplit();
342  $subNode = new ‪AtImportInclude();
343  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
344  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
345  $subNode->setOriginalLine($atImportLine);
346  $expectedTree->addChild($subNode);
347  $subNode = new ‪AtImportInclude();
348  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
349  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
350  $subNode->setOriginalLine($atImportLine);
351  $expectedTree->addChild($subNode);
352  $subNode = new ‪AtImportInclude();
353  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/subInclude.typoscript');
354  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n"));
355  $subNode->setOriginalLine($atImportLine);
356  $subNode->setSplit();
357  $subSubNode = new ‪AtImportInclude();
358  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript');
359  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("SubDirectory.typoscript\n"));
360  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n")->getNextLine())[0]);
361  $subNode->addChild($subSubNode);
362  $expectedTree->addChild($subNode);
363  yield 'atImport with directory' => [
364  $atImportLineStream,
365  $expectedTree,
366  ];
367 
368  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/"';
369  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
370  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
371  $expectedTree = new ‪FileInclude();
372  $expectedTree->setLineStream($atImportLineStream);
373  $expectedTree->setSplit();
374  $subNode = new ‪AtImportInclude();
375  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
376  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
377  $subNode->setOriginalLine($atImportLine);
378  $expectedTree->addChild($subNode);
379  $subNode = new ‪AtImportInclude();
380  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
381  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
382  $subNode->setOriginalLine($atImportLine);
383  $expectedTree->addChild($subNode);
384  $subNode = new ‪AtImportInclude();
385  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/subInclude.typoscript');
386  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n"));
387  $subNode->setOriginalLine($atImportLine);
388  $subNode->setSplit();
389  $subSubNode = new ‪AtImportInclude();
390  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript');
391  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("SubDirectory.typoscript\n"));
392  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n")->getNextLine())[0]);
393  $subNode->addChild($subSubNode);
394  $expectedTree->addChild($subNode);
395  yield 'atImport with directory and slash at end' => [
396  $atImportLineStream,
397  $expectedTree,
398  ];
399 
400  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup"';
401  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
402  $expectedTree = new ‪FileInclude();
403  $expectedTree->setLineStream($atImportLineStream);
404  $expectedTree->setSplit();
405  $subNode = new ‪AtImportInclude();
406  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
407  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
408  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
409  $expectedTree->addChild($subNode);
410  yield 'atImport with single file adds .typoscript ending' => [
411  $atImportLineStream,
412  $expectedTree,
413  ];
414 
415  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*"';
416  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
417  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
418  $expectedTree = new ‪FileInclude();
419  $expectedTree->setLineStream($atImportLineStream);
420  $expectedTree->setSplit();
421  $subNode = new ‪AtImportInclude();
422  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
423  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
424  $subNode->setOriginalLine($atImportLine);
425  $expectedTree->addChild($subNode);
426  $subNode = new ‪AtImportInclude();
427  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
428  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
429  $subNode->setOriginalLine($atImportLine);
430  $expectedTree->addChild($subNode);
431  yield 'atImport with setup* resolves setup.typoscript and setup2.typoscript' => [
432  $atImportLineStream,
433  $expectedTree,
434  ];
435 
436  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/*typoscript"';
437  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
438  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
439  $expectedTree = new ‪FileInclude();
440  $expectedTree->setLineStream($atImportLineStream);
441  $expectedTree->setSplit();
442  $subNode = new ‪AtImportInclude();
443  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
444  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
445  $subNode->setOriginalLine($atImportLine);
446  $expectedTree->addChild($subNode);
447  $subNode = new ‪AtImportInclude();
448  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
449  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
450  $subNode->setOriginalLine($atImportLine);
451  $expectedTree->addChild($subNode);
452  $subNode = new ‪AtImportInclude();
453  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/subInclude.typoscript');
454  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n"));
455  $subNode->setOriginalLine($atImportLine);
456  $subNode->setSplit();
457  $subSubNode = new ‪AtImportInclude();
458  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript');
459  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("SubDirectory.typoscript\n"));
460  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n")->getNextLine())[0]);
461  $subNode->addChild($subSubNode);
462  $expectedTree->addChild($subNode);
463  yield 'atImport with *typoscript resolves setup.typoscript, setup2.typoscript and subInclude.typoscript' => [
464  $atImportLineStream,
465  $expectedTree,
466  ];
467 
468  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/NotExistingDirectory/*.typoscript"';
469  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
470  $expectedTree = new ‪FileInclude();
471  $expectedTree->setLineStream($atImportLineStream);
472  $expectedTree->setSplit();
473  yield 'atImport with *.typoscript on not existing directory does not crash' => [
474  $atImportLineStream,
475  $expectedTree,
476  ];
477 
478  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/*.typoscript"';
479  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
480  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
481  $expectedTree = new ‪FileInclude();
482  $expectedTree->setLineStream($atImportLineStream);
483  $expectedTree->setSplit();
484  $subNode = new ‪AtImportInclude();
485  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
486  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
487  $subNode->setOriginalLine($atImportLine);
488  $expectedTree->addChild($subNode);
489  $subNode = new ‪AtImportInclude();
490  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
491  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
492  $subNode->setOriginalLine($atImportLine);
493  $expectedTree->addChild($subNode);
494  $subNode = new ‪AtImportInclude();
495  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/subInclude.typoscript');
496  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n"));
497  $subNode->setOriginalLine($atImportLine);
498  $subNode->setSplit();
499  $subSubNode = new ‪AtImportInclude();
500  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript');
501  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("SubDirectory.typoscript\n"));
502  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n")->getNextLine())[0]);
503  $subNode->addChild($subSubNode);
504  $expectedTree->addChild($subNode);
505  yield 'atImport with *.typoscript resolves setup.typoscript, setup2.typoscript and subInclude.typoscript' => [
506  $atImportLineStream,
507  $expectedTree,
508  ];
509 
510  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*.typoscript"';
511  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
512  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
513  $expectedTree = new ‪FileInclude();
514  $expectedTree->setLineStream($atImportLineStream);
515  $expectedTree->setSplit();
516  $subNode = new ‪AtImportInclude();
517  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
518  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
519  $subNode->setOriginalLine($atImportLine);
520  $expectedTree->addChild($subNode);
521  $subNode = new ‪AtImportInclude();
522  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
523  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
524  $subNode->setOriginalLine($atImportLine);
525  $expectedTree->addChild($subNode);
526  yield 'atImport with setup*.typoscript resolves setup.typoscript and setup2.typoscript' => [
527  $atImportLineStream,
528  $expectedTree,
529  ];
530 
531  $atImportStatement = '@import \'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario2/pathTraversal1.typoscript\'';
532  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
533  $expectedTree = new ‪FileInclude();
534  $expectedTree->setLineStream($atImportLineStream);
535  $expectedTree->setSplit();
536  $subNode = new ‪AtImportInclude();
537  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario2/pathTraversal1.typoscript');
538  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario2/./subInclude.typoscript'\n"));
539  $subNode->setSplit();
540  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
541  $subSubNode = new ‪AtImportInclude();
542  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario2/./subInclude.typoscript');
543  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
544  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario2/./subInclude.typoscript'\n")->getNextLine())[0]);
545  $subNode->addChild($subSubNode);
546  $expectedTree->addChild($subNode);
547  yield 'atImport with dot-slash path traversal is loaded' => [
548  $atImportLineStream,
549  $expectedTree,
550  ];
551 
552  $atImportStatement = '@import \'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario4/*.setup.typoscript\'';
553  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
554  $atImportLine = iterator_to_array($atImportLineStream->getNextLine())[0];
555  $expectedTree = new ‪FileInclude();
556  $expectedTree->setLineStream($atImportLineStream);
557  $expectedTree->setSplit();
558  $subNode = new ‪AtImportInclude();
559  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario4/file1.setup.typoscript');
560  $subNode->setOriginalLine($atImportLine);
561  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("file1\n"));
562  $expectedTree->addChild($subNode);
563  $subNode = new ‪AtImportInclude();
564  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario4/file2.setup.typoscript');
565  $subNode->setOriginalLine($atImportLine);
566  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("file2\n"));
567  $expectedTree->addChild($subNode);
568  yield 'atImport with EXT:.../SomeDirectory/*.setup.typoscript is allowed' => [
569  $atImportLineStream,
570  $expectedTree,
571  ];
572 
573  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative1.typoscript"';
574  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
575  $expectedTree = new ‪FileInclude();
576  $expectedTree->setLineStream($atImportLineStream);
577  $expectedTree->setSplit();
578  $subNode = new ‪AtImportInclude();
579  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative1.typoscript');
580  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import './relativeTarget.typoscript'\n"));
581  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
582  $subNode->setSplit();
583  $expectedTree->addChild($subNode);
584  $subSubNode = new ‪AtImportInclude();
585  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/relativeTarget.typoscript');
586  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
587  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import './relativeTarget.typoscript'\n")->getNextLine())[0]);
588  $subNode->addChild($subSubNode);
589  yield 'atImport with dot slash relative include' => [
590  $atImportLineStream,
591  $expectedTree,
592  ];
593 
594  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative2.typoscript"';
595  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
596  $expectedTree = new ‪FileInclude();
597  $expectedTree->setLineStream($atImportLineStream);
598  $expectedTree->setSplit();
599  $subNode = new ‪AtImportInclude();
600  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative2.typoscript');
601  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'relativeTarget.typoscript'\n"));
602  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
603  $subNode->setSplit();
604  $expectedTree->addChild($subNode);
605  $subSubNode = new ‪AtImportInclude();
606  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/relativeTarget.typoscript');
607  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
608  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'relativeTarget.typoscript'\n")->getNextLine())[0]);
609  $subNode->addChild($subSubNode);
610  yield 'atImport with relative include' => [
611  $atImportLineStream,
612  $expectedTree,
613  ];
614 
615  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative3.typoscript"';
616  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
617  $expectedTree = new ‪FileInclude();
618  $expectedTree->setLineStream($atImportLineStream);
619  $expectedTree->setSplit();
620  $subNode = new ‪AtImportInclude();
621  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative3.typoscript');
622  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import './RelativeSubDirectory/relativeTarget.typoscript'\n"));
623  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
624  $subNode->setSplit();
625  $expectedTree->addChild($subNode);
626  $subSubNode = new ‪AtImportInclude();
627  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeSubDirectory/relativeTarget.typoscript');
628  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
629  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import './RelativeSubDirectory/relativeTarget.typoscript'\n")->getNextLine())[0]);
630  $subNode->addChild($subSubNode);
631  yield 'atImport with dot slash relative directory include' => [
632  $atImportLineStream,
633  $expectedTree,
634  ];
635 
636  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative4.typoscript"';
637  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
638  $expectedTree = new ‪FileInclude();
639  $expectedTree->setLineStream($atImportLineStream);
640  $expectedTree->setSplit();
641  $subNode = new ‪AtImportInclude();
642  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative4.typoscript');
643  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'RelativeSubDirectory/relativeTarget.typoscript'\n"));
644  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
645  $subNode->setSplit();
646  $expectedTree->addChild($subNode);
647  $subSubNode = new ‪AtImportInclude();
648  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeSubDirectory/relativeTarget.typoscript');
649  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
650  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'RelativeSubDirectory/relativeTarget.typoscript'\n")->getNextLine())[0]);
651  $subNode->addChild($subSubNode);
652  yield 'atImport with relative directory include' => [
653  $atImportLineStream,
654  $expectedTree,
655  ];
656 
657  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative5.typoscript"';
658  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
659  $expectedTree = new ‪FileInclude();
660  $expectedTree->setLineStream($atImportLineStream);
661  $expectedTree->setSplit();
662  $subNode = new ‪AtImportInclude();
663  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative5.typoscript');
664  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'RelativeRecursiveDirectory/relativeRecursive.typoscript'\n"));
665  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
666  $subNode->setSplit();
667  $expectedTree->addChild($subNode);
668  $subSubNode = new ‪AtImportInclude();
669  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeRecursiveDirectory/relativeRecursive.typoscript');
670  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'relativeTarget.typoscript'\n"));
671  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'RelativeRecursiveDirectory/relativeRecursive.typoscript'\n")->getNextLine())[0]);
672  $subSubNode->setSplit();
673  $subNode->addChild($subSubNode);
674  $subSubSubNode = new ‪AtImportInclude();
675  $subSubSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeRecursiveDirectory/relativeTarget.typoscript');
676  $subSubSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
677  $subSubSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'relativeTarget.typoscript'\n")->getNextLine())[0]);
678  $subSubNode->addChild($subSubSubNode);
679  yield 'atImport with relative recursive include' => [
680  $atImportLineStream,
681  $expectedTree,
682  ];
683 
684  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative6.typoscript"';
685  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
686  $expectedTree = new ‪FileInclude();
687  $expectedTree->setLineStream($atImportLineStream);
688  $expectedTree->setSplit();
689  $subNode = new ‪AtImportInclude();
690  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/hasRelative6.typoscript');
691  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import './RelativeSubDirectory/*.typoscript'\n"));
692  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
693  $subNode->setSplit();
694  $expectedTree->addChild($subNode);
695  $subSubNode1 = new ‪AtImportInclude();
696  $subSubNode1->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeSubDirectory/relativeTarget.typoscript');
697  $subSubNode1->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget.typoscript\n"));
698  $subSubNode1->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import './RelativeSubDirectory/*.typoscript'\n")->getNextLine())[0]);
699  $subNode->addChild($subSubNode1);
700  $subSubNode2 = new ‪AtImportInclude();
701  $subSubNode2->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/RelativeImport/RelativeSubDirectory/relativeTarget2.typoscript');
702  $subSubNode2->setLineStream((new ‪LosslessTokenizer())->tokenize("relativeTarget2.typoscript\n"));
703  $subSubNode2->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import './RelativeSubDirectory/*.typoscript'\n")->getNextLine())[0]);
704  $subNode->addChild($subSubNode2);
705  yield 'atImport with relative sub directory include with wildcards' => [
706  $atImportLineStream,
707  $expectedTree,
708  ];
709 
710  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal1.typoscript"';
711  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
712  $expectedTree = new ‪FileInclude();
713  $expectedTree->setLineStream($atImportLineStream);
714  $expectedTree->setSplit();
715  $subNode = new ‪AtImportInclude();
716  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal1.typoscript');
717  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/../InvalidImport/invalidPathTraversalTarget.typoscript'\n"));
718  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
719  $subNode->setSplit();
720  $expectedTree->addChild($subNode);
721  yield 'atImport single path traversal dot-dot-slash 1 is not allowed' => [
722  $atImportLineStream,
723  $expectedTree,
724  ];
725 
726  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal2.typoscript"';
727  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
728  $expectedTree = new ‪FileInclude();
729  $expectedTree->setLineStream($atImportLineStream);
730  $expectedTree->setSplit();
731  $subNode = new ‪AtImportInclude();
732  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal2.typoscript');
733  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/../invalidPathTraversalTarget.typoscript'\n"));
734  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
735  $subNode->setSplit();
736  $expectedTree->addChild($subNode);
737  yield 'atImport single path traversal dot-dot-slash 2 is not allowed' => [
738  $atImportLineStream,
739  $expectedTree,
740  ];
741 
742  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal3.typoscript"';
743  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
744  $expectedTree = new ‪FileInclude();
745  $expectedTree->setLineStream($atImportLineStream);
746  $expectedTree->setSplit();
747  $subNode = new ‪AtImportInclude();
748  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal3.typoscript');
749  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import '../invalidPathTraversalTarget.typoscript'\n"));
750  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
751  $subNode->setSplit();
752  $expectedTree->addChild($subNode);
753  yield 'atImport single path traversal relative dot-dot-slash 1 is not allowed' => [
754  $atImportLineStream,
755  $expectedTree,
756  ];
757 
758  $atImportStatement = '@import "EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal4.typoscript"';
759  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
760  $expectedTree = new ‪FileInclude();
761  $expectedTree->setLineStream($atImportLineStream);
762  $expectedTree->setSplit();
763  $subNode = new ‪AtImportInclude();
764  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/InvalidImport/pathTraversal4.typoscript');
765  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import './../invalidPathTraversalTarget.typoscript'\n"));
766  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
767  $subNode->setSplit();
768  $expectedTree->addChild($subNode);
769  yield 'atImport single path traversal relative dot-dot-slash 2 is not allowed' => [
770  $atImportLineStream,
771  $expectedTree,
772  ];
773  }
774 
775  #[DataProvider('buildTreeAtImportDataProvider')]
776  #[Test]
777  public function ‪buildTreeAtImport(‪LineStream $lineStream, ‪IncludeInterface $expectedTree): void
778  {
779  $tree = (new ‪FileInclude());
780  $tree->setLineStream($lineStream);
781  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
782  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
783  self::assertEquals($expectedTree, $tree);
784  }
785 
786  public static function ‪buildTreeAtImportTsConfigDataProvider(): iterable
787  {
788  $atImportStatement = '@import \'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario3/mainInclude.tsconfig\'';
789  $atImportLineStream = (new ‪LosslessTokenizer())->tokenize($atImportStatement);
790  $expectedTree = new ‪FileInclude();
791  $expectedTree->setLineStream($atImportLineStream);
792  $expectedTree->setSplit();
793  $subNode = new ‪AtImportInclude();
794  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario3/mainInclude.tsconfig');
795  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario3/subInclude.tsconfig'\n"));
796  $subNode->setSplit();
797  $subNode->setOriginalLine(iterator_to_array($atImportLineStream->getNextLine())[0]);
798  $subSubNode = new ‪AtImportInclude();
799  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario3/subInclude.tsconfig');
800  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
801  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario3/subInclude.tsconfig'\n")->getNextLine())[0]);
802  $subNode->addChild($subSubNode);
803  $expectedTree->addChild($subNode);
804  yield 'atImport with dot-slash path traversal is allowed for tsconfig' => [
805  $atImportLineStream,
806  $expectedTree,
807  ];
808  }
809 
810  #[DataProvider('buildTreeAtImportTsConfigDataProvider')]
811  #[Test]
812  public function ‪buildTreeAtImportTsConfig(‪LineStream $lineStream, ‪IncludeInterface $expectedTree): void
813  {
814  $tree = (new ‪FileInclude());
815  $tree->setLineStream($lineStream);
816  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
817  $treeFromTokenStreamBuilder->buildTree($tree, 'tsconfig', new ‪LosslessTokenizer());
818  self::assertEquals($expectedTree, $tree);
819  }
820 
821  public static function ‪buildTreeImportTyposcriptDataProvider(): iterable
822  {
823  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">';
824  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
825  $expectedTree = new ‪FileInclude();
826  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
827  $expectedTree->setSplit();
828  $subNode = new ‪IncludeTyposcriptInclude();
829  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
830  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
831  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
832  $expectedTree->addChild($subNode);
833  yield 'INCLUDE_TYPOSCRIPT FILE EXT file' => [
834  $includeTyposcriptStatementLineStream,
835  $expectedTree,
836  ];
837 
838  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative1.typoscript">';
839  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
840  $expectedTree = new ‪FileInclude();
841  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
842  $expectedTree->setSplit();
843  $subNode = new ‪IncludeTyposcriptInclude();
844  $subNode->setSplit();
845  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative1.typoscript');
846  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n"));
847  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
848  $expectedTree->addChild($subNode);
849  $subSubNode = new ‪IncludeTyposcriptInclude();
850  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/subInclude.typoscript');
851  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
852  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n")->getNextLine())[0]);
853  $subNode->addChild($subSubNode);
854  yield 'INCLUDE_TYPOSCRIPT FILE EXT file relative 1 sub include' => [
855  $includeTyposcriptStatementLineStream,
856  $expectedTree,
857  ];
858 
859  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative2.typoscript">';
860  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
861  $expectedTree = new ‪FileInclude();
862  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
863  $expectedTree->setSplit();
864  $subNode = new ‪IncludeTyposcriptInclude();
865  $subNode->setSplit();
866  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative2.typoscript');
867  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./RelativeSub/subInclude.typoscript\">\n"));
868  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
869  $expectedTree->addChild($subNode);
870  $subSubNode = new ‪IncludeTyposcriptInclude();
871  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/RelativeSub/subInclude.typoscript');
872  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
873  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./RelativeSub/subInclude.typoscript\">\n")->getNextLine())[0]);
874  $subNode->addChild($subSubNode);
875  yield 'INCLUDE_TYPOSCRIPT FILE EXT file relative 2 sub include' => [
876  $includeTyposcriptStatementLineStream,
877  $expectedTree,
878  ];
879 
880  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative3.typoscript">';
881  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
882  $expectedTree = new ‪FileInclude();
883  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
884  $expectedTree->setSplit();
885  $subNode = new ‪IncludeTyposcriptInclude();
886  $subNode->setSplit();
887  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative3.typoscript');
888  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE: ./subInclude.typoscript\">\n"));
889  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
890  $expectedTree->addChild($subNode);
891  $subSubNode = new ‪IncludeTyposcriptInclude();
892  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/subInclude.typoscript');
893  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
894  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE: ./subInclude.typoscript\">\n")->getNextLine())[0]);
895  $subNode->addChild($subSubNode);
896  yield 'INCLUDE_TYPOSCRIPT FILE EXT file relative 3 sub include' => [
897  $includeTyposcriptStatementLineStream,
898  $expectedTree,
899  ];
900 
901  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/Scenario1/setup.typoscript">';
902  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
903  $expectedTree = new ‪FileInclude();
904  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
905  $expectedTree->setSplit();
906  $subNode = new ‪IncludeTyposcriptInclude();
907  $subNode->setName('fileadmin/Scenario1/setup.typoscript');
908  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
909  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
910  $expectedTree->addChild($subNode);
911  yield 'INCLUDE_TYPOSCRIPT FILE fileadmin file' => [
912  $includeTyposcriptStatementLineStream,
913  $expectedTree,
914  ];
915 
916  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/Scenario2/relative1.typoscript">';
917  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
918  $expectedTree = new ‪FileInclude();
919  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
920  $expectedTree->setSplit();
921  $subNode = new ‪IncludeTyposcriptInclude();
922  $subNode->setSplit();
923  $subNode->setName('fileadmin/Scenario2/relative1.typoscript');
924  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n"));
925  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
926  $expectedTree->addChild($subNode);
927  $subSubNode = new ‪IncludeTyposcriptInclude();
928  $subSubNode->setName('fileadmin/Scenario2/subInclude.typoscript');
929  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
930  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n")->getNextLine())[0]);
931  $subNode->addChild($subSubNode);
932  yield 'INCLUDE_TYPOSCRIPT FILE fileadmin file relative 1 sub include' => [
933  $includeTyposcriptStatementLineStream,
934  $expectedTree,
935  ];
936 
937  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/Scenario2/relative2.typoscript">';
938  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
939  $expectedTree = new ‪FileInclude();
940  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
941  $expectedTree->setSplit();
942  $subNode = new ‪IncludeTyposcriptInclude();
943  $subNode->setSplit();
944  $subNode->setName('fileadmin/Scenario2/relative2.typoscript');
945  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./RelativeSub/subInclude.typoscript\">\n"));
946  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
947  $expectedTree->addChild($subNode);
948  $subSubNode = new ‪IncludeTyposcriptInclude();
949  $subSubNode->setName('fileadmin/Scenario2/RelativeSub/subInclude.typoscript');
950  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
951  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./RelativeSub/subInclude.typoscript\">\n")->getNextLine())[0]);
952  $subNode->addChild($subSubNode);
953  yield 'INCLUDE_TYPOSCRIPT FILE fileadmin file relative 2 sub include' => [
954  $includeTyposcriptStatementLineStream,
955  $expectedTree,
956  ];
957 
958  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/Scenario2/relative3.typoscript">';
959  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
960  $expectedTree = new ‪FileInclude();
961  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
962  $expectedTree->setSplit();
963  $subNode = new ‪IncludeTyposcriptInclude();
964  $subNode->setSplit();
965  $subNode->setName('fileadmin/Scenario2/relative3.typoscript');
966  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE: ./subInclude.typoscript\">\n"));
967  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
968  $expectedTree->addChild($subNode);
969  $subSubNode = new ‪IncludeTyposcriptInclude();
970  $subSubNode->setName('fileadmin/Scenario2/subInclude.typoscript');
971  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
972  $subSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE: ./subInclude.typoscript\">\n")->getNextLine())[0]);
973  $subNode->addChild($subSubNode);
974  yield 'INCLUDE_TYPOSCRIPT FILE fileadmin file relative 3 sub include' => [
975  $includeTyposcriptStatementLineStream,
976  $expectedTree,
977  ];
978 
979  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3">';
980  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
981  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
982  $expectedTree = new ‪FileInclude();
983  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
984  $expectedTree->setSplit();
985  $subNode = new ‪IncludeTyposcriptInclude();
986  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3/setup1.typoscript');
987  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
988  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
989  $expectedTree->addChild($subNode);
990  $subNode = new ‪IncludeTyposcriptInclude();
991  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3/setup2.typoscript');
992  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
993  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
994  $expectedTree->addChild($subNode);
995  yield 'INCLUDE_TYPOSCRIPT DIR EXT files' => [
996  $includeTyposcriptStatementLineStream,
997  $expectedTree,
998  ];
999 
1000  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3/">';
1001  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1002  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1003  $expectedTree = new ‪FileInclude();
1004  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1005  $expectedTree->setSplit();
1006  $subNode = new ‪IncludeTyposcriptInclude();
1007  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3/setup1.typoscript');
1008  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1009  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1010  $expectedTree->addChild($subNode);
1011  $subNode = new ‪IncludeTyposcriptInclude();
1012  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario3/setup2.typoscript');
1013  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
1014  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1015  $expectedTree->addChild($subNode);
1016  yield 'INCLUDE_TYPOSCRIPT DIR EXT files with ending slash' => [
1017  $includeTyposcriptStatementLineStream,
1018  $expectedTree,
1019  ];
1020 
1021  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario4">';
1022  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1023  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1024  $expectedTree = new ‪FileInclude();
1025  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1026  $expectedTree->setSplit();
1027  $subNode = new ‪IncludeTyposcriptInclude();
1028  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario4/setup1.typoscript');
1029  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1030  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1031  $expectedTree->addChild($subNode);
1032  $subNode = new ‪IncludeTyposcriptInclude();
1033  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario4/AutoSubDir1/auto1.typoscript');
1034  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto1.typoscript\n"));
1035  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1036  $expectedTree->addChild($subNode);
1037  $subNode = new ‪IncludeTyposcriptInclude();
1038  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario4/AutoSubDir1/auto2.typoscript');
1039  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto2.typoscript\n"));
1040  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1041  $expectedTree->addChild($subNode);
1042  $subNode = new ‪IncludeTyposcriptInclude();
1043  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario4/AutoSubDir2/auto1.typoscript');
1044  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto1.typoscript\n"));
1045  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1046  $expectedTree->addChild($subNode);
1047  yield 'INCLUDE_TYPOSCRIPT DIR EXT files with auto include sub dirs' => [
1048  $includeTyposcriptStatementLineStream,
1049  $expectedTree,
1050  ];
1051 
1052  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario6">';
1053  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1054  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1055  $expectedTree = new ‪FileInclude();
1056  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1057  $expectedTree->setSplit();
1058  $subNode = new ‪IncludeTyposcriptInclude();
1059  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario6/setup.typoscript');
1060  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1061  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1062  $expectedTree->addChild($subNode);
1063  $subNode = new ‪IncludeTyposcriptInclude();
1064  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario6/SubDir/sub.typoscript');
1065  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("sub.typoscript\n"));
1066  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1067  $expectedTree->addChild($subNode);
1068  $subNode = new ‪IncludeTyposcriptInclude();
1069  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario6/SubDir/SubSubDir/subsub.typoscript');
1070  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subsub.typoscript\n"));
1071  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1072  $expectedTree->addChild($subNode);
1073  yield 'INCLUDE_TYPOSCRIPT DIR EXT files with auto include sub dirs recursive' => [
1074  $includeTyposcriptStatementLineStream,
1075  $expectedTree,
1076  ];
1077 
1078  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario7" extensions="setup.typoscript">';
1079  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1080  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1081  $expectedTree = new ‪FileInclude();
1082  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1083  $expectedTree->setSplit();
1084  $subNode = new ‪IncludeTyposcriptInclude();
1085  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario7/general.setup.typoscript');
1086  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1087  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1088  $expectedTree->addChild($subNode);
1089  $subNode = new ‪IncludeTyposcriptInclude();
1090  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario7/SubDir/sub.typoscript');
1091  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("sub.typoscript\n"));
1092  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1093  $subNode = new ‪IncludeTyposcriptInclude();
1094  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario7/SubDir/SubSubDir/subsub.setup.typoscript');
1095  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subsub.typoscript\n"));
1096  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1097  $expectedTree->addChild($subNode);
1098  yield 'INCLUDE_TYPOSCRIPT DIR EXT files with auto include sub dirs and extensions restriction recursive' => [
1099  $includeTyposcriptStatementLineStream,
1100  $expectedTree,
1101  ];
1102 
1103  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: extensions="typoscript,txt" source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5">';
1104  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1105  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1106  $expectedTree = new ‪FileInclude();
1107  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1108  $expectedTree->setSplit();
1109  $subNode = new ‪IncludeTyposcriptInclude();
1110  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5/setup1.typoscript');
1111  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1112  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1113  $expectedTree->addChild($subNode);
1114  $subNode = new ‪IncludeTyposcriptInclude();
1115  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5/setup2.foo.txt');
1116  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.foo.txt\n"));
1117  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1118  $expectedTree->addChild($subNode);
1119  yield 'INCLUDE_TYPOSCRIPT DIR EXT files extensions restriction' => [
1120  $includeTyposcriptStatementLineStream,
1121  $expectedTree,
1122  ];
1123 
1124  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:fileadmin/Scenario3">';
1125  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1126  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1127  $expectedTree = new ‪FileInclude();
1128  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1129  $expectedTree->setSplit();
1130  $subNode = new ‪IncludeTyposcriptInclude();
1131  $subNode->setName('fileadmin/Scenario3/setup1.typoscript');
1132  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1133  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1134  $expectedTree->addChild($subNode);
1135  $subNode = new ‪IncludeTyposcriptInclude();
1136  $subNode->setName('fileadmin/Scenario3/setup2.typoscript');
1137  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
1138  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1139  $expectedTree->addChild($subNode);
1140  yield 'INCLUDE_TYPOSCRIPT DIR fileadmin files' => [
1141  $includeTyposcriptStatementLineStream,
1142  $expectedTree,
1143  ];
1144 
1145  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:fileadmin/Scenario3/">';
1146  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1147  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1148  $expectedTree = new ‪FileInclude();
1149  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1150  $expectedTree->setSplit();
1151  $subNode = new ‪IncludeTyposcriptInclude();
1152  $subNode->setName('fileadmin/Scenario3/setup1.typoscript');
1153  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1154  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1155  $expectedTree->addChild($subNode);
1156  $subNode = new ‪IncludeTyposcriptInclude();
1157  $subNode->setName('fileadmin/Scenario3/setup2.typoscript');
1158  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
1159  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1160  $expectedTree->addChild($subNode);
1161  yield 'INCLUDE_TYPOSCRIPT DIR fileadmin files with ending slash' => [
1162  $includeTyposcriptStatementLineStream,
1163  $expectedTree,
1164  ];
1165 
1166  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="DIR:fileadmin/Scenario4">';
1167  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1168  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1169  $expectedTree = new ‪FileInclude();
1170  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1171  $expectedTree->setSplit();
1172  $subNode = new ‪IncludeTyposcriptInclude();
1173  $subNode->setName('fileadmin/Scenario4/setup1.typoscript');
1174  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1175  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1176  $expectedTree->addChild($subNode);
1177  $subNode = new ‪IncludeTyposcriptInclude();
1178  $subNode->setName('fileadmin/Scenario4/AutoSubDir1/auto1.typoscript');
1179  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto1.typoscript\n"));
1180  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1181  $expectedTree->addChild($subNode);
1182  $subNode = new ‪IncludeTyposcriptInclude();
1183  $subNode->setName('fileadmin/Scenario4/AutoSubDir1/auto2.typoscript');
1184  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto2.typoscript\n"));
1185  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1186  $expectedTree->addChild($subNode);
1187  $subNode = new ‪IncludeTyposcriptInclude();
1188  $subNode->setName('fileadmin/Scenario4/AutoSubDir2/auto1.typoscript');
1189  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("auto1.typoscript\n"));
1190  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1191  $expectedTree->addChild($subNode);
1192  yield 'INCLUDE_TYPOSCRIPT DIR fileadmin files with auto include sub dirs' => [
1193  $includeTyposcriptStatementLineStream,
1194  $expectedTree,
1195  ];
1196 
1197  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: extensions="typoscript,txt" source="DIR:fileadmin/Scenario5">';
1198  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1199  $includeTyposcriptStatementLineStreamLine = iterator_to_array((new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement)->getNextLine())[0];
1200  $expectedTree = new ‪FileInclude();
1201  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1202  $expectedTree->setSplit();
1203  $subNode = new ‪IncludeTyposcriptInclude();
1204  $subNode->setName('fileadmin/Scenario5/setup1.typoscript');
1205  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1206  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1207  $expectedTree->addChild($subNode);
1208  $subNode = new ‪IncludeTyposcriptInclude();
1209  $subNode->setName('fileadmin/Scenario5/setup2.foo.txt');
1210  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.foo.txt\n"));
1211  $subNode->setOriginalLine($includeTyposcriptStatementLineStreamLine);
1212  $expectedTree->addChild($subNode);
1213  yield 'INCLUDE_TYPOSCRIPT DIR fileadmin files extensions restriction' => [
1214  $includeTyposcriptStatementLineStream,
1215  $expectedTree,
1216  ];
1217 
1218  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: condition="[foo = bar]" source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">';
1219  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1220  $expectedTree = new ‪FileInclude();
1221  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1222  $expectedTree->setSplit();
1223  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1224  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1225  $subNode->setSplit();
1226  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 0));
1227  $expectedTree->addChild($subNode);
1228  $subSubNode = new ‪IncludeTyposcriptInclude();
1229  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1230  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1231  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1232  $subNode->addChild($subSubNode);
1233  yield 'INCLUDE_TYPOSCRIPT FILE EXT file with condition restriction' => [
1234  $includeTyposcriptStatementLineStream,
1235  $expectedTree,
1236  ];
1237 
1238  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:fileadmin/Scenario1/setup.typoscript" condition="[foo = bar]">';
1239  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1240  $expectedTree = new ‪FileInclude();
1241  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1242  $expectedTree->setSplit();
1243  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1244  $subNode->setName('fileadmin/Scenario1/setup.typoscript');
1245  $subNode->setSplit();
1246  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 0));
1247  $expectedTree->addChild($subNode);
1248  $subSubNode = new ‪IncludeTyposcriptInclude();
1249  $subSubNode->setName('fileadmin/Scenario1/setup.typoscript');
1250  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1251  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1252  $subNode->addChild($subSubNode);
1253  yield 'INCLUDE_TYPOSCRIPT FILE fileadmin file with condition restriction' => [
1254  $includeTyposcriptStatementLineStream,
1255  $expectedTree,
1256  ];
1257 
1258  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: condition="[applicationContext matches \"/^Production/\"]" source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">';
1259  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1260  $expectedTree = new ‪FileInclude();
1261  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1262  $expectedTree->setSplit();
1263  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1264  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1265  $subNode->setSplit();
1266  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'applicationContext matches "/^Production/"', 0, 0));
1267  $expectedTree->addChild($subNode);
1268  $subSubNode = new ‪IncludeTyposcriptInclude();
1269  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1270  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1271  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1272  $subNode->addChild($subSubNode);
1273  yield 'INCLUDE_TYPOSCRIPT FILE EXT file with complex condition restriction 1' => [
1274  $includeTyposcriptStatementLineStream,
1275  $expectedTree,
1276  ];
1277 
1278  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: condition="page[\"pid\"] in [17,24]" source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">';
1279  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1280  $expectedTree = new ‪FileInclude();
1281  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1282  $expectedTree->setSplit();
1283  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1284  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1285  $subNode->setSplit();
1286  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'page["pid"] in [17,24]', 0, 0));
1287  $expectedTree->addChild($subNode);
1288  $subSubNode = new ‪IncludeTyposcriptInclude();
1289  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1290  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1291  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1292  $subNode->addChild($subSubNode);
1293  yield 'INCLUDE_TYPOSCRIPT FILE EXT file with complex condition restriction 2' => [
1294  $includeTyposcriptStatementLineStream,
1295  $expectedTree,
1296  ];
1297 
1298  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: condition="[foo = bar]" source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative1.typoscript">';
1299  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1300  $expectedTree = new ‪FileInclude();
1301  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1302  $expectedTree->setSplit();
1303  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1304  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative1.typoscript');
1305  $subNode->setSplit();
1306  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 0));
1307  $expectedTree->addChild($subNode);
1308  $subSubNode = new ‪IncludeTyposcriptInclude();
1309  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/relative1.typoscript');
1310  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n"));
1311  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1312  $subSubNode->setSplit();
1313  $subNode->addChild($subSubNode);
1314  $subSubSubNode = new ‪IncludeTyposcriptInclude();
1315  $subSubSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario2/subInclude.typoscript');
1316  $subSubSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("subInclude.typoscript\n"));
1317  $subSubSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./subInclude.typoscript\">\n")->getNextLine())[0]);
1318  $subSubNode->addChild($subSubSubNode);
1319  yield 'INCLUDE_TYPOSCRIPT FILE EXT fileadmin file relative 1 sub include with condition restriction' => [
1320  $includeTyposcriptStatementLineStream,
1321  $expectedTree,
1322  ];
1323 
1324  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: extensions="typoscript" source="DIR:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5" condition="[foo = bar]">';
1325  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1326  $expectedTree = new ‪FileInclude();
1327  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1328  $expectedTree->setSplit();
1329  $subNode = new ‪ConditionIncludeTyposcriptInclude();
1330  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5');
1331  $subNode->setSplit();
1332  $subNode->setConditionToken(new ‪Token(TokenType::T_VALUE, 'foo = bar', 0, 0));
1333  $expectedTree->addChild($subNode);
1334  $subSubNode = new ‪IncludeTyposcriptInclude();
1335  $subSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario5/setup1.typoscript');
1336  $subSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup1.typoscript\n"));
1337  $subSubNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1338  $subNode->addChild($subSubNode);
1339  yield 'INCLUDE_TYPOSCRIPT DIR EXT files extensions restriction and condition restriction' => [
1340  $includeTyposcriptStatementLineStream,
1341  $expectedTree,
1342  ];
1343 
1344  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario1/setup.typoscript">';
1345  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1346  $expectedTree = new ‪FileInclude();
1347  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1348  $expectedTree->setSplit();
1349  $subNode = new ‪IncludeTyposcriptInclude();
1350  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario1/setup.typoscript');
1351  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario1/../Scenario1/invalidPathTraversalTarget.typoscript\">\n"));
1352  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1353  $subNode->setSplit();
1354  $expectedTree->addChild($subNode);
1355  yield 'INCLUDE_TYPOSCRIPT FILE EXT path traversal dot-dot-slash 1 is not allowed' => [
1356  $includeTyposcriptStatementLineStream,
1357  $expectedTree,
1358  ];
1359 
1360  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario2/setup.typoscript">';
1361  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1362  $expectedTree = new ‪FileInclude();
1363  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1364  $expectedTree->setSplit();
1365  $subNode = new ‪IncludeTyposcriptInclude();
1366  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario2/setup.typoscript');
1367  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario2/../invalidPathTraversalTarget.typoscript\">\n"));
1368  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1369  $subNode->setSplit();
1370  $expectedTree->addChild($subNode);
1371  yield 'INCLUDE_TYPOSCRIPT FILE EXT path traversal dot-dot-slash 2 is not allowed' => [
1372  $includeTyposcriptStatementLineStream,
1373  $expectedTree,
1374  ];
1375 
1376  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario3/setup.typoscript">';
1377  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1378  $expectedTree = new ‪FileInclude();
1379  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1380  $expectedTree->setSplit();
1381  $subNode = new ‪IncludeTyposcriptInclude();
1382  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario3/setup.typoscript');
1383  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./../Scenario3/invalidPathTraversalTarget.typoscript\">\n"));
1384  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1385  $subNode->setSplit();
1386  $expectedTree->addChild($subNode);
1387  yield 'INCLUDE_TYPOSCRIPT FILE relative path traversal dot-dot-slash 1 is not allowed' => [
1388  $includeTyposcriptStatementLineStream,
1389  $expectedTree,
1390  ];
1391 
1392  $includeTyposcriptStatement = '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario4/setup.typoscript">';
1393  $includeTyposcriptStatementLineStream = (new ‪LosslessTokenizer())->tokenize($includeTyposcriptStatement);
1394  $expectedTree = new ‪FileInclude();
1395  $expectedTree->setLineStream($includeTyposcriptStatementLineStream);
1396  $expectedTree->setSplit();
1397  $subNode = new ‪IncludeTyposcriptInclude();
1398  $subNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/InvalidImport/Scenario4/setup.typoscript');
1399  $subNode->setLineStream((new ‪LosslessTokenizer())->tokenize("<INCLUDE_TYPOSCRIPT: source=\"FILE:./../invalidPathTraversalTarget.typoscript\">\n"));
1400  $subNode->setOriginalLine(iterator_to_array($includeTyposcriptStatementLineStream->getNextLine())[0]);
1401  $subNode->setSplit();
1402  $expectedTree->addChild($subNode);
1403  yield 'INCLUDE_TYPOSCRIPT FILE relative path traversal dot-dot-slash 2 is not allowed' => [
1404  $includeTyposcriptStatementLineStream,
1405  $expectedTree,
1406  ];
1407  }
1408 
1409  #[DataProvider('buildTreeImportTyposcriptDataProvider')]
1410  #[Test]
1411  public function ‪buildTreeImportTyposcript(‪LineStream $lineStream, ‪IncludeInterface $expectedTree): void
1412  {
1413  $tree = (new ‪FileInclude());
1414  $tree->setLineStream($lineStream);
1415  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1416  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1417  self::assertEquals($expectedTree, $tree);
1418  }
1419 
1420  #[Test]
1422  {
1423  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = [
1424  'core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/',
1425  ];
1426  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'] = 'foo23';
1427 
1428  $expectedTree = new ‪FileInclude();
1429  $expectedTree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript'\n"));
1430  $expectedTree->setSplit();
1431  $expectedTreeSubNode = new ‪AtImportInclude();
1432  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1433  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1434  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript'\n")->getNextLine())[0]);
1435  $expectedTree->addChild($expectedTreeSubNode);
1436  $expectedTreeSubNode = new ‪DefaultTypoScriptMagicKeyInclude();
1437  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize('foo23'));
1438  $expectedTreeSubNode->setName('TYPO3_CONF_VARS defaultContentRendering for EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1439  $expectedTree->addChild($expectedTreeSubNode);
1440 
1441  $tree = new ‪FileInclude();
1442  $tree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript'\n"));
1443  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1444  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1445  self::assertEquals($expectedTree, $tree);
1446  }
1447 
1448  #[Test]
1450  {
1451  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = [
1452  'core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/',
1453  ];
1454  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'] = 'foo23';
1455 
1456  $expectedTree = new ‪FileInclude();
1457  $expectedTree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup'\n"));
1458  $expectedTree->setSplit();
1459  $expectedTreeSubNode = new ‪AtImportInclude();
1460  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1461  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1462  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup'\n")->getNextLine())[0]);
1463  $expectedTree->addChild($expectedTreeSubNode);
1464  $expectedTreeSubNode = new ‪DefaultTypoScriptMagicKeyInclude();
1465  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize('foo23'));
1466  $expectedTreeSubNode->setName('TYPO3_CONF_VARS defaultContentRendering for EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1467  $expectedTree->addChild($expectedTreeSubNode);
1468 
1469  $tree = new ‪FileInclude();
1470  $tree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup'\n"));
1471  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1472  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1473  self::assertEquals($expectedTree, $tree);
1474  }
1475 
1476  #[Test]
1478  {
1479  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = [
1480  'core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/',
1481  ];
1482  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'] = 'foo23';
1483 
1484  $expectedTree = new ‪FileInclude();
1485  $expectedTree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/'\n"));
1486  $expectedTree->setSplit();
1487  $expectedTreeSubNode = new ‪AtImportInclude();
1488  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1489  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1490  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/'\n")->getNextLine())[0]);
1491  $expectedTree->addChild($expectedTreeSubNode);
1492  $expectedTreeSubNode = new ‪DefaultTypoScriptMagicKeyInclude();
1493  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize('foo23'));
1494  $expectedTreeSubNode->setName('TYPO3_CONF_VARS defaultContentRendering for EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1495  $expectedTree->addChild($expectedTreeSubNode);
1496  $expectedTreeSubNode = new ‪AtImportInclude();
1497  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
1498  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
1499  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/'\n")->getNextLine())[0]);
1500  $expectedTree->addChild($expectedTreeSubNode);
1501  $expectedTreeSubNode = new ‪AtImportInclude();
1502  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/subInclude.typoscript');
1503  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n"));
1504  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/'\n")->getNextLine())[0]);
1505  $expectedTreeSubNode->setSplit();
1506  $expectedTreeSubSubNode = new ‪AtImportInclude();
1507  $expectedTreeSubSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript');
1508  $expectedTreeSubSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("SubDirectory.typoscript\n"));
1509  $expectedTreeSubSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/SubDirectory/SubDirectory.typoscript'\n")->getNextLine())[0]);
1510  $expectedTreeSubNode->addChild($expectedTreeSubSubNode);
1511  $expectedTree->addChild($expectedTreeSubNode);
1512 
1513  $tree = new ‪FileInclude();
1514  $tree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/'\n"));
1515  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1516  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1517  self::assertEquals($expectedTree, $tree);
1518  }
1519 
1520  #[Test]
1522  {
1523  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = [
1524  'core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/',
1525  ];
1526  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'] = 'foo23';
1527 
1528  $expectedTree = new ‪FileInclude();
1529  $expectedTree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*'\n"));
1530  $expectedTree->setSplit();
1531  $expectedTreeSubNode = new ‪AtImportInclude();
1532  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1533  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1534  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*'\n")->getNextLine())[0]);
1535  $expectedTree->addChild($expectedTreeSubNode);
1536  $expectedTreeSubNode = new ‪DefaultTypoScriptMagicKeyInclude();
1537  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize('foo23'));
1538  $expectedTreeSubNode->setName('TYPO3_CONF_VARS defaultContentRendering for EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup.typoscript');
1539  $expectedTree->addChild($expectedTreeSubNode);
1540  $expectedTreeSubNode = new ‪AtImportInclude();
1541  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup2.typoscript');
1542  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*'\n")->getNextLine())[0]);
1543  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup2.typoscript\n"));
1544  $expectedTree->addChild($expectedTreeSubNode);
1545 
1546  $tree = new ‪FileInclude();
1547  $tree->setLineStream((new ‪LosslessTokenizer())->tokenize("@import 'EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/AtImport/AbsoluteImport/Scenario1/setup*'\n"));
1548  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1549  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1550  self::assertEquals($expectedTree, $tree);
1551  }
1552 
1553  #[Test]
1555  {
1556  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['contentRenderingTemplates'] = [
1557  'core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/',
1558  ];
1559  ‪$GLOBALS['TYPO3_CONF_VARS']['FE']['defaultTypoScript_setup.']['defaultContentRendering'] = 'foo23';
1560 
1561  $expectedTree = new ‪FileInclude();
1562  $expectedTree->setLineStream((new ‪LosslessTokenizer())->tokenize('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">'));
1563  $expectedTree->setSplit();
1564  $expectedTreeSubNode = new ‪IncludeTyposcriptInclude();
1565  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize("setup.typoscript\n"));
1566  $expectedTreeSubNode->setName('EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1567  $expectedTreeSubNode->setOriginalLine(iterator_to_array((new ‪LosslessTokenizer())->tokenize('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">')->getNextLine())[0]);
1568  $expectedTree->addChild($expectedTreeSubNode);
1569  $expectedTreeSubNode = new ‪DefaultTypoScriptMagicKeyInclude();
1570  $expectedTreeSubNode->setLineStream((new ‪LosslessTokenizer())->tokenize('foo23'));
1571  $expectedTreeSubNode->setName('TYPO3_CONF_VARS defaultContentRendering for EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript');
1572  $expectedTree->addChild($expectedTreeSubNode);
1573 
1574  $tree = new ‪FileInclude();
1575  $tree->setLineStream((new ‪LosslessTokenizer())->tokenize('<INCLUDE_TYPOSCRIPT: source="FILE:EXT:core/Tests/Functional/TypoScript/IncludeTree/Fixtures/IncludeTyposcript/ExtImport/Scenario1/setup.typoscript">'));
1576  $treeFromTokenStreamBuilder = $this->get(TreeFromLineStreamBuilder::class);
1577  $treeFromTokenStreamBuilder->buildTree($tree, 'setup', new ‪LosslessTokenizer());
1578  self::assertEquals($expectedTree, $tree);
1579  }
1580 }
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeImportTyposcript
‪buildTreeImportTyposcript(LineStream $lineStream, IncludeInterface $expectedTree)
Definition: TreeFromLineStreamBuilderTest.php:1411
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\atImportIncludesMagicTypoScriptRenderingForSimpleFileWithoutDotTypoScriptEnding
‪atImportIncludesMagicTypoScriptRenderingForSimpleFileWithoutDotTypoScriptEnding()
Definition: TreeFromLineStreamBuilderTest.php:1449
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\atImportIncludesMagicTypoScriptRenderingForSimpleFile
‪atImportIncludesMagicTypoScriptRenderingForSimpleFile()
Definition: TreeFromLineStreamBuilderTest.php:1421
‪TYPO3\CMS\Core\TypoScript\Tokenizer\LosslessTokenizer
Definition: LosslessTokenizer.php:61
‪TYPO3\CMS\Core\TypoScript\Tokenizer\Token\Token
Definition: Token.php:29
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\$pathsToLinkInTestInstance
‪array $pathsToLinkInTestInstance
Definition: TreeFromLineStreamBuilderTest.php:41
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\SegmentInclude
Definition: SegmentInclude.php:32
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeAtImportTsConfigDataProvider
‪static buildTreeAtImportTsConfigDataProvider()
Definition: TreeFromLineStreamBuilderTest.php:786
‪TYPO3\CMS\Core\TypoScript\Tokenizer\Token\TokenType
‪TokenType
Definition: TokenType.php:26
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeAtImportTsConfig
‪buildTreeAtImportTsConfig(LineStream $lineStream, IncludeInterface $expectedTree)
Definition: TreeFromLineStreamBuilderTest.php:812
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\importTyposcriptIncludesMagicTypoScriptRenderingForSimpleFile
‪importTyposcriptIncludesMagicTypoScriptRenderingForSimpleFile()
Definition: TreeFromLineStreamBuilderTest.php:1554
‪TYPO3\CMS\Core\TypoScript\IncludeTree\TreeFromLineStreamBuilder
Definition: TreeFromLineStreamBuilder.php:58
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest
Definition: TreeFromLineStreamBuilderTest.php:40
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeAtImport
‪buildTreeAtImport(LineStream $lineStream, IncludeInterface $expectedTree)
Definition: TreeFromLineStreamBuilderTest.php:777
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeConditionDataProvider
‪static buildTreeConditionDataProvider()
Definition: TreeFromLineStreamBuilderTest.php:64
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\IncludeTreeObjectIgnoringIdentifierAndPathComparator
Definition: IncludeTreeObjectIgnoringIdentifierAndPathComparator.php:27
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeImportTyposcriptDataProvider
‪static buildTreeImportTyposcriptDataProvider()
Definition: TreeFromLineStreamBuilderTest.php:821
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeAtImportDataProvider
‪static buildTreeAtImportDataProvider()
Definition: TreeFromLineStreamBuilderTest.php:294
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\atImportIncludesMagicTypoScriptRenderingForDirectoryInclude
‪atImportIncludesMagicTypoScriptRenderingForDirectoryInclude()
Definition: TreeFromLineStreamBuilderTest.php:1477
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeInterface
Definition: IncludeInterface.php:39
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\FileInclude
Definition: FileInclude.php:28
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\atImportIncludesMagicTypoScriptRenderingForWildcardInclude
‪atImportIncludesMagicTypoScriptRenderingForWildcardInclude()
Definition: TreeFromLineStreamBuilderTest.php:1521
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\$initializeDatabase
‪bool $initializeDatabase
Definition: TreeFromLineStreamBuilderTest.php:52
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\DefaultTypoScriptMagicKeyInclude
Definition: DefaultTypoScriptMagicKeyInclude.php:26
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionInclude
Definition: ConditionInclude.php:29
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\buildTreeCondition
‪buildTreeCondition(IncludeInterface $tree, IncludeInterface $expectedTree)
Definition: TreeFromLineStreamBuilderTest.php:288
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeTyposcriptInclude
Definition: IncludeTyposcriptInclude.php:25
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\TypoScript\Tokenizer\Line\LineStream
Definition: LineStream.php:29
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionIncludeTyposcriptInclude
Definition: ConditionIncludeTyposcriptInclude.php:28
‪TYPO3\CMS\Core\TypoScript\Tokenizer\LossyTokenizer
Definition: LossyTokenizer.php:57
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\ConditionElseInclude
Definition: ConditionElseInclude.php:34
‪TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\AtImportInclude
Definition: AtImportInclude.php:27
‪TYPO3\CMS\Core\Tests\Functional\TypoScript\IncludeTree\TreeFromLineStreamBuilderTest\setUp
‪setUp()
Definition: TreeFromLineStreamBuilderTest.php:54