Completed
Push — master ( 725e76...e58edb )
by Marco
04:59
created

Visitor/HydratorMethodsVisitorTest.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/*
3
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14
 *
15
 * This software consists of voluntary contributions made by many individuals
16
 * and is licensed under the MIT license.
17
 */
18
19
declare(strict_types=1);
20
21
namespace GeneratedHydratorTest\CodeGenerator\Visitor;
22
23
use GeneratedHydrator\CodeGenerator\Visitor\HydratorMethodsVisitor;
24
use PhpParser\Node;
25
use PhpParser\Node\Expr\Assign;
26
use PhpParser\Node\Expr\PropertyFetch;
27
use PhpParser\Node\Stmt\Class_;
28
use PhpParser\Node\Stmt\ClassMethod;
29
use PhpParser\ParserFactory;
30
use PHPUnit_Framework_TestCase;
31
use CodeGenerationUtils\Inflector\Util\UniqueIdentifierGenerator;
32
use ReflectionClass;
33
34
/**
35
 * Tests for {@see \GeneratedHydrator\CodeGenerator\Visitor\HydratorMethodsVisitor}
36
 *
37
 * @author Marco Pivetta <[email protected]>
38
 * @license MIT
39
 *
40
 * @covers \GeneratedHydrator\CodeGenerator\Visitor\HydratorMethodsVisitor
41
 */
42
class HydratorMethodsVisitorTest extends PHPUnit_Framework_TestCase
43
{
44
    /**
45
     * @dataProvider classAstProvider
46
     *
47
     * @param string   $className
48
     * @param Class_   $classNode
49
     * @param string[] $properties
50
     */
51
    public function testBasicCodeGeneration(string $className, Class_ $classNode, array $properties)
0 ignored issues
show
The parameter $properties is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
52
    {
53
        $visitor = new HydratorMethodsVisitor(new ReflectionClass($className));
54
55
        /* @var $modifiedAst Class_ */
56
        $modifiedNode = $visitor->leaveNode($classNode);
57
58
        self::assertMethodExistence('hydrate', $modifiedNode);
59
        self::assertMethodExistence('extract', $modifiedNode);
60
        self::assertMethodExistence('__construct', $modifiedNode);
61
    }
62
63
    /**
64
     * Verifies that a method was correctly added to by the visitor
65
     *
66
     * @param string $methodName
67
     * @param Class_ $class
68
     */
69
    private function assertMethodExistence(string $methodName, Class_ $class)
70
    {
71
        $members = $class->stmts;
72
73
        self::assertCount(
74
            1,
75
            array_filter(
76
                $members,
77
                function (Node $node) use ($methodName) : bool {
78
                    return $node instanceof ClassMethod
79
                        && $methodName === $node->name;
80
                }
81
            )
82
        );
83
    }
84
85
    /**
86
     * @return \PhpParser\Node[][]
87
     */
88
    public function classAstProvider() : array
89
    {
90
        $parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
91
92
        $className = UniqueIdentifierGenerator::getIdentifier('Foo');
93
        $classCode = 'class ' . $className . ' { private $bar; private $baz; protected $tab; '
94
            . 'protected $tar; public $taw; public $tam; }';
95
96
        eval($classCode);
97
98
        $staticClassName = UniqueIdentifierGenerator::getIdentifier('Foo');
99
        $staticClassCode = 'class ' . $staticClassName . ' { private static $bar; '
100
            . 'protected static $baz; public static $tab; private $taz; }';
101
102
        eval($staticClassCode);
103
104
        return [
105
            [$className, $parser->parse('<?php ' . $classCode)[0], ['bar', 'baz', 'tab', 'tar', 'taw', 'tam']],
106
            [$staticClassName, $parser->parse('<?php ' . $staticClassCode)[0], ['taz']],
107
        ];
108
    }
109
}
110