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 ( a48bd8...83d092 )
by joseph
16:18 queued 18s
created

TestCodeGenerator.php$0 ➔ setBuildHash()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
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\FindAndReplaceHelper;
10
use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\RelationsGenerator;
11
use EdmondsCommerce\DoctrineStaticMeta\Entity\Embeddable\Traits\Financial\HasMoneyEmbeddableTrait;
12
use EdmondsCommerce\DoctrineStaticMeta\Entity\Embeddable\Traits\Geo\HasAddressEmbeddableTrait;
13
use EdmondsCommerce\DoctrineStaticMeta\Entity\Embeddable\Traits\Identity\HasFullNameEmbeddableTrait;
14
use EdmondsCommerce\DoctrineStaticMeta\Entity\Fields\Traits\String\EmailAddressFieldTrait;
15
use EdmondsCommerce\DoctrineStaticMeta\MappingHelper;
16
use Symfony\Component\Filesystem\Filesystem;
17
18
/**
19
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
20
 */
21
class TestCodeGenerator
22
{
23
24
    public const   TEST_PROJECT_ROOT_NAMESPACE = 'Test\\Code\\Generator';
25
    public const   TEST_ENTITY_NAMESPACE_BASE  = '\\' . AbstractGenerator::ENTITIES_FOLDER_NAME;
26
    private const  TEST_FIELD_NAMESPACE_BASE   = '\\Entity\\Fields';
27
    private const  TEST_FIELD_FQN_BASE         = self::TEST_FIELD_NAMESPACE_BASE . '\\Traits';
28
29
    public const TEST_ENTITY_PERSON                      = '\\Person';
30
    public const TEST_ENTITY_ATTRIBUTES_ADDRESS          = '\\Attributes\\Address';
31
    public const TEST_ENTITY_EMAIL                       = '\\Attributes\\Email';
32
    public const TEST_ENTITY_COMPANY                     = '\\Company';
33
    public const TEST_ENTITY_DIRECTOR                    = '\\Company\\Director';
34
    public const TEST_ENTITY_ORDER                       = '\\Order';
35
    public const TEST_ENTITY_ORDER_ADDRESS               = '\\Order\\Address';
36
    public const TEST_ENTITY_NAME_SPACING_SOME_CLIENT    = '\\Some\\Client';
37
    public const TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT = '\\Another\\Deeply\\Nested\\Client';
38
    public const TEST_ENTITY_LARGE_DATA                  = '\\Large\\Data';
39
    public const TEST_ENTITY_LARGE_PROPERTIES            = '\\Large\\Property';
40
    public const TEST_ENTITY_LARGE_RELATIONS             = '\\Large\\Relation';
41
    public const TEST_ENTITY_ALL_ARCHETYPE_FIELDS        = '\\All\\StandardLibraryFields\\TestEntity';
42
    public const TEST_ENTITY_ALL_EMBEDDABLES             = '\\AllEmbeddable';
43
44
    public const TEST_ENTITIES = [
45
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
46
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
47
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
48
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
49
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
50
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
51
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
52
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
53
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
54
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
55
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_PROPERTIES,
56
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
57
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ALL_ARCHETYPE_FIELDS,
58
        self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ALL_EMBEDDABLES,
59
    ];
60
61
62
    private const TEST_RELATIONS = [
63
        [
64
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
65
            RelationsGenerator::HAS_UNIDIRECTIONAL_MANY_TO_ONE,
66
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
67
            false,
68
        ],
69
        [
70
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
71
            RelationsGenerator::HAS_REQUIRED_ONE_TO_MANY,
72
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
73
            false,
74
        ],
75
        [
76
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
77
            RelationsGenerator::HAS_REQUIRED_MANY_TO_MANY,
78
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
79
            true,
80
        ],
81
        [
82
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
83
            RelationsGenerator::HAS_REQUIRED_ONE_TO_MANY,
84
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
85
            false,
86
        ],
87
        [
88
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
89
            RelationsGenerator::HAS_REQUIRED_UNIDIRECTIONAL_ONE_TO_MANY,
90
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
91
            false,
92
        ],
93
        [
94
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
95
            RelationsGenerator::HAS_REQUIRED_ONE_TO_ONE,
96
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
97
            false,
98
        ],
99
        [
100
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
101
            RelationsGenerator::HAS_REQUIRED_UNIDIRECTIONAL_MANY_TO_ONE,
102
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
103
            false,
104
        ],
105
        [
106
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER,
107
            RelationsGenerator::HAS_REQUIRED_ONE_TO_MANY,
108
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
109
            true,
110
        ],
111
        [
112
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
113
            RelationsGenerator::HAS_REQUIRED_UNIDIRECTIONAL_ONE_TO_ONE,
114
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
115
            false,
116
        ],
117
        [
118
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
119
            RelationsGenerator::HAS_ONE_TO_ONE,
120
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_SOME_CLIENT,
121
            false,
122
        ],
123
        [
124
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
125
            RelationsGenerator::HAS_ONE_TO_ONE,
126
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_NAME_SPACING_ANOTHER_CLIENT,
127
            false,
128
        ],
129
        [
130
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
131
            RelationsGenerator::HAS_UNIDIRECTIONAL_MANY_TO_ONE,
132
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ATTRIBUTES_ADDRESS,
133
            false,
134
        ],
135
        [
136
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
137
            RelationsGenerator::HAS_REQUIRED_ONE_TO_MANY,
138
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_EMAIL,
139
            false,
140
        ],
141
        [
142
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
143
            RelationsGenerator::HAS_MANY_TO_MANY,
144
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_DIRECTOR,
145
            false,
146
        ],
147
        [
148
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
149
            RelationsGenerator::HAS_REQUIRED_UNIDIRECTIONAL_ONE_TO_MANY,
150
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_DATA,
151
            false,
152
        ],
153
        [
154
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
155
            RelationsGenerator::HAS_ONE_TO_ONE,
156
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_PERSON,
157
            false,
158
        ],
159
        [
160
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
161
            RelationsGenerator::HAS_REQUIRED_MANY_TO_ONE,
162
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_PROPERTIES,
163
            true,
164
        ],
165
        [
166
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
167
            RelationsGenerator::HAS_ONE_TO_MANY,
168
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_ORDER_ADDRESS,
169
            false,
170
        ],
171
        [
172
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_LARGE_RELATIONS,
173
            RelationsGenerator::HAS_REQUIRED_UNIDIRECTIONAL_ONE_TO_ONE,
174
            self::TEST_ENTITY_NAMESPACE_BASE . self::TEST_ENTITY_COMPANY,
175
            false,
176
        ],
177
    ];
178
179
    private const LARGE_DATA_FIELDS = [
180
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataOne',
181
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataTwo',
182
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataThree',
183
        self::TEST_FIELD_FQN_BASE . '\\Large\\Data\\LargeDataFour',
184
    ];
185
186
    private const LARGE_PROPERTIES_FIELDS = [
187
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData001',
188
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData002',
189
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData003',
190
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData004',
191
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData005',
192
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData006',
193
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData007',
194
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData008',
195
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData009',
196
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData010',
197
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData011',
198
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData012',
199
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData013',
200
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData014',
201
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData015',
202
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData016',
203
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData017',
204
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData018',
205
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData019',
206
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData020',
207
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData021',
208
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData022',
209
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData023',
210
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData024',
211
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData025',
212
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData026',
213
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData027',
214
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData028',
215
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData029',
216
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData030',
217
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData031',
218
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData032',
219
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData033',
220
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData034',
221
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData035',
222
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData036',
223
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData037',
224
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData038',
225
        self::TEST_FIELD_FQN_BASE . '\\Large\\Properties\\LargeData039',
226
    ];
227
228
    private const  BUILD_DIR                      = AbstractTest::VAR_PATH . '/../testCode';
229
    private const  BUILD_DIR_TMP_B1               = AbstractTest::VAR_PATH . '/../testCodeTmp1';
230
    private const  BUILD_DIR_TMP_B2               = AbstractTest::VAR_PATH . '/../testCodeTmp2';
231
    private const  TEST_PROJECT_ROOT_NAMESPACE_B1 = self::TEST_PROJECT_ROOT_NAMESPACE . '\\Tmp1';
232
    private const  TEST_ENTITY_NAMESPACE_BASE_B1  = self::TEST_PROJECT_ROOT_NAMESPACE_B1 .
233
                                                    self::TEST_ENTITY_NAMESPACE_BASE;
234
    private const  TEST_PROJECT_ROOT_NAMESPACE_B2 = self::TEST_PROJECT_ROOT_NAMESPACE . '\\Tmp2';
235
    private const  BUILD_HASH_FILE                = self::BUILD_DIR . '/.buildHash';
236
237
    /**
238
     * @var Builder
239
     */
240
    protected $builder;
241
    /**
242
     * @var Filesystem
243
     */
244
    protected $filesystem;
245
    /**
246
     * @var FindAndReplaceHelper
247
     */
248
    protected $findAndReplaceHelper;
249
    /**
250
     * @var CodeCopier
251
     */
252
    private $codeCopier;
253
254
    public function __construct(
255
        Builder $builder,
256
        Filesystem $filesystem,
257
        FindAndReplaceHelper $findAndReplaceHelper
258
    ) {
259
        $this->builder    = $builder;
260
        $this->filesystem = $filesystem;
261
        $this->codeCopier = new CodeCopier($this->filesystem, $findAndReplaceHelper);
262
        $this->initBuildDir();
263
        $this->buildOnce();
264
    }
265
266
    private function initBuildDir(): void
267
    {
268
269
        if (!is_dir(self::BUILD_DIR)) {
270
            $this->filesystem->mkdir(self::BUILD_DIR);
271
        }
272
    }
273
274
    private function buildOnce(): void
275
    {
276
        if ($this->isBuilt()) {
277
            return;
278
        }
279
        $this->firstBuild();
280
        $this->secondBuild();
281
        $this->filesystem->remove(self::BUILD_DIR_TMP_B1);
282
        $this->filesystem->remove(self::BUILD_DIR_TMP_B2);
283
        $this->setBuildHash();
284
    }
285
286
    /**
287
     * Check that a file exists in the build directory which contains the md5 hash of this class.
288
     *
289
     * This means that if we update this class, the hash changes and the built files are invalid and will be nuked
290
     *
291
     * @return bool
292
     */
293
    private function isBuilt(): bool
294
    {
295
        return file_exists(self::BUILD_HASH_FILE) && $this->validateBuildHash();
296
    }
297
298
    private function validateBuildHash(): bool
299
    {
300
        return md5(\ts\file_get_contents(__FILE__)) === \ts\file_get_contents(self::BUILD_HASH_FILE);
301
    }
302
303
    private function firstBuild(): void
304
    {
305
        $this->emptyDir(self::BUILD_DIR_TMP_B1);
306
        $this->builder->setProjectRootNamespace(self::TEST_PROJECT_ROOT_NAMESPACE_B1)
307
                      ->setPathToProjectRoot(self::BUILD_DIR_TMP_B1);
308
        $this->filesystem->remove(self::BUILD_DIR_TMP_B1);
309
        $this->filesystem->mkdir(self::BUILD_DIR_TMP_B1);
310
        $this->extendAutoloader(self::TEST_PROJECT_ROOT_NAMESPACE_B1, self::BUILD_DIR_TMP_B1);
311
        $fields = $this->buildCommonTypeFields();
312
        $this->buildEntitiesAndAssignCommonFields($fields);
313
        $this->updateLargeDataEntity();
314
        $this->updateLargePropertiesEntity();
315
        $this->updateAllArchetypeFieldsEntity();
316
        $this->updateEmailEntity();
317
        $this->updateAllEmbeddablesEntity();
318
        $this->setRelations();
319
        $this->resetAutoloader();
320
    }
321
322
    private function emptyDir(string $path): void
323
    {
324
        $this->filesystem->remove($path);
325
        $this->filesystem->mkdir($path);
326
    }
327
328
    private function extendAutoloader(string $namespace, string $buildDir): void
329
    {
330
        $testLoader = new class($namespace) extends ClassLoader
331
        {
332
            /**
333
             * @var string
334
             */
335
            protected $namespace;
336
337
            public function __construct(string $namespace)
338
            {
339
                $this->namespace = $namespace;
340
            }
341
342
            public function loadClass($class)
343
            {
344
                if (false === strpos($class, $this->namespace)) {
345
                    return false;
346
                }
347
                $found = parent::loadClass($class);
348
                if (false === $found || null === $found) {
0 ignored issues
show
introduced by
The condition null === $found is always false.
Loading history...
349
                    //good point to set a breakpoint
350
                    return $found;
351
                }
352
353
                return $found;
354
            }
355
        };
356
        $testLoader->addPsr4($namespace . '\\', $buildDir . '/src', true);
357
        $testLoader->addPsr4($namespace . '\\', $buildDir . '/tests', true);
358
        $testLoader->register();
359
    }
360
361
    /**
362
     * Build the fields and return an array of Field Trait FQNs
363
     *
364
     * @return array|string[]
365
     * @throws \EdmondsCommerce\DoctrineStaticMeta\Exception\DoctrineStaticMetaException
366
     * @throws \ReflectionException
367
     */
368
    private function buildCommonTypeFields(): array
369
    {
370
        $fields         = [];
371
        $fieldGenerator = $this->builder->getFieldGenerator();
372
373
        foreach (MappingHelper::COMMON_TYPES as $type) {
374
            $fields[] = $fieldGenerator->generateField(
375
                self::TEST_PROJECT_ROOT_NAMESPACE_B1 . self::TEST_FIELD_FQN_BASE . '\\' . ucwords($type),
376
                $type
377
            );
378
        }
379
380
        return $fields;
381
    }
382
383
    private function buildEntitiesAndAssignCommonFields(array $fields): void
384
    {
385
386
        $entityGenerator = $this->builder->getEntityGenerator();
387
        $fieldSetter     = $this->builder->getFieldSetter();
388
389
        foreach (self::TEST_ENTITIES as $entityFqn) {
390
            $entityGenerator->generateEntity(self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $entityFqn);
391
            foreach ($fields as $fieldFqn) {
392
                $fieldSetter->setEntityHasField(
393
                    self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $entityFqn,
394
                    $fieldFqn
395
                );
396
            }
397
        }
398
    }
399
400
    private function updateLargeDataEntity(): void
401
    {
402
        $fieldGenerator = $this->builder->getFieldGenerator();
403
        $fieldSetter    = $this->builder->getFieldSetter();
404
        foreach (self::LARGE_DATA_FIELDS as $field) {
405
            $fieldSetter->setEntityHasField(
406
                self::TEST_ENTITY_NAMESPACE_BASE_B1 . self::TEST_ENTITY_LARGE_DATA,
407
                $fieldGenerator->generateField(
408
                    self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $field,
409
                    MappingHelper::TYPE_TEXT
410
                )
411
            );
412
        }
413
    }
414
415
    private function updateLargePropertiesEntity(): void
416
    {
417
        $fieldGenerator = $this->builder->getFieldGenerator();
418
        $fieldSetter    = $this->builder->getFieldSetter();
419
        foreach (self::LARGE_PROPERTIES_FIELDS as $field) {
420
            $fieldSetter->setEntityHasField(
421
                self::TEST_ENTITY_NAMESPACE_BASE_B1 . self::TEST_ENTITY_LARGE_DATA,
422
                $fieldGenerator->generateField(
423
                    self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $field,
424
                    MappingHelper::TYPE_BOOLEAN
425
                )
426
            );
427
        }
428
    }
429
430
    private function updateAllArchetypeFieldsEntity(): void
431
    {
432
        $fieldSetter = $this->builder->getFieldSetter();
433
        foreach (FieldGenerator::STANDARD_FIELDS as $archetypeFieldFqn) {
434
            $fieldSetter->setEntityHasField(
435
                self::TEST_ENTITY_NAMESPACE_BASE_B1 . self::TEST_ENTITY_ALL_ARCHETYPE_FIELDS,
436
                $archetypeFieldFqn
437
            );
438
        }
439
    }
440
441
    private function updateEmailEntity(): void
442
    {
443
        $emailEntityFqn = self::TEST_ENTITY_NAMESPACE_BASE_B1 . self::TEST_ENTITY_EMAIL;
444
        $this->builder->getFieldSetter()->setEntityHasField($emailEntityFqn, EmailAddressFieldTrait::class);
445
    }
446
447
    private function updateAllEmbeddablesEntity(): void
448
    {
449
        $this->builder->setEmbeddablesToEntity(
450
            self::TEST_ENTITY_NAMESPACE_BASE_B1 . self::TEST_ENTITY_ALL_EMBEDDABLES,
451
            [
452
                HasMoneyEmbeddableTrait::class,
453
                HasAddressEmbeddableTrait::class,
454
                HasFullNameEmbeddableTrait::class,
455
            ]
456
        );
457
    }
458
459
    private function setRelations(): void
460
    {
461
        $relationsGenerator = $this->builder->getRelationsGenerator();
462
        foreach (self::TEST_RELATIONS as $relation) {
463
            $relationsGenerator->setEntityHasRelationToEntity(
464
                self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $relation[0],
465
                (string)$relation[1],
466
                self::TEST_PROJECT_ROOT_NAMESPACE_B1 . $relation[2],
467
                (bool)$relation[3]
468
            );
469
        }
470
    }
471
472
    private function resetAutoloader(): void
473
    {
474
        $registered = \spl_autoload_functions();
475
        $loader     = array_pop($registered);
476
        \spl_autoload_unregister($loader);
477
    }
478
479
    private function secondBuild(): void
480
    {
481
        $this->emptyDir(self::BUILD_DIR_TMP_B2);
482
        $this->codeCopier->copy(
483
            self::BUILD_DIR_TMP_B1,
484
            self::BUILD_DIR_TMP_B2,
485
            self::TEST_PROJECT_ROOT_NAMESPACE_B1,
486
            self::TEST_PROJECT_ROOT_NAMESPACE_B2
487
        );
488
        $this->extendAutoloader(self::TEST_PROJECT_ROOT_NAMESPACE_B2, self::BUILD_DIR_TMP_B2);
489
        $this->builder->setPathToProjectRoot(self::BUILD_DIR_TMP_B2)
490
                      ->setProjectRootNamespace(self::TEST_PROJECT_ROOT_NAMESPACE_B2)
491
                      ->generateDataTransferObjectsForAllEntities();
492
        $this->emptyDir(self::BUILD_DIR);
493
        $this->codeCopier->copy(
494
            self::BUILD_DIR_TMP_B2,
495
            self::BUILD_DIR,
496
            self::TEST_PROJECT_ROOT_NAMESPACE_B2,
497
            self::TEST_PROJECT_ROOT_NAMESPACE
498
        );
499
    }
500
501
    private function setBuildHash(): void
502
    {
503
        \ts\file_put_contents(self::BUILD_HASH_FILE, md5(\ts\file_get_contents(__FILE__)));
504
    }
505
506
    public function copyTo(
507
        string $destinationPath,
508
        string $replaceNamespace = AbstractTest::TEST_PROJECT_ROOT_NAMESPACE
509
    ): void {
510
        $this->codeCopier->copy(
511
            self::BUILD_DIR,
512
            $destinationPath,
513
            self::TEST_PROJECT_ROOT_NAMESPACE,
514
            $replaceNamespace
515
        );
516
    }
517
}
518