Rajout de doctrine/orm
[zf2.biz/galerie.git] / vendor / doctrine / common / tests / Doctrine / Tests / Common / Collections / ClosureExpressionVisitorTest.php
1 <?php
2 /*
3  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
6  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
7  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
8  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
9  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
10  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
11  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
12  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
13  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14  *
15  * This software consists of voluntary contributions made by many individuals
16  * and is licensed under the LGPL. For more information, see
17  * <http://www.doctrine-project.org>.
18  */
19
20 namespace Doctrine\Tests\Common\Collections;
21
22 use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor;
23 use Doctrine\Common\Collections\ExpressionBuilder;
24
25 /**
26  * @group DDC-1637
27  */
28 class ClosureExpressionVisitorTest extends \PHPUnit_Framework_TestCase
29 {
30     private $visitor;
31     private $builder;
32
33     public function setUp()
34     {
35         $this->visitor = new ClosureExpressionVisitor();
36         $this->builder = new ExpressionBuilder();
37     }
38
39     public function testWalkEqualsComparison()
40     {
41         $closure = $this->visitor->walkComparison($this->builder->eq("foo", 1));
42
43         $this->assertTrue($closure(new TestObject(1)));
44         $this->assertFalse($closure(new TestObject(2)));
45     }
46
47     public function testWalkNotEqualsComparison()
48     {
49         $closure = $this->visitor->walkComparison($this->builder->neq("foo", 1));
50
51         $this->assertFalse($closure(new TestObject(1)));
52         $this->assertTrue($closure(new TestObject(2)));
53     }
54
55     public function testWalkLessThanComparison()
56     {
57         $closure = $this->visitor->walkComparison($this->builder->lt("foo", 1));
58
59         $this->assertFalse($closure(new TestObject(1)));
60         $this->assertTrue($closure(new TestObject(0)));
61     }
62
63     public function testWalkLessThanEqualsComparison()
64     {
65         $closure = $this->visitor->walkComparison($this->builder->lte("foo", 1));
66
67         $this->assertFalse($closure(new TestObject(2)));
68         $this->assertTrue($closure(new TestObject(1)));
69         $this->assertTrue($closure(new TestObject(0)));
70     }
71
72     public function testWalkGreaterThanEqualsComparison()
73     {
74         $closure = $this->visitor->walkComparison($this->builder->gte("foo", 1));
75
76         $this->assertTrue($closure(new TestObject(2)));
77         $this->assertTrue($closure(new TestObject(1)));
78         $this->assertFalse($closure(new TestObject(0)));
79     }
80
81     public function testWalkGreaterThanComparison()
82     {
83         $closure = $this->visitor->walkComparison($this->builder->gt("foo", 1));
84
85         $this->assertTrue($closure(new TestObject(2)));
86         $this->assertFalse($closure(new TestObject(1)));
87         $this->assertFalse($closure(new TestObject(0)));
88     }
89
90     public function testWalkInComparison()
91     {
92         $closure = $this->visitor->walkComparison($this->builder->in("foo", array(1, 2, 3)));
93
94         $this->assertTrue($closure(new TestObject(2)));
95         $this->assertTrue($closure(new TestObject(1)));
96         $this->assertFalse($closure(new TestObject(0)));
97     }
98
99     public function testWalkNotInComparison()
100     {
101         $closure = $this->visitor->walkComparison($this->builder->notIn("foo", array(1, 2, 3)));
102
103         $this->assertFalse($closure(new TestObject(1)));
104         $this->assertFalse($closure(new TestObject(2)));
105         $this->assertTrue($closure(new TestObject(0)));
106         $this->assertTrue($closure(new TestObject(4)));
107     }
108
109     public function testWalkAndCompositeExpression()
110     {
111         $closure = $this->visitor->walkCompositeExpression(
112             $this->builder->andX(
113                 $this->builder->eq("foo", 1),
114                 $this->builder->eq("bar", 1)
115             )
116         );
117
118         $this->assertTrue($closure(new TestObject(1, 1)));
119         $this->assertFalse($closure(new TestObject(1, 0)));
120         $this->assertFalse($closure(new TestObject(0, 1)));
121         $this->assertFalse($closure(new TestObject(0, 0)));
122     }
123
124     public function testWalkOrCompositeExpression()
125     {
126         $closure = $this->visitor->walkCompositeExpression(
127             $this->builder->orX(
128                 $this->builder->eq("foo", 1),
129                 $this->builder->eq("bar", 1)
130             )
131         );
132
133         $this->assertTrue($closure(new TestObject(1, 1)));
134         $this->assertTrue($closure(new TestObject(1, 0)));
135         $this->assertTrue($closure(new TestObject(0, 1)));
136         $this->assertFalse($closure(new TestObject(0, 0)));
137     }
138
139     public function testSortByFieldAscending()
140     {
141         $objects = array(new TestObject("b"), new TestObject("a"), new TestObject("c"));
142         $sort = ClosureExpressionVisitor::sortByField("foo");
143
144         usort($objects, $sort);
145
146         $this->assertEquals("a", $objects[0]->getFoo());
147         $this->assertEquals("b", $objects[1]->getFoo());
148         $this->assertEquals("c", $objects[2]->getFoo());
149     }
150
151     public function testSortByFieldDescending()
152     {
153         $objects = array(new TestObject("b"), new TestObject("a"), new TestObject("c"));
154         $sort = ClosureExpressionVisitor::sortByField("foo", -1);
155
156         usort($objects, $sort);
157
158         $this->assertEquals("c", $objects[0]->getFoo());
159         $this->assertEquals("b", $objects[1]->getFoo());
160         $this->assertEquals("a", $objects[2]->getFoo());
161     }
162
163     public function testSortDelegate()
164     {
165         $objects = array(new TestObject("a", "c"), new TestObject("a", "b"), new TestObject("a", "a"));
166         $sort = ClosureExpressionVisitor::sortByField("bar", 1);
167         $sort = ClosureExpressionVisitor::sortByField("foo", 1, $sort);
168
169         usort($objects, $sort);
170
171         $this->assertEquals("a", $objects[0]->getBar());
172         $this->assertEquals("b", $objects[1]->getBar());
173         $this->assertEquals("c", $objects[2]->getBar());
174     }
175 }
176
177 class TestObject
178 {
179     private $foo;
180     private $bar;
181
182     public function __construct($foo = null, $bar = null)
183     {
184         $this->foo = $foo;
185         $this->bar = $bar;
186     }
187
188     public function getFoo()
189     {
190         return $this->foo;
191     }
192
193     public function getBar()
194     {
195         return $this->bar;
196     }
197 }
198