Failed Conditions
Pull Request — 2.11.x (#3850)
by Benjamin
09:18
created

testCompositeUsageAndGeneration()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
namespace Doctrine\Tests\DBAL\Query\Expression;
4
5
use Doctrine\DBAL\Query\Expression\CompositeExpression;
6
use Doctrine\Tests\DbalTestCase;
7
8
/**
9
 * @group DBAL-12
10
 */
11
class CompositeExpressionTest extends DbalTestCase
12
{
13
    public function testCount() : void
14
    {
15
        $expr = new CompositeExpression(CompositeExpression::TYPE_OR, ['u.group_id = 1']);
16
17
        self::assertCount(1, $expr);
18
19
        $expr = $expr->with('u.group_id = 2');
20
21
        self::assertCount(2, $expr);
22
    }
23
24
    public function testAdd() : void
25
    {
26
        $expr = new CompositeExpression(CompositeExpression::TYPE_OR, ['u.group_id = 1']);
27
28
        self::assertCount(1, $expr);
29
30
        $expr->add(new CompositeExpression(CompositeExpression::TYPE_AND, []));
31
32
        self::assertCount(1, $expr);
33
34
        $expr->add(new CompositeExpression(CompositeExpression::TYPE_OR, ['u.user_id = 1']));
35
36
        self::assertCount(2, $expr);
37
38
        $expr->add(null);
39
40
        self::assertCount(2, $expr);
41
42
        $expr->add('u.user_id = 1');
43
44
        self::assertCount(3, $expr);
45
    }
46
47
    public function testWith() : void
48
    {
49
        $expr = new CompositeExpression(CompositeExpression::TYPE_OR, ['u.group_id = 1']);
50
51
        self::assertCount(1, $expr);
52
53
        $expr = $expr->with(new CompositeExpression(CompositeExpression::TYPE_AND, []));
54
55
        self::assertCount(1, $expr);
56
57
        // test immutability
58
        $expr->with(new CompositeExpression(CompositeExpression::TYPE_OR, ['u.user_id = 1']));
59
60
        self::assertCount(1, $expr);
61
62
        $expr = $expr->with(new CompositeExpression(CompositeExpression::TYPE_OR, ['u.user_id = 1']));
63
64
        self::assertCount(2, $expr);
65
66
        $expr = $expr->with('u.user_id = 1');
67
68
        self::assertCount(3, $expr);
69
    }
70
71
    /**
72
     * @param string[]|CompositeExpression[] $parts
73
     *
74
     * @dataProvider provideDataForConvertToString
75
     */
76
    public function testCompositeUsageAndGeneration(string $type, array $parts, string $expects) : void
77
    {
78
        $expr = new CompositeExpression($type, $parts);
79
80
        self::assertEquals($expects, (string) $expr);
81
    }
82
83
    /**
84
     * @return mixed[][]
85
     */
86
    public static function provideDataForConvertToString() : iterable
87
    {
88
        return [
89
            [
90
                CompositeExpression::TYPE_AND,
91
                ['u.user = 1'],
92
                'u.user = 1',
93
            ],
94
            [
95
                CompositeExpression::TYPE_AND,
96
                ['u.user = 1', 'u.group_id = 1'],
97
                '(u.user = 1) AND (u.group_id = 1)',
98
            ],
99
            [
100
                CompositeExpression::TYPE_OR,
101
                ['u.user = 1'],
102
                'u.user = 1',
103
            ],
104
            [
105
                CompositeExpression::TYPE_OR,
106
                ['u.group_id = 1', 'u.group_id = 2'],
107
                '(u.group_id = 1) OR (u.group_id = 2)',
108
            ],
109
            [
110
                CompositeExpression::TYPE_AND,
111
                [
112
                    'u.user = 1',
113
                    new CompositeExpression(
114
                        CompositeExpression::TYPE_OR,
115
                        ['u.group_id = 1', 'u.group_id = 2']
116
                    ),
117
                ],
118
                '(u.user = 1) AND ((u.group_id = 1) OR (u.group_id = 2))',
119
            ],
120
            [
121
                CompositeExpression::TYPE_OR,
122
                [
123
                    'u.group_id = 1',
124
                    new CompositeExpression(
125
                        CompositeExpression::TYPE_AND,
126
                        ['u.user = 1', 'u.group_id = 2']
127
                    ),
128
                ],
129
                '(u.group_id = 1) OR ((u.user = 1) AND (u.group_id = 2))',
130
            ],
131
        ];
132
    }
133
}
134