GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( 75bdf9...8faa57 )
by joseph
83:56 queued 81:04
created

anonymous//tests/Assets/TestCodeGenerator.php$0   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 24
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 5
dl 0
loc 24
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace EdmondsCommerce\DoctrineStaticMeta\Tests\Assets;
4
5
use Composer\Autoload\ClassLoader;
6
use EdmondsCommerce\DoctrineStaticMeta\Builder\Builder;
7
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\AbstractGenerator;
8
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\FieldGenerator;
9
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field\IdTrait;
10
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\FindAndReplaceHelper;
11
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\RelationsGenerator;
12
use EdmondsCommerce\DoctrineStaticMeta\MappingHelper;
13
use Symfony\Component\Filesystem\Filesystem;
14
15
class TestCodeGenerator
16
{
17
18
    public const  TEST_PROJECT_ROOT_NAMESPACE = 'Test\\Code\\Generator';
19
20
    public const  TEST_ENTITY_NAMESPACE_BASE = self::TEST_PROJECT_ROOT_NAMESPACE
21
                                               . '\\' . AbstractGenerator::ENTITIES_FOLDER_NAME;
22
23
    public const TEST_FIELD_NAMESPACE_BASE = self::TEST_PROJECT_ROOT_NAMESPACE . '\\Entity\\Fields';
24
25
    public const  TEST_FIELD_FQN_BASE = self::TEST_FIELD_NAMESPACE_BASE . '\\Traits';
26
27
    public const TEST_ENTITY_PERSON                      = '\\Person';
28
    public const TEST_ENTITY_ATTRIBUTES_ADDRESS          = '\\Attributes\\Address';
29
    public const TEST_ENTITY_EMAIL                       = '\\Attributes\\Email';
30
    public const TEST_ENTITY_COMPANY                     = '\\Company';
31
    public const TEST_ENTITY_DIRECTOR                    = '\\Company\\Director';
32
    public const TEST_ENTITY_ORDER                       = '\\Order';
33
    public const TEST_ENTITY_ORDER_ADDRESS               = '\\Order\\Address';
34
    public const TEST_ENTITY_NAME_SPACING_SOME_CLIENT    = '\\Some\\Client';
35
    public const TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT = '\\Another\\Deeply\\Nested\\Client';
36
    public const TEST_ENTITY_LARGE_DATA                  = '\\Large\\Data';
37
    public const TEST_ENTITY_LARGE_PROPERTIES            = '\\Large\\Property';
38
    public const TEST_ENTITY_LARGE_RELATIONS             = '\\Large\\Relation';
39
    public const TEST_ENTITY_ALL_ARCHETYPE_FIELDS        = '\\All\\StandardLibraryFields\\TestEntity';
40
    public const TEST_ENTITY_INTEGER_KEY                 = '\\IntegerIdKeyEntity';
41
    public const TEST_ENTITIES                           = [
42
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
43
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
44
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
45
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
46
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
47
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
48
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
49
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
50
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
51
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
52
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_PROPERTIES,
53
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
54
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ALL_ARCHETYPE_FIELDS,
55
    ];
56
57
58
    public const TEST_RELATIONS = [
59
        [
60
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
61
            RelationsGenerator::HAS_UNIDIRECTIONAL_MANY_TO_ONE,
62
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
63
        ],
64
        [
65
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
66
            RelationsGenerator::HAS_ONE_TO_MANY,
67
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
68
        ],
69
        [
70
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
71
            RelationsGenerator::HAS_MANY_TO_MANY,
72
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
73
        ],
74
        [
75
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
76
            RelationsGenerator::HAS_ONE_TO_MANY,
77
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
78
        ],
79
        [
80
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
81
            RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_MANY,
82
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
83
        ],
84
        [
85
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
86
            RelationsGenerator::HAS_ONE_TO_ONE,
87
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
88
        ],
89
        [
90
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
91
            RelationsGenerator::HAS_MANY_TO_ONE,
92
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
93
        ],
94
        [
95
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
96
            RelationsGenerator::HAS_ONE_TO_MANY,
97
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
98
        ],
99
        [
100
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
101
            RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_ONE,
102
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
103
        ],
104
        [
105
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
106
            RelationsGenerator::HAS_ONE_TO_ONE,
107
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
108
        ],
109
        [
110
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
111
            RelationsGenerator::HAS_ONE_TO_ONE,
112
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
113
        ],
114
        [
115
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
116
            RelationsGenerator::HAS_UNIDIRECTIONAL_MANY_TO_ONE,
117
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
118
        ],
119
        [
120
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
121
            RelationsGenerator::HAS_ONE_TO_MANY,
122
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
123
        ],
124
        [
125
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
126
            RelationsGenerator::HAS_MANY_TO_MANY,
127
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
128
        ],
129
        [
130
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
131
            RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_MANY,
132
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
133
        ],
134
        [
135
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
136
            RelationsGenerator::HAS_ONE_TO_ONE,
137
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
138
        ],
139
        [
140
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
141
            RelationsGenerator::HAS_MANY_TO_ONE,
142
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_PROPERTIES,
143
        ],
144
        [
145
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
146
            RelationsGenerator::HAS_ONE_TO_MANY,
147
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
148
        ],
149
        [
150
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
151
            RelationsGenerator::HAS_UNIDIRECTIONAL_ONE_TO_ONE,
152
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
153
        ],
154
    ];
155
156
    public const LARGE_DATA_FIELDS = [
157
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataOne',
158
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataTwo',
159
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataThree',
160
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataFour',
161
    ];
162
163
    public const LARGE_PROPERTIES_FIELDS = [
164
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData001',
165
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData002',
166
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData003',
167
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData004',
168
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData005',
169
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData006',
170
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData007',
171
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData008',
172
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData009',
173
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData010',
174
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData011',
175
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData012',
176
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData013',
177
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData014',
178
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData015',
179
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData016',
180
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData017',
181
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData018',
182
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData019',
183
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData020',
184
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData021',
185
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData022',
186
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData023',
187
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData024',
188
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData025',
189
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData026',
190
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData027',
191
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData028',
192
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData029',
193
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData030',
194
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData031',
195
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData032',
196
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData033',
197
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData034',
198
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData035',
199
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData036',
200
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData037',
201
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData038',
202
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData039',
203
    ];
204
205
    public const  BUILD_DIR       = AbstractTest::VAR_PATH . '/../testCode';
206
    private const BUILD_HASH_FILE = self::BUILD_DIR . '/.buildHash';
207
208
    /**
209
     * @var Builder
210
     */
211
    protected $builder;
212
    /**
213
     * @var Filesystem
214
     */
215
    protected $filesystem;
216
    /**
217
     * @var FindAndReplaceHelper
218
     */
219
    protected $findAndReplaceHelper;
220
221
    public function __construct(Builder $builder, Filesystem $filesystem, FindAndReplaceHelper $findAndReplaceHelper)
222
    {
223
        $this->filesystem = $filesystem;
224
        $this->initBuildDir();
225
        $this->builder = $builder->setProjectRootNamespace(self::TEST_PROJECT_ROOT_NAMESPACE)
226
                                 ->setPathToProjectRoot(self::BUILD_DIR);
227
        $this->buildOnce();
228
        $this->findAndReplaceHelper = $findAndReplaceHelper;
229
    }
230
231
    private function initBuildDir(): void
232
    {
233
234
        if (!is_dir(self::BUILD_DIR)) {
235
            $this->filesystem->mkdir(self::BUILD_DIR);
236
        }
237
    }
238
239
    public function buildOnce(): void
240
    {
241
        if ($this->isBuilt()) {
242
            return;
243
        }
244
        $this->filesystem->remove(self::BUILD_DIR);
245
        $this->filesystem->mkdir(self::BUILD_DIR);
246
        $this->extendAutoloader();
247
        $fields = $this->buildCommonTypeFields();
248
        $this->buildEntitiesAndAssignCommonFields($fields);
249
        $this->updateLargeDataEntity();
250
        $this->updateLargePropertiesEntity();
251
        $this->updateAllArchetypeFieldsEntity();
252
        $this->buildEntityWithIntegerKey($fields);
253
        $this->setRelations();
254
        $this->resetAutoloader();
255
        $this->setBuildHash();
256
    }
257
258
    /**
259
     * Check that a file exists in the build directory which contains the md5 hash of this class.
260
     *
261
     * This means that if we update this class, the hash changes and the built files are invalid and will be nuked
262
     *
263
     * @return bool
264
     */
265
    private function isBuilt(): bool
266
    {
267
        return file_exists(self::BUILD_HASH_FILE) && $this->validateBuildHash();
268
    }
269
270
    private function validateBuildHash(): bool
271
    {
272
        return md5(\ts\file_get_contents(__FILE__)) === \ts\file_get_contents(self::BUILD_HASH_FILE);
273
    }
274
275
    private function extendAutoloader(): void
276
    {
277
        $testLoader = new class(self::TEST_PROJECT_ROOT_NAMESPACE) extends ClassLoader
278
        {
279
            /**
280
             * @var string
281
             */
282
            protected $namespace;
283
284
            public function __construct(string $namespace)
285
            {
286
                $this->namespace = $namespace;
287
            }
288
289
            public function loadClass($class)
290
            {
291
                if (false === strpos($class, $this->namespace)) {
292
                    return false;
293
                }
294
                $found = parent::loadClass($class);
295
                if (false === $found || null === $found) {
0 ignored issues
show
introduced by
The condition null === $found is always false.
Loading history...
296
                    //good point to set a breakpoint
297
                    return $found;
298
                }
299
300
                return $found;
301
            }
302
        };
303
        $testLoader->addPsr4(self::TEST_PROJECT_ROOT_NAMESPACE . '\\', self::BUILD_DIR . '/src', true);
304
        $testLoader->addPsr4(self::TEST_PROJECT_ROOT_NAMESPACE . '\\', self::BUILD_DIR . '/tests', true);
305
        $testLoader->register();
306
    }
307
308
    /**
309
     * Build the fields and return an array of Field Trait FQNs
310
     *
311
     * @return array|string[]
312
     * @throws \EdmondsCommerce\DoctrineStaticMeta\Exception\DoctrineStaticMetaException
313
     * @throws \ReflectionException
314
     */
315
    private function buildCommonTypeFields(): array
316
    {
317
        $fields         = [];
318
        $fieldGenerator = $this->builder->getFieldGenerator();
319
320
        foreach (MappingHelper::COMMON_TYPES as $type) {
321
            $fields[] = $fieldGenerator->generateField(
322
                self::TEST_FIELD_FQN_BASE . '\\' . ucwords($type),
323
                $type
324
            );
325
        }
326
327
        return $fields;
328
    }
329
330
    private function buildEntitiesAndAssignCommonFields(array $fields): void
331
    {
332
333
        $entityGenerator = $this->builder->getEntityGenerator();
334
        $fieldSetter     = $this->builder->getFieldSetter();
335
336
        foreach (self::TEST_ENTITIES as $entityFqn) {
337
            $entityGenerator->generateEntity($entityFqn);
338
            foreach ($fields as $fieldFqn) {
339
                $fieldSetter->setEntityHasField($entityFqn, $fieldFqn);
340
            }
341
        }
342
    }
343
344
    private function updateLargeDataEntity(): void
345
    {
346
        $fieldGenerator = $this->builder->getFieldGenerator();
347
        $fieldSetter    = $this->builder->getFieldSetter();
348
        foreach (self::LARGE_DATA_FIELDS as $field) {
349
            $fieldSetter->setEntityHasField(
350
                self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
351
                $fieldGenerator->generateField($field, MappingHelper::TYPE_TEXT)
352
            );
353
        }
354
    }
355
356
    private function updateLargePropertiesEntity(): void
357
    {
358
        $fieldGenerator = $this->builder->getFieldGenerator();
359
        $fieldSetter    = $this->builder->getFieldSetter();
360
        foreach (self::LARGE_PROPERTIES_FIELDS as $field) {
361
            $fieldSetter->setEntityHasField(
362
                self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
363
                $fieldGenerator->generateField($field, MappingHelper::TYPE_BOOLEAN)
364
            );
365
        }
366
    }
367
368
    private function updateAllArchetypeFieldsEntity(): void
369
    {
370
        $fieldSetter = $this->builder->getFieldSetter();
371
        foreach (FieldGenerator::STANDARD_FIELDS as $archetypeFieldFqn) {
372
            $fieldSetter->setEntityHasField(
373
                self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ALL_ARCHETYPE_FIELDS,
374
                $archetypeFieldFqn
375
            );
376
        }
377
    }
378
379
    private function buildEntityWithIntegerKey(array $fields)
380
    {
381
        $entityFqn = self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_INTEGER_KEY;
382
        $this->builder->getEntityGenerator()
0 ignored issues
show
Deprecated Code introduced by
The function EdmondsCommerce\Doctrine...or::setPrimaryKeyType() has been deprecated. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

382
        /** @scrutinizer ignore-deprecated */ $this->builder->getEntityGenerator()
Loading history...
383
                      ->setPrimaryKeyType(IdTrait::INTEGER_ID_FIELD_TRAIT)
384
                      ->generateEntity($entityFqn);
385
        foreach ($fields as $fieldFqn) {
386
            $this->builder->getFieldSetter()->setEntityHasField($entityFqn, $fieldFqn);
387
        }
388
    }
389
390
    private function setRelations(): void
391
    {
392
        $relationsGenerator = $this->builder->getRelationsGenerator();
393
394
        foreach (self::TEST_RELATIONS as $relation) {
395
            $relationsGenerator->setEntityHasRelationToEntity(...$relation);
396
        }
397
    }
398
399
    private function resetAutoloader(): void
400
    {
401
        $registered = \spl_autoload_functions();
402
        $loader     = array_pop($registered);
403
        \spl_autoload_unregister($loader);
404
    }
405
406
    private function setBuildHash(): void
407
    {
408
        \ts\file_put_contents(self::BUILD_HASH_FILE, md5(\ts\file_get_contents(__FILE__)));
409
    }
410
411
    public function copyTo(
412
        string $destinationPath,
413
        string $replaceNamespace = AbstractTest::TEST_PROJECT_ROOT_NAMESPACE
414
    ): void {
415
        $this->filesystem->mirror(self::BUILD_DIR, $destinationPath);
416
        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($destinationPath));
417
418
        foreach ($iterator as $info) {
419
            /**
420
             * @var \SplFileInfo $info
421
             */
422
            if (false === $info->isFile()) {
423
                continue;
424
            }
425
            $contents = file_get_contents($info->getPathname());
426
427
            $updated = \preg_replace(
428
                '%(use|namespace)\s+?'
429
                . $this->findAndReplaceHelper->escapeSlashesForRegex(self::TEST_PROJECT_ROOT_NAMESPACE)
430
                . '\\\\%',
431
                '$1 ' . $replaceNamespace . '\\',
432
                $contents
433
            );
434
            file_put_contents($info->getPathname(), $updated);
435
        }
436
    }
437
}
438