Failed Conditions
Pull Request — develop (#6935)
by Michael
65:23
created

NewOperatorTest   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 1017
Duplicated Lines 57.23 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 24
lcom 1
cbo 7
dl 582
loc 1017
rs 9.6504
c 0
b 0
f 0

24 Methods

Rating   Name   Duplication   Size   Complexity  
A setUp() 0 7 1
A provideDataForHydrationMode() 0 7 1
A loadFixtures() 0 60 1
B testShouldSupportsBasicUsage() 39 39 1
B testShouldIgnoreAliasesForSingleObject() 39 39 1
A testShouldAssumeFromEntityNamespaceWhenNotGiven() 0 23 1
A testShouldSupportLiteralExpression() 0 49 1
B testShouldSupportCaseExpression() 0 39 1
A testShouldSupportSimpleArithmeticExpression() 0 59 1
A testShouldSupportAggregateFunctions() 0 59 1
A testShouldSupportArithmeticExpression() 0 59 1
A testShouldSupportMultipleNewOperators() 51 51 1
A testShouldSupportMultipleNewOperatorsWithAliases() 51 51 1
A testShouldSupportMultipleNewOperatorsWithAndWithoutAliases() 51 51 1
A testShouldSupportMultipleNewOperatorsAndSingleScalar() 56 56 1
A testShouldSupportMultipleNewOperatorsAndSingleScalarWithAliases() 56 56 1
A testShouldSupportMultipleNewOperatorsAndSingleScalarWithAndWithoutAliases() 56 56 1
A testShouldSupportMultipleNewOperatorsAndMultipleScalars() 61 61 1
A testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAliases() 61 61 1
A testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAndWithoutAliases() 61 61 1
A testInvalidClassException() 0 5 1
A testInvalidClassConstructorException() 0 5 1
A testInvalidClassWithoutConstructorException() 0 5 1
A testClassCantBeInstantiatedException() 0 5 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\ORM\Functional;
6
7
use Doctrine\ORM\Query;
8
use Doctrine\Tests\Models\CMS\CmsAddressDTO;
9
use Doctrine\Tests\Models\CMS\CmsUser;
10
use Doctrine\Tests\Models\CMS\CmsEmail;
11
use Doctrine\Tests\Models\CMS\CmsAddress;
12
use Doctrine\Tests\Models\CMS\CmsPhonenumber;
13
use Doctrine\Tests\Models\CMS\CmsUserDTO;
14
use Doctrine\Tests\OrmFunctionalTestCase;
15
16
/**
17
 * @group DDC-1574
18
 */
19
class NewOperatorTest extends OrmFunctionalTestCase
20
{
21
    /**
22
     * @var array
23
     */
24
    private $fixtures;
25
26
    protected function setUp()
27
    {
28
        $this->useModelSet('cms');
29
        parent::setUp();
30
31
        $this->loadFixtures();
32
    }
33
34
    public function provideDataForHydrationMode()
35
    {
36
        return [
37
            [Query::HYDRATE_ARRAY],
38
            [Query::HYDRATE_OBJECT],
39
        ];
40
    }
41
42
    private function loadFixtures()
43
    {
44
        $u1 = new CmsUser;
45
        $u2 = new CmsUser;
46
        $u3 = new CmsUser;
47
48
        $u1->setEmail(new CmsEmail());
49
        $u1->setAddress(new CmsAddress());
50
        $u1->addPhonenumber(new CmsPhonenumber());
51
52
        $u2->setEmail(new CmsEmail());
53
        $u2->setAddress(new CmsAddress());
54
        $u2->addPhonenumber(new CmsPhonenumber());
55
        $u2->addPhonenumber(new CmsPhonenumber());
56
57
        $u3->setEmail(new CmsEmail());
58
        $u3->setAddress(new CmsAddress());
59
        $u3->addPhonenumber(new CmsPhonenumber());
60
        $u3->addPhonenumber(new CmsPhonenumber());
61
        $u3->addPhonenumber(new CmsPhonenumber());
62
63
        $u1->name               = 'Test 1';
64
        $u1->username           = '1test';
65
        $u1->status             = 'developer';
66
        $u1->email->email       = '[email protected]';
67
        $u1->address->zip       = '111111111';
68
        $u1->address->city      = 'Some City 1';
69
        $u1->address->country   = 'Some Country 2';
70
        $u1->phonenumbers[0]->phonenumber = "(11) 1111-1111";
71
72
        $u2->name               = 'Test 2';
73
        $u2->username           = '2test';
74
        $u2->status             = 'developer';
75
        $u2->email->email       = '[email protected]';
76
        $u2->address->zip       = '222222222';
77
        $u2->address->city      = 'Some City 2';
78
        $u2->address->country   = 'Some Country 2';
79
        $u2->phonenumbers[0]->phonenumber = "(22) 1111-1111";
80
        $u2->phonenumbers[1]->phonenumber = "(22) 2222-2222";
81
82
        $u3->name               = 'Test 3';
83
        $u3->username           = '3test';
84
        $u3->status             = 'developer';
85
        $u3->email->email       = '[email protected]';
86
        $u3->address->zip       = '33333333';
87
        $u3->address->city      = 'Some City 3';
88
        $u3->address->country   = 'Some Country 3';
89
        $u3->phonenumbers[0]->phonenumber = "(33) 1111-1111";
90
        $u3->phonenumbers[1]->phonenumber = "(33) 2222-2222";
91
        $u3->phonenumbers[2]->phonenumber = "(33) 3333-3333";
92
93
        $this->em->persist($u1);
94
        $this->em->persist($u2);
95
        $this->em->persist($u3);
96
97
        $this->em->flush();
98
        $this->em->clear();
99
100
        $this->fixtures = [$u1, $u2, $u3];
101
    }
102
103
    /**
104
     * @dataProvider provideDataForHydrationMode
105
     */
106 View Code Duplication
    public function testShouldSupportsBasicUsage($hydrationMode)
107
    {
108
        $dql = "
109
            SELECT
110
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
111
                    u.name,
112
                    e.email,
113
                    a.city
114
                )
115
            FROM
116
                Doctrine\Tests\Models\CMS\CmsUser u
117
            JOIN
118
                u.email e
119
            JOIN
120
                u.address a
121
            ORDER BY
122
                u.name";
123
124
        $query  = $this->em->createQuery($dql);
125
        $result = $query->getResult($hydrationMode);
126
127
        self::assertCount(3, $result);
128
129
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
130
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
131
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
132
133
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
134
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
135
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
136
137
        self::assertEquals($this->fixtures[0]->email->email, $result[0]->email);
138
        self::assertEquals($this->fixtures[1]->email->email, $result[1]->email);
139
        self::assertEquals($this->fixtures[2]->email->email, $result[2]->email);
140
141
        self::assertEquals($this->fixtures[0]->address->city, $result[0]->address);
142
        self::assertEquals($this->fixtures[1]->address->city, $result[1]->address);
143
        self::assertEquals($this->fixtures[2]->address->city, $result[2]->address);
144
    }
145
146
    /**
147
     * @dataProvider provideDataForHydrationMode
148
     */
149 View Code Duplication
    public function testShouldIgnoreAliasesForSingleObject($hydrationMode)
150
    {
151
        $dql = "
152
            SELECT
153
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
154
                    u.name,
155
                    e.email,
156
                    a.city
157
                ) as cmsUser
158
            FROM
159
                Doctrine\Tests\Models\CMS\CmsUser u
160
            JOIN
161
                u.email e
162
            JOIN
163
                u.address a
164
            ORDER BY
165
                u.name";
166
167
        $query  = $this->em->createQuery($dql);
168
        $result = $query->getResult($hydrationMode);
169
170
        self::assertCount(3, $result);
171
172
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
173
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
174
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
175
176
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
177
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
178
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
179
180
        self::assertEquals($this->fixtures[0]->email->email, $result[0]->email);
181
        self::assertEquals($this->fixtures[1]->email->email, $result[1]->email);
182
        self::assertEquals($this->fixtures[2]->email->email, $result[2]->email);
183
184
        self::assertEquals($this->fixtures[0]->address->city, $result[0]->address);
185
        self::assertEquals($this->fixtures[1]->address->city, $result[1]->address);
186
        self::assertEquals($this->fixtures[2]->address->city, $result[2]->address);
187
    }
188
189
    public function testShouldAssumeFromEntityNamespaceWhenNotGiven()
190
    {
191
        $dql = "
192
            SELECT
193
                new CmsUserDTO(u.name, e.email, a.city)
194
            FROM
195
                Doctrine\Tests\Models\CMS\CmsUser u
196
            JOIN
197
                u.email e
198
            JOIN
199
                u.address a
200
            ORDER BY
201
                u.name";
202
203
        $query  = $this->em->createQuery($dql);
204
        $result = $query->getResult();
205
206
        self::assertCount(3, $result);
207
208
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
209
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
210
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
211
    }
212
213
    public function testShouldSupportLiteralExpression()
214
    {
215
        $dql = "
216
            SELECT
217
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
218
                    u.name,
219
                    '[email protected]',
220
                    FALSE,
221
                    123
222
                )
223
            FROM
224
                Doctrine\Tests\Models\CMS\CmsUser u
225
            JOIN
226
                u.email e
227
            JOIN
228
                u.address a
229
            JOIN
230
                u.phonenumbers p
231
            GROUP BY
232
                u, e, a
233
            ORDER BY
234
                u.name";
235
236
        $query  = $this->em->createQuery($dql);
237
        $result = $query->getResult();
238
239
        self::assertCount(3, $result);
240
241
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
242
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
243
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
244
245
246
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
247
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
248
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
249
250
        self::assertEquals('[email protected]', $result[0]->email);
251
        self::assertEquals('[email protected]', $result[1]->email);
252
        self::assertEquals('[email protected]', $result[2]->email);
253
254
        self::assertFalse($result[0]->address);
255
        self::assertFalse($result[1]->address);
256
        self::assertFalse($result[2]->address);
257
258
        self::assertEquals(123, $result[0]->phonenumbers);
259
        self::assertEquals(123, $result[1]->phonenumbers);
260
        self::assertEquals(123, $result[2]->phonenumbers);
261
    }
262
263
    public function testShouldSupportCaseExpression()
264
    {
265
        $dql = "
266
            SELECT
267
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
268
                    u.name,
269
                    CASE WHEN (e.email = '[email protected]') THEN 'TEST1' ELSE 'OTHER_TEST' END
270
                )
271
            FROM
272
                Doctrine\Tests\Models\CMS\CmsUser u
273
            JOIN
274
                u.email e
275
            JOIN
276
                u.address a
277
            JOIN
278
                u.phonenumbers p
279
            GROUP BY
280
                u, e, a
281
            ORDER BY
282
                u.name";
283
284
        $query  = $this->em->createQuery($dql);
285
        $result = $query->getResult();
286
287
        self::assertCount(3, $result);
288
289
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
290
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
291
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
292
293
294
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
295
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
296
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
297
298
        self::assertEquals('TEST1', $result[0]->email);
299
        self::assertEquals('OTHER_TEST', $result[1]->email);
300
        self::assertEquals('OTHER_TEST', $result[2]->email);
301
    }
302
303
    public function testShouldSupportSimpleArithmeticExpression()
304
    {
305
        $dql = "
306
            SELECT
307
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
308
                    u.name,
309
                    e.email,
310
                    a.city,
311
                    a.id + u.id
312
                )
313
            FROM
314
                Doctrine\Tests\Models\CMS\CmsUser u
315
            JOIN
316
                u.email e
317
            JOIN
318
                u.address a
319
            JOIN
320
                u.phonenumbers p
321
            GROUP BY
322
                u, e, a
323
            ORDER BY
324
                u.name";
325
326
        $query  = $this->em->createQuery($dql);
327
        $result = $query->getResult();
328
329
        self::assertCount(3, $result);
330
331
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
332
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
333
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
334
335
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
336
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
337
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
338
339
        self::assertEquals($this->fixtures[0]->email->email, $result[0]->email);
340
        self::assertEquals($this->fixtures[1]->email->email, $result[1]->email);
341
        self::assertEquals($this->fixtures[2]->email->email, $result[2]->email);
342
343
        self::assertEquals($this->fixtures[0]->address->city, $result[0]->address);
344
        self::assertEquals($this->fixtures[1]->address->city, $result[1]->address);
345
        self::assertEquals($this->fixtures[2]->address->city, $result[2]->address);
346
347
        self::assertEquals(
348
            ($this->fixtures[0]->address->id + $this->fixtures[0]->id),
349
            $result[0]->phonenumbers
350
        );
351
352
        self::assertEquals(
353
            ($this->fixtures[1]->address->id + $this->fixtures[1]->id),
354
            $result[1]->phonenumbers
355
        );
356
357
        self::assertEquals(
358
            ($this->fixtures[2]->address->id + $this->fixtures[2]->id),
359
            $result[2]->phonenumbers
360
        );
361
    }
362
363
    public function testShouldSupportAggregateFunctions()
364
    {
365
        $dql = "
366
            SELECT
367
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
368
                    u.name,
369
                    e.email,
370
                    a.city,
371
                    COUNT(p)
372
                )
373
            FROM
374
                Doctrine\Tests\Models\CMS\CmsUser u
375
            JOIN
376
                u.email e
377
            JOIN
378
                u.address a
379
            JOIN
380
                u.phonenumbers p
381
            GROUP BY
382
                u, e, a
383
            ORDER BY
384
                u.name";
385
386
        $query  = $this->em->createQuery($dql);
387
        $result = $query->getResult();
388
389
        self::assertCount(3, $result);
390
391
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
392
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
393
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
394
395
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
396
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
397
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
398
399
        self::assertEquals($this->fixtures[0]->email->email, $result[0]->email);
400
        self::assertEquals($this->fixtures[1]->email->email, $result[1]->email);
401
        self::assertEquals($this->fixtures[2]->email->email, $result[2]->email);
402
403
        self::assertEquals($this->fixtures[0]->address->city, $result[0]->address);
404
        self::assertEquals($this->fixtures[1]->address->city, $result[1]->address);
405
        self::assertEquals($this->fixtures[2]->address->city, $result[2]->address);
406
407
        self::assertEquals(
408
            (count($this->fixtures[0]->phonenumbers)),
409
            $result[0]->phonenumbers
410
        );
411
412
        self::assertEquals(
413
            (count($this->fixtures[1]->phonenumbers)),
414
            $result[1]->phonenumbers
415
        );
416
417
        self::assertEquals(
418
            (count($this->fixtures[2]->phonenumbers)),
419
            $result[2]->phonenumbers
420
        );
421
    }
422
423
    public function testShouldSupportArithmeticExpression()
424
    {
425
        $dql = "
426
            SELECT
427
                new Doctrine\Tests\Models\CMS\CmsUserDTO(
428
                    u.name,
429
                    e.email,
430
                    a.city,
431
                    COUNT(p) + u.id
432
                )
433
            FROM
434
                Doctrine\Tests\Models\CMS\CmsUser u
435
            JOIN
436
                u.email e
437
            JOIN
438
                u.address a
439
            JOIN
440
                u.phonenumbers p
441
            GROUP BY
442
                u, e, a
443
            ORDER BY
444
                u.name";
445
446
        $query  = $this->em->createQuery($dql);
447
        $result = $query->getResult();
448
449
        self::assertCount(3, $result);
450
451
        self::assertInstanceOf(CmsUserDTO::class, $result[0]);
452
        self::assertInstanceOf(CmsUserDTO::class, $result[1]);
453
        self::assertInstanceOf(CmsUserDTO::class, $result[2]);
454
455
        self::assertEquals($this->fixtures[0]->name, $result[0]->name);
456
        self::assertEquals($this->fixtures[1]->name, $result[1]->name);
457
        self::assertEquals($this->fixtures[2]->name, $result[2]->name);
458
459
        self::assertEquals($this->fixtures[0]->email->email, $result[0]->email);
460
        self::assertEquals($this->fixtures[1]->email->email, $result[1]->email);
461
        self::assertEquals($this->fixtures[2]->email->email, $result[2]->email);
462
463
        self::assertEquals($this->fixtures[0]->address->city, $result[0]->address);
464
        self::assertEquals($this->fixtures[1]->address->city, $result[1]->address);
465
        self::assertEquals($this->fixtures[2]->address->city, $result[2]->address);
466
467
        self::assertEquals(
468
            (count($this->fixtures[0]->phonenumbers) + $this->fixtures[0]->id),
469
            $result[0]->phonenumbers
470
        );
471
472
        self::assertEquals(
473
            (count($this->fixtures[1]->phonenumbers) + $this->fixtures[1]->id),
474
            $result[1]->phonenumbers
475
        );
476
477
        self::assertEquals(
478
            (count($this->fixtures[2]->phonenumbers) + $this->fixtures[2]->id),
479
            $result[2]->phonenumbers
480
        );
481
    }
482
483 View Code Duplication
    public function testShouldSupportMultipleNewOperators()
484
    {
485
        $dql = "
486
            SELECT
487
                new CmsUserDTO(
488
                    u.name,
489
                    e.email
490
                ),
491
                new CmsAddressDTO(
492
                    a.country,
493
                    a.city
494
                )
495
            FROM
496
                Doctrine\Tests\Models\CMS\CmsUser u
497
            JOIN
498
                u.email e
499
            JOIN
500
                u.address a
501
            ORDER BY
502
                u.name";
503
504
        $query  = $this->em->createQuery($dql);
505
        $result = $query->getResult();
506
507
        self::assertCount(3, $result);
508
509
        self::assertInstanceOf(CmsUserDTO::class, $result[0][0]);
510
        self::assertInstanceOf(CmsUserDTO::class, $result[1][0]);
511
        self::assertInstanceOf(CmsUserDTO::class, $result[2][0]);
512
513
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][1]);
514
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][1]);
515
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][1]);
516
517
        self::assertEquals($this->fixtures[0]->name, $result[0][0]->name);
518
        self::assertEquals($this->fixtures[1]->name, $result[1][0]->name);
519
        self::assertEquals($this->fixtures[2]->name, $result[2][0]->name);
520
521
        self::assertEquals($this->fixtures[0]->email->email, $result[0][0]->email);
522
        self::assertEquals($this->fixtures[1]->email->email, $result[1][0]->email);
523
        self::assertEquals($this->fixtures[2]->email->email, $result[2][0]->email);
524
525
526
        self::assertEquals($this->fixtures[0]->address->city, $result[0][1]->city);
527
        self::assertEquals($this->fixtures[1]->address->city, $result[1][1]->city);
528
        self::assertEquals($this->fixtures[2]->address->city, $result[2][1]->city);
529
530
        self::assertEquals($this->fixtures[0]->address->country, $result[0][1]->country);
531
        self::assertEquals($this->fixtures[1]->address->country, $result[1][1]->country);
532
        self::assertEquals($this->fixtures[2]->address->country, $result[2][1]->country);
533
    }
534
535 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsWithAliases()
536
    {
537
        $dql = "
538
            SELECT
539
                new CmsUserDTO(
540
                    u.name,
541
                    e.email
542
                ) as cmsUser,
543
                new CmsAddressDTO(
544
                    a.country,
545
                    a.city
546
                ) as cmsAddress
547
            FROM
548
                Doctrine\Tests\Models\CMS\CmsUser u
549
            JOIN
550
                u.email e
551
            JOIN
552
                u.address a
553
            ORDER BY
554
                u.name";
555
556
        $query  = $this->em->createQuery($dql);
557
        $result = $query->getResult();
558
559
        self::assertCount(3, $result);
560
561
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
562
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
563
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
564
565
        self::assertInstanceOf(CmsAddressDTO::class, $result[0]['cmsAddress']);
566
        self::assertInstanceOf(CmsAddressDTO::class, $result[1]['cmsAddress']);
567
        self::assertInstanceOf(CmsAddressDTO::class, $result[2]['cmsAddress']);
568
569
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
570
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
571
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
572
573
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
574
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
575
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
576
577
578
        self::assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city);
579
        self::assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city);
580
        self::assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city);
581
582
        self::assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country);
583
        self::assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country);
584
        self::assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country);
585
    }
586
587 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsWithAndWithoutAliases()
588
    {
589
        $dql = "
590
            SELECT
591
                new CmsUserDTO(
592
                    u.name,
593
                    e.email
594
                ) as cmsUser,
595
                new CmsAddressDTO(
596
                    a.country,
597
                    a.city
598
                )
599
            FROM
600
                Doctrine\Tests\Models\CMS\CmsUser u
601
            JOIN
602
                u.email e
603
            JOIN
604
                u.address a
605
            ORDER BY
606
                u.name";
607
608
        $query  = $this->em->createQuery($dql);
609
        $result = $query->getResult();
610
611
        self::assertCount(3, $result);
612
613
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
614
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
615
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
616
617
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][0]);
618
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][0]);
619
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][0]);
620
621
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
622
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
623
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
624
625
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
626
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
627
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
628
629
630
        self::assertEquals($this->fixtures[0]->address->city, $result[0][0]->city);
631
        self::assertEquals($this->fixtures[1]->address->city, $result[1][0]->city);
632
        self::assertEquals($this->fixtures[2]->address->city, $result[2][0]->city);
633
634
        self::assertEquals($this->fixtures[0]->address->country, $result[0][0]->country);
635
        self::assertEquals($this->fixtures[1]->address->country, $result[1][0]->country);
636
        self::assertEquals($this->fixtures[2]->address->country, $result[2][0]->country);
637
    }
638
639 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndSingleScalar()
640
    {
641
        $dql = "
642
            SELECT
643
                new CmsUserDTO(
644
                    u.name,
645
                    e.email
646
                ),
647
                new CmsAddressDTO(
648
                    a.country,
649
                    a.city
650
                ),
651
                u.status
652
            FROM
653
                Doctrine\Tests\Models\CMS\CmsUser u
654
            JOIN
655
                u.email e
656
            JOIN
657
                u.address a
658
            ORDER BY
659
                u.name";
660
661
        $query  = $this->em->createQuery($dql);
662
        $result = $query->getResult();
663
664
        self::assertCount(3, $result);
665
666
        self::assertInstanceOf(CmsUserDTO::class, $result[0][0]);
667
        self::assertInstanceOf(CmsUserDTO::class, $result[1][0]);
668
        self::assertInstanceOf(CmsUserDTO::class, $result[2][0]);
669
670
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][1]);
671
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][1]);
672
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][1]);
673
674
        self::assertEquals($this->fixtures[0]->name, $result[0][0]->name);
675
        self::assertEquals($this->fixtures[1]->name, $result[1][0]->name);
676
        self::assertEquals($this->fixtures[2]->name, $result[2][0]->name);
677
678
        self::assertEquals($this->fixtures[0]->email->email, $result[0][0]->email);
679
        self::assertEquals($this->fixtures[1]->email->email, $result[1][0]->email);
680
        self::assertEquals($this->fixtures[2]->email->email, $result[2][0]->email);
681
682
683
        self::assertEquals($this->fixtures[0]->address->city, $result[0][1]->city);
684
        self::assertEquals($this->fixtures[1]->address->city, $result[1][1]->city);
685
        self::assertEquals($this->fixtures[2]->address->city, $result[2][1]->city);
686
687
        self::assertEquals($this->fixtures[0]->address->country, $result[0][1]->country);
688
        self::assertEquals($this->fixtures[1]->address->country, $result[1][1]->country);
689
        self::assertEquals($this->fixtures[2]->address->country, $result[2][1]->country);
690
691
        self::assertEquals($this->fixtures[0]->status,$result[0]['status']);
692
        self::assertEquals($this->fixtures[1]->status,$result[1]['status']);
693
        self::assertEquals($this->fixtures[2]->status,$result[2]['status']);
694
    }
695
696 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndSingleScalarWithAliases()
697
    {
698
        $dql = "
699
            SELECT
700
                new CmsUserDTO(
701
                    u.name,
702
                    e.email
703
                ) as cmsUser,
704
                new CmsAddressDTO(
705
                    a.country,
706
                    a.city
707
                ) as cmsAddress,
708
                u.status as cmsUserStatus
709
            FROM
710
                Doctrine\Tests\Models\CMS\CmsUser u
711
            JOIN
712
                u.email e
713
            JOIN
714
                u.address a
715
            ORDER BY
716
                u.name";
717
718
        $query  = $this->em->createQuery($dql);
719
        $result = $query->getResult();
720
721
        self::assertCount(3, $result);
722
723
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
724
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
725
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
726
727
        self::assertInstanceOf(CmsAddressDTO::class, $result[0]['cmsAddress']);
728
        self::assertInstanceOf(CmsAddressDTO::class, $result[1]['cmsAddress']);
729
        self::assertInstanceOf(CmsAddressDTO::class, $result[2]['cmsAddress']);
730
731
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
732
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
733
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
734
735
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
736
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
737
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
738
739
740
        self::assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city);
741
        self::assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city);
742
        self::assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city);
743
744
        self::assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country);
745
        self::assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country);
746
        self::assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country);
747
748
        self::assertEquals($this->fixtures[0]->status,$result[0]['cmsUserStatus']);
749
        self::assertEquals($this->fixtures[1]->status,$result[1]['cmsUserStatus']);
750
        self::assertEquals($this->fixtures[2]->status,$result[2]['cmsUserStatus']);
751
    }
752
753 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndSingleScalarWithAndWithoutAliases()
754
    {
755
        $dql = "
756
            SELECT
757
                new CmsUserDTO(
758
                    u.name,
759
                    e.email
760
                ) as cmsUser,
761
                new CmsAddressDTO(
762
                    a.country,
763
                    a.city
764
                ),
765
                u.status
766
            FROM
767
                Doctrine\Tests\Models\CMS\CmsUser u
768
            JOIN
769
                u.email e
770
            JOIN
771
                u.address a
772
            ORDER BY
773
                u.name";
774
775
        $query  = $this->em->createQuery($dql);
776
        $result = $query->getResult();
777
778
        self::assertCount(3, $result);
779
780
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
781
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
782
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
783
784
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][0]);
785
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][0]);
786
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][0]);
787
788
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
789
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
790
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
791
792
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
793
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
794
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
795
796
797
        self::assertEquals($this->fixtures[0]->address->city, $result[0][0]->city);
798
        self::assertEquals($this->fixtures[1]->address->city, $result[1][0]->city);
799
        self::assertEquals($this->fixtures[2]->address->city, $result[2][0]->city);
800
801
        self::assertEquals($this->fixtures[0]->address->country, $result[0][0]->country);
802
        self::assertEquals($this->fixtures[1]->address->country, $result[1][0]->country);
803
        self::assertEquals($this->fixtures[2]->address->country, $result[2][0]->country);
804
805
        self::assertEquals($this->fixtures[0]->status,$result[0]['status']);
806
        self::assertEquals($this->fixtures[1]->status,$result[1]['status']);
807
        self::assertEquals($this->fixtures[2]->status,$result[2]['status']);
808
    }
809
810 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndMultipleScalars()
811
    {
812
        $dql = "
813
            SELECT
814
                new CmsUserDTO(
815
                    u.name,
816
                    e.email
817
                ),
818
                new CmsAddressDTO(
819
                    a.country,
820
                    a.city
821
                ),
822
                u.status,
823
                u.username
824
            FROM
825
                Doctrine\Tests\Models\CMS\CmsUser u
826
            JOIN
827
                u.email e
828
            JOIN
829
                u.address a
830
            ORDER BY
831
                u.name";
832
833
        $query  = $this->em->createQuery($dql);
834
        $result = $query->getResult();
835
836
        self::assertCount(3, $result);
837
838
        self::assertInstanceOf(CmsUserDTO::class, $result[0][0]);
839
        self::assertInstanceOf(CmsUserDTO::class, $result[1][0]);
840
        self::assertInstanceOf(CmsUserDTO::class, $result[2][0]);
841
842
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][1]);
843
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][1]);
844
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][1]);
845
846
        self::assertEquals($this->fixtures[0]->name, $result[0][0]->name);
847
        self::assertEquals($this->fixtures[1]->name, $result[1][0]->name);
848
        self::assertEquals($this->fixtures[2]->name, $result[2][0]->name);
849
850
        self::assertEquals($this->fixtures[0]->email->email, $result[0][0]->email);
851
        self::assertEquals($this->fixtures[1]->email->email, $result[1][0]->email);
852
        self::assertEquals($this->fixtures[2]->email->email, $result[2][0]->email);
853
854
855
        self::assertEquals($this->fixtures[0]->address->city, $result[0][1]->city);
856
        self::assertEquals($this->fixtures[1]->address->city, $result[1][1]->city);
857
        self::assertEquals($this->fixtures[2]->address->city, $result[2][1]->city);
858
859
        self::assertEquals($this->fixtures[0]->address->country, $result[0][1]->country);
860
        self::assertEquals($this->fixtures[1]->address->country, $result[1][1]->country);
861
        self::assertEquals($this->fixtures[2]->address->country, $result[2][1]->country);
862
863
        self::assertEquals($this->fixtures[0]->status,$result[0]['status']);
864
        self::assertEquals($this->fixtures[1]->status,$result[1]['status']);
865
        self::assertEquals($this->fixtures[2]->status,$result[2]['status']);
866
867
        self::assertEquals($this->fixtures[0]->username,$result[0]['username']);
868
        self::assertEquals($this->fixtures[1]->username,$result[1]['username']);
869
        self::assertEquals($this->fixtures[2]->username,$result[2]['username']);
870
    }
871
872 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAliases()
873
    {
874
        $dql = "
875
            SELECT
876
                new CmsUserDTO(
877
                    u.name,
878
                    e.email
879
                ) as cmsUser,
880
                new CmsAddressDTO(
881
                    a.country,
882
                    a.city
883
                ) as cmsAddress,
884
                u.status as cmsUserStatus,
885
                u.username as cmsUserUsername
886
            FROM
887
                Doctrine\Tests\Models\CMS\CmsUser u
888
            JOIN
889
                u.email e
890
            JOIN
891
                u.address a
892
            ORDER BY
893
                u.name";
894
895
        $query  = $this->em->createQuery($dql);
896
        $result = $query->getResult();
897
898
        self::assertCount(3, $result);
899
900
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
901
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
902
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
903
904
        self::assertInstanceOf(CmsAddressDTO::class, $result[0]['cmsAddress']);
905
        self::assertInstanceOf(CmsAddressDTO::class, $result[1]['cmsAddress']);
906
        self::assertInstanceOf(CmsAddressDTO::class, $result[2]['cmsAddress']);
907
908
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
909
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
910
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
911
912
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
913
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
914
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
915
916
917
        self::assertEquals($this->fixtures[0]->address->city, $result[0]['cmsAddress']->city);
918
        self::assertEquals($this->fixtures[1]->address->city, $result[1]['cmsAddress']->city);
919
        self::assertEquals($this->fixtures[2]->address->city, $result[2]['cmsAddress']->city);
920
921
        self::assertEquals($this->fixtures[0]->address->country, $result[0]['cmsAddress']->country);
922
        self::assertEquals($this->fixtures[1]->address->country, $result[1]['cmsAddress']->country);
923
        self::assertEquals($this->fixtures[2]->address->country, $result[2]['cmsAddress']->country);
924
925
        self::assertEquals($this->fixtures[0]->status,$result[0]['cmsUserStatus']);
926
        self::assertEquals($this->fixtures[1]->status,$result[1]['cmsUserStatus']);
927
        self::assertEquals($this->fixtures[2]->status,$result[2]['cmsUserStatus']);
928
929
        self::assertEquals($this->fixtures[0]->username,$result[0]['cmsUserUsername']);
930
        self::assertEquals($this->fixtures[1]->username,$result[1]['cmsUserUsername']);
931
        self::assertEquals($this->fixtures[2]->username,$result[2]['cmsUserUsername']);
932
    }
933
934 View Code Duplication
    public function testShouldSupportMultipleNewOperatorsAndMultipleScalarsWithAndWithoutAliases()
935
    {
936
        $dql = "
937
            SELECT
938
                new CmsUserDTO(
939
                    u.name,
940
                    e.email
941
                ) as cmsUser,
942
                new CmsAddressDTO(
943
                    a.country,
944
                    a.city
945
                ),
946
                u.status,
947
                u.username as cmsUserUsername
948
            FROM
949
                Doctrine\Tests\Models\CMS\CmsUser u
950
            JOIN
951
                u.email e
952
            JOIN
953
                u.address a
954
            ORDER BY
955
                u.name";
956
957
        $query  = $this->em->createQuery($dql);
958
        $result = $query->getResult();
959
960
        self::assertCount(3, $result);
961
962
        self::assertInstanceOf(CmsUserDTO::class, $result[0]['cmsUser']);
963
        self::assertInstanceOf(CmsUserDTO::class, $result[1]['cmsUser']);
964
        self::assertInstanceOf(CmsUserDTO::class, $result[2]['cmsUser']);
965
966
        self::assertInstanceOf(CmsAddressDTO::class, $result[0][0]);
967
        self::assertInstanceOf(CmsAddressDTO::class, $result[1][0]);
968
        self::assertInstanceOf(CmsAddressDTO::class, $result[2][0]);
969
970
        self::assertEquals($this->fixtures[0]->name, $result[0]['cmsUser']->name);
971
        self::assertEquals($this->fixtures[1]->name, $result[1]['cmsUser']->name);
972
        self::assertEquals($this->fixtures[2]->name, $result[2]['cmsUser']->name);
973
974
        self::assertEquals($this->fixtures[0]->email->email, $result[0]['cmsUser']->email);
975
        self::assertEquals($this->fixtures[1]->email->email, $result[1]['cmsUser']->email);
976
        self::assertEquals($this->fixtures[2]->email->email, $result[2]['cmsUser']->email);
977
978
979
        self::assertEquals($this->fixtures[0]->address->city, $result[0][0]->city);
980
        self::assertEquals($this->fixtures[1]->address->city, $result[1][0]->city);
981
        self::assertEquals($this->fixtures[2]->address->city, $result[2][0]->city);
982
983
        self::assertEquals($this->fixtures[0]->address->country, $result[0][0]->country);
984
        self::assertEquals($this->fixtures[1]->address->country, $result[1][0]->country);
985
        self::assertEquals($this->fixtures[2]->address->country, $result[2][0]->country);
986
987
        self::assertEquals($this->fixtures[0]->status,$result[0]['status']);
988
        self::assertEquals($this->fixtures[1]->status,$result[1]['status']);
989
        self::assertEquals($this->fixtures[2]->status,$result[2]['status']);
990
991
        self::assertEquals($this->fixtures[0]->username,$result[0]['cmsUserUsername']);
992
        self::assertEquals($this->fixtures[1]->username,$result[1]['cmsUserUsername']);
993
        self::assertEquals($this->fixtures[2]->username,$result[2]['cmsUserUsername']);
994
    }
995
996
    /**
997
     * @expectedException Doctrine\ORM\Query\QueryException
998
     * @expectedExceptionMessage [Semantical Error] line 0, col 11 near '\InvalidClass(u.name)': Error: Class "\InvalidClass" is not defined.
999
     */
1000
    public function testInvalidClassException()
1001
    {
1002
        $dql = "SELECT new \InvalidClass(u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u";
1003
        $this->em->createQuery($dql)->getResult();
1004
    }
1005
1006
    /**
1007
     * @expectedException Doctrine\ORM\Query\QueryException
1008
     * @expectedExceptionMessage [Semantical Error] line 0, col 11 near '\stdClass(u.name)': Error: Class "\stdClass" has not a valid constructor.
1009
     */
1010
    public function testInvalidClassConstructorException()
1011
    {
1012
        $dql = "SELECT new \stdClass(u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u";
1013
        $this->em->createQuery($dql)->getResult();
1014
    }
1015
1016
    /**
1017
     * @expectedException Doctrine\ORM\Query\QueryException
1018
     * @expectedExceptionMessage [Semantical Error] line 0, col 11 near 'Doctrine\Tests\ORM\Functional\ClassWithTooMuchArgs(u.name)': Error: Number of arguments does not match with "Doctrine\Tests\ORM\Functional\ClassWithTooMuchArgs" constructor declaration.
1019
     */
1020
    public function testInvalidClassWithoutConstructorException()
1021
    {
1022
        $dql = "SELECT new Doctrine\Tests\ORM\Functional\ClassWithTooMuchArgs(u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u";
1023
        $this->em->createQuery($dql)->getResult();
1024
    }
1025
1026
    /**
1027
     * @expectedException Doctrine\ORM\Query\QueryException
1028
     * @expectedExceptionMessage [Semantical Error] line 0, col 11 near 'Doctrine\Tests\ORM\Functional\ClassWithPrivateConstructor(u.name)': Error: Class "Doctrine\Tests\ORM\Functional\ClassWithPrivateConstructor" can not be instantiated.
1029
     */
1030
    public function testClassCantBeInstantiatedException()
1031
    {
1032
        $dql = "SELECT new Doctrine\Tests\ORM\Functional\ClassWithPrivateConstructor(u.name) FROM Doctrine\Tests\Models\CMS\CmsUser u";
1033
        $this->em->createQuery($dql)->getResult();
1034
    }
1035
}
1036
1037
class ClassWithTooMuchArgs
1038
{
1039
    public function __construct($foo, $bar)
1040
    {
1041
        $this->foo = $foo;
0 ignored issues
show
Bug introduced by
The property foo does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1042
        $this->bor = $bar;
0 ignored issues
show
Bug introduced by
The property bor does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1043
    }
1044
}
1045
1046
class ClassWithPrivateConstructor
1047
{
1048
    private function __construct($foo)
1049
    {
1050
        $this->foo = $foo;
0 ignored issues
show
Bug introduced by
The property foo does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
1051
    }
1052
}
1053