getExpectedImplementedInterfaces()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GeneratedHydratorTest\ClassGenerator;
6
7
use CodeGenerationUtils\GeneratorStrategy\EvaluatingGeneratorStrategy;
8
use CodeGenerationUtils\Inflector\Util\UniqueIdentifierGenerator;
9
use CodeGenerationUtils\Visitor\ClassRenamerVisitor;
10
use GeneratedHydrator\ClassGenerator\DefaultHydratorGenerator;
11
use GeneratedHydratorTestAsset\BaseClass;
12
use GeneratedHydratorTestAsset\ClassWithByRefMagicMethods;
13
use GeneratedHydratorTestAsset\ClassWithMagicMethods;
14
use GeneratedHydratorTestAsset\ClassWithMixedProperties;
15
use PhpParser\NodeTraverser;
16
use PHPUnit\Framework\TestCase;
17
use ReflectionClass;
18
use Laminas\Hydrator\HydratorInterface;
19
20
/**
21
 * Tests for {@see \GeneratedHydrator\ClassGenerator\HydratorGenerator}
22
 *
23
 * @covers \GeneratedHydrator\ClassGenerator\DefaultHydratorGenerator
24
 */
25
class HydratorGeneratorTest extends TestCase
26
{
27
    /**
28
     * @dataProvider getTestedImplementations
29
     *
30
     * Verifies that generated code is valid and implements expected interfaces
31
     */
32
    public function testGeneratesValidCode(string $className) : void
33
    {
34
        $generator          = new DefaultHydratorGenerator();
35
        $generatedClassName = UniqueIdentifierGenerator::getIdentifier('HydratorGeneratorTest');
36
        $originalClass      = new ReflectionClass($className);
37
        $generatorStrategy  = new EvaluatingGeneratorStrategy();
38
        $traverser          = new NodeTraverser();
39
40
        $traverser->addVisitor(new ClassRenamerVisitor($originalClass, $generatedClassName));
41
        $generatorStrategy->generate($traverser->traverse($generator->generate($originalClass)));
42
43
        $generatedReflection = new ReflectionClass($generatedClassName);
44
45
        self::assertSame($generatedClassName, $generatedReflection->getName());
0 ignored issues
show
Bug introduced by
Consider using $generatedReflection->name. There is an issue with getName() and APC-enabled PHP versions.
Loading history...
46
47
        foreach ($this->getExpectedImplementedInterfaces() as $interface) {
48
            self::assertTrue($generatedReflection->implementsInterface($interface));
49
        }
50
    }
51
52
    /**
53
     * @return string[]
54
     */
55
    public function getTestedImplementations() : array
56
    {
57
        return [
58
            [BaseClass::class],
59
            [ClassWithMagicMethods::class],
60
            [ClassWithByRefMagicMethods::class],
61
            [ClassWithMixedProperties::class],
62
        ];
63
    }
64
65
    /**
66
     * {@inheritDoc}
67
     */
68
    protected function getExpectedImplementedInterfaces() : array
69
    {
70
        return [HydratorInterface::class];
71
    }
72
}
73