CompilerTest::examples()   B
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 639
Code Lines 381

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 381
dl 0
loc 639
rs 8
c 0
b 0
f 0
cc 1
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\Annotations\Parser;
6
7
use Doctrine\Annotations\Parser\Ast\Annotation;
8
use Doctrine\Annotations\Parser\Ast\Annotations;
9
use Doctrine\Annotations\Parser\Ast\ClassConstantFetch;
10
use Doctrine\Annotations\Parser\Ast\Collection\ListCollection;
11
use Doctrine\Annotations\Parser\Ast\Collection\MapCollection;
12
use Doctrine\Annotations\Parser\Ast\ConstantFetch;
13
use Doctrine\Annotations\Parser\Ast\Node;
14
use Doctrine\Annotations\Parser\Ast\Pair;
15
use Doctrine\Annotations\Parser\Ast\Parameter\NamedParameter;
16
use Doctrine\Annotations\Parser\Ast\Parameter\UnnamedParameter;
17
use Doctrine\Annotations\Parser\Ast\Parameters;
18
use Doctrine\Annotations\Parser\Ast\Reference;
19
use Doctrine\Annotations\Parser\Ast\Scalar\BooleanScalar;
20
use Doctrine\Annotations\Parser\Ast\Scalar\FloatScalar;
21
use Doctrine\Annotations\Parser\Ast\Scalar\Identifier;
22
use Doctrine\Annotations\Parser\Ast\Scalar\IntegerScalar;
23
use Doctrine\Annotations\Parser\Ast\Scalar\StringScalar;
24
use Doctrine\Annotations\Parser\Compiler;
25
use PHPUnit\Framework\TestCase;
26
27
class CompilerTest extends TestCase
28
{
29
    /** @var Compiler */
30
    private $compiler;
31
32
    public function setUp() : void
33
    {
34
        $this->compiler = new Compiler();
35
    }
36
37
    /**
38
     * @dataProvider examples
39
     */
40
    public function testCompile(string $givenDocblock, Node $esxpectedAst) : void
41
    {
42
        $result = $this->compiler->compile($givenDocblock);
43
44
        $this->assertEquals($esxpectedAst, $result);
45
    }
46
47
    /**
48
     * @return mixed[]
49
     */
50
    public function examples() : iterable
51
    {
52
        yield 'simple with no parenthesis' => [
0 ignored issues
show
Bug Best Practice introduced by
The expression yield 'simple with no pa...ser\Ast\Parameters()))) returns the type Generator which is incompatible with the documented return type array<mixed,mixed>.
Loading history...
53
            <<<'DOCBLOCK'
54
/**
55
* @Annotation
56
*/
57
DOCBLOCK
58
            ,
59
            new Annotations(
60
                new Annotation(
61
                    new Reference('Annotation', false),
62
                    new Parameters()
63
                )
64
            ),
65
        ];
66
67
        yield 'simple with empty parenthesis' => [
68
            <<<'DOCBLOCK'
69
/**
70
* @Annotation()
71
*/
72
DOCBLOCK
73
            ,
74
            new Annotations(
75
                new Annotation(
76
                    new Reference('Annotation', false),
77
                    new Parameters()
78
                )
79
            ),
80
        ];
81
82
        yield 'multiple without parameters' => [
83
            <<<'DOCBLOCK'
84
/** @Annotation1 @Annotation2 @Annotation3 */
85
DOCBLOCK
86
            ,
87
            new Annotations(
88
                new Annotation(
89
                    new Reference('Annotation1', false),
90
                    new Parameters()
91
                ),
92
                new Annotation(
93
                    new Reference('Annotation2', false),
94
                    new Parameters()
95
                ),
96
                new Annotation(
97
                    new Reference('Annotation3', false),
98
                    new Parameters()
99
                )
100
            ),
101
        ];
102
103
        yield 'multiple with comments' => [
104
            <<<'DOCBLOCK'
105
/**
106
 * Hello world
107
 * @Annotation1
108
 * Hola mundo
109
 * @Annotation2
110
 */
111
DOCBLOCK
112
            ,
113
            new Annotations(
114
                new Annotation(
115
                    new Reference('Annotation1', false),
116
                    new Parameters()
117
                ),
118
                new Annotation(
119
                    new Reference('Annotation2', false),
120
                    new Parameters()
121
                )
122
            ),
123
        ];
124
125
        yield 'fully qualified with parameter' => [
126
            <<<'DOCBLOCK'
127
/**
128
* @\Ns\Annotation("value")
129
*/
130
DOCBLOCK
131
            ,
132
            new Annotations(
133
                new Annotation(
134
                    new Reference('Ns\Annotation', true),
135
                    new Parameters(
136
                        new UnnamedParameter(new StringScalar('value'))
137
                    )
138
                )
139
            ),
140
        ];
141
142
        yield 'with array' => [
143
            <<<'DOCBLOCK'
144
/**
145
* @return array<string>
146
*/
147
DOCBLOCK
148
            ,
149
            new Annotations(
150
                new Annotation(
151
                    new Reference('return', false),
152
                    new Parameters()
153
                )
154
            ),
155
        ];
156
157
        yield 'constants' => [
158
            <<<'DOCBLOCK'
159
/**
160
* @Foo(PHP_EOL, Doctrine, DateTimeInterface::RFC3339, \Doctrine\Annotations\Reader::class)
161
*/
162
DOCBLOCK
163
            ,
164
            new Annotations(
165
                new Annotation(
166
                    new Reference('Foo', false),
167
                    new Parameters(
168
                        new UnnamedParameter(
169
                            new ConstantFetch(new Identifier('PHP_EOL'))
170
                        ),
171
                        new UnnamedParameter(
172
                            new ConstantFetch(new Identifier('Doctrine'))
173
                        ),
174
                        new UnnamedParameter(
175
                            new ClassConstantFetch(
176
                                new Reference('DateTimeInterface', false),
177
                                new Identifier('RFC3339')
178
                            )
179
                        ),
180
                        new UnnamedParameter(
181
                            new ClassConstantFetch(
182
                                new Reference('Doctrine\Annotations\Reader', true),
183
                                new Identifier('class')
184
                            )
185
                        )
186
                    )
187
                )
188
            ),
189
        ];
190
191
        yield 'fully qualified, nested, multiple parameters' =>  [
192
            <<<'DOCBLOCK'
193
/**
194
* @\Ns\Name(int=1, annot=@Annot, float=1.2)
195
*/
196
DOCBLOCK
197
            ,
198
            new Annotations(
199
                new Annotation(
200
                    new Reference('Ns\Name', true),
201
                    new Parameters(
202
                        new NamedParameter(
203
                            new Identifier('int'),
204
                            new IntegerScalar(1)
205
                        ),
206
                        new NamedParameter(
207
                            new Identifier('annot'),
208
                            new Annotation(
209
                                new Reference('Annot', false),
210
                                new Parameters()
211
                            )
212
                        ),
213
                        new NamedParameter(
214
                            new Identifier('float'),
215
                            new FloatScalar(1.2)
216
                        )
217
                    )
218
                )
219
            ),
220
        ];
221
222
        yield 'nested, with arrays' => [
223
            <<<'DOCBLOCK'
224
/**
225
* @Annot(
226
*  v1={1,2,3},
227
*  v2={@one,@two,@three},
228
*  v3={one=1,two=2,three=3},
229
*  v4={one=@one(1),two=@two(2),three=@three(3)}
230
* )
231
*/
232
DOCBLOCK
233
            ,
234
            new Annotations(
235
                new Annotation(
236
                    new Reference('Annot', false),
237
                    new Parameters(
238
                        new NamedParameter(
239
                            new Identifier('v1'),
240
                            new ListCollection(
241
                                new IntegerScalar(1),
242
                                new IntegerScalar(2),
243
                                new IntegerScalar(3)
244
                            )
245
                        ),
246
                        new NamedParameter(
247
                            new Identifier('v2'),
248
                            new ListCollection(
249
                                new Annotation(
250
                                    new Reference('one', false),
251
                                    new Parameters()
252
                                ),
253
                                new Annotation(
254
                                    new Reference('two', false),
255
                                    new Parameters()
256
                                ),
257
                                new Annotation(
258
                                    new Reference('three', false),
259
                                    new Parameters()
260
                                )
261
                            )
262
                        ),
263
                        new NamedParameter(
264
                            new Identifier('v3'),
265
                            new MapCollection(
266
                                new Pair(new Identifier('one'), new IntegerScalar(1)),
267
                                new Pair(new Identifier('two'), new IntegerScalar(2)),
268
                                new Pair(new Identifier('three'), new IntegerScalar(3))
269
                            )
270
                        ),
271
                        new NamedParameter(
272
                            new Identifier('v4'),
273
                            new MapCollection(
274
                                new Pair(
275
                                    new Identifier('one'),
276
                                    new Annotation(
277
                                        new Reference('one', false),
278
                                        new Parameters(
279
                                            new UnnamedParameter(new IntegerScalar(1))
280
                                        )
281
                                    )
282
                                ),
283
                                new Pair(
284
                                    new Identifier('two'),
285
                                    new Annotation(
286
                                        new Reference('two', false),
287
                                        new Parameters(
288
                                            new UnnamedParameter(new IntegerScalar(2))
289
                                        )
290
                                    )
291
                                ),
292
                                new Pair(
293
                                    new Identifier('three'),
294
                                    new Annotation(
295
                                        new Reference('three', false),
296
                                        new Parameters(
297
                                            new UnnamedParameter(new IntegerScalar(3))
298
                                        )
299
                                    )
300
                                )
301
                            )
302
                        )
303
                    )
304
                )
305
            ),
306
        ];
307
308
        yield 'ORM Id example' => [
309
            <<<'DOCBLOCK'
310
/**
311
 * @ORM\Id @ORM\Column(type="integer")
312
 * @ORM\GeneratedValue
313
 */
314
DOCBLOCK
315
            ,
316
            new Annotations(
317
                new Annotation(
318
                    new Reference('ORM\\Id', false),
319
                    new Parameters()
320
                ),
321
                new Annotation(
322
                    new Reference('ORM\\Column', false),
323
                    new Parameters(
324
                        new NamedParameter(
325
                            new Identifier('type'),
326
                            new StringScalar('integer')
327
                        )
328
                    )
329
                ),
330
                new Annotation(
331
                    new Reference('ORM\\GeneratedValue', false),
332
                    new Parameters()
333
                )
334
            ),
335
        ];
336
337
        yield 'unicode' => [
338
            <<<'DOCBLOCK'
339
/**
340
 * @Fancy😊Annotation
341
 */
342
DOCBLOCK
343
            ,
344
            new Annotations(
345
                new Annotation(
346
                    new Reference('Fancy😊Annotation', false),
347
                    new Parameters()
348
                )
349
            ),
350
        ];
351
352
        yield 'spaces after @' => [
353
            <<<'DOCBLOCK'
354
/**
355
 * @
356
 * @ Hello world
357
 */
358
DOCBLOCK
359
            ,
360
            new Annotations(),
361
        ];
362
363
        yield 'numbers' => [
364
            <<<'DOCBLOCK'
365
/**
366
 * @Annotation(1, 123, -123, 1.2, 123.456, -123.456, 1e2, 123e456, 1.2e-3, -123.456E-789)
367
 */
368
DOCBLOCK
369
            ,
370
            new Annotations(
371
                new Annotation(
372
                    new Reference('Annotation', false),
373
                    new Parameters(
374
                        new UnnamedParameter(new IntegerScalar(1)),
375
                        new UnnamedParameter(new IntegerScalar(123)),
376
                        new UnnamedParameter(new IntegerScalar(-123)),
377
                        new UnnamedParameter(new FloatScalar(1.2)),
378
                        new UnnamedParameter(new FloatScalar(123.456)),
379
                        new UnnamedParameter(new FloatScalar(-123.456)),
380
                        new UnnamedParameter(new FloatScalar(1e2)),
381
                        new UnnamedParameter(new FloatScalar(123e456)),
382
                        new UnnamedParameter(new FloatScalar(1.2e-3)),
383
                        new UnnamedParameter(new FloatScalar(-123.456E-789))
384
                    )
385
                )
386
            ),
387
        ];
388
389
        yield 'ORM Column example' => [
390
            <<<'DOCBLOCK'
391
/** @ORM\Column(type="string", length=50, nullable=true) */
392
DOCBLOCK
393
            ,
394
            new Annotations(
395
                new Annotation(
396
                    new Reference('ORM\\Column', false),
397
                    new Parameters(
398
                        new NamedParameter(
399
                            new Identifier('type'),
400
                            new StringScalar('string')
401
                        ),
402
                        new NamedParameter(
403
                            new Identifier('length'),
404
                            new IntegerScalar(50)
405
                        ),
406
                        new NamedParameter(
407
                            new Identifier('nullable'),
408
                            new BooleanScalar(true)
409
                        )
410
                    )
411
                )
412
            ),
413
        ];
414
415
        yield 'complex ORM M:N' => [
416
            <<<'DOCBLOCK'
417
/**
418
 * @ORM\ManyToMany(targetEntity=CmsGroup::class, inversedBy="users", cascade={"persist"})
419
 * @ORM\JoinTable(name="cms_users_groups",
420
 *      joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
421
 *      inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")}
422
 * )
423
 */
424
DOCBLOCK
425
            ,
426
            new Annotations(
427
                new Annotation(
428
                    new Reference('ORM\\ManyToMany', false),
429
                    new Parameters(
430
                        new NamedParameter(
431
                            new Identifier('targetEntity'),
432
                            new ClassConstantFetch(
433
                                new Reference('CmsGroup', false),
434
                                new Identifier('class')
435
                            )
436
                        ),
437
                        new NamedParameter(
438
                            new Identifier('inversedBy'),
439
                            new StringScalar('users')
440
                        ),
441
                        new NamedParameter(
442
                            new Identifier('cascade'),
443
                            new ListCollection(
444
                                new StringScalar('persist')
445
                            )
446
                        )
447
                    )
448
                ),
449
                new Annotation(
450
                    new Reference('ORM\\JoinTable', false),
451
                    new Parameters(
452
                        new NamedParameter(
453
                            new Identifier('name'),
454
                            new StringScalar('cms_users_groups')
455
                        ),
456
                        new NamedParameter(
457
                            new Identifier('joinColumns'),
458
                            new ListCollection(
459
                                new Annotation(
460
                                    new Reference('ORM\JoinColumn', false),
461
                                    new Parameters(
462
                                        new NamedParameter(
463
                                            new Identifier('name'),
464
                                            new StringScalar('user_id')
465
                                        ),
466
                                        new NamedParameter(
467
                                            new Identifier('referencedColumnName'),
468
                                            new StringScalar('id')
469
                                        )
470
                                    )
471
                                )
472
                            )
473
                        ),
474
                        new NamedParameter(
475
                            new Identifier('inverseJoinColumns'),
476
                            new ListCollection(
477
                                new Annotation(
478
                                    new Reference('ORM\JoinColumn', false),
479
                                    new Parameters(
480
                                        new NamedParameter(
481
                                            new Identifier('name'),
482
                                            new StringScalar('group_id')
483
                                        ),
484
                                        new NamedParameter(
485
                                            new Identifier('referencedColumnName'),
486
                                            new StringScalar('id')
487
                                        )
488
                                    )
489
                                )
490
                            )
491
                        )
492
                    )
493
                )
494
            ),
495
        ];
496
497
        yield 'Symfony route' => [
498
            <<<'DOCBLOCK'
499
/**
500
 * @Route("/argument_with_route_param_and_default/{value}", defaults={"value": "value"}, name="argument_with_route_param_and_default")
501
 */
502
DOCBLOCK
503
            ,
504
            new Annotations(
505
                new Annotation(
506
                    new Reference('Route', false),
507
                    new Parameters(
508
                        new UnnamedParameter(new StringScalar('/argument_with_route_param_and_default/{value}')),
509
                        new NamedParameter(
510
                            new Identifier('defaults'),
511
                            new MapCollection(
512
                                new Pair(new StringScalar('value'), new StringScalar('value'))
513
                            )
514
                        ),
515
                        new NamedParameter(
516
                            new Identifier('name'),
517
                            new StringScalar('argument_with_route_param_and_default')
518
                        )
519
                    )
520
                )
521
            ),
522
        ];
523
524
        yield 'SymfonyFrameworkExtraBundle annotations' => [
525
            <<<'DOCBLOCK'
526
/**
527
 * @Route("/is_granted/resolved/conflict")
528
 * @IsGranted("ISGRANTED_VOTER", subject="request")
529
 * @Security("is_granted('ISGRANTED_VOTER', request)")
530
 */
531
DOCBLOCK
532
            ,
533
            new Annotations(
534
                new Annotation(
535
                    new Reference('Route', false),
536
                    new Parameters(
537
                        new UnnamedParameter(new StringScalar('/is_granted/resolved/conflict'))
538
                    )
539
                ),
540
                new Annotation(
541
                    new Reference('IsGranted', false),
542
                    new Parameters(
543
                        new UnnamedParameter(new StringScalar('ISGRANTED_VOTER')),
544
                        new NamedParameter(new Identifier('subject'), new StringScalar('request'))
545
                    )
546
                ),
547
                new Annotation(
548
                    new Reference('Security', false),
549
                    new Parameters(
550
                        new UnnamedParameter(new StringScalar('is_granted(\'ISGRANTED_VOTER\', request)'))
551
                    )
552
                )
553
            ),
554
        ];
555
556
        yield 'JMS Serializer field' => [
557
            <<<'DOCBLOCK'
558
/**
559
 * @Type("array<string,string>")
560
 * @SerializedName("addresses")
561
 * @XmlElement(namespace="http://example.com/namespace2")
562
 * @XmlMap(inline = false, entry = "address", keyAttribute = "id", namespace="http://example.com/namespace2")
563
 */
564
DOCBLOCK
565
            ,
566
            new Annotations(
567
                new Annotation(
568
                    new Reference('Type', false),
569
                    new Parameters(
570
                        new UnnamedParameter(new StringScalar('array<string,string>'))
571
                    )
572
                ),
573
                new Annotation(
574
                    new Reference('SerializedName', false),
575
                    new Parameters(
576
                        new UnnamedParameter(new StringScalar('addresses'))
577
                    )
578
                ),
579
                new Annotation(
580
                    new Reference('XmlElement', false),
581
                    new Parameters(
582
                        new NamedParameter(new Identifier('namespace'), new StringScalar('http://example.com/namespace2'))
583
                    )
584
                ),
585
                new Annotation(
586
                    new Reference('XmlMap', false),
587
                    new Parameters(
588
                        new NamedParameter(
589
                            new Identifier('inline'),
590
                            new BooleanScalar(false)
591
                        ),
592
                        new NamedParameter(
593
                            new Identifier('entry'),
594
                            new StringScalar('address')
595
                        ),
596
                        new NamedParameter(
597
                            new Identifier('keyAttribute'),
598
                            new StringScalar('id')
599
                        ),
600
                        new NamedParameter(
601
                            new Identifier('namespace'),
602
                            new StringScalar('http://example.com/namespace2')
603
                        )
604
                    )
605
                )
606
            ),
607
        ];
608
609
        yield 'string escaping' => [
610
            <<<'DOCBLOCK'
611
/**
612
 * @Annotation("", "foo", "b\"a\"r", "ba\\z", "bla\h", "\\\\hello\\\\")
613
 */
614
DOCBLOCK
615
            ,
616
            new Annotations(
617
                new Annotation(
618
                    new Reference('Annotation', false),
619
                    new Parameters(
620
                        new UnnamedParameter(new StringScalar('')),
621
                        new UnnamedParameter(new StringScalar('foo')),
622
                        new UnnamedParameter(new StringScalar('b\\"a\\"r')),
623
                        new UnnamedParameter(new StringScalar('ba\\z')),
624
                        new UnnamedParameter(new StringScalar('bla\\h')),
625
                        new UnnamedParameter(new StringScalar('\\\\hello\\\\'))
626
                    )
627
                )
628
            ),
629
        ];
630
631
        yield 'constants' => [
632
            <<<'DOCBLOCK'
633
/**
634
 * @Annotation(Foo\Bar::BAZ, \Foo\Bar\Baz::BLAH)
635
 */
636
DOCBLOCK
637
            ,
638
            new Annotations(
639
                new Annotation(
640
                    new Reference('Annotation', false),
641
                    new Parameters(
642
                        new UnnamedParameter(
643
                            new ClassConstantFetch(
644
                                new Reference('Foo\Bar', false),
645
                                new Identifier('BAZ')
646
                            )
647
                        ),
648
                        new UnnamedParameter(
649
                            new ClassConstantFetch(
650
                                new Reference('Foo\Bar\Baz', true),
651
                                new Identifier('BLAH')
652
                            )
653
                        )
654
                    )
655
                )
656
            ),
657
        ];
658
659
        yield [
660
            <<<'DOCBLOCK'
661
/**
662
 * @TrailingComma(
663
 *     123,
664
 *     @Foo(1, 2, 3,),
665
 *     @Bar,
666
 * )
667
 */
668
DOCBLOCK
669
            ,
670
            new Annotations(
671
                new Annotation(
672
                    new Reference('TrailingComma', false),
673
                    new Parameters(
674
                        new UnnamedParameter(new IntegerScalar(123)),
675
                        new UnnamedParameter(
676
                            new Annotation(
677
                                new Reference('Foo', false),
678
                                new Parameters(
679
                                    new UnnamedParameter(new IntegerScalar(1)),
680
                                    new UnnamedParameter(new IntegerScalar(2)),
681
                                    new UnnamedParameter(new IntegerScalar(3))
682
                                )
683
                            )
684
                        ),
685
                        new UnnamedParameter(
686
                            new Annotation(
687
                                new Reference('Bar', false),
688
                                new Parameters()
689
                            )
690
                        )
691
                    )
692
                )
693
            ),
694
        ];
695
    }
696
}
697