Failed Conditions
Pull Request — develop (#6935)
by Michael
167:08 queued 149:28
created

testShouldSupportValueObjectNamespaceAlias()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 26
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nop 0
dl 0
loc 26
rs 8.8571
c 0
b 0
f 0
nc 1
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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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
    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 Best Practice introduced by
The property foo does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
1042
        $this->bor = $bar;
0 ignored issues
show
Bug Best Practice introduced by
The property bor does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
1043
    }
1044
}
1045
1046
class ClassWithPrivateConstructor
1047
{
1048
    private function __construct($foo)
1049
    {
1050
        $this->foo = $foo;
0 ignored issues
show
Bug Best Practice introduced by
The property foo does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
1051
    }
1052
}
1053