ExpressionBuilderTest.php 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. namespace Doctrine\Tests\DBAL\Query\Expression;
  3. use Doctrine\DBAL\Query\Expression\ExpressionBuilder,
  4. Doctrine\DBAL\Query\Expression\CompositeExpression;
  5. require_once __DIR__ . '/../../../TestInit.php';
  6. /**
  7. * @group DBAL-12
  8. */
  9. class ExpressionBuilderTest extends \Doctrine\Tests\DbalTestCase
  10. {
  11. protected $expr;
  12. public function setUp()
  13. {
  14. $conn = $this->getMock('Doctrine\DBAL\Connection', array(), array(), '', false);
  15. $this->expr = new ExpressionBuilder($conn);
  16. $conn->expects($this->any())
  17. ->method('getExpressionBuilder')
  18. ->will($this->returnValue($this->expr));
  19. }
  20. /**
  21. * @dataProvider provideDataForAndX
  22. */
  23. public function testAndX($parts, $expected)
  24. {
  25. $composite = $this->expr->andX();
  26. foreach ($parts as $part) {
  27. $composite->add($part);
  28. }
  29. $this->assertEquals($expected, (string) $composite);
  30. }
  31. public function provideDataForAndX()
  32. {
  33. return array(
  34. array(
  35. array('u.user = 1'),
  36. 'u.user = 1'
  37. ),
  38. array(
  39. array('u.user = 1', 'u.group_id = 1'),
  40. '(u.user = 1) AND (u.group_id = 1)'
  41. ),
  42. array(
  43. array('u.user = 1'),
  44. 'u.user = 1'
  45. ),
  46. array(
  47. array('u.group_id = 1', 'u.group_id = 2'),
  48. '(u.group_id = 1) AND (u.group_id = 2)'
  49. ),
  50. array(
  51. array(
  52. 'u.user = 1',
  53. new CompositeExpression(
  54. CompositeExpression::TYPE_OR,
  55. array('u.group_id = 1', 'u.group_id = 2')
  56. )
  57. ),
  58. '(u.user = 1) AND ((u.group_id = 1) OR (u.group_id = 2))'
  59. ),
  60. array(
  61. array(
  62. 'u.group_id = 1',
  63. new CompositeExpression(
  64. CompositeExpression::TYPE_AND,
  65. array('u.user = 1', 'u.group_id = 2')
  66. )
  67. ),
  68. '(u.group_id = 1) AND ((u.user = 1) AND (u.group_id = 2))'
  69. ),
  70. );
  71. }
  72. /**
  73. * @dataProvider provideDataForOrX
  74. */
  75. public function testOrX($parts, $expected)
  76. {
  77. $composite = $this->expr->orX();
  78. foreach ($parts as $part) {
  79. $composite->add($part);
  80. }
  81. $this->assertEquals($expected, (string) $composite);
  82. }
  83. public function provideDataForOrX()
  84. {
  85. return array(
  86. array(
  87. array('u.user = 1'),
  88. 'u.user = 1'
  89. ),
  90. array(
  91. array('u.user = 1', 'u.group_id = 1'),
  92. '(u.user = 1) OR (u.group_id = 1)'
  93. ),
  94. array(
  95. array('u.user = 1'),
  96. 'u.user = 1'
  97. ),
  98. array(
  99. array('u.group_id = 1', 'u.group_id = 2'),
  100. '(u.group_id = 1) OR (u.group_id = 2)'
  101. ),
  102. array(
  103. array(
  104. 'u.user = 1',
  105. new CompositeExpression(
  106. CompositeExpression::TYPE_OR,
  107. array('u.group_id = 1', 'u.group_id = 2')
  108. )
  109. ),
  110. '(u.user = 1) OR ((u.group_id = 1) OR (u.group_id = 2))'
  111. ),
  112. array(
  113. array(
  114. 'u.group_id = 1',
  115. new CompositeExpression(
  116. CompositeExpression::TYPE_AND,
  117. array('u.user = 1', 'u.group_id = 2')
  118. )
  119. ),
  120. '(u.group_id = 1) OR ((u.user = 1) AND (u.group_id = 2))'
  121. ),
  122. );
  123. }
  124. /**
  125. * @dataProvider provideDataForComparison
  126. */
  127. public function testComparison($leftExpr, $operator, $rightExpr, $expected)
  128. {
  129. $part = $this->expr->comparison($leftExpr, $operator, $rightExpr);
  130. $this->assertEquals($expected, (string) $part);
  131. }
  132. public function provideDataForComparison()
  133. {
  134. return array(
  135. array('u.user_id', ExpressionBuilder::EQ, '1', 'u.user_id = 1'),
  136. array('u.user_id', ExpressionBuilder::NEQ, '1', 'u.user_id <> 1'),
  137. array('u.salary', ExpressionBuilder::LT, '10000', 'u.salary < 10000'),
  138. array('u.salary', ExpressionBuilder::LTE, '10000', 'u.salary <= 10000'),
  139. array('u.salary', ExpressionBuilder::GT, '10000', 'u.salary > 10000'),
  140. array('u.salary', ExpressionBuilder::GTE, '10000', 'u.salary >= 10000'),
  141. );
  142. }
  143. public function testEq()
  144. {
  145. $this->assertEquals('u.user_id = 1', $this->expr->eq('u.user_id', '1'));
  146. }
  147. public function testNeq()
  148. {
  149. $this->assertEquals('u.user_id <> 1', $this->expr->neq('u.user_id', '1'));
  150. }
  151. public function testLt()
  152. {
  153. $this->assertEquals('u.salary < 10000', $this->expr->lt('u.salary', '10000'));
  154. }
  155. public function testLte()
  156. {
  157. $this->assertEquals('u.salary <= 10000', $this->expr->lte('u.salary', '10000'));
  158. }
  159. public function testGt()
  160. {
  161. $this->assertEquals('u.salary > 10000', $this->expr->gt('u.salary', '10000'));
  162. }
  163. public function testGte()
  164. {
  165. $this->assertEquals('u.salary >= 10000', $this->expr->gte('u.salary', '10000'));
  166. }
  167. public function testIsNull()
  168. {
  169. $this->assertEquals('u.deleted IS NULL', $this->expr->isNull('u.deleted'));
  170. }
  171. public function testIsNotNull()
  172. {
  173. $this->assertEquals('u.updated IS NOT NULL', $this->expr->isNotNull('u.updated'));
  174. }
  175. }