ExpressionBuilderTest.php 5.96 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

require_once __DIR__ . '/../../../TestInit.php';

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

17 18 19
    public function setUp()
    {
        $conn = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false);
20

21
        $this->expr = new ExpressionBuilder($conn);
22

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

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

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

39 40
        $this->assertEquals($expected, (string) $composite);
    }
41

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

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

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

95 96
        $this->assertEquals($expected, (string) $composite);
    }
97

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

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

147 148
        $this->assertEquals($expected, (string) $part);
    }
149

150 151 152 153 154 155 156 157 158 159 160
    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'),
        );
    }
161

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

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

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

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

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

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

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

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

    public function testIn()
    {
Paul Chubatyy's avatar
Paul Chubatyy committed
204
        $this->assertEquals('u.groups IN (1, 3, 4, 7)', $this->expr->in('u.groups', array(1,3,4,7)));
205 206 207 208
    }

    public function testNotIn()
    {
Paul Chubatyy's avatar
Paul Chubatyy committed
209
        $this->assertEquals('u.groups NOT IN (1, 3, 4, 7)', $this->expr->notIn('u.groups', array(1,3,4,7)));
210
    }
211
}