ConsoleTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Text
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. // Call Zend_ProgressBar_Adapter_ConsoleTest::main() if this source file is executed directly.
  23. if (!defined("PHPUnit_MAIN_METHOD")) {
  24. define("PHPUnit_MAIN_METHOD", "Zend_ProgressBar_Adapter_ConsoleTest::main");
  25. }
  26. /**
  27. * Test helper
  28. */
  29. require_once dirname(__FILE__) . '/../../../TestHelper.php';
  30. /**
  31. * Zend_ProgressBar_Adapter_Console
  32. */
  33. require_once 'Zend/ProgressBar/Adapter/Console.php';
  34. require_once 'MockupStream.php';
  35. /**
  36. * @category Zend
  37. * @package Zend_ProgressBar
  38. * @subpackage UnitTests
  39. * @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
  40. * @license http://framework.zend.com/license/new-bsd New BSD License
  41. */
  42. class Zend_ProgressBar_Adapter_ConsoleTest extends PHPUnit_Framework_TestCase
  43. {
  44. protected function setUp()
  45. {
  46. stream_wrapper_register("zendprogressbaradapterconsole", "Zend_ProgressBar_Adapter_Console_MockupStream");
  47. }
  48. protected function tearDown()
  49. {
  50. stream_wrapper_unregister('zendprogressbaradapterconsole');
  51. }
  52. /**
  53. * Runs the test methods of this class.
  54. *
  55. * @return void
  56. */
  57. public static function main()
  58. {
  59. $suite = new PHPUnit_Framework_TestSuite("Zend_ProgressBar_Adapter_ConsoleTest");
  60. $result = PHPUnit_TextUI_TestRunner::run($suite);
  61. }
  62. public function testWindowsWidth()
  63. {
  64. if (substr(PHP_OS, 0, 3) === 'WIN') {
  65. $adapter = new Zend_ProgressBar_Adapter_Console_Stub();
  66. $adapter->notify(0, 100, 0, 0, null, null);
  67. $this->assertEquals(79, strlen($adapter->getLastOutput()));
  68. } else {
  69. $this->markTestSkipped('Not testable on non-windows systems');
  70. }
  71. }
  72. public function testStandardOutputStream()
  73. {
  74. $adapter = new Zend_ProgressBar_Adapter_Console_Stub();
  75. $this->assertTrue(is_resource($adapter->getOutputStream()));
  76. $metaData = stream_get_meta_data($adapter->getOutputStream());
  77. $this->assertEquals('php://stdout', $metaData['uri']);
  78. }
  79. public function testManualStandardOutputStream()
  80. {
  81. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('outputStream' => 'php://stdout'));
  82. $this->assertTrue(is_resource($adapter->getOutputStream()));
  83. $metaData = stream_get_meta_data($adapter->getOutputStream());
  84. $this->assertEquals('php://stdout', $metaData['uri']);
  85. }
  86. public function testManualErrorOutputStream()
  87. {
  88. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('outputStream' => 'php://stderr'));
  89. $this->assertTrue(is_resource($adapter->getOutputStream()));
  90. $metaData = stream_get_meta_data($adapter->getOutputStream());
  91. $this->assertEquals('php://stderr', $metaData['uri']);
  92. }
  93. public function testFixedWidth()
  94. {
  95. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 30));
  96. $adapter->notify(0, 100, 0, 0, null, null);
  97. $this->assertEquals(' 0% [----------] ', $adapter->getLastOutput());
  98. }
  99. public function testInvalidElement()
  100. {
  101. try {
  102. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 30, 'elements' => array('foo')));
  103. $adapter->notify(0, 100, 0, 0, null, null);
  104. $this->fail('An expected Zend_ProgressBar_Adapter_Exception has not been raised');
  105. } catch (Zend_ProgressBar_Adapter_Exception $expected) {
  106. $this->assertContains('Invalid element found in $elements array', $expected->getMessage());
  107. }
  108. }
  109. public function testCariageReturn()
  110. {
  111. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 30));
  112. $adapter->notify(0, 100, 0, 0, null, null);
  113. $adapter->notify(0, 100, 0, 0, null, null);
  114. $this->assertEquals(str_repeat("\x08", 30) . ' 0% [----------] ', $adapter->getLastOutput());
  115. }
  116. public function testBarLayout()
  117. {
  118. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 30));
  119. $adapter->notify(50, 100, .5, 0, null, null);
  120. $this->assertContains(' 50% [#####-----]', $adapter->getLastOutput());
  121. }
  122. public function testBarOnly()
  123. {
  124. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR)));
  125. $adapter->notify(0, 100, 0, 0, null, null);
  126. $this->assertEquals('[------------------]', $adapter->getLastOutput());
  127. }
  128. public function testPercentageOnly()
  129. {
  130. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_PERCENT)));
  131. $adapter->notify(0, 100, 0, 0, null, null);
  132. $this->assertEquals(' 0%', $adapter->getLastOutput());
  133. }
  134. public function testEtaOnly()
  135. {
  136. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_ETA)));
  137. $adapter->notify(0, 100, 0, 0, null, null);
  138. $this->assertEquals(' ', $adapter->getLastOutput());
  139. }
  140. public function testCustomOrder()
  141. {
  142. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 25, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_ETA,
  143. Zend_ProgressBar_Adapter_Console::ELEMENT_PERCENT,
  144. Zend_ProgressBar_Adapter_Console::ELEMENT_BAR)));
  145. $adapter->notify(0, 100, 0, 0, null, null);
  146. $this->assertEquals(' 0% [-----]', $adapter->getLastOutput());
  147. }
  148. public function testBarStyleIndicator()
  149. {
  150. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'barIndicatorChar' => '>'));
  151. $adapter->notify(10, 100, .1, 0, null, null);
  152. $this->assertContains('[##>---------------]', $adapter->getLastOutput());
  153. }
  154. public function testBarStyleIndicatorWide()
  155. {
  156. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'barIndicatorChar' => '[]'));
  157. $adapter->notify(10, 100, .1, 0, null, null);
  158. $this->assertContains('[##[]--------------]', $adapter->getLastOutput());
  159. }
  160. public function testBarStyleLeftRightNormal()
  161. {
  162. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'barLeftChar' => '+', 'barRightChar' => ' '));
  163. $adapter->notify(10, 100, .1, 0, null, null);
  164. $this->assertContains('[++ ]', $adapter->getLastOutput());
  165. }
  166. public function testBarStyleLeftRightWide()
  167. {
  168. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'barLeftChar' => '+-', 'barRightChar' => '=-'));
  169. $adapter->notify(10, 100, .1, 0, null, null);
  170. $this->assertContains('[+-=-=-=-=-=-=-=-=-]', $adapter->getLastOutput());
  171. }
  172. public function testBarStyleLeftIndicatorRightWide()
  173. {
  174. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 20, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'barLeftChar' => '+-', 'barIndicatorChar' => '[]', 'barRightChar' => '=-'));
  175. $adapter->notify(10, 100, .1, 0, null, null);
  176. $this->assertContains('[+-[]=-=-=-=-=-=-=-]', $adapter->getLastOutput());
  177. }
  178. public function testEtaDelayDisplay()
  179. {
  180. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 100, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_ETA)));
  181. $adapter->notify(33, 100, .33, 3, null, null);
  182. $this->assertContains(' ', $adapter->getLastOutput());
  183. $adapter->notify(66, 100, .66, 6, 3, null);
  184. $result = preg_match('#ETA 00:00:(\d)+#', $adapter->getLastOutput(), $match);
  185. $this->assertEquals(1, $result);
  186. }
  187. public function testEtaHighValue()
  188. {
  189. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 100, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_ETA)));
  190. $adapter->notify(1, 100005, .001, 5, 100000, null);
  191. $this->assertContains('ETA ??:??:??', $adapter->getLastOutput());
  192. }
  193. public function testTextElementDefaultLength()
  194. {
  195. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 100, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_TEXT, Zend_ProgressBar_Adapter_Console::ELEMENT_BAR)));
  196. $adapter->notify(0, 100, 0, 0, null, 'foobar');
  197. $this->assertContains('foobar [', $adapter->getLastOutput());
  198. }
  199. public function testTextElementCustomLength()
  200. {
  201. $adapter = new Zend_ProgressBar_Adapter_Console_Stub(array('width' => 100, 'elements' => array(Zend_ProgressBar_Adapter_Console::ELEMENT_TEXT, Zend_ProgressBar_Adapter_Console::ELEMENT_BAR), 'textWidth' => 10));
  202. $adapter->notify(0, 100, 0, 0, null, 'foobar');
  203. $this->assertContains('foobar [', $adapter->getLastOutput());
  204. }
  205. public function testSetOutputStreamOpen() {
  206. $adapter = new Zend_ProgressBar_Adapter_Console();
  207. $adapter->setOutputStream('zendprogressbaradapterconsole://test1');
  208. $this->assertArrayHasKey('test1', Zend_ProgressBar_Adapter_Console_MockupStream::$tests);
  209. }
  210. public function testSetOutputStreamOpenFail() {
  211. try {
  212. $adapter = new Zend_ProgressBar_Adapter_Console();
  213. $adapter->setOutputStream(null);
  214. $this->fail('Expected Zend_ProgressBar_Adapter_Exception');
  215. } catch (Zend_ProgressBar_Adapter_Exception $e) {
  216. }
  217. }
  218. public function testSetOutputStreamReplaceStream() {
  219. $adapter = new Zend_ProgressBar_Adapter_Console();
  220. $adapter->setOutputStream('zendprogressbaradapterconsole://test2');
  221. $this->assertArrayHasKey('test2', Zend_ProgressBar_Adapter_Console_MockupStream::$tests);
  222. $adapter->setOutputStream('zendprogressbaradapterconsole://test3');
  223. $this->assertArrayHasKey('test3', Zend_ProgressBar_Adapter_Console_MockupStream::$tests);
  224. $this->assertArrayNotHasKey('test2', Zend_ProgressBar_Adapter_Console_MockupStream::$tests);
  225. }
  226. public function testgetOutputStream() {
  227. $adapter = new Zend_ProgressBar_Adapter_Console();
  228. $adapter->setOutputStream('zendprogressbaradapterconsole://test4');
  229. $resource = $adapter->getOutputStream();
  230. fwrite($resource, 'Hello Word!');
  231. $this->assertEquals('Hello Word!', Zend_ProgressBar_Adapter_Console_MockupStream::$tests['test4']);
  232. }
  233. public function testgetOutputStreamReturnigStdout() {
  234. $adapter = new Zend_ProgressBar_Adapter_Console();
  235. $resource = $adapter->getOutputStream();
  236. $this->assertTrue(is_resource($resource));
  237. }
  238. public function testFinishEol() {
  239. $adapter = new Zend_ProgressBar_Adapter_Console();
  240. $adapter->setOutputStream('zendprogressbaradapterconsole://test5');
  241. $adapter->finish();
  242. $this->assertEquals(PHP_EOL, Zend_ProgressBar_Adapter_Console_MockupStream::$tests['test5']);
  243. }
  244. public function testFinishNone() {
  245. $adapter = new Zend_ProgressBar_Adapter_Console();
  246. $adapter->setOutputStream('zendprogressbaradapterconsole://test7');
  247. $adapter->setFinishAction(Zend_ProgressBar_Adapter_Console::FINISH_ACTION_NONE);
  248. $adapter->finish();
  249. $this->assertEquals('', Zend_ProgressBar_Adapter_Console_MockupStream::$tests['test7']);
  250. }
  251. public function testSetBarLeftChar() {
  252. try {
  253. $adapter = new Zend_ProgressBar_Adapter_Console();
  254. $adapter->setBarLeftChar(null);
  255. $this->fail('Expected Zend_ProgressBar_Adapter_Exception');
  256. } catch (Zend_ProgressBar_Adapter_Exception $e) {
  257. $this->assertEquals($e->getMessage(), 'Character may not be empty');
  258. }
  259. }
  260. public function testSetBarRightChar() {
  261. try {
  262. $adapter = new Zend_ProgressBar_Adapter_Console();
  263. $adapter->setBarRightChar(null);
  264. $this->fail('Expected Zend_ProgressBar_Adapter_Exception');
  265. } catch (Zend_ProgressBar_Adapter_Exception $e) {
  266. $this->assertEquals($e->getMessage(), 'Character may not be empty');
  267. }
  268. }
  269. public function testSetInvalidFinishAction() {
  270. try {
  271. $adapter = new Zend_ProgressBar_Adapter_Console();
  272. $adapter->setFinishAction('CUSTOM_FINISH_ACTION');
  273. $this->fail('Expected Zend_ProgressBar_Adapter_Exception');
  274. } catch (Zend_ProgressBar_Adapter_Exception $e) {
  275. $this->assertEquals($e->getMessage(), 'Invalid finish action specified');
  276. }
  277. }
  278. }
  279. class Zend_ProgressBar_Adapter_Console_Stub extends Zend_ProgressBar_Adapter_Console
  280. {
  281. protected $_lastOutput = null;
  282. public function getLastOutput()
  283. {
  284. return $this->_lastOutput;
  285. }
  286. protected function _outputData($data)
  287. {
  288. $this->_lastOutput = $data;
  289. }
  290. }
  291. // Call Zend_ProgressBar_Adapter_ConsoleTest::main() if this source file is executed directly.
  292. if (PHPUnit_MAIN_METHOD == "Zend_ProgressBar_Adapert_ConsoleTest::main") {
  293. Zend_ProgressBar_Adapter_ConsoleTest::main();
  294. }