/tests/database/postgresql/result.php

https://github.com/cbandy/real-database · PHP · 722 lines · 440 code · 88 blank · 194 comment · 5 complexity · 8ee13309cb9e080d959e24d798097bd1 MD5 · raw file

  1. <?php
  2. require_once dirname(__FILE__).'/testcase'.EXT;
  3. require_once 'PHPUnit/Extensions/Database/DataSet/CsvDataSet.php';
  4. /**
  5. * @package RealDatabase
  6. * @subpackage PostgreSQL
  7. * @author Chris Bandy
  8. *
  9. * @group database
  10. * @group database.postgresql
  11. */
  12. class Database_PostgreSQL_Result_Test extends Database_PostgreSQL_TestCase
  13. {
  14. protected $_table = 'kohana_test_table';
  15. protected function getDataSet()
  16. {
  17. $dataset = new PHPUnit_Extensions_Database_DataSet_CsvDataSet;
  18. $dataset->addTable(
  19. Database::factory()->table_prefix().$this->_table,
  20. dirname(dirname(__FILE__)).'/datasets/values.csv'
  21. );
  22. return $dataset;
  23. }
  24. public function provider_fetch()
  25. {
  26. $entire = Database::factory()->select()->from($this->_table);
  27. return array(
  28. // data set #0
  29. array($entire, FALSE, 0, array('id' => 1, 'value' => 50)),
  30. array($entire, FALSE, 1, array('id' => 2, 'value' => 55)),
  31. array($entire, FALSE, 2, array('id' => 3, 'value' => 60)),
  32. array($entire, FALSE, 6, array('id' => 7, 'value' => 65)),
  33. // data set #4
  34. array($entire, TRUE, 0, (object) array('id' => 1, 'value' => 50)),
  35. array($entire, TRUE, 1, (object) array('id' => 2, 'value' => 55)),
  36. array($entire, TRUE, 2, (object) array('id' => 3, 'value' => 60)),
  37. array($entire, TRUE, 6, (object) array('id' => 7, 'value' => 65)),
  38. );
  39. }
  40. /**
  41. * @covers Database_PostgreSQL_Result::__construct
  42. * @covers Database_PostgreSQL_Result::fetch
  43. *
  44. * @dataProvider provider_fetch
  45. *
  46. * @param SQL_Expression $query
  47. * @param string|boolean $as_object
  48. * @param integer $position
  49. * @param array $expected
  50. */
  51. public function test_fetch($query, $as_object, $position, $expected)
  52. {
  53. $result = Database::factory()->execute_query($query, $as_object);
  54. $this->assertEquals($expected, $result->fetch($position));
  55. $this->assertSame(0, $result->key(), 'Do not move pointer');
  56. }
  57. public function provider_fetch_object_arguments()
  58. {
  59. $entire = Database::factory()->select()->from($this->_table);
  60. return array(
  61. // data set #0
  62. array($entire, 0, array()),
  63. array($entire, 2, array()),
  64. // data set #2
  65. array($entire, 1, array(1)),
  66. array($entire, 3, array(1)),
  67. // data set #4
  68. array($entire, 4, array('a', 'b')),
  69. array($entire, 5, array('a', 'b')),
  70. );
  71. }
  72. /**
  73. * @covers Database_PostgreSQL_Result::__construct
  74. * @covers Database_PostgreSQL_Result::fetch
  75. *
  76. * @dataProvider provider_fetch_object_arguments
  77. *
  78. * @todo This test would be better using a mocked constructor
  79. *
  80. * @param SQL_Expression $query
  81. * @param integer $position
  82. * @param array $arguments
  83. */
  84. public function test_fetch_object_arguments($query, $position, $arguments)
  85. {
  86. $result = Database::factory()
  87. ->execute_query(
  88. $query, 'Database_PostgreSQL_Result_Test_Constructor', $arguments
  89. )
  90. ->fetch($position);
  91. $this->assertSame($arguments, $result->arguments());
  92. }
  93. /**
  94. * @covers Database_PostgreSQL_Result::__construct
  95. * @covers Database_PostgreSQL_Result::fetch
  96. */
  97. public function test_fetch_object_arguments_no_constructor()
  98. {
  99. $db = Database::factory();
  100. // No errors about missing constructor
  101. $db->execute_query(
  102. $db->select()->from($this->_table), 'stdClass', array()
  103. )
  104. ->fetch(0);
  105. }
  106. public function provider_fetch_after_seek()
  107. {
  108. $entire = Database::factory()->select()->from($this->_table);
  109. return array(
  110. // data set #0
  111. array($entire, FALSE, 0, 0, array('id' => 1, 'value' => 50)),
  112. array($entire, FALSE, 1, 0, array('id' => 1, 'value' => 50)),
  113. array($entire, FALSE, 2, 0, array('id' => 1, 'value' => 50)),
  114. // data set #3
  115. array($entire, FALSE, 0, 1, array('id' => 2, 'value' => 55)),
  116. array($entire, FALSE, 1, 1, array('id' => 2, 'value' => 55)),
  117. array($entire, FALSE, 2, 1, array('id' => 2, 'value' => 55)),
  118. // data set #6
  119. array($entire, FALSE, 0, 6, array('id' => 7, 'value' => 65)),
  120. array($entire, FALSE, 1, 6, array('id' => 7, 'value' => 65)),
  121. array($entire, FALSE, 2, 6, array('id' => 7, 'value' => 65)),
  122. // data set #9
  123. array($entire, TRUE, 0, 0, (object) array('id' => 1, 'value' => 50)),
  124. array($entire, TRUE, 1, 0, (object) array('id' => 1, 'value' => 50)),
  125. array($entire, TRUE, 2, 0, (object) array('id' => 1, 'value' => 50)),
  126. // data set #12
  127. array($entire, TRUE, 0, 1, (object) array('id' => 2, 'value' => 55)),
  128. array($entire, TRUE, 1, 1, (object) array('id' => 2, 'value' => 55)),
  129. array($entire, TRUE, 2, 1, (object) array('id' => 2, 'value' => 55)),
  130. // data set #15
  131. array($entire, TRUE, 0, 6, (object) array('id' => 7, 'value' => 65)),
  132. array($entire, TRUE, 1, 6, (object) array('id' => 7, 'value' => 65)),
  133. array($entire, TRUE, 2, 6, (object) array('id' => 7, 'value' => 65)),
  134. );
  135. }
  136. /**
  137. * @covers Database_PostgreSQL_Result::fetch
  138. *
  139. * @dataProvider provider_fetch_after_seek
  140. *
  141. * @param SQL_Expression $query
  142. * @param string|boolean $as_object
  143. * @param integer $seek
  144. * @param integer $position
  145. * @param array $expected
  146. */
  147. public function test_fetch_after_seek($query, $as_object, $seek, $position, $expected)
  148. {
  149. $result = Database::factory()->execute_query($query, $as_object)->seek($seek);
  150. $this->assertEquals($expected, $result->fetch($position));
  151. $this->assertSame($seek, $result->key(), 'Do not move pointer');
  152. }
  153. public function provider_fetch_invalid()
  154. {
  155. $entire = Database::factory()->select()->from($this->_table);
  156. return array(
  157. array($entire, -5),
  158. array($entire, -1),
  159. array($entire, 7),
  160. array($entire, 8),
  161. array($entire, 10),
  162. );
  163. }
  164. /**
  165. * @covers Database_PostgreSQL_Result::fetch
  166. *
  167. * @dataProvider provider_fetch_invalid
  168. *
  169. * @param SQL_Expression $query
  170. * @param integer $position
  171. */
  172. public function test_fetch_invalid($query, $position)
  173. {
  174. $result = Database::factory()->execute_query($query);
  175. if (error_reporting() & E_WARNING)
  176. {
  177. if (version_compare(PHP_VERSION, '5.3.9', '<'))
  178. {
  179. if ($position == -1)
  180. {
  181. $this->markTestIncomplete('http://bugs.php.net/60244');
  182. }
  183. else
  184. {
  185. $this->setExpectedException(
  186. 'ErrorException', 'Unable to jump to row', E_WARNING
  187. );
  188. }
  189. }
  190. else
  191. {
  192. if ($position < 0)
  193. {
  194. $this->setExpectedException(
  195. 'ErrorException', 'row parameter', E_WARNING
  196. );
  197. }
  198. else
  199. {
  200. $this->setExpectedException(
  201. 'ErrorException', 'Unable to jump to row', E_WARNING
  202. );
  203. }
  204. }
  205. $result->fetch($position);
  206. }
  207. else
  208. {
  209. $this->assertFalse($result->fetch($position));
  210. }
  211. }
  212. public function provider_current()
  213. {
  214. $entire = Database::factory()->select()->from($this->_table);
  215. return array(
  216. array($entire, FALSE, array('id' => 1, 'value' => 50)),
  217. array($entire, TRUE, (object) array('id' => 1, 'value' => 50)),
  218. );
  219. }
  220. /**
  221. * @covers Database_PostgreSQL_Result::current
  222. *
  223. * @dataProvider provider_current
  224. *
  225. * @param SQL_Expression $query
  226. * @param string|boolean $as_object
  227. * @param array $expected
  228. */
  229. public function test_current($query, $as_object, $expected)
  230. {
  231. $result = Database::factory()->execute_query($query, $as_object);
  232. $this->assertEquals($expected, $result->current());
  233. $this->assertEquals($expected, $result->current(), 'Do not move pointer');
  234. }
  235. public function provider_current_after_seek()
  236. {
  237. $entire = Database::factory()->select()->from($this->_table);
  238. return array(
  239. // data set #0
  240. array($entire, FALSE, 0, array('id' => 1, 'value' => 50)),
  241. array($entire, FALSE, 1, array('id' => 2, 'value' => 55)),
  242. array($entire, FALSE, 2, array('id' => 3, 'value' => 60)),
  243. array($entire, FALSE, 6, array('id' => 7, 'value' => 65)),
  244. // data set #4
  245. array($entire, TRUE, 0, (object) array('id' => 1, 'value' => 50)),
  246. array($entire, TRUE, 1, (object) array('id' => 2, 'value' => 55)),
  247. array($entire, TRUE, 2, (object) array('id' => 3, 'value' => 60)),
  248. array($entire, TRUE, 6, (object) array('id' => 7, 'value' => 65)),
  249. );
  250. }
  251. /**
  252. * @covers Database_PostgreSQL_Result::current
  253. *
  254. * @dataProvider provider_current_after_seek
  255. *
  256. * @param SQL_Expression $query
  257. * @param string|boolean $as_object
  258. * @param integer $position
  259. * @param array $expected
  260. */
  261. public function test_current_after_seek($query, $as_object, $position, $expected)
  262. {
  263. $result = Database::factory()->execute_query($query, $as_object)->seek($position);
  264. $this->assertEquals($expected, $result->current());
  265. $this->assertEquals($expected, $result->current(), 'Do not move pointer');
  266. }
  267. public function provider_get()
  268. {
  269. $entire = Database::factory()->select()->from($this->_table);
  270. return array(
  271. // data set #0
  272. array($entire, FALSE, NULL, NULL, 1),
  273. array($entire, FALSE, 'id', NULL, 1),
  274. array($entire, FALSE, 'value', NULL, 50),
  275. array($entire, FALSE, NULL, 'asdf', 1),
  276. array($entire, FALSE, 'id', 'asdf', 1),
  277. array($entire, FALSE, 'value', 'asdf', 50),
  278. // data set #7
  279. array($entire, TRUE, NULL, NULL, 1),
  280. array($entire, TRUE, 'id', NULL, 1),
  281. array($entire, TRUE, 'value', NULL, 50),
  282. array($entire, TRUE, NULL, 'asdf', 1),
  283. array($entire, TRUE, 'id', 'asdf', 1),
  284. array($entire, TRUE, 'value', 'asdf', 50),
  285. );
  286. }
  287. /**
  288. * @covers Database_PostgreSQL_Result::get
  289. *
  290. * @dataProvider provider_get
  291. *
  292. * @param SQL_Expression $query
  293. * @param string|boolean $as_object
  294. * @param string $name First argument to method
  295. * @param mixed $default Second argument to method
  296. * @param array $expected
  297. */
  298. public function test_get($query, $as_object, $name, $default, $expected)
  299. {
  300. $result = Database::factory()->execute_query($query, $as_object);
  301. $this->assertEquals($expected, $result->get($name, $default));
  302. $this->assertEquals($expected, $result->get($name, $default), 'Do not move pointer');
  303. }
  304. public function provider_get_after_seek()
  305. {
  306. $entire = Database::factory()->select()->from($this->_table);
  307. return array(
  308. // data set #0
  309. array($entire, FALSE, 0, NULL, NULL, 1),
  310. array($entire, FALSE, 1, NULL, NULL, 2),
  311. array($entire, FALSE, 2, NULL, NULL, 3),
  312. array($entire, FALSE, 6, NULL, NULL, 7),
  313. // data set #4
  314. array($entire, FALSE, 0, NULL, 'asdf', 1),
  315. array($entire, FALSE, 1, NULL, 'asdf', 2),
  316. array($entire, FALSE, 2, NULL, 'asdf', 3),
  317. array($entire, FALSE, 6, NULL, 'asdf', 7),
  318. );
  319. }
  320. /**
  321. * @covers Database_PostgreSQL_Result::get
  322. *
  323. * @dataProvider provider_get_after_seek
  324. *
  325. * @param SQL_Expression $query
  326. * @param string|boolean $as_object
  327. * @param integer $position
  328. * @param string $name First argument to method
  329. * @param mixed $default Second argument to method
  330. * @param array $expected
  331. */
  332. public function test_get_after_seek($query, $as_object, $position, $name, $default, $expected)
  333. {
  334. $result = Database::factory()->execute_query($query, $as_object)->seek($position);
  335. $this->assertEquals($expected, $result->get($name, $default));
  336. $this->assertEquals($expected, $result->get($name, $default), 'Do not move pointer');
  337. }
  338. public function provider_get_invalid()
  339. {
  340. $empty = Database::factory()
  341. ->select()
  342. ->from($this->_table)
  343. ->where('value', '>', 1000);
  344. return array(
  345. // data set #0
  346. array($empty, FALSE, NULL, NULL),
  347. array($empty, FALSE, NULL, 'asdf'),
  348. array($empty, FALSE, 'value', NULL),
  349. array($empty, FALSE, 'value', 'asdf'),
  350. // data set #4
  351. array($empty, TRUE, NULL, NULL),
  352. array($empty, TRUE, NULL, 'asdf'),
  353. array($empty, TRUE, 'value', NULL),
  354. array($empty, TRUE, 'value', 'asdf'),
  355. );
  356. }
  357. /**
  358. * @covers Database_PostgreSQL_Result::get
  359. *
  360. * @dataProvider provider_get_invalid
  361. *
  362. * @param SQL_Expression $query SQL that returns no rows
  363. * @param string|boolean $as_object
  364. * @param string $name First argument to method
  365. * @param mixed $default Second argument to method
  366. */
  367. public function test_get_invalid($query, $as_object, $name, $default)
  368. {
  369. $result = Database::factory()->execute_query($query, $as_object);
  370. $this->assertSame($default, $result->get($name, $default));
  371. $this->assertSame($default, $result->get($name, $default), 'Do not move pointer');
  372. }
  373. public function provider_get_null()
  374. {
  375. $null = 'SELECT NULL AS value';
  376. return array(
  377. // data set #0
  378. array($null, FALSE, NULL, NULL),
  379. array($null, FALSE, NULL, 'asdf'),
  380. array($null, FALSE, 'value', NULL),
  381. array($null, FALSE, 'value', 'asdf'),
  382. // data set #4
  383. array($null, TRUE, NULL, NULL),
  384. array($null, TRUE, NULL, 'asdf'),
  385. array($null, TRUE, 'value', NULL),
  386. array($null, TRUE, 'value', 'asdf'),
  387. );
  388. }
  389. /**
  390. * @covers Database_PostgreSQL_Result::get
  391. *
  392. * @dataProvider provider_get_null
  393. *
  394. * @param SQL_Expression $query SQL that returns a NULL value
  395. * @param string|boolean $as_object
  396. * @param string $name First argument to method
  397. * @param mixed $default Second argument to method
  398. */
  399. public function test_get_null($query, $as_object, $name, $default)
  400. {
  401. $result = Database::factory()->execute_query($query, $as_object);
  402. $this->assertSame($default, $result->get($name, $default));
  403. $this->assertSame($default, $result->get($name, $default), 'Do not move pointer');
  404. }
  405. public function provider_offset_get()
  406. {
  407. $entire = Database::factory()->select()->from($this->_table);
  408. return array(
  409. array($entire, FALSE, 0, array('id' => 1, 'value' => 50)),
  410. array($entire, FALSE, 3, array('id' => 4, 'value' => 60)),
  411. array($entire, TRUE, 0, (object) array('id' => 1, 'value' => 50)),
  412. array($entire, TRUE, 3, (object) array('id' => 4, 'value' => 60)),
  413. );
  414. }
  415. /**
  416. * @covers Database_PostgreSQL_Result::fetch
  417. * @covers Database_PostgreSQL_Result::offsetGet
  418. *
  419. * @dataProvider provider_offset_get
  420. *
  421. * @param SQL_Expression $query
  422. * @param string|boolean $as_object
  423. * @param integer $offset
  424. * @param array $expected
  425. */
  426. public function test_offset_get($query, $as_object, $offset, $expected)
  427. {
  428. $result = Database::factory()->execute_query($query, $as_object);
  429. $this->assertEquals($expected, $result->offsetGet($offset));
  430. }
  431. public function provider_offset_get_after_seek()
  432. {
  433. $entire = Database::factory()->select()->from($this->_table);
  434. return array(
  435. // data set #0
  436. array($entire, FALSE, 0, 0, array('id' => 1, 'value' => 50)),
  437. array($entire, FALSE, 1, 0, array('id' => 1, 'value' => 50)),
  438. array($entire, FALSE, 2, 0, array('id' => 1, 'value' => 50)),
  439. // data set #3
  440. array($entire, FALSE, 0, 1, array('id' => 2, 'value' => 55)),
  441. array($entire, FALSE, 1, 1, array('id' => 2, 'value' => 55)),
  442. array($entire, FALSE, 2, 1, array('id' => 2, 'value' => 55)),
  443. // data set #6
  444. array($entire, FALSE, 0, 6, array('id' => 7, 'value' => 65)),
  445. array($entire, FALSE, 1, 6, array('id' => 7, 'value' => 65)),
  446. array($entire, FALSE, 2, 6, array('id' => 7, 'value' => 65)),
  447. // data set #9
  448. array($entire, TRUE, 0, 0, (object) array('id' => 1, 'value' => 50)),
  449. array($entire, TRUE, 1, 0, (object) array('id' => 1, 'value' => 50)),
  450. array($entire, TRUE, 2, 0, (object) array('id' => 1, 'value' => 50)),
  451. // data set #12
  452. array($entire, TRUE, 0, 1, (object) array('id' => 2, 'value' => 55)),
  453. array($entire, TRUE, 1, 1, (object) array('id' => 2, 'value' => 55)),
  454. array($entire, TRUE, 2, 1, (object) array('id' => 2, 'value' => 55)),
  455. // data set #15
  456. array($entire, TRUE, 0, 6, (object) array('id' => 7, 'value' => 65)),
  457. array($entire, TRUE, 1, 6, (object) array('id' => 7, 'value' => 65)),
  458. array($entire, TRUE, 2, 6, (object) array('id' => 7, 'value' => 65)),
  459. );
  460. }
  461. /**
  462. * @covers Database_PostgreSQL_Result::fetch
  463. * @covers Database_PostgreSQL_Result::offsetGet
  464. *
  465. * @dataProvider provider_offset_get_after_seek
  466. *
  467. * @param SQL_Expression $query
  468. * @param string|boolean $as_object
  469. * @param integer $position
  470. * @param integer $offset
  471. * @param array $expected
  472. */
  473. public function test_offset_get_after_seek($query, $as_object, $position, $offset, $expected)
  474. {
  475. $result = Database::factory()->execute_query($query, $as_object)->seek($position);
  476. $this->assertEquals($expected, $result->offsetGet($offset));
  477. $this->assertSame($position, $result->key(), 'Do not move pointer');
  478. }
  479. /**
  480. * @covers Database_PostgreSQL_Result::offsetGet
  481. *
  482. * @dataProvider provider_fetch_invalid
  483. *
  484. * @param SQL_Expression $query
  485. * @param integer $offset
  486. */
  487. public function test_offset_get_invalid($query, $offset)
  488. {
  489. $result = Database::factory()->execute_query($query);
  490. $this->assertNull($result->offsetGet($offset));
  491. }
  492. public function provider_as_array()
  493. {
  494. $result = array();
  495. $empty = Database::factory()
  496. ->select()
  497. ->from($this->_table)
  498. ->where('value', '>', 1000);
  499. // data set #0
  500. $result[] = array($empty, FALSE, NULL, NULL, array());
  501. $result[] = array($empty, FALSE, NULL, 'id', array());
  502. $result[] = array($empty, FALSE, NULL, 'value', array());
  503. $result[] = array($empty, FALSE, 'id', 'value', array());
  504. $result[] = array($empty, FALSE, 'value', 'id', array());
  505. $result[] = array($empty, FALSE, 'id', NULL, array());
  506. $result[] = array($empty, FALSE, 'value', NULL, array());
  507. // data set #7
  508. $result[] = array($empty, TRUE, NULL, NULL, array());
  509. $result[] = array($empty, TRUE, NULL, 'id', array());
  510. $result[] = array($empty, TRUE, NULL, 'value', array());
  511. $result[] = array($empty, TRUE, 'id', 'value', array());
  512. $result[] = array($empty, TRUE, 'value', 'id', array());
  513. $result[] = array($empty, TRUE, 'id', NULL, array());
  514. $result[] = array($empty, TRUE, 'value', NULL, array());
  515. $entire = Database::factory()->select()->from($this->_table);
  516. // data set #14
  517. $result[] = array($entire, FALSE, NULL, NULL, array(
  518. array('id' => 1, 'value' => 50),
  519. array('id' => 2, 'value' => 55),
  520. array('id' => 3, 'value' => 60),
  521. array('id' => 4, 'value' => 60),
  522. array('id' => 5, 'value' => 65),
  523. array('id' => 6, 'value' => 65),
  524. array('id' => 7, 'value' => 65),
  525. ));
  526. $result[] = array($entire, FALSE, NULL, 'id', array(1, 2, 3, 4, 5, 6, 7));
  527. $result[] = array($entire, FALSE, NULL, 'value', array(50, 55, 60, 60, 65, 65, 65));
  528. $result[] = array($entire, FALSE, 'id', 'value', array(
  529. 1 => 50,
  530. 2 => 55,
  531. 3 => 60,
  532. 4 => 60,
  533. 5 => 65,
  534. 6 => 65,
  535. 7 => 65,
  536. ));
  537. $result[] = array($entire, FALSE, 'value', 'id', array(
  538. 50 => 1,
  539. 55 => 2,
  540. 60 => 4,
  541. 65 => 7,
  542. ));
  543. $result[] = array($entire, FALSE, 'id', NULL, array(
  544. 1 => array('id' => 1, 'value' => 50),
  545. 2 => array('id' => 2, 'value' => 55),
  546. 3 => array('id' => 3, 'value' => 60),
  547. 4 => array('id' => 4, 'value' => 60),
  548. 5 => array('id' => 5, 'value' => 65),
  549. 6 => array('id' => 6, 'value' => 65),
  550. 7 => array('id' => 7, 'value' => 65),
  551. ));
  552. $result[] = array($entire, FALSE, 'value', NULL, array(
  553. 50 => array('id' => 1, 'value' => 50),
  554. 55 => array('id' => 2, 'value' => 55),
  555. 60 => array('id' => 4, 'value' => 60),
  556. 65 => array('id' => 7, 'value' => 65),
  557. ));
  558. // data set #21
  559. $result[] = array($entire, TRUE, NULL, NULL, array(
  560. (object) array('id' => 1, 'value' => 50),
  561. (object) array('id' => 2, 'value' => 55),
  562. (object) array('id' => 3, 'value' => 60),
  563. (object) array('id' => 4, 'value' => 60),
  564. (object) array('id' => 5, 'value' => 65),
  565. (object) array('id' => 6, 'value' => 65),
  566. (object) array('id' => 7, 'value' => 65),
  567. ));
  568. $result[] = array($entire, TRUE, NULL, 'id', array(1, 2, 3, 4, 5, 6, 7));
  569. $result[] = array($entire, TRUE, NULL, 'value', array(50, 55, 60, 60, 65, 65, 65));
  570. $result[] = array($entire, TRUE, 'id', 'value', array(
  571. 1 => 50,
  572. 2 => 55,
  573. 3 => 60,
  574. 4 => 60,
  575. 5 => 65,
  576. 6 => 65,
  577. 7 => 65,
  578. ));
  579. $result[] = array($entire, TRUE, 'value', 'id', array(
  580. 50 => 1,
  581. 55 => 2,
  582. 60 => 4,
  583. 65 => 7,
  584. ));
  585. $result[] = array($entire, TRUE, 'id', NULL, array(
  586. 1 => (object) array('id' => 1, 'value' => 50),
  587. 2 => (object) array('id' => 2, 'value' => 55),
  588. 3 => (object) array('id' => 3, 'value' => 60),
  589. 4 => (object) array('id' => 4, 'value' => 60),
  590. 5 => (object) array('id' => 5, 'value' => 65),
  591. 6 => (object) array('id' => 6, 'value' => 65),
  592. 7 => (object) array('id' => 7, 'value' => 65),
  593. ));
  594. $result[] = array($entire, TRUE, 'value', NULL, array(
  595. 50 => (object) array('id' => 1, 'value' => 50),
  596. 55 => (object) array('id' => 2, 'value' => 55),
  597. 60 => (object) array('id' => 4, 'value' => 60),
  598. 65 => (object) array('id' => 7, 'value' => 65),
  599. ));
  600. return $result;
  601. }
  602. /**
  603. * @covers Database_PostgreSQL_Result::as_array
  604. *
  605. * @dataProvider provider_as_array
  606. *
  607. * @param SQL_Expression $query
  608. * @param string|boolean $as_object
  609. * @param string $key First argument to method
  610. * @param string $value Second argument to method
  611. * @param array $expected
  612. */
  613. public function test_as_array($query, $as_object, $key, $value, $expected)
  614. {
  615. $result = Database::factory()->execute_query($query, $as_object);
  616. $this->assertEquals($expected, $result->as_array($key, $value));
  617. }
  618. }
  619. /**
  620. * Class to expose the arguments passed to a constructor. Remove if/when
  621. * constructors can be mocked.
  622. */
  623. class Database_PostgreSQL_Result_Test_Constructor
  624. {
  625. protected $_arguments;
  626. public function __construct()
  627. {
  628. $this->_arguments = func_get_args();
  629. }
  630. public function arguments()
  631. {
  632. return $this->_arguments;
  633. }
  634. }