-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathClassConstantTest.php
More file actions
179 lines (142 loc) · 4.73 KB
/
ClassConstantTest.php
File metadata and controls
179 lines (142 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
<?php
declare(strict_types=1);
namespace OpenCodeModelingTest\CodeAst\NodeVisitor;
use OpenCodeModeling\CodeAst\Code\ClassConstGenerator;
use OpenCodeModeling\CodeAst\Code\ClassGenerator;
use OpenCodeModeling\CodeAst\NodeVisitor\ClassConstant;
use OpenCodeModeling\CodeAst\NodeVisitor\ClassFile;
use OpenCodeModeling\CodeAst\NodeVisitor\ClassNamespace;
use OpenCodeModeling\CodeAst\NodeVisitor\ClassUseTrait;
use OpenCodeModeling\CodeAst\NodeVisitor\NamespaceUse;
use OpenCodeModeling\CodeAst\NodeVisitor\StrictType;
use PhpParser\NodeTraverser;
use PhpParser\Parser;
use PhpParser\ParserFactory;
use PhpParser\PrettyPrinter\Standard;
use PHPUnit\Framework\TestCase;
final class ClassConstantTest extends TestCase
{
/**
* @var Parser
*/
private $parser;
/**
* @var Standard
*/
private $printer;
public function setUp(): void
{
$this->parser = (new ParserFactory())->create(ParserFactory::ONLY_PHP7);
$this->printer = new Standard(['shortArraySyntax' => true]);
}
/**
* @test
*/
public function it_generates_constant_for_class_for_empty_file(): void
{
$ast = $this->parser->parse('');
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new StrictType());
$nodeTraverser->addVisitor(new ClassFile(new ClassGenerator('TestClass')));
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string'));
$expected = <<<'EOF'
<?php
declare (strict_types=1);
class TestClass
{
public const TYPE_STRING = 'string';
}
EOF;
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
}
/**
* @test
*/
public function it_generates_constant_for_class_for_existing_file(): void
{
$ast = $this->parser->parse('<?php class TestClass {}');
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string', ClassConstGenerator::FLAG_PRIVATE));
$expected = <<<'EOF'
<?php
class TestClass
{
private const TYPE_STRING = 'string';
}
EOF;
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
}
/**
* @test
*/
public function it_generates_constant_for_class_with_namespace_for_empty_file(): void
{
$ast = $this->parser->parse('');
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new StrictType());
$nodeTraverser->addVisitor(new ClassNamespace('My\\Awesome\\Service'));
$nodeTraverser->addVisitor(new ClassFile(new ClassGenerator('TestClass')));
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string'));
$expected = <<<'EOF'
<?php
declare (strict_types=1);
namespace My\Awesome\Service;
class TestClass
{
public const TYPE_STRING = 'string';
}
EOF;
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
}
/**
* @test
*/
public function it_generates_constant_for_class_with_namespace_for_existing_file(): void
{
$code = <<<'PHP'
<?php
namespace My\Awesome\Service;
class TestClass {}
PHP;
$ast = $this->parser->parse($code);
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string', ClassConstGenerator::FLAG_PRIVATE));
$expected = <<<'EOF'
<?php
namespace My\Awesome\Service;
class TestClass
{
private const TYPE_STRING = 'string';
}
EOF;
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
}
/**
* @test
*/
public function it_preserves_order_of_registered_visitors()
{
$ast = $this->parser->parse('');
$nodeTraverser = new NodeTraverser();
$nodeTraverser->addVisitor(new StrictType());
$nodeTraverser->addVisitor(new ClassNamespace('My\\Awesome\\Service'));
$nodeTraverser->addVisitor(new NamespaceUse('My\\Awesome\\ServiceTrait'));
$nodeTraverser->addVisitor(new ClassFile(new ClassGenerator('TestClass')));
$nodeTraverser->addVisitor(new ClassUseTrait('ServiceTrait'));
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string'));
$nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_INT', 3));
$expected = <<<'EOF'
<?php
declare (strict_types=1);
namespace My\Awesome\Service;
use My\Awesome\ServiceTrait;
class TestClass
{
use ServiceTrait;
public const TYPE_STRING = 'string';
public const TYPE_INT = 3;
}
EOF;
$this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));
}
}