Completed
Push — master ( 7fbbb0...53f538 )
by Oleg
03:37
created

AddGenerator   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
eloc 52
dl 0
loc 102
rs 10
c 0
b 0
f 0
ccs 0
cts 55
cp 0
wmc 6

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getNameSpace() 0 6 1
A __construct() 0 5 1
A getFileName() 0 6 1
A getClassName() 0 3 1
A generate() 0 56 2
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DFCodeGeneration\Generator\Tests\Api;
5
6
use Nette\PhpGenerator\ClassType;
7
use Nette\PhpGenerator\Parameter;
8
use Nette\PhpGenerator\PhpFile;
9
use Nette\PhpGenerator\PsrPrinter;
10
use SlayerBirden\DFCodeGeneration\Generator\DataProvider\DataProviderInterface;
11
use SlayerBirden\DFCodeGeneration\Generator\GeneratorInterface;
12
use Twig\Environment;
13
use Twig\Loader\FilesystemLoader;
14
15
final class AddGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28
        $this->dataProvider = $dataProvider;
29
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30
        $this->twig = new Environment($loader);
31
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39
    public function generate(): string
40
    {
41
        $file = new PhpFile();
42
        $file->setStrictTypes();
43
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45
        $namespace = $file->addNamespace($this->getNameSpace());
46
47
        $namespace->addUse('codecept\ApiTester');
48
        $namespace->addUse('Codeception\Util\HttpCode');
49
50
        $class = $namespace->addClass('AddCest');
51
52
        $class->addMethod('add' . $this->dataProvider->provide()['entityClassName'])
53
            ->setParameters([
54
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
55
            ])
56
            ->setBody(
57
                $this->twig->load('Add/add.template.twig')->render($this->dataProvider->provide())
58
            )
59
            ->setReturnType('void')
60
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
61
62
        $class->addMethod('addIncomplete' . $this->dataProvider->provide()['entityClassName'])
63
            ->setParameters([
64
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
65
            ])
66
            ->setBody(
67
                $this->twig->load('Add/add.incomplete.template.twig')->render($this->dataProvider->provide())
68
            )
69
            ->setReturnType('void')
70
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
71
72
        $class->addMethod('addInvalid' . $this->dataProvider->provide()['entityClassName'])
73
            ->setParameters([
74
                (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
75
            ])
76
            ->setBody(
77
                $this->twig->load('Add/add.invalid.template.twig')->render($this->dataProvider->provide())
78
            )
79
            ->setReturnType('void')
80
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
81
82
        if ($this->dataProvider->provide()['hasUnique']) {
83
            $class->addMethod('addNonUnique' . $this->dataProvider->provide()['entityClassName'])
84
                ->setParameters([
85
                    (new Parameter('I'))->setTypeHint('\codecept\ApiTester'),
86
                ])
87
                ->setBody(
88
                    $this->twig->load('Add/add.nonunique.template.twig')->render($this->dataProvider->provide())
89
                )
90
                ->setReturnType('void')
91
                ->setVisibility(ClassType::VISIBILITY_PUBLIC);
92
        }
93
94
        return (new PsrPrinter())->printFile($file);
95
    }
96
97
    public function getClassName(): string
98
    {
99
        return $this->getNameSpace() . '\\' . 'AddCest';
100
    }
101
102
    public function getFileName(): string
103
    {
104
        return sprintf(
105
            'tests/api/%s/%s/AddCest.php',
106
            strtolower($this->dataProvider->provide()['moduleName']),
107
            $this->dataProvider->provide()['refName']
108
        );
109
    }
110
111
    private function getNameSpace(): string
112
    {
113
        return sprintf(
114
            'codecept\%s\%s',
115
            strtolower($this->dataProvider->provide()['moduleName']),
116
            $this->dataProvider->provide()['refName']
117
        );
118
    }
119
}
120