Completed
Pull Request — master (#6494)
by Artem
10:15
created

testEmbeddedEntityWithColumnPrefix()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 16
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 9
nc 1
nop 0
1
<?php
2
3
namespace Doctrine\Tests\ORM\Tools;
4
5
use Doctrine\Common\Annotations\AnnotationReader;
6
use Doctrine\Common\Collections\ArrayCollection;
7
use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService;
8
use Doctrine\ORM\Mapping\ClassMetadataFactory;
9
use Doctrine\ORM\Mapping\ClassMetadataInfo;
10
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
11
use Doctrine\ORM\Tools\EntityGenerator;
12
use Doctrine\Tests\Models\DDC2372\DDC2372Admin;
13
use Doctrine\Tests\Models\DDC2372\DDC2372User;
14
use Doctrine\Tests\OrmTestCase;
15
16
class EntityGeneratorTest extends OrmTestCase
17
{
18
19
    /**
20
     * @var EntityGenerator
21
     */
22
    private $_generator;
23
    private $_tmpDir;
24
    private $_namespace;
25
26
    public function setUp()
27
    {
28
        $this->_namespace = uniqid("doctrine_");
29
        $this->_tmpDir = \sys_get_temp_dir();
30
        \mkdir($this->_tmpDir . \DIRECTORY_SEPARATOR . $this->_namespace);
31
        $this->_generator = new EntityGenerator();
32
        $this->_generator->setAnnotationPrefix("");
33
        $this->_generator->setGenerateAnnotations(true);
34
        $this->_generator->setGenerateStubMethods(true);
35
        $this->_generator->setRegenerateEntityIfExists(false);
36
        $this->_generator->setUpdateEntityIfExists(true);
37
        $this->_generator->setFieldVisibility(EntityGenerator::FIELD_VISIBLE_PROTECTED);
38
    }
39
40
    public function tearDown()
41
    {
42
        $ri = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->_tmpDir . '/' . $this->_namespace));
43
        foreach ($ri AS $file) {
44
            /* @var $file \SplFileInfo */
45
            if ($file->isFile()) {
46
                \unlink($file->getPathname());
47
            }
48
        }
49
        rmdir($this->_tmpDir . '/' . $this->_namespace);
50
    }
51
52
    /**
53
     * @param ClassMetadataInfo[] $embeddedClasses
54
     *
55
     * @return ClassMetadataInfo
56
     */
57
    public function generateBookEntityFixture(array $embeddedClasses = [])
58
    {
59
        $metadata = new ClassMetadataInfo($this->_namespace . '\EntityGeneratorBook');
60
        $metadata->namespace = $this->_namespace;
61
        $metadata->customRepositoryClassName = $this->_namespace  . '\EntityGeneratorBookRepository';
62
63
        $metadata->table['name'] = 'book';
64
        $metadata->table['uniqueConstraints']['name_uniq'] = ['columns' => ['name']];
65
        $metadata->table['indexes']['status_idx'] = ['columns' => ['status']];
66
        $metadata->mapField(['fieldName' => 'name', 'type' => 'string']);
67
        $metadata->mapField(['fieldName' => 'status', 'type' => 'string', 'options' => ['default' => 'published']]);
68
        $metadata->mapField(['fieldName' => 'id', 'type' => 'integer', 'id' => true]);
69
        $metadata->mapOneToOne(
70
            ['fieldName' => 'author', 'targetEntity' => EntityGeneratorAuthor::class, 'mappedBy' => 'book']
71
        );
72
        $joinColumns = [
73
            ['name' => 'author_id', 'referencedColumnName' => 'id']
74
        ];
75
        $metadata->mapManyToMany(
76
            [
77
            'fieldName' => 'comments',
78
            'targetEntity' => EntityGeneratorComment::class,
79
            'fetch' => ClassMetadataInfo::FETCH_EXTRA_LAZY,
80
            'joinTable' => [
81
                'name' => 'book_comment',
82
                'joinColumns' => [['name' => 'book_id', 'referencedColumnName' => 'id']],
83
                'inverseJoinColumns' => [['name' => 'comment_id', 'referencedColumnName' => 'id']],
84
            ],
85
            ]
86
        );
87
        $metadata->addLifecycleCallback('loading', 'postLoad');
88
        $metadata->addLifecycleCallback('willBeRemoved', 'preRemove');
89
        $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO);
90
91
        foreach ($embeddedClasses as $fieldName => $embeddedClass) {
92
            $this->mapNestedEmbedded($fieldName, $metadata, $embeddedClass);
93
            $this->mapEmbedded($fieldName, $metadata, $embeddedClass);
94
        }
95
96
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
97
98
        return $metadata;
99
    }
100
101
    private function generateEntityTypeFixture(array $field)
102
    {
103
        $metadata = new ClassMetadataInfo($this->_namespace . '\EntityType');
104
        $metadata->namespace = $this->_namespace;
105
106
        $metadata->table['name'] = 'entity_type';
107
        $metadata->mapField(['fieldName' => 'id', 'type' => 'integer', 'id' => true]);
108
        $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO);
109
110
        $name  = $field['fieldName'];
111
        $type  = $field['dbType'];
112
        $metadata->mapField(['fieldName' => $name, 'type' => $type]);
113
114
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
115
116
        return $metadata;
117
    }
118
119
    /**
120
     * @return ClassMetadataInfo
121
     */
122
    private function generateIsbnEmbeddableFixture(array $embeddedClasses = [], $columnPrefix = null)
123
    {
124
        $metadata = new ClassMetadataInfo($this->_namespace . '\EntityGeneratorIsbn');
125
        $metadata->namespace = $this->_namespace;
126
        $metadata->isEmbeddedClass = true;
127
        $metadata->mapField(['fieldName' => 'prefix', 'type' => 'integer']);
128
        $metadata->mapField(['fieldName' => 'groupNumber', 'type' => 'integer']);
129
        $metadata->mapField(['fieldName' => 'publisherNumber', 'type' => 'integer']);
130
        $metadata->mapField(['fieldName' => 'titleNumber', 'type' => 'integer']);
131
        $metadata->mapField(['fieldName' => 'checkDigit', 'type' => 'integer']);
132
133
        foreach ($embeddedClasses as $fieldName => $embeddedClass) {
134
            $this->mapEmbedded($fieldName, $metadata, $embeddedClass, $columnPrefix);
135
        }
136
137
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
138
139
        return $metadata;
140
    }
141
142
    /**
143
     * @return ClassMetadataInfo
144
     */
145
    private function generateTestEmbeddableFixture()
146
    {
147
        $metadata = new ClassMetadataInfo($this->_namespace . '\EntityGeneratorTestEmbeddable');
148
        $metadata->namespace = $this->_namespace;
149
        $metadata->isEmbeddedClass = true;
150
        $metadata->mapField(['fieldName' => 'field1', 'type' => 'integer']);
151
        $metadata->mapField(['fieldName' => 'field2', 'type' => 'integer', 'nullable' => true]);
152
        $metadata->mapField(['fieldName' => 'field3', 'type' => 'datetime']);
153
        $metadata->mapField(['fieldName' => 'field4', 'type' => 'datetime', 'nullable' => true]);
154
155
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
156
157
        return $metadata;
158
    }
159
160
    /**
161
     * @param string            $fieldName
162
     * @param ClassMetadataInfo $classMetadata
163
     * @param ClassMetadataInfo $embeddableMetadata
164
     * @param string|null       $columnPrefix
165
     */
166
    private function mapEmbedded(
167
        $fieldName,
168
        ClassMetadataInfo $classMetadata,
169
        ClassMetadataInfo $embeddableMetadata,
170
        $columnPrefix = false
171
    ) {
172
        $classMetadata->mapEmbedded(
173
            ['fieldName' => $fieldName, 'class' => $embeddableMetadata->name, 'columnPrefix' => $columnPrefix]
174
        );
175
    }
176
177
    /**
178
     * @param string            $fieldName
179
     * @param ClassMetadataInfo $classMetadata
180
     * @param ClassMetadataInfo $embeddableMetadata
181
     */
182
    private function mapNestedEmbedded(
183
        $fieldName,
184
        ClassMetadataInfo $classMetadata,
185
        ClassMetadataInfo $embeddableMetadata
186
    ) {
187
        foreach ($embeddableMetadata->embeddedClasses as $property => $embeddableClass) {
188
            $classMetadata->mapEmbedded(
189
                [
190
                'fieldName' => $fieldName . '.' . $property,
191
                'class' => $embeddableClass['class'],
192
                'columnPrefix' => $embeddableClass['columnPrefix'],
193
                'declaredField' => $embeddableClass['declaredField']
194
                        ? $fieldName . '.' . $embeddableClass['declaredField']
195
                        : $fieldName,
196
                'originalField' => $embeddableClass['originalField'] ?: $property,
197
                ]
198
            );
199
        }
200
    }
201
202
    /**
203
     * @param ClassMetadataInfo $metadata
204
     */
205
    private function loadEntityClass(ClassMetadataInfo $metadata)
206
    {
207
        $className = basename(str_replace('\\', '/', $metadata->name));
208
        $path = $this->_tmpDir . '/' . $this->_namespace . '/' . $className . '.php';
209
210
        $this->assertFileExists($path);
211
212
        require_once $path;
213
    }
214
215
    /**
216
     * @param  ClassMetadataInfo $metadata
217
     *
218
     * @return mixed An instance of the given metadata's class.
219
     */
220
    public function newInstance($metadata)
221
    {
222
        $this->loadEntityClass($metadata);
223
224
        return new $metadata->name;
225
    }
226
227
    /**
228
     * @group GH-6314
229
     */
230
    public function testEmbeddedEntityWithColumnPrefix()
231
    {
232
        $testMetadata = $this->generateTestEmbeddableFixture();
233
        $isbnMetadata = $this->generateIsbnEmbeddableFixture(['testEmbedded' => $testMetadata], 'prefix');
234
        $isbnEntity = $this->newInstance($isbnMetadata);
235
        $refClass = new \ReflectionClass($isbnEntity);
236
237
        self::assertTrue($refClass->hasProperty('testEmbedded'));
238
239
240
        $docComment = $refClass->getProperty('testEmbedded')->getDocComment();
241
242
        $needle = sprintf('@Embedded(class="%s", columnPrefix=\'%s\')', $testMetadata->name,'prefix');
243
        self::assertContains($needle, $docComment);
244
245
    }
246
247
    public function testGeneratedEntityClass()
248
    {
249
        $testMetadata = $this->generateTestEmbeddableFixture();
250
        $isbnMetadata = $this->generateIsbnEmbeddableFixture(['test' => $testMetadata]);
251
        $metadata = $this->generateBookEntityFixture(['isbn' => $isbnMetadata]);
252
253
        $book = $this->newInstance($metadata);
254
        $this->assertTrue(class_exists($metadata->name), "Class does not exist.");
255
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', '__construct'), "EntityGeneratorBook::__construct() missing.");
256
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getId'), "EntityGeneratorBook::getId() missing.");
257
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'setName'), "EntityGeneratorBook::setName() missing.");
258
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getName'), "EntityGeneratorBook::getName() missing.");
259
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'setStatus'), "EntityGeneratorBook::setStatus() missing.");
260
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getStatus'), "EntityGeneratorBook::getStatus() missing.");
261
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'setAuthor'), "EntityGeneratorBook::setAuthor() missing.");
262
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getAuthor'), "EntityGeneratorBook::getAuthor() missing.");
263
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getComments'), "EntityGeneratorBook::getComments() missing.");
264
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'addComment'), "EntityGeneratorBook::addComment() missing.");
265
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'removeComment'), "EntityGeneratorBook::removeComment() missing.");
266
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'setIsbn'), "EntityGeneratorBook::setIsbn() missing.");
267
        $this->assertTrue(method_exists($metadata->namespace . '\EntityGeneratorBook', 'getIsbn'), "EntityGeneratorBook::getIsbn() missing.");
268
269
        $reflClass = new \ReflectionClass($metadata->name);
270
271
        $this->assertCount(6, $reflClass->getProperties());
272
        $this->assertCount(15, $reflClass->getMethods());
273
274
        $this->assertEquals('published', $book->getStatus());
275
276
        $book->setName('Jonathan H. Wage');
277
        $this->assertEquals('Jonathan H. Wage', $book->getName());
278
279
        $reflMethod = new \ReflectionMethod($metadata->name, 'addComment');
280
        $addCommentParameters = $reflMethod->getParameters();
281
        $this->assertEquals('comment', $addCommentParameters[0]->getName());
282
283
        $reflMethod = new \ReflectionMethod($metadata->name, 'removeComment');
284
        $removeCommentParameters = $reflMethod->getParameters();
285
        $this->assertEquals('comment', $removeCommentParameters[0]->getName());
286
287
        $author = new EntityGeneratorAuthor();
288
        $book->setAuthor($author);
289
        $this->assertEquals($author, $book->getAuthor());
290
291
        $comment = new EntityGeneratorComment();
292
        $this->assertInstanceOf($metadata->name, $book->addComment($comment));
293
        $this->assertInstanceOf(ArrayCollection::class, $book->getComments());
294
        $this->assertEquals(new ArrayCollection([$comment]), $book->getComments());
295
        $this->assertInternalType('boolean', $book->removeComment($comment));
296
        $this->assertEquals(new ArrayCollection([]), $book->getComments());
297
298
        $this->newInstance($isbnMetadata);
299
        $isbn = new $isbnMetadata->name();
300
301
        $book->setIsbn($isbn);
302
        $this->assertSame($isbn, $book->getIsbn());
303
304
        $reflMethod = new \ReflectionMethod($metadata->name, 'setIsbn');
305
        $reflParameters = $reflMethod->getParameters();
306
        $this->assertEquals($isbnMetadata->name, $reflParameters[0]->getClass()->name);
307
    }
308
309
    public function testEntityUpdatingWorks()
310
    {
311
        $metadata = $this->generateBookEntityFixture(['isbn' => $this->generateIsbnEmbeddableFixture()]);
312
313
        $metadata->mapField(['fieldName' => 'test', 'type' => 'string']);
314
315
        $testEmbeddableMetadata = $this->generateTestEmbeddableFixture();
316
        $this->mapEmbedded('testEmbedded', $metadata, $testEmbeddableMetadata);
317
318
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
319
320
        $this->assertFileExists($this->_tmpDir . "/" . $this->_namespace . "/EntityGeneratorBook.php~");
321
322
        $book = $this->newInstance($metadata);
323
        $reflClass = new \ReflectionClass($metadata->name);
324
325
        $this->assertTrue($reflClass->hasProperty('name'), "Regenerating keeps property 'name'.");
326
        $this->assertTrue($reflClass->hasProperty('status'), "Regenerating keeps property 'status'.");
327
        $this->assertTrue($reflClass->hasProperty('id'), "Regenerating keeps property 'id'.");
328
        $this->assertTrue($reflClass->hasProperty('isbn'), "Regenerating keeps property 'isbn'.");
329
330
        $this->assertTrue($reflClass->hasProperty('test'), "Check for property test failed.");
331
        $this->assertTrue($reflClass->getProperty('test')->isProtected(), "Check for protected property test failed.");
332
        $this->assertTrue($reflClass->hasProperty('testEmbedded'), "Check for property testEmbedded failed.");
333
        $this->assertTrue($reflClass->getProperty('testEmbedded')->isProtected(), "Check for protected property testEmbedded failed.");
334
        $this->assertTrue($reflClass->hasMethod('getTest'), "Check for method 'getTest' failed.");
335
        $this->assertTrue($reflClass->getMethod('getTest')->isPublic(), "Check for public visibility of method 'getTest' failed.");
336
        $this->assertTrue($reflClass->hasMethod('setTest'), "Check for method 'setTest' failed.");
337
        $this->assertTrue($reflClass->getMethod('setTest')->isPublic(), "Check for public visibility of method 'setTest' failed.");
338
        $this->assertTrue($reflClass->hasMethod('getTestEmbedded'), "Check for method 'getTestEmbedded' failed.");
339
        $this->assertTrue(
340
            $reflClass->getMethod('getTestEmbedded')->isPublic(),
341
            "Check for public visibility of method 'getTestEmbedded' failed."
342
        );
343
        $this->assertTrue($reflClass->hasMethod('setTestEmbedded'), "Check for method 'setTestEmbedded' failed.");
344
        $this->assertTrue(
345
            $reflClass->getMethod('setTestEmbedded')->isPublic(),
346
            "Check for public visibility of method 'setTestEmbedded' failed."
347
        );
348
    }
349
350
    /**
351
     * @group DDC-3152
352
     */
353
    public function testDoesNotRegenerateExistingMethodsWithDifferentCase()
354
    {
355
        $metadata = $this->generateBookEntityFixture(['isbn' => $this->generateIsbnEmbeddableFixture()]);
356
357
        // Workaround to change existing fields case (just to simulate the use case)
358
        $metadata->fieldMappings['status']['fieldName'] = 'STATUS';
359
        $metadata->embeddedClasses['ISBN'] = $metadata->embeddedClasses['isbn'];
360
        unset($metadata->embeddedClasses['isbn']);
361
362
        // Should not throw a PHP fatal error
363
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
364
365
        $this->assertFileExists($this->_tmpDir . "/" . $this->_namespace . "/EntityGeneratorBook.php~");
366
367
        $this->newInstance($metadata);
368
        $reflClass = new \ReflectionClass($metadata->name);
369
370
        $this->assertTrue($reflClass->hasProperty('status'));
371
        $this->assertTrue($reflClass->hasProperty('STATUS'));
372
        $this->assertTrue($reflClass->hasProperty('isbn'));
373
        $this->assertTrue($reflClass->hasProperty('ISBN'));
374
        $this->assertTrue($reflClass->hasMethod('getStatus'));
375
        $this->assertTrue($reflClass->hasMethod('setStatus'));
376
        $this->assertTrue($reflClass->hasMethod('getIsbn'));
377
        $this->assertTrue($reflClass->hasMethod('setIsbn'));
378
    }
379
380
    /**
381
     * @group DDC-2121
382
     */
383
    public function testMethodDocBlockShouldStartWithBackSlash()
384
    {
385
        $embeddedMetadata = $this->generateIsbnEmbeddableFixture();
386
        $metadata = $this->generateBookEntityFixture(['isbn' => $embeddedMetadata]);
387
        $book     = $this->newInstance($metadata);
388
389
        $this->assertPhpDocVarType('\Doctrine\Common\Collections\Collection', new \ReflectionProperty($book, 'comments'));
390
        $this->assertPhpDocReturnType('\Doctrine\Common\Collections\Collection', new \ReflectionMethod($book, 'getComments'));
391
        $this->assertPhpDocParamType('\Doctrine\Tests\ORM\Tools\EntityGeneratorComment', new \ReflectionMethod($book, 'addComment'));
392
        $this->assertPhpDocReturnType('EntityGeneratorBook', new \ReflectionMethod($book, 'addComment'));
393
        $this->assertPhpDocParamType('\Doctrine\Tests\ORM\Tools\EntityGeneratorComment', new \ReflectionMethod($book, 'removeComment'));
394
        $this->assertPhpDocReturnType('boolean', new \ReflectionMethod($book, 'removeComment'));
395
396
        $this->assertPhpDocVarType('\Doctrine\Tests\ORM\Tools\EntityGeneratorAuthor', new \ReflectionProperty($book, 'author'));
397
        $this->assertPhpDocReturnType('\Doctrine\Tests\ORM\Tools\EntityGeneratorAuthor|null', new \ReflectionMethod($book, 'getAuthor'));
398
        $this->assertPhpDocParamType('\Doctrine\Tests\ORM\Tools\EntityGeneratorAuthor|null', new \ReflectionMethod($book, 'setAuthor'));
399
400
        $expectedClassName = '\\' . $embeddedMetadata->name;
401
        $this->assertPhpDocVarType($expectedClassName, new \ReflectionProperty($book, 'isbn'));
402
        $this->assertPhpDocReturnType($expectedClassName, new \ReflectionMethod($book, 'getIsbn'));
403
        $this->assertPhpDocParamType($expectedClassName, new \ReflectionMethod($book, 'setIsbn'));
404
    }
405
406
    public function testEntityExtendsStdClass()
407
    {
408
        $this->_generator->setClassToExtend('stdClass');
409
        $metadata = $this->generateBookEntityFixture();
410
411
        $book = $this->newInstance($metadata);
412
        $this->assertInstanceOf('stdClass', $book);
413
414
        $metadata = $this->generateIsbnEmbeddableFixture();
415
        $isbn = $this->newInstance($metadata);
416
        $this->assertInstanceOf('stdClass', $isbn);
417
    }
418
419
    public function testLifecycleCallbacks()
420
    {
421
        $metadata = $this->generateBookEntityFixture();
422
423
        $book = $this->newInstance($metadata);
424
        $reflClass = new \ReflectionClass($metadata->name);
425
426
        $this->assertTrue($reflClass->hasMethod('loading'), "Check for postLoad lifecycle callback.");
427
        $this->assertTrue($reflClass->hasMethod('willBeRemoved'), "Check for preRemove lifecycle callback.");
428
    }
429
430
    public function testLoadMetadata()
431
    {
432
        $embeddedMetadata = $this->generateIsbnEmbeddableFixture();
433
        $metadata = $this->generateBookEntityFixture(['isbn' => $embeddedMetadata]);
434
435
        $book = $this->newInstance($metadata);
436
437
        $reflectionService = new RuntimeReflectionService();
438
439
        $cm = new ClassMetadataInfo($metadata->name);
440
        $cm->initializeReflection($reflectionService);
441
442
        $driver = $this->createAnnotationDriver();
443
        $driver->loadMetadataForClass($cm->name, $cm);
444
445
        $this->assertEquals($cm->columnNames, $metadata->columnNames);
446
        $this->assertEquals($cm->getTableName(), $metadata->getTableName());
447
        $this->assertEquals($cm->lifecycleCallbacks, $metadata->lifecycleCallbacks);
448
        $this->assertEquals($cm->identifier, $metadata->identifier);
449
        $this->assertEquals($cm->idGenerator, $metadata->idGenerator);
450
        $this->assertEquals($cm->customRepositoryClassName, $metadata->customRepositoryClassName);
451
        $this->assertEquals($cm->embeddedClasses, $metadata->embeddedClasses);
452
        $this->assertEquals($cm->isEmbeddedClass, $metadata->isEmbeddedClass);
453
454
        $this->assertEquals(ClassMetadataInfo::FETCH_EXTRA_LAZY, $cm->associationMappings['comments']['fetch']);
455
456
        $isbn = $this->newInstance($embeddedMetadata);
457
458
        $cm = new ClassMetadataInfo($embeddedMetadata->name);
459
        $cm->initializeReflection($reflectionService);
460
461
        $driver->loadMetadataForClass($cm->name, $cm);
462
463
        $this->assertEquals($cm->columnNames, $embeddedMetadata->columnNames);
464
        $this->assertEquals($cm->embeddedClasses, $embeddedMetadata->embeddedClasses);
465
        $this->assertEquals($cm->isEmbeddedClass, $embeddedMetadata->isEmbeddedClass);
466
    }
467
468
    public function testLoadPrefixedMetadata()
469
    {
470
        $this->_generator->setAnnotationPrefix('ORM\\');
471
        $embeddedMetadata = $this->generateIsbnEmbeddableFixture();
472
        $metadata = $this->generateBookEntityFixture(['isbn' => $embeddedMetadata]);
473
474
        $reader = new AnnotationReader();
475
        $driver = new AnnotationDriver($reader, []);
476
477
        $book = $this->newInstance($metadata);
478
479
        $reflectionService = new RuntimeReflectionService();
480
481
        $cm = new ClassMetadataInfo($metadata->name);
482
        $cm->initializeReflection($reflectionService);
483
484
        $driver->loadMetadataForClass($cm->name, $cm);
485
486
        $this->assertEquals($cm->columnNames, $metadata->columnNames);
487
        $this->assertEquals($cm->getTableName(), $metadata->getTableName());
488
        $this->assertEquals($cm->lifecycleCallbacks, $metadata->lifecycleCallbacks);
489
        $this->assertEquals($cm->identifier, $metadata->identifier);
490
        $this->assertEquals($cm->idGenerator, $metadata->idGenerator);
491
        $this->assertEquals($cm->customRepositoryClassName, $metadata->customRepositoryClassName);
492
493
        $isbn = $this->newInstance($embeddedMetadata);
494
495
        $cm = new ClassMetadataInfo($embeddedMetadata->name);
496
        $cm->initializeReflection($reflectionService);
497
498
        $driver->loadMetadataForClass($cm->name, $cm);
499
500
        $this->assertEquals($cm->columnNames, $embeddedMetadata->columnNames);
501
        $this->assertEquals($cm->embeddedClasses, $embeddedMetadata->embeddedClasses);
502
        $this->assertEquals($cm->isEmbeddedClass, $embeddedMetadata->isEmbeddedClass);
503
    }
504
505
    /**
506
     * @group DDC-3272
507
     */
508
    public function testMappedSuperclassAnnotationGeneration()
509
    {
510
        $metadata                     = new ClassMetadataInfo($this->_namespace . '\EntityGeneratorBook');
511
        $metadata->namespace          = $this->_namespace;
512
        $metadata->isMappedSuperclass = true;
513
514
        $this->_generator->setAnnotationPrefix('ORM\\');
515
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
516
        $this->newInstance($metadata); // force instantiation (causes autoloading to kick in)
517
518
        $driver = new AnnotationDriver(new AnnotationReader(), []);
519
        $cm     = new ClassMetadataInfo($metadata->name);
520
521
        $cm->initializeReflection(new RuntimeReflectionService);
522
        $driver->loadMetadataForClass($cm->name, $cm);
523
524
        $this->assertTrue($cm->isMappedSuperclass);
525
    }
526
527
    /**
528
     * @dataProvider getParseTokensInEntityFileData
529
     */
530
    public function testParseTokensInEntityFile($php, $classes)
531
    {
532
        $r = new \ReflectionObject($this->_generator);
533
        $m = $r->getMethod('parseTokensInEntityFile');
534
        $m->setAccessible(true);
535
536
        $p = $r->getProperty('staticReflection');
537
        $p->setAccessible(true);
538
539
        $ret = $m->invoke($this->_generator, $php);
540
        $this->assertEquals($classes, array_keys($p->getValue($this->_generator)));
541
    }
542
543
    /**
544
     * @group DDC-1784
545
     */
546
    public function testGenerateEntityWithSequenceGenerator()
547
    {
548
        $metadata               = new ClassMetadataInfo($this->_namespace . '\DDC1784Entity');
549
        $metadata->namespace    = $this->_namespace;
550
        $metadata->mapField(['fieldName' => 'id', 'type' => 'integer', 'id' => true]);
551
        $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE);
552
        $metadata->setSequenceGeneratorDefinition(
553
            [
554
            'sequenceName'      => 'DDC1784_ID_SEQ',
555
            'allocationSize'    => 1,
556
            'initialValue'      => 2
557
            ]
558
        );
559
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
560
561
        $filename = $this->_tmpDir . DIRECTORY_SEPARATOR
562
                  . $this->_namespace . DIRECTORY_SEPARATOR . 'DDC1784Entity.php';
563
564
        $this->assertFileExists($filename);
565
        require_once $filename;
566
567
568
        $reflection = new \ReflectionProperty($metadata->name, 'id');
569
        $docComment = $reflection->getDocComment();
570
571
        $this->assertContains('@Id', $docComment);
572
        $this->assertContains('@Column(name="id", type="integer")', $docComment);
573
        $this->assertContains('@GeneratedValue(strategy="SEQUENCE")', $docComment);
574
        $this->assertContains('@SequenceGenerator(sequenceName="DDC1784_ID_SEQ", allocationSize=1, initialValue=2)', $docComment);
575
    }
576
577
    /**
578
     * @group DDC-2079
579
     */
580
    public function testGenerateEntityWithMultipleInverseJoinColumns()
581
    {
582
        $metadata               = new ClassMetadataInfo($this->_namespace . '\DDC2079Entity');
583
        $metadata->namespace    = $this->_namespace;
584
        $metadata->mapField(['fieldName' => 'id', 'type' => 'integer', 'id' => true]);
585
        $metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_SEQUENCE);
586
        $metadata->mapManyToMany(
587
            [
588
            'fieldName'     => 'centroCustos',
589
            'targetEntity'  => 'DDC2079CentroCusto',
590
            'joinTable'     => [
591
                'name'                  => 'unidade_centro_custo',
592
                'joinColumns'           => [
593
                    ['name' => 'idorcamento',      'referencedColumnName' => 'idorcamento'],
594
                    ['name' => 'idunidade',        'referencedColumnName' => 'idunidade']
595
                ],
596
                'inverseJoinColumns'    => [
597
                    ['name' => 'idcentrocusto',    'referencedColumnName' => 'idcentrocusto'],
598
                    ['name' => 'idpais',           'referencedColumnName' => 'idpais'],
599
                ],
600
            ],
601
            ]
602
        );
603
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
604
605
        $filename = $this->_tmpDir . DIRECTORY_SEPARATOR
606
            . $this->_namespace . DIRECTORY_SEPARATOR . 'DDC2079Entity.php';
607
608
        $this->assertFileExists($filename);
609
        require_once $filename;
610
611
        $property   = new \ReflectionProperty($metadata->name, 'centroCustos');
612
        $docComment = $property->getDocComment();
613
614
        //joinColumns
615
        $this->assertContains('@JoinColumn(name="idorcamento", referencedColumnName="idorcamento"),', $docComment);
616
        $this->assertContains('@JoinColumn(name="idunidade", referencedColumnName="idunidade")', $docComment);
617
        //inverseJoinColumns
618
        $this->assertContains('@JoinColumn(name="idcentrocusto", referencedColumnName="idcentrocusto"),', $docComment);
619
        $this->assertContains('@JoinColumn(name="idpais", referencedColumnName="idpais")', $docComment);
620
621
    }
622
623
     /**
624
     * @group DDC-2172
625
     */
626
    public function testGetInheritanceTypeString()
627
    {
628
        $reflection = new \ReflectionClass('\Doctrine\ORM\Mapping\ClassMetadataInfo');
629
        $method     = new \ReflectionMethod($this->_generator, 'getInheritanceTypeString');
630
        $constants  = $reflection->getConstants();
631
        $pattern    = '/^INHERITANCE_TYPE_/';
632
633
        $method->setAccessible(true);
634
635
        foreach ($constants as $name => $value) {
636
            if( ! preg_match($pattern, $name)) {
637
                continue;
638
            }
639
640
            $expected = preg_replace($pattern, '', $name);
641
            $actual   = $method->invoke($this->_generator, $value);
642
643
            $this->assertEquals($expected, $actual);
644
        }
645
646
        $this->expectException(\InvalidArgumentException::class);
647
        $this->expectExceptionMessage('Invalid provided InheritanceType: INVALID');
648
649
        $method->invoke($this->_generator, 'INVALID');
650
    }
651
652
    /**
653
    * @group DDC-2172
654
    */
655
    public function testGetChangeTrackingPolicyString()
656
    {
657
        $reflection = new \ReflectionClass('\Doctrine\ORM\Mapping\ClassMetadata');
658
        $method     = new \ReflectionMethod($this->_generator, 'getChangeTrackingPolicyString');
659
        $constants  = $reflection->getConstants();
660
        $pattern    = '/^CHANGETRACKING_/';
661
662
        $method->setAccessible(true);
663
664
        foreach ($constants as $name => $value) {
665
            if( ! preg_match($pattern, $name)) {
666
                continue;
667
            }
668
669
            $expected = preg_replace($pattern, '', $name);
670
            $actual   = $method->invoke($this->_generator, $value);
671
672
            $this->assertEquals($expected, $actual);
673
        }
674
675
        $this->expectException(\InvalidArgumentException::class);
676
        $this->expectExceptionMessage('Invalid provided ChangeTrackingPolicy: INVALID');
677
678
        $method->invoke($this->_generator, 'INVALID');
679
    }
680
681
    /**
682
     * @group DDC-2172
683
     */
684
    public function testGetIdGeneratorTypeString()
685
    {
686
        $reflection = new \ReflectionClass('\Doctrine\ORM\Mapping\ClassMetadataInfo');
687
        $method     = new \ReflectionMethod($this->_generator, 'getIdGeneratorTypeString');
688
        $constants  = $reflection->getConstants();
689
        $pattern    = '/^GENERATOR_TYPE_/';
690
691
        $method->setAccessible(true);
692
693
        foreach ($constants as $name => $value) {
694
            if( ! preg_match($pattern, $name)) {
695
                continue;
696
            }
697
698
            $expected = preg_replace($pattern, '', $name);
699
            $actual   = $method->invoke($this->_generator, $value);
700
701
            $this->assertEquals($expected, $actual);
702
        }
703
704
        $this->expectException(\InvalidArgumentException::class);
705
        $this->expectExceptionMessage('Invalid provided IdGeneratorType: INVALID');
706
707
        $method->invoke($this->_generator, 'INVALID');
708
    }
709
710
    /**
711
     * @dataProvider getEntityTypeAliasDataProvider
712
     *
713
     * @group DDC-1694
714
     */
715
    public function testEntityTypeAlias(array $field)
716
    {
717
        $metadata   = $this->generateEntityTypeFixture($field);
718
        $path       = $this->_tmpDir . '/'. $this->_namespace . '/EntityType.php';
719
720
        $this->assertFileExists($path);
721
        require_once $path;
722
723
        $entity     = new $metadata->name;
724
        $reflClass  = new \ReflectionClass($metadata->name);
725
726
        $type   = $field['phpType'];
727
        $name   = $field['fieldName'];
728
        $value  = $field['value'];
729
        $getter = "get" . ucfirst($name);
730
        $setter = "set" . ucfirst($name);
731
732
        $this->assertPhpDocVarType($type, $reflClass->getProperty($name));
733
        $this->assertPhpDocParamType($type, $reflClass->getMethod($setter));
734
        $this->assertPhpDocReturnType($type, $reflClass->getMethod($getter));
735
736
        $this->assertSame($entity, $entity->{$setter}($value));
737
        $this->assertEquals($value, $entity->{$getter}());
738
    }
739
740
    /**
741
     * @group DDC-2372
742
     */
743
    public function testTraitPropertiesAndMethodsAreNotDuplicated()
744
    {
745
        $cmf = new ClassMetadataFactory();
746
        $em = $this->_getTestEntityManager();
747
        $cmf->setEntityManager($em);
748
749
        $user = new DDC2372User();
750
        $metadata = $cmf->getMetadataFor(get_class($user));
751
        $metadata->name = $this->_namespace . "\DDC2372User";
752
        $metadata->namespace = $this->_namespace;
753
754
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
755
756
        $this->assertFileExists($this->_tmpDir . "/" . $this->_namespace . "/DDC2372User.php");
757
        require $this->_tmpDir . "/" . $this->_namespace . "/DDC2372User.php";
758
759
        $reflClass = new \ReflectionClass($metadata->name);
760
761
        $this->assertSame($reflClass->hasProperty('address'), false);
762
        $this->assertSame($reflClass->hasMethod('setAddress'), false);
763
        $this->assertSame($reflClass->hasMethod('getAddress'), false);
764
    }
765
766
    /**
767
     * @group DDC-2372
768
     */
769
    public function testTraitPropertiesAndMethodsAreNotDuplicatedInChildClasses()
770
    {
771
        $cmf = new ClassMetadataFactory();
772
        $em = $this->_getTestEntityManager();
773
        $cmf->setEntityManager($em);
774
775
        $user = new DDC2372Admin();
776
        $metadata = $cmf->getMetadataFor(get_class($user));
777
        $metadata->name = $this->_namespace . "\DDC2372Admin";
778
        $metadata->namespace = $this->_namespace;
779
780
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
781
782
        $this->assertFileExists($this->_tmpDir . "/" . $this->_namespace . "/DDC2372Admin.php");
783
        require $this->_tmpDir . "/" . $this->_namespace . "/DDC2372Admin.php";
784
785
        $reflClass = new \ReflectionClass($metadata->name);
786
787
        $this->assertSame($reflClass->hasProperty('address'), false);
788
        $this->assertSame($reflClass->hasMethod('setAddress'), false);
789
        $this->assertSame($reflClass->hasMethod('getAddress'), false);
790
    }
791
792
    /**
793
     * @group DDC-1590
794
     */
795
    public function testMethodsAndPropertiesAreNotDuplicatedInChildClasses()
796
    {
797
        $cmf    = new ClassMetadataFactory();
798
        $em     = $this->_getTestEntityManager();
799
800
        $cmf->setEntityManager($em);
801
802
        $ns     = $this->_namespace;
803
        $nsdir  = $this->_tmpDir . '/' . $ns;
804
805
        $content = str_replace(
806
            'namespace Doctrine\Tests\Models\DDC1590',
807
            'namespace ' . $ns,
808
            file_get_contents(__DIR__ . '/../../Models/DDC1590/DDC1590User.php')
809
        );
810
811
        $fname = $nsdir . "/DDC1590User.php";
812
        file_put_contents($fname, $content);
813
        require $fname;
814
815
816
        $metadata = $cmf->getMetadataFor($ns . '\DDC1590User');
817
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
818
819
        // class DDC1590User extends DDC1590Entity { ... }
820
        $source = file_get_contents($fname);
821
822
        // class _DDC1590User extends DDC1590Entity { ... }
823
        $source2    = str_replace('class DDC1590User', 'class _DDC1590User', $source);
824
        $fname2     = $nsdir . "/_DDC1590User.php";
825
        file_put_contents($fname2, $source2);
826
        require $fname2;
827
828
        // class __DDC1590User { ... }
829
        $source3    = str_replace('class DDC1590User extends DDC1590Entity', 'class __DDC1590User', $source);
830
        $fname3     = $nsdir . "/__DDC1590User.php";
831
        file_put_contents($fname3, $source3);
832
        require $fname3;
833
834
835
        // class _DDC1590User extends DDC1590Entity { ... }
836
        $rc2 = new \ReflectionClass($ns.'\_DDC1590User');
837
838
        $this->assertTrue($rc2->hasProperty('name'));
839
        $this->assertTrue($rc2->hasProperty('id'));
840
        $this->assertTrue($rc2->hasProperty('created_at'));
841
842
        $this->assertTrue($rc2->hasMethod('getName'));
843
        $this->assertTrue($rc2->hasMethod('setName'));
844
        $this->assertTrue($rc2->hasMethod('getId'));
845
        $this->assertFalse($rc2->hasMethod('setId'));
846
        $this->assertTrue($rc2->hasMethod('getCreatedAt'));
847
        $this->assertTrue($rc2->hasMethod('setCreatedAt'));
848
849
850
        // class __DDC1590User { ... }
851
        $rc3 = new \ReflectionClass($ns.'\__DDC1590User');
852
853
        $this->assertTrue($rc3->hasProperty('name'));
854
        $this->assertFalse($rc3->hasProperty('id'));
855
        $this->assertFalse($rc3->hasProperty('created_at'));
856
857
        $this->assertTrue($rc3->hasMethod('getName'));
858
        $this->assertTrue($rc3->hasMethod('setName'));
859
        $this->assertFalse($rc3->hasMethod('getId'));
860
        $this->assertFalse($rc3->hasMethod('setId'));
861
        $this->assertFalse($rc3->hasMethod('getCreatedAt'));
862
        $this->assertFalse($rc3->hasMethod('setCreatedAt'));
863
    }
864
865
    /**
866
     * @group DDC-3304
867
     */
868
    public function testGeneratedMutableEmbeddablesClass()
869
    {
870
        $embeddedMetadata = $this->generateTestEmbeddableFixture();
871
        $metadata = $this->generateIsbnEmbeddableFixture(['test' => $embeddedMetadata]);
872
873
        $isbn = $this->newInstance($metadata);
874
875
        $this->assertTrue(class_exists($metadata->name), "Class does not exist.");
876
        $this->assertFalse(method_exists($metadata->name, '__construct'), "EntityGeneratorIsbn::__construct present.");
877
        $this->assertTrue(method_exists($metadata->name, 'getPrefix'), "EntityGeneratorIsbn::getPrefix() missing.");
878
        $this->assertTrue(method_exists($metadata->name, 'setPrefix'), "EntityGeneratorIsbn::setPrefix() missing.");
879
        $this->assertTrue(method_exists($metadata->name, 'getGroupNumber'), "EntityGeneratorIsbn::getGroupNumber() missing.");
880
        $this->assertTrue(method_exists($metadata->name, 'setGroupNumber'), "EntityGeneratorIsbn::setGroupNumber() missing.");
881
        $this->assertTrue(method_exists($metadata->name, 'getPublisherNumber'), "EntityGeneratorIsbn::getPublisherNumber() missing.");
882
        $this->assertTrue(method_exists($metadata->name, 'setPublisherNumber'), "EntityGeneratorIsbn::setPublisherNumber() missing.");
883
        $this->assertTrue(method_exists($metadata->name, 'getTitleNumber'), "EntityGeneratorIsbn::getTitleNumber() missing.");
884
        $this->assertTrue(method_exists($metadata->name, 'setTitleNumber'), "EntityGeneratorIsbn::setTitleNumber() missing.");
885
        $this->assertTrue(method_exists($metadata->name, 'getCheckDigit'), "EntityGeneratorIsbn::getCheckDigit() missing.");
886
        $this->assertTrue(method_exists($metadata->name, 'setCheckDigit'), "EntityGeneratorIsbn::setCheckDigit() missing.");
887
        $this->assertTrue(method_exists($metadata->name, 'getTest'), "EntityGeneratorIsbn::getTest() missing.");
888
        $this->assertTrue(method_exists($metadata->name, 'setTest'), "EntityGeneratorIsbn::setTest() missing.");
889
890
        $isbn->setPrefix(978);
891
        $this->assertSame(978, $isbn->getPrefix());
892
893
        $this->newInstance($embeddedMetadata);
894
        $test = new $embeddedMetadata->name();
895
896
        $isbn->setTest($test);
897
        $this->assertSame($test, $isbn->getTest());
898
899
        $reflMethod = new \ReflectionMethod($metadata->name, 'setTest');
900
        $reflParameters = $reflMethod->getParameters();
901
        $this->assertEquals($embeddedMetadata->name, $reflParameters[0]->getClass()->name);
902
    }
903
904
    /**
905
     * @group DDC-3304
906
     */
907
    public function testGeneratedImmutableEmbeddablesClass()
908
    {
909
        $this->_generator->setEmbeddablesImmutable(true);
910
        $embeddedMetadata = $this->generateTestEmbeddableFixture();
911
        $metadata = $this->generateIsbnEmbeddableFixture(['test' => $embeddedMetadata]);
912
913
        $this->loadEntityClass($embeddedMetadata);
914
        $this->loadEntityClass($metadata);
915
916
        $this->assertTrue(class_exists($metadata->name), "Class does not exist.");
917
        $this->assertTrue(method_exists($metadata->name, '__construct'), "EntityGeneratorIsbn::__construct missing.");
918
        $this->assertTrue(method_exists($metadata->name, 'getPrefix'), "EntityGeneratorIsbn::getPrefix() missing.");
919
        $this->assertFalse(method_exists($metadata->name, 'setPrefix'), "EntityGeneratorIsbn::setPrefix() present.");
920
        $this->assertTrue(method_exists($metadata->name, 'getGroupNumber'), "EntityGeneratorIsbn::getGroupNumber() missing.");
921
        $this->assertFalse(method_exists($metadata->name, 'setGroupNumber'), "EntityGeneratorIsbn::setGroupNumber() present.");
922
        $this->assertTrue(method_exists($metadata->name, 'getPublisherNumber'), "EntityGeneratorIsbn::getPublisherNumber() missing.");
923
        $this->assertFalse(method_exists($metadata->name, 'setPublisherNumber'), "EntityGeneratorIsbn::setPublisherNumber() present.");
924
        $this->assertTrue(method_exists($metadata->name, 'getTitleNumber'), "EntityGeneratorIsbn::getTitleNumber() missing.");
925
        $this->assertFalse(method_exists($metadata->name, 'setTitleNumber'), "EntityGeneratorIsbn::setTitleNumber() present.");
926
        $this->assertTrue(method_exists($metadata->name, 'getCheckDigit'), "EntityGeneratorIsbn::getCheckDigit() missing.");
927
        $this->assertFalse(method_exists($metadata->name, 'setCheckDigit'), "EntityGeneratorIsbn::setCheckDigit() present.");
928
        $this->assertTrue(method_exists($metadata->name, 'getTest'), "EntityGeneratorIsbn::getTest() missing.");
929
        $this->assertFalse(method_exists($metadata->name, 'setTest'), "EntityGeneratorIsbn::setTest() present.");
930
931
        $test = new $embeddedMetadata->name(1, new \DateTime());
932
        $isbn = new $metadata->name($test, 978, 3, 12, 732320, 83);
933
934
        $reflMethod = new \ReflectionMethod($isbn, '__construct');
935
        $reflParameters = $reflMethod->getParameters();
936
937
        $this->assertCount(6, $reflParameters);
938
939
        $this->assertSame($embeddedMetadata->name, $reflParameters[0]->getClass()->name);
940
        $this->assertSame('test', $reflParameters[0]->getName());
941
        $this->assertFalse($reflParameters[0]->isOptional());
942
943
        $this->assertSame('prefix', $reflParameters[1]->getName());
944
        $this->assertFalse($reflParameters[1]->isOptional());
945
946
        $this->assertSame('groupNumber', $reflParameters[2]->getName());
947
        $this->assertFalse($reflParameters[2]->isOptional());
948
949
        $this->assertSame('publisherNumber', $reflParameters[3]->getName());
950
        $this->assertFalse($reflParameters[3]->isOptional());
951
952
        $this->assertSame('titleNumber', $reflParameters[4]->getName());
953
        $this->assertFalse($reflParameters[4]->isOptional());
954
955
        $this->assertSame('checkDigit', $reflParameters[5]->getName());
956
        $this->assertFalse($reflParameters[5]->isOptional());
957
958
        $reflMethod = new \ReflectionMethod($test, '__construct');
959
        $reflParameters = $reflMethod->getParameters();
960
961
        $this->assertCount(4, $reflParameters);
962
963
        $this->assertSame('field1', $reflParameters[0]->getName());
964
        $this->assertFalse($reflParameters[0]->isOptional());
965
966
        $this->assertSame('DateTime', $reflParameters[1]->getClass()->name);
967
        $this->assertSame('field3', $reflParameters[1]->getName());
968
        $this->assertFalse($reflParameters[1]->isOptional());
969
970
        $this->assertSame('field2', $reflParameters[2]->getName());
971
        $this->assertTrue($reflParameters[2]->isOptional());
972
973
        $this->assertSame('DateTime', $reflParameters[3]->getClass()->name);
974
        $this->assertSame('field4', $reflParameters[3]->getName());
975
        $this->assertTrue($reflParameters[3]->isOptional());
976
    }
977
978
    public function testRegenerateEntityClass()
979
    {
980
        $metadata = $this->generateBookEntityFixture();
981
        $this->loadEntityClass($metadata);
982
983
        $className = basename(str_replace('\\', '/', $metadata->name));
984
        $path = $this->_tmpDir . '/' . $this->_namespace . '/' . $className . '.php';
985
        $classTest = file_get_contents($path);
986
987
        $this->_generator->setRegenerateEntityIfExists(true);
988
        $this->_generator->setBackupExisting(false);
989
990
        $this->_generator->writeEntityClass($metadata, $this->_tmpDir);
991
        $classNew = file_get_contents($path);
992
993
        $this->assertSame($classTest,$classNew);
994
    }
995
996
    /**
997
     * @return array
998
     */
999
    public function getEntityTypeAliasDataProvider()
1000
    {
1001
        return [
1002
            [
1003
                [
1004
                'fieldName' => 'datetimetz',
1005
                'phpType' => '\\DateTime',
1006
                'dbType' => 'datetimetz',
1007
                'value' => new \DateTime
1008
                ]
1009
            ],
1010
            [
1011
                [
1012
                'fieldName' => 'datetime',
1013
                'phpType' => '\\DateTime',
1014
                'dbType' => 'datetime',
1015
                'value' => new \DateTime
1016
                ]
1017
            ],
1018
            [
1019
                [
1020
                'fieldName' => 'date',
1021
                'phpType' => '\\DateTime',
1022
                'dbType' => 'date',
1023
                'value' => new \DateTime
1024
                ]
1025
            ],
1026
            [
1027
                [
1028
                'fieldName' => 'time',
1029
                'phpType' => '\DateTime',
1030
                'dbType' => 'time',
1031
                'value' => new \DateTime
1032
                ]
1033
            ],
1034
            [
1035
                [
1036
                'fieldName' => 'object',
1037
                'phpType' => '\stdClass',
1038
                'dbType' => 'object',
1039
                'value' => new \stdClass()
1040
                ]
1041
            ],
1042
            [
1043
                [
1044
                'fieldName' => 'bigint',
1045
                'phpType' => 'int',
1046
                'dbType' => 'bigint',
1047
                'value' => 11
1048
                ]
1049
            ],
1050
            [
1051
                [
1052
                'fieldName' => 'smallint',
1053
                'phpType' => 'int',
1054
                'dbType' => 'smallint',
1055
                'value' => 22
1056
                ]
1057
            ],
1058
            [
1059
                [
1060
                'fieldName' => 'text',
1061
                'phpType' => 'string',
1062
                'dbType' => 'text',
1063
                'value' => 'text'
1064
                ]
1065
            ],
1066
            [
1067
                [
1068
                'fieldName' => 'blob',
1069
                'phpType' => 'string',
1070
                'dbType' => 'blob',
1071
                'value' => 'blob'
1072
                ]
1073
            ],
1074
            [
1075
                [
1076
                'fieldName' => 'decimal',
1077
                'phpType' => 'string',
1078
                'dbType' => 'decimal',
1079
                'value' => '12.34'
1080
                ],
1081
            ]
1082
        ];
1083
    }
1084
1085
    public function getParseTokensInEntityFileData()
1086
    {
1087
        return [
1088
            [
1089
                '<?php namespace Foo\Bar; class Baz {}',
1090
                ['Foo\Bar\Baz'],
1091
            ],
1092
            [
1093
                '<?php namespace Foo\Bar; use Foo; class Baz {}',
1094
                ['Foo\Bar\Baz'],
1095
            ],
1096
            [
1097
                '<?php namespace /*Comment*/ Foo\Bar; /** Foo */class /* Comment */ Baz {}',
1098
                ['Foo\Bar\Baz'],
1099
            ],
1100
            [
1101
                '
1102
<?php namespace
1103
/*Comment*/
1104
Foo\Bar
1105
;
1106
1107
/** Foo */
1108
class
1109
/* Comment */
1110
 Baz {}
1111
     ',
1112
                ['Foo\Bar\Baz'],
1113
            ],
1114
            [
1115
                '
1116
<?php namespace Foo\Bar; class Baz {
1117
    public static function someMethod(){
1118
        return self::class;
1119
    }
1120
}
1121
',
1122
                ['Foo\Bar\Baz'],
1123
            ],
1124
        ];
1125
    }
1126
1127
    /**
1128
     * @param string $type
1129
     * @param \ReflectionProperty $property
1130
     */
1131
    private function assertPhpDocVarType($type, \ReflectionProperty $property)
1132
    {
1133
        $docComment = $property->getDocComment();
1134
        $regex      = '/@var\s+([\S]+)$/m';
1135
1136
        $this->assertRegExp($regex, $docComment);
1137
        $this->assertEquals(1, preg_match($regex, $docComment, $matches));
1138
        $this->assertEquals($type, $matches[1]);
1139
    }
1140
1141
    /**
1142
     * @param string $type
1143
     * @param \ReflectionMethod $method
1144
     */
1145
    private function assertPhpDocReturnType($type, \ReflectionMethod $method)
1146
    {
1147
        $docComment = $method->getDocComment();
1148
        $regex      = '/@return\s+([\S]+)(\s+.*)$/m';
1149
1150
        $this->assertRegExp($regex, $docComment);
1151
        $this->assertEquals(1, preg_match($regex, $docComment, $matches));
1152
        $this->assertEquals($type, $matches[1]);
1153
    }
1154
1155
    /**
1156
     * @param string $type
1157
     * @param \ReflectionProperty $method
1158
     */
1159
    private function assertPhpDocParamType($type, \ReflectionMethod $method)
1160
    {
1161
        $this->assertEquals(1, preg_match('/@param\s+([^\s]+)/', $method->getDocComment(), $matches));
1162
        $this->assertEquals($type, $matches[1]);
1163
    }
1164
}
1165
1166
class EntityGeneratorAuthor {}
1167
class EntityGeneratorComment {}
1168