Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
42 / 42
100.00% covered (success)
100.00%
10 / 10
CRAP
100.00% covered (success)
100.00%
1 / 1
StructEnum
100.00% covered (success)
100.00%
42 / 42
100.00% covered (success)
100.00%
10 / 10
18
100.00% covered (success)
100.00%
1 / 1
 setModel
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
3
 addClassElement
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 fillClassConstants
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
 defineUseStatements
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getConstantAnnotationBlock
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
2
 fillClassMethods
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getMethodAnnotationBlock
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
 getEnumMethodGetValidValues
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
 getEnumMethodValues
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
2
 getEnumGetValidValuesAnnotationBlock
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace WsdlToPhp\PackageGenerator\File;
6
7use WsdlToPhp\PackageGenerator\Container\PhpElement\Constant as ConstantContainer;
8use WsdlToPhp\PackageGenerator\Model\AbstractModel;
9use WsdlToPhp\PackageGenerator\Model\Struct as StructModel;
10use WsdlToPhp\PackageGenerator\Model\StructValue as StructValueModel;
11use WsdlToPhp\PhpGenerator\Element\PhpAnnotation;
12use WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock;
13use WsdlToPhp\PhpGenerator\Element\PhpConstant;
14use WsdlToPhp\PhpGenerator\Element\PhpMethod;
15
16final class StructEnum extends Struct
17{
18    public const METHOD_VALUE_IS_VALID = 'valueIsValid';
19    public const METHOD_GET_VALID_VALUES = 'getValidValues';
20
21    /**
22     * @throws \InvalidArgumentException
23     */
24    public function setModel(AbstractModel $model): self
25    {
26        if ($model instanceof StructModel && !$model->isRestriction()) {
27            throw new \InvalidArgumentException('Model must be a restriction containing values', __LINE__);
28        }
29
30        return parent::setModel($model);
31    }
32
33    protected function addClassElement(): AbstractModelFile
34    {
35        return AbstractModelFile::addClassElement();
36    }
37
38    protected function fillClassConstants(ConstantContainer $constants): void
39    {
40        /** @var StructModel $model */
41        $model = $this->getModel();
42        foreach ($model->getValues() as $value) {
43            $constants->add(new PhpConstant($value->getCleanName(), $value->getValue()));
44        }
45    }
46
47    protected function defineUseStatements(): self
48    {
49        return AbstractModelFile::defineUseStatements();
50    }
51
52    protected function getConstantAnnotationBlock(PhpConstant $constant): ?PhpAnnotationBlock
53    {
54        $block = new PhpAnnotationBlock([
55            sprintf('Constant for value \'%s\'', $constant->getValue()),
56        ]);
57
58        /** @var StructModel $model */
59        $model = $this->getModel();
60        if (($value = $model->getValue($constant->getValue())) instanceof StructValueModel) {
61            $this->defineModelAnnotationsFromWsdl($block, $value);
62        }
63        $block->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, sprintf('string \'%s\'', $constant->getValue())));
64
65        return $block;
66    }
67
68    protected function fillClassMethods(): void
69    {
70        $this->methods->add($this->getEnumMethodGetValidValues());
71    }
72
73    protected function getMethodAnnotationBlock(PhpMethod $method): ?PhpAnnotationBlock
74    {
75        $block = null;
76
77        switch ($method->getName()) {
78            case self::METHOD_GET_VALID_VALUES:
79                $block = $this->getEnumGetValidValuesAnnotationBlock();
80
81                break;
82        }
83
84        return $block;
85    }
86
87    protected function getEnumMethodGetValidValues(): PhpMethod
88    {
89        $method = new PhpMethod(self::METHOD_GET_VALID_VALUES, [], self::TYPE_ARRAY, PhpMethod::ACCESS_PUBLIC, false, true);
90        $validValues = $this->getEnumMethodValues();
91        $method->addChild('return [');
92        foreach ($validValues as $validValue) {
93            $method->addChild(sprintf('%s,', $method->getIndentedString($validValue, 1)));
94        }
95        $method->addChild('];');
96
97        return $method;
98    }
99
100    protected function getEnumMethodValues(): array
101    {
102        $values = [];
103
104        /** @var StructModel $model */
105        $model = $this->getModel();
106        foreach ($model->getValues() as $value) {
107            $values[] = sprintf('self::%s', $value->getCleanName());
108        }
109
110        return $values;
111    }
112
113    protected function getEnumGetValidValuesAnnotationBlock(): PhpAnnotationBlock
114    {
115        $annotationBlock = new PhpAnnotationBlock([
116            'Return allowed values',
117        ]);
118        foreach ($this->getEnumMethodValues() as $value) {
119            $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_USES, $value));
120        }
121        $annotationBlock->addChild(new PhpAnnotation(self::ANNOTATION_RETURN, 'string[]'));
122
123        return $annotationBlock;
124    }
125}