ExpressionBuilderTest.php 6.17 KB
Newer Older
1 2 3 4
<?php

namespace Doctrine\Tests\DBAL\Query\Expression;

jeroendedauw's avatar
jeroendedauw committed
5 6
use Doctrine\DBAL\Query\Expression\CompositeExpression;
use Doctrine\DBAL\Query\Expression\ExpressionBuilder;
7

8 9 10
/**
 * @group DBAL-12
 */
11 12 13
class ExpressionBuilderTest extends \Doctrine\Tests\DbalTestCase
{
    protected $expr;
14

15
    protected function setUp()
16
    {
17
        $conn = $this->createMock('Doctrine\DBAL\Connection');
18

19
        $this->expr = new ExpressionBuilder($conn);
20

21 22 23 24
        $conn->expects($this->any())
             ->method('getExpressionBuilder')
             ->will($this->returnValue($this->expr));
    }
25

26 27 28 29 30 31
    /**
     * @dataProvider provideDataForAndX
     */
    public function testAndX($parts, $expected)
    {
        $composite = $this->expr->andX();
32

33 34 35
        foreach ($parts as $part) {
            $composite->add($part);
        }
36

37
        self::assertEquals($expected, (string) $composite);
38
    }
39

40 41 42 43
    public function provideDataForAndX()
    {
        return array(
            array(
44
                array('u.user = 1'),
45 46 47
                'u.user = 1'
            ),
            array(
48
                array('u.user = 1', 'u.group_id = 1'),
49 50 51
                '(u.user = 1) AND (u.group_id = 1)'
            ),
            array(
52
                array('u.user = 1'),
53 54 55
                'u.user = 1'
            ),
            array(
56
                array('u.group_id = 1', 'u.group_id = 2'),
57 58 59 60
                '(u.group_id = 1) AND (u.group_id = 2)'
            ),
            array(
                array(
61
                    'u.user = 1',
62 63 64 65
                    new CompositeExpression(
                        CompositeExpression::TYPE_OR,
                        array('u.group_id = 1', 'u.group_id = 2')
                    )
66
                ),
67 68 69 70
                '(u.user = 1) AND ((u.group_id = 1) OR (u.group_id = 2))'
            ),
            array(
                array(
71
                    'u.group_id = 1',
72 73 74 75
                    new CompositeExpression(
                        CompositeExpression::TYPE_AND,
                        array('u.user = 1', 'u.group_id = 2')
                    )
76
                ),
77 78 79 80
                '(u.group_id = 1) AND ((u.user = 1) AND (u.group_id = 2))'
            ),
        );
    }
81

82 83 84 85 86 87
    /**
     * @dataProvider provideDataForOrX
     */
    public function testOrX($parts, $expected)
    {
        $composite = $this->expr->orX();
88

89 90 91
        foreach ($parts as $part) {
            $composite->add($part);
        }
92

93
        self::assertEquals($expected, (string) $composite);
94
    }
95

96 97 98 99
    public function provideDataForOrX()
    {
        return array(
            array(
100
                array('u.user = 1'),
101 102 103
                'u.user = 1'
            ),
            array(
104
                array('u.user = 1', 'u.group_id = 1'),
105 106 107
                '(u.user = 1) OR (u.group_id = 1)'
            ),
            array(
108
                array('u.user = 1'),
109 110 111
                'u.user = 1'
            ),
            array(
112
                array('u.group_id = 1', 'u.group_id = 2'),
113 114 115 116
                '(u.group_id = 1) OR (u.group_id = 2)'
            ),
            array(
                array(
117
                    'u.user = 1',
118 119 120 121
                    new CompositeExpression(
                        CompositeExpression::TYPE_OR,
                        array('u.group_id = 1', 'u.group_id = 2')
                    )
122
                ),
123 124 125 126
                '(u.user = 1) OR ((u.group_id = 1) OR (u.group_id = 2))'
            ),
            array(
                array(
127
                    'u.group_id = 1',
128 129 130 131
                    new CompositeExpression(
                        CompositeExpression::TYPE_AND,
                        array('u.user = 1', 'u.group_id = 2')
                    )
132
                ),
133 134 135 136
                '(u.group_id = 1) OR ((u.user = 1) AND (u.group_id = 2))'
            ),
        );
    }
137

138 139 140 141 142 143
    /**
     * @dataProvider provideDataForComparison
     */
    public function testComparison($leftExpr, $operator, $rightExpr, $expected)
    {
        $part = $this->expr->comparison($leftExpr, $operator, $rightExpr);
144

145
        self::assertEquals($expected, (string) $part);
146
    }
147

148 149 150 151 152 153 154 155 156 157 158
    public function provideDataForComparison()
    {
        return array(
            array('u.user_id', ExpressionBuilder::EQ, '1', 'u.user_id = 1'),
            array('u.user_id', ExpressionBuilder::NEQ, '1', 'u.user_id <> 1'),
            array('u.salary', ExpressionBuilder::LT, '10000', 'u.salary < 10000'),
            array('u.salary', ExpressionBuilder::LTE, '10000', 'u.salary <= 10000'),
            array('u.salary', ExpressionBuilder::GT, '10000', 'u.salary > 10000'),
            array('u.salary', ExpressionBuilder::GTE, '10000', 'u.salary >= 10000'),
        );
    }
159

160 161
    public function testEq()
    {
162
        self::assertEquals('u.user_id = 1', $this->expr->eq('u.user_id', '1'));
163
    }
164

165 166
    public function testNeq()
    {
167
        self::assertEquals('u.user_id <> 1', $this->expr->neq('u.user_id', '1'));
168
    }
169

170 171
    public function testLt()
    {
172
        self::assertEquals('u.salary < 10000', $this->expr->lt('u.salary', '10000'));
173
    }
174

175 176
    public function testLte()
    {
177
        self::assertEquals('u.salary <= 10000', $this->expr->lte('u.salary', '10000'));
178
    }
179

180 181
    public function testGt()
    {
182
        self::assertEquals('u.salary > 10000', $this->expr->gt('u.salary', '10000'));
183
    }
184

185 186
    public function testGte()
    {
187
        self::assertEquals('u.salary >= 10000', $this->expr->gte('u.salary', '10000'));
188
    }
189

190 191
    public function testIsNull()
    {
192
        self::assertEquals('u.deleted IS NULL', $this->expr->isNull('u.deleted'));
193
    }
194

195 196
    public function testIsNotNull()
    {
197
        self::assertEquals('u.updated IS NOT NULL', $this->expr->isNotNull('u.updated'));
198
    }
199 200 201

    public function testIn()
    {
202
        self::assertEquals('u.groups IN (1, 3, 4, 7)', $this->expr->in('u.groups', array(1,3,4,7)));
203 204
    }

205 206
    public function testInWithPlaceholder()
    {
207
        self::assertEquals('u.groups IN (?)', $this->expr->in('u.groups', '?'));
208 209
    }

210 211
    public function testNotIn()
    {
212
        self::assertEquals('u.groups NOT IN (1, 3, 4, 7)', $this->expr->notIn('u.groups', array(1,3,4,7)));
213
    }
214 215 216

    public function testNotInWithPlaceholder()
    {
217
        self::assertEquals('u.groups NOT IN (:values)', $this->expr->notIn('u.groups', ':values'));
218 219
    }
}