1<?php
2/**
3 * Zend Framework (http://framework.zend.com/)
4 *
5 * @link      http://github.com/zendframework/zf2 for the canonical source repository
6 * @copyright Copyright (c) 2005-2016 Zend Technologies USA Inc. (http://www.zend.com)
7 * @license   http://framework.zend.com/license/new-bsd New BSD License
8 */
9
10namespace ZendTest\Db\Sql\Predicate;
11
12use PHPUnit\Framework\TestCase;
13use Zend\Db\Sql\Predicate\Operator;
14
15class OperatorTest extends TestCase
16{
17    public function testEmptyConstructorYieldsNullLeftAndRightValues()
18    {
19        $operator = new Operator();
20        self::assertNull($operator->getLeft());
21        self::assertNull($operator->getRight());
22    }
23
24    public function testEmptyConstructorYieldsDefaultsForOperatorAndLeftAndRightTypes()
25    {
26        $operator = new Operator();
27        self::assertEquals(Operator::OP_EQ, $operator->getOperator());
28        self::assertEquals(Operator::TYPE_IDENTIFIER, $operator->getLeftType());
29        self::assertEquals(Operator::TYPE_VALUE, $operator->getRightType());
30    }
31
32    public function testCanPassAllValuesToConstructor()
33    {
34        $operator = new Operator('bar', '>=', 'foo.bar', Operator::TYPE_VALUE, Operator::TYPE_IDENTIFIER);
35        self::assertEquals(Operator::OP_GTE, $operator->getOperator());
36        self::assertEquals('bar', $operator->getLeft());
37        self::assertEquals('foo.bar', $operator->getRight());
38        self::assertEquals(Operator::TYPE_VALUE, $operator->getLeftType());
39        self::assertEquals(Operator::TYPE_IDENTIFIER, $operator->getRightType());
40
41        $operator = new Operator(['bar' => Operator::TYPE_VALUE], '>=', ['foo.bar' => Operator::TYPE_IDENTIFIER]);
42        self::assertEquals(Operator::OP_GTE, $operator->getOperator());
43        self::assertEquals(['bar' => Operator::TYPE_VALUE], $operator->getLeft());
44        self::assertEquals(['foo.bar' => Operator::TYPE_IDENTIFIER], $operator->getRight());
45        self::assertEquals(Operator::TYPE_VALUE, $operator->getLeftType());
46        self::assertEquals(Operator::TYPE_IDENTIFIER, $operator->getRightType());
47
48        $operator = new Operator('bar', '>=', 0);
49        self::assertEquals(0, $operator->getRight());
50    }
51
52    public function testLeftIsMutable()
53    {
54        $operator = new Operator();
55        $operator->setLeft('foo.bar');
56        self::assertEquals('foo.bar', $operator->getLeft());
57    }
58
59    public function testRightIsMutable()
60    {
61        $operator = new Operator();
62        $operator->setRight('bar');
63        self::assertEquals('bar', $operator->getRight());
64    }
65
66    public function testLeftTypeIsMutable()
67    {
68        $operator = new Operator();
69        $operator->setLeftType(Operator::TYPE_VALUE);
70        self::assertEquals(Operator::TYPE_VALUE, $operator->getLeftType());
71    }
72
73    public function testRightTypeIsMutable()
74    {
75        $operator = new Operator();
76        $operator->setRightType(Operator::TYPE_IDENTIFIER);
77        self::assertEquals(Operator::TYPE_IDENTIFIER, $operator->getRightType());
78    }
79
80    public function testOperatorIsMutable()
81    {
82        $operator = new Operator();
83        $operator->setOperator(Operator::OP_LTE);
84        self::assertEquals(Operator::OP_LTE, $operator->getOperator());
85    }
86
87    public function testRetrievingWherePartsReturnsSpecificationArrayOfLeftAndRightAndArrayOfTypes()
88    {
89        $operator = new Operator();
90        $operator->setLeft('foo')
91            ->setOperator('>=')
92            ->setRight('foo.bar')
93            ->setLeftType(Operator::TYPE_VALUE)
94            ->setRightType(Operator::TYPE_IDENTIFIER);
95        $expected = [[
96            '%s >= %s',
97            ['foo', 'foo.bar'],
98            [Operator::TYPE_VALUE, Operator::TYPE_IDENTIFIER],
99        ]];
100        $test = $operator->getExpressionData();
101        self::assertEquals($expected, $test, var_export($test, 1));
102    }
103}
104