Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
96.15% covered (success)
96.15%
25 / 26
83.33% covered (warning)
83.33%
5 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
VariableAssignment
96.15% covered (success)
96.15%
25 / 26
83.33% covered (warning)
83.33%
5 / 6
10
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toTypescript
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 toJavascript
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 providesDefinitions
66.67% covered (warning)
66.67%
2 / 3
0.00% covered (danger)
0.00%
0 / 1
3.33
 needsDefinitions
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 createRandom
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2namespace Apie\TypescriptCodeBuilder\Dto;
3
4use Apie\Core\Attributes\FakeMethod;
5use Apie\TypescriptCodeBuilder\Dto\Expressions\ArrayAccessExpression;
6use Apie\TypescriptCodeBuilder\Dto\Expressions\IdentifierExpression;
7use Apie\TypescriptCodeBuilder\Dto\Expressions\NumberLiteralExpression;
8use Apie\TypescriptCodeBuilder\Dto\Expressions\ObjectExpression;
9use Apie\TypescriptCodeBuilder\Dto\Expressions\StringLiteralExpression;
10use Apie\TypescriptCodeBuilder\Dto\Expressions\TernaryExpression;
11use Apie\TypescriptCodeBuilder\Dto\Expressions\UnaryOperationExpression;
12use Apie\TypescriptCodeBuilder\Enums\VariableDeclarationKind;
13use Apie\TypescriptCodeBuilder\Lists\JavascriptIdentifierList;
14use Apie\TypescriptCodeBuilder\TypescriptFileExpressionInterface;
15use Apie\TypescriptCodeBuilder\TypescriptTypeDeclarationInterface;
16use Apie\TypescriptCodeBuilder\ValueObjects\JavascriptIdentifier;
17use Faker\Generator;
18
19#[FakeMethod('createRandom')]
20class VariableAssignment implements TypescriptFileExpressionInterface
21{
22    public function __construct(
23        public VariableDeclarationKind $kind,
24        public JavascriptIdentifier $name,
25        public TypescriptFileExpressionInterface $expression,
26        public ?TypescriptTypeDeclarationInterface $typehint = null,
27    ) {
28    }
29
30    public function toTypescript(): string
31    {
32        $typehint = $this->typehint ? ': ' . $this->typehint->toTypescript() : '';
33        return $this->kind->value . ' ' . $this->name->toNative() . $typehint . ' = ' . $this->expression->toTypescript() . ';';
34    }
35
36    public function toJavascript(): string
37    {
38        return $this->kind->value . ' ' . $this->name->toNative() . ' = ' . $this->expression->toJavascript() . ';';
39    }
40
41    public function providesDefinitions(bool $applyBlockScope): JavascriptIdentifierList
42    {
43        if ($applyBlockScope && $this->kind !== VariableDeclarationKind::Var) {
44            return new JavascriptIdentifierList();
45        }
46        return new JavascriptIdentifierList([$this->name]);
47    }
48
49    public function needsDefinitions(): JavascriptIdentifierList
50    {
51        $definitions = $this->typehint?->needsDefinitions() ?? new JavascriptIdentifierList();
52        foreach ($this->expression->needsDefinitions() as $definition) {
53            $definitions = $definitions->append($definition);
54        }
55        return $definitions;
56    }
57
58    public static function createRandom(Generator $faker): self
59    {
60        return new VariableAssignment(
61            $faker->fakeClass(VariableDeclarationKind::class),
62            $faker->fakeClass(JavascriptIdentifier::class),
63            $faker->fakeClass(
64                $faker->randomElement([
65                    ArrayAccessExpression::class,
66                    IdentifierExpression::class,
67                    NumberLiteralExpression::class,
68                    StringLiteralExpression::class,
69                    ObjectExpression::class,
70                    TernaryExpression::class,
71                    UnaryOperationExpression::class,
72                ])
73            )
74        );
75    }
76}