PageRenderTime 50ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/cake/tests/cases/libs/view/helpers/javascript.test.php

https://github.com/mariuz/firetube
PHP | 874 lines | 570 code | 115 blank | 189 comment | 7 complexity | 95546f25eaac3313a74a51091605003a MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /* SVN FILE: $Id$ */
  3. /**
  4. * JavascriptHelperTest file
  5. *
  6. * Long description for file
  7. *
  8. * PHP versions 4 and 5
  9. *
  10. * CakePHP(tm) Tests <https://trac.cakephp.org/wiki/Developement/TestSuite>
  11. * Copyright 2005-2011, Cake Software Foundation, Inc.
  12. *
  13. * Licensed under The Open Group Test Suite License
  14. * Redistributions of files must retain the above copyright notice.
  15. *
  16. * @copyright Copyright 2005-2011, Cake Software Foundation, Inc.
  17. * @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests
  18. * @package cake
  19. * @subpackage cake.tests.cases.libs.view.helpers
  20. * @since CakePHP(tm) v 1.2.0.4206
  21. * @version $Revision$
  22. * @modifiedby $LastChangedBy$
  23. * @lastmodified $Date$
  24. * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License
  25. */
  26. App::import('Core', array('Controller', 'View', 'ClassRegistry', 'View'));
  27. App::import('Helper', array('Javascript', 'Html', 'Form'));
  28. /**
  29. * TheJsTestController class
  30. *
  31. * @package cake
  32. * @subpackage cake.tests.cases.libs.view.helpers
  33. */
  34. class TheJsTestController extends Controller {
  35. /**
  36. * name property
  37. *
  38. * @var string 'TheTest'
  39. * @access public
  40. */
  41. var $name = 'TheTest';
  42. /**
  43. * uses property
  44. *
  45. * @var mixed null
  46. * @access public
  47. */
  48. var $uses = null;
  49. }
  50. /**
  51. * TheView class
  52. *
  53. * @package cake
  54. * @subpackage cake.tests.cases.libs.view.helpers
  55. */
  56. class TheView extends View {
  57. /**
  58. * scripts method
  59. *
  60. * @access public
  61. * @return void
  62. */
  63. function scripts() {
  64. return $this->__scripts;
  65. }
  66. }
  67. /**
  68. * TestJavascriptObject class
  69. *
  70. * @package cake
  71. * @subpackage cake.tests.cases.libs.view.helpers
  72. */
  73. class TestJavascriptObject {
  74. /**
  75. * property1 property
  76. *
  77. * @var string 'value1'
  78. * @access public
  79. */
  80. var $property1 = 'value1';
  81. /**
  82. * property2 property
  83. *
  84. * @var int 2
  85. * @access public
  86. */
  87. var $property2 = 2;
  88. }
  89. /**
  90. * JavascriptTest class
  91. *
  92. * @package test_suite
  93. * @subpackage test_suite.cases.libs
  94. * @since CakePHP Test Suite v 1.0.0.0
  95. */
  96. class JavascriptTest extends CakeTestCase {
  97. /**
  98. * Regexp for CDATA start block
  99. *
  100. * @var string
  101. */
  102. var $cDataStart = 'preg:/^\/\/<!\[CDATA\[[\n\r]*/';
  103. /**
  104. * Regexp for CDATA end block
  105. *
  106. * @var string
  107. */
  108. var $cDataEnd = 'preg:/[^\]]*\]\]\>[\s\r\n]*/';
  109. /**
  110. * setUp method
  111. *
  112. * @access public
  113. * @return void
  114. */
  115. function startTest() {
  116. $this->Javascript =& new JavascriptHelper();
  117. $this->Javascript->Html =& new HtmlHelper();
  118. $this->Javascript->Form =& new FormHelper();
  119. $this->View =& new TheView(new TheJsTestController());
  120. ClassRegistry::addObject('view', $this->View);
  121. }
  122. /**
  123. * tearDown method
  124. *
  125. * @access public
  126. * @return void
  127. */
  128. function endTest() {
  129. unset($this->Javascript->Html);
  130. unset($this->Javascript->Form);
  131. unset($this->Javascript);
  132. ClassRegistry::removeObject('view');
  133. unset($this->View);
  134. }
  135. /**
  136. * testConstruct method
  137. *
  138. * @access public
  139. * @return void
  140. */
  141. function testConstruct() {
  142. $Javascript =& new JavascriptHelper(array('safe'));
  143. $this->assertTrue($Javascript->safe);
  144. $Javascript =& new JavascriptHelper(array('safe' => false));
  145. $this->assertFalse($Javascript->safe);
  146. }
  147. /**
  148. * testLink method
  149. *
  150. * @access public
  151. * @return void
  152. */
  153. function testLink() {
  154. Configure::write('Asset.timestamp', false);
  155. $result = $this->Javascript->link('script.js');
  156. $expected = '<script type="text/javascript" src="js/script.js"></script>';
  157. $this->assertEqual($result, $expected);
  158. $result = $this->Javascript->link('script');
  159. $expected = '<script type="text/javascript" src="js/script.js"></script>';
  160. $this->assertEqual($result, $expected);
  161. $result = $this->Javascript->link('scriptaculous.js?load=effects');
  162. $expected = '<script type="text/javascript" src="js/scriptaculous.js?load=effects"></script>';
  163. $this->assertEqual($result, $expected);
  164. $result = $this->Javascript->link('some.json.libary');
  165. $expected = '<script type="text/javascript" src="js/some.json.libary.js"></script>';
  166. $this->assertEqual($result, $expected);
  167. $result = $this->Javascript->link('jquery-1.1.2');
  168. $expected = '<script type="text/javascript" src="js/jquery-1.1.2.js"></script>';
  169. $this->assertEqual($result, $expected);
  170. $result = $this->Javascript->link('jquery-1.1.2.php');
  171. $expected = '<script type="text/javascript" src="js/jquery-1.1.2.php"></script>';
  172. $this->assertEqual($result, $expected);
  173. $result = $this->Javascript->link('/plugin/js/jquery-1.1.2');
  174. $expected = '<script type="text/javascript" src="/plugin/js/jquery-1.1.2.js"></script>';
  175. $this->assertEqual($result, $expected);
  176. $result = $this->Javascript->link('/some_other_path/myfile.1.2.2.min.js');
  177. $expected = '<script type="text/javascript" src="/some_other_path/myfile.1.2.2.min.js"></script>';
  178. $this->assertEqual($result, $expected);
  179. $result = $this->Javascript->link('some_other_path/myfile.1.2.2.min.js');
  180. $expected = '<script type="text/javascript" src="js/some_other_path/myfile.1.2.2.min.js"></script>';
  181. $this->assertEqual($result, $expected);
  182. $result = $this->Javascript->link('some_other_path/myfile.1.2.2.min');
  183. $expected = '<script type="text/javascript" src="js/some_other_path/myfile.1.2.2.min.js"></script>';
  184. $this->assertEqual($result, $expected);
  185. $result = $this->Javascript->link('http://example.com/jquery.js');
  186. $expected = '<script type="text/javascript" src="http://example.com/jquery.js"></script>';
  187. $this->assertEqual($result, $expected);
  188. $result = $this->Javascript->link(array('prototype.js', 'scriptaculous.js'));
  189. $this->assertPattern('/^\s*<script\s+type="text\/javascript"\s+src=".*js\/prototype\.js"[^<>]*><\/script>/', $result);
  190. $this->assertPattern('/<\/script>\s*<script[^<>]+>/', $result);
  191. $this->assertPattern('/<script\s+type="text\/javascript"\s+src=".*js\/scriptaculous\.js"[^<>]*><\/script>\s*$/', $result);
  192. $result = $this->Javascript->link('jquery-1.1.2', false);
  193. $resultScripts = $this->View->scripts();
  194. reset($resultScripts);
  195. $expected = '<script type="text/javascript" src="js/jquery-1.1.2.js"></script>';
  196. $this->assertNull($result);
  197. $this->assertEqual(count($resultScripts), 1);
  198. $this->assertEqual(current($resultScripts), $expected);
  199. }
  200. /**
  201. * testFilteringAndTimestamping method
  202. *
  203. * @access public
  204. * @return void
  205. */
  206. function testFilteringAndTimestamping() {
  207. if ($this->skipIf(!is_writable(JS), 'JavaScript directory not writable, skipping JS asset timestamp tests. %s')) {
  208. return;
  209. }
  210. cache(str_replace(WWW_ROOT, '', JS) . '__cake_js_test.js', 'alert("test")', '+999 days', 'public');
  211. $timestamp = substr(strtotime('now'), 0, 8);
  212. Configure::write('Asset.timestamp', true);
  213. $result = $this->Javascript->link('__cake_js_test');
  214. $this->assertPattern('/^<script[^<>]+src=".*js\/__cake_js_test\.js\?' . $timestamp . '[0-9]{2}"[^<>]*>/', $result);
  215. $debug = Configure::read('debug');
  216. Configure::write('debug', 0);
  217. $result = $this->Javascript->link('__cake_js_test');
  218. $expected = '<script type="text/javascript" src="js/__cake_js_test.js"></script>';
  219. $this->assertEqual($result, $expected);
  220. Configure::write('Asset.timestamp', 'force');
  221. $result = $this->Javascript->link('__cake_js_test');
  222. $this->assertPattern('/^<script[^<>]+src=".*js\/__cake_js_test.js\?' . $timestamp . '[0-9]{2}"[^<>]*>/', $result);
  223. Configure::write('debug', $debug);
  224. Configure::write('Asset.timestamp', false);
  225. $old = Configure::read('Asset.filter.js');
  226. Configure::write('Asset.filter.js', 'js.php');
  227. $result = $this->Javascript->link('__cake_js_test');
  228. $this->assertPattern('/^<script[^<>]+src=".*cjs\/__cake_js_test\.js"[^<>]*>/', $result);
  229. Configure::write('Asset.filter.js', true);
  230. $result = $this->Javascript->link('jquery-1.1.2');
  231. $expected = '<script type="text/javascript" src="cjs/jquery-1.1.2.js"></script>';
  232. $this->assertEqual($result, $expected);
  233. $result = $this->Javascript->link('folderjs/jquery-1.1.2');
  234. $expected = '<script type="text/javascript" src="cjs/folderjs/jquery-1.1.2.js"></script>';
  235. $this->assertEqual($result, $expected);
  236. if ($old === null) {
  237. Configure::delete('Asset.filter.js');
  238. }
  239. $debug = Configure::read('debug');
  240. $webroot = $this->Javascript->webroot;
  241. Configure::write('debug', 0);
  242. Configure::write('Asset.timestamp', 'force');
  243. $this->Javascript->webroot = '/testing/';
  244. $result = $this->Javascript->link('__cake_js_test');
  245. $this->assertPattern('/^<script[^<>]+src="\/testing\/js\/__cake_js_test\.js\?\d+"[^<>]*>/', $result);
  246. $this->Javascript->webroot = '/testing/longer/';
  247. $result = $this->Javascript->link('__cake_js_test');
  248. $this->assertPattern('/^<script[^<>]+src="\/testing\/longer\/js\/__cake_js_test\.js\?\d+"[^<>]*>/', $result);
  249. $this->Javascript->webroot = $webroot;
  250. Configure::write('debug', $debug);
  251. unlink(JS . '__cake_js_test.js');
  252. }
  253. /**
  254. * testValue method
  255. *
  256. * @access public
  257. * @return void
  258. */
  259. function testValue() {
  260. $result = $this->Javascript->value(array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8)));
  261. $expected = '{"title":"New thing","indexes":[5,6,7,8]}';
  262. $this->assertEqual($result, $expected);
  263. $result = $this->Javascript->value(null);
  264. $this->assertEqual($result, 'null');
  265. $result = $this->Javascript->value(true);
  266. $this->assertEqual($result, 'true');
  267. $result = $this->Javascript->value(false);
  268. $this->assertEqual($result, 'false');
  269. $result = $this->Javascript->value(5);
  270. $this->assertEqual($result, '5');
  271. $result = $this->Javascript->value(floatval(5.3));
  272. $this->assertPattern('/^5.3[0]+$/', $result);
  273. $result = $this->Javascript->value('');
  274. $expected = '""';
  275. $this->assertEqual($result, $expected);
  276. $result = $this->Javascript->value('CakePHP' . "\n" . 'Rapid Development Framework');
  277. $expected = '"CakePHP\\nRapid Development Framework"';
  278. $this->assertEqual($result, $expected);
  279. $result = $this->Javascript->value('CakePHP' . "\r\n" . 'Rapid Development Framework' . "\r" . 'For PHP');
  280. $expected = '"CakePHP\\nRapid Development Framework\\nFor PHP"';
  281. $this->assertEqual($result, $expected);
  282. $result = $this->Javascript->value('CakePHP: "Rapid Development Framework"');
  283. $expected = '"CakePHP: \\"Rapid Development Framework\\""';
  284. $this->assertEqual($result, $expected);
  285. $result = $this->Javascript->value('CakePHP: \'Rapid Development Framework\'');
  286. $expected = '"CakePHP: \\\'Rapid Development Framework\\\'"';
  287. $this->assertEqual($result, $expected);
  288. }
  289. /**
  290. * testObjectGeneration method
  291. *
  292. * @access public
  293. * @return void
  294. */
  295. function testObjectGeneration() {
  296. $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8));
  297. $result = $this->Javascript->object($object);
  298. $expected = '{"title":"New thing","indexes":[5,6,7,8]}';
  299. $this->assertEqual($result, $expected);
  300. $result = $this->Javascript->object(array('default' => 0));
  301. $expected = '{"default":0}';
  302. $this->assertEqual($result, $expected);
  303. $result = $this->Javascript->object(array(
  304. '2007' => array(
  305. 'Spring' => array('1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky')),
  306. 'Fall' => array('1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky'))
  307. ), '2006' => array(
  308. 'Spring' => array('1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky')),
  309. 'Fall' => array('1' => array('id' => 1, 'name' => 'Josh'), '2' => array('id' => 2, 'name' => 'Becky')
  310. ))
  311. ));
  312. $expected = '{"2007":{"Spring":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}},"Fall":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}}},"2006":{"Spring":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}},"Fall":{"1":{"id":1,"name":"Josh"},"2":{"id":2,"name":"Becky"}}}}';
  313. $this->assertEqual($result, $expected);
  314. if (ini_get('precision') >= 12) {
  315. $number = 3.141592653589;
  316. if (!$this->Javascript->useNative) {
  317. $number = sprintf("%.11f", $number);
  318. }
  319. $result = $this->Javascript->object(array('Object' => array(true, false, 1, '02101', 0, -1, 3.141592653589, "1")));
  320. $expected = '{"Object":[true,false,1,"02101",0,-1,' . $number . ',"1"]}';
  321. $this->assertEqual($result, $expected);
  322. $result = $this->Javascript->object(array('Object' => array(true => true, false, -3.141592653589, -10)));
  323. $expected = '{"Object":{"1":true,"2":false,"3":' . (-1 * $number) . ',"4":-10}}';
  324. $this->assertEqual($result, $expected);
  325. }
  326. $result = $this->Javascript->object(new TestJavascriptObject());
  327. $expected = '{"property1":"value1","property2":2}';
  328. $this->assertEqual($result, $expected);
  329. $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8));
  330. $result = $this->Javascript->object($object, array('block' => true));
  331. $expected = array(
  332. 'script' => array('type' => 'text/javascript'),
  333. $this->cDataStart,
  334. '{"title":"New thing","indexes":[5,6,7,8]}',
  335. $this->cDataEnd,
  336. '/script'
  337. );
  338. $this->assertTags($result, $expected);
  339. $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8), 'object' => array('inner' => array('value' => 1)));
  340. $result = $this->Javascript->object($object);
  341. $expected = '{"title":"New thing","indexes":[5,6,7,8],"object":{"inner":{"value":1}}}';
  342. $this->assertEqual($result, $expected);
  343. foreach (array('true' => true, 'false' => false, 'null' => null) as $expected => $data) {
  344. $result = $this->Javascript->object($data);
  345. $this->assertEqual($result, $expected);
  346. }
  347. $object = array('title' => 'New thing', 'indexes' => array(5, 6, 7, 8), 'object' => array('inner' => array('value' => 1)));
  348. $result = $this->Javascript->object($object, array('prefix' => 'PREFIX', 'postfix' => 'POSTFIX'));
  349. $this->assertPattern('/^PREFIX/', $result);
  350. $this->assertPattern('/POSTFIX$/', $result);
  351. $this->assertNoPattern('/.PREFIX./', $result);
  352. $this->assertNoPattern('/.POSTFIX./', $result);
  353. if ($this->Javascript->useNative) {
  354. $this->Javascript->useNative = false;
  355. $this->testObjectGeneration();
  356. $this->Javascript->useNative = true;
  357. }
  358. }
  359. /**
  360. * testObjectNonNative method
  361. *
  362. * @access public
  363. * @return void
  364. */
  365. function testObjectNonNative() {
  366. $oldNative = $this->Javascript->useNative;
  367. $this->Javascript->useNative = false;
  368. $object = array(
  369. 'Object' => array(
  370. 'key1' => 'val1',
  371. 'key2' => 'val2',
  372. 'key3' => 'val3'
  373. )
  374. );
  375. $expected = '{"Object":{"key1":val1,"key2":"val2","key3":val3}}';
  376. $result = $this->Javascript->object($object, array('quoteKeys' => false, 'stringKeys' => array('key1', 'key3')));
  377. $this->assertEqual($result, $expected);
  378. $this->Javascript->useNative = $oldNative;
  379. }
  380. /**
  381. * testScriptBlock method
  382. *
  383. * @access public
  384. * @return void
  385. */
  386. function testScriptBlock() {
  387. $result = $this->Javascript->codeBlock('something');
  388. $expected = array(
  389. 'script' => array('type' => 'text/javascript'),
  390. $this->cDataStart,
  391. 'something',
  392. $this->cDataEnd,
  393. '/script'
  394. );
  395. $this->assertTags($result, $expected);
  396. $result = $this->Javascript->codeBlock('something', array('allowCache' => true, 'safe' => false));
  397. $expected = array(
  398. 'script' => array('type' => 'text/javascript'),
  399. 'something',
  400. '/script'
  401. );
  402. $this->assertTags($result, $expected);
  403. $result = $this->Javascript->codeBlock('something', array('allowCache' => false, 'safe' => false));
  404. $expected = array(
  405. 'script' => array('type' => 'text/javascript'),
  406. 'something',
  407. '/script'
  408. );
  409. $this->assertTags($result, $expected);
  410. $result = $this->Javascript->codeBlock('something', true);
  411. $expected = array(
  412. 'script' => array('type' => 'text/javascript'),
  413. $this->cDataStart,
  414. 'something',
  415. $this->cDataEnd,
  416. '/script'
  417. );
  418. $this->assertTags($result, $expected);
  419. $result = $this->Javascript->codeBlock('something', false);
  420. $expected = array(
  421. 'script' => array('type' => 'text/javascript'),
  422. $this->cDataStart,
  423. 'something',
  424. $this->cDataEnd,
  425. '/script'
  426. );
  427. $this->assertTags($result, $expected);
  428. $result = $this->Javascript->codeBlock('something', array('safe' => false));
  429. $expected = array(
  430. 'script' => array('type' => 'text/javascript'),
  431. 'something',
  432. '/script'
  433. );
  434. $this->assertTags($result, $expected);
  435. $result = $this->Javascript->codeBlock('something', array('safe' => true));
  436. $expected = array(
  437. 'script' => array('type' => 'text/javascript'),
  438. $this->cDataStart,
  439. 'something',
  440. $this->cDataEnd,
  441. '/script'
  442. );
  443. $this->assertTags($result, $expected);
  444. $result = $this->Javascript->codeBlock(null, array('safe' => true, 'allowCache' => false));
  445. $this->assertNull($result);
  446. echo 'this is some javascript';
  447. $result = $this->Javascript->blockEnd();
  448. $expected = array(
  449. 'script' => array('type' => 'text/javascript'),
  450. $this->cDataStart,
  451. 'this is some javascript',
  452. $this->cDataEnd,
  453. '/script'
  454. );
  455. $this->assertTags($result, $expected);
  456. $result = $this->Javascript->codeBlock();
  457. $this->assertNull($result);
  458. echo "alert('hey');";
  459. $result = $this->Javascript->blockEnd();
  460. $expected = array(
  461. 'script' => array('type' => 'text/javascript'),
  462. $this->cDataStart,
  463. "alert('hey');",
  464. $this->cDataEnd,
  465. '/script'
  466. );
  467. $this->assertTags($result, $expected);
  468. $this->Javascript->cacheEvents(false, true);
  469. $this->assertFalse($this->Javascript->inBlock);
  470. $result = $this->Javascript->codeBlock();
  471. $this->assertIdentical($result, null);
  472. $this->assertTrue($this->Javascript->inBlock);
  473. echo 'alert("this is a buffered script");';
  474. $result = $this->Javascript->blockEnd();
  475. $this->assertIdentical($result, null);
  476. $this->assertFalse($this->Javascript->inBlock);
  477. $result = $this->Javascript->getCache();
  478. $this->assertEqual('alert("this is a buffered script");', $result);
  479. }
  480. /**
  481. * testOutOfLineScriptWriting method
  482. *
  483. * @access public
  484. * @return void
  485. */
  486. function testOutOfLineScriptWriting() {
  487. echo $this->Javascript->codeBlock('$(document).ready(function() { });', array('inline' => false));
  488. $this->Javascript->codeBlock(null, array('inline' => false));
  489. echo '$(function(){ });';
  490. $this->Javascript->blockEnd();
  491. $script = $this->View->scripts();
  492. $this->assertEqual(count($script), 2);
  493. $this->assertPattern('/' . preg_quote('$(document).ready(function() { });', '/') . '/', $script[0]);
  494. $this->assertPattern('/' . preg_quote('$(function(){ });', '/') . '/', $script[1]);
  495. }
  496. /**
  497. * testEvent method
  498. *
  499. * @access public
  500. * @return void
  501. */
  502. function testEvent() {
  503. $result = $this->Javascript->event('myId', 'click', 'something();');
  504. $expected = array(
  505. 'script' => array('type' => 'text/javascript'),
  506. $this->cDataStart,
  507. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  508. $this->cDataEnd,
  509. '/script'
  510. );
  511. $this->assertTags($result, $expected);
  512. $result = $this->Javascript->event('myId', 'click', 'something();', array('safe' => false));
  513. $expected = array(
  514. 'script' => array('type' => 'text/javascript'),
  515. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  516. '/script'
  517. );
  518. $this->assertTags($result, $expected);
  519. $result = $this->Javascript->event('myId', 'click');
  520. $expected = array(
  521. 'script' => array('type' => 'text/javascript'),
  522. $this->cDataStart,
  523. "Event.observe($('myId'), 'click', function(event) { }, false);",
  524. $this->cDataEnd,
  525. '/script'
  526. );
  527. $this->assertTags($result, $expected);
  528. $result = $this->Javascript->event('myId', 'click', 'something();', false);
  529. $expected = array(
  530. 'script' => array('type' => 'text/javascript'),
  531. $this->cDataStart,
  532. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  533. $this->cDataEnd,
  534. '/script'
  535. );
  536. $this->assertTags($result, $expected);
  537. $result = $this->Javascript->event('myId', 'click', 'something();', array('useCapture' => true));
  538. $expected = array(
  539. 'script' => array('type' => 'text/javascript'),
  540. $this->cDataStart,
  541. "Event.observe($('myId'), 'click', function(event) { something(); }, true);",
  542. $this->cDataEnd,
  543. '/script'
  544. );
  545. $this->assertTags($result, $expected);
  546. $result = $this->Javascript->event('document', 'load');
  547. $expected = array(
  548. 'script' => array('type' => 'text/javascript'),
  549. $this->cDataStart,
  550. "Event.observe(document, 'load', function(event) { }, false);",
  551. $this->cDataEnd,
  552. '/script'
  553. );
  554. $this->assertTags($result, $expected);
  555. $result = $this->Javascript->event('$(\'myId\')', 'click', 'something();', array('safe' => false));
  556. $expected = array(
  557. 'script' => array('type' => 'text/javascript'),
  558. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  559. '/script'
  560. );
  561. $this->assertTags($result, $expected);
  562. $result = $this->Javascript->event('\'document\'', 'load', 'something();', array('safe' => false));
  563. $expected = array(
  564. 'script' => array('type' => 'text/javascript'),
  565. "Event.observe('document', 'load', function(event) { something(); }, false);",
  566. '/script'
  567. );
  568. $this->assertTags($result, $expected);
  569. $this->Javascript->cacheEvents();
  570. $result = $this->Javascript->event('myId', 'click', 'something();');
  571. $this->assertNull($result);
  572. $result = $this->Javascript->getCache();
  573. $this->assertPattern('/^' . str_replace('/', '\\/', preg_quote('Event.observe($(\'myId\'), \'click\', function(event) { something(); }, false);')) . '$/s', $result);
  574. $result = $this->Javascript->event('#myId', 'alert(event);');
  575. $this->assertNull($result);
  576. $result = $this->Javascript->getCache();
  577. $this->assertPattern('/^\s*var Rules = {\s*\'#myId\': function\(element, event\)\s*{\s*alert\(event\);\s*}\s*}\s*EventSelectors\.start\(Rules\);\s*$/s', $result);
  578. }
  579. /**
  580. * testWriteEvents method
  581. *
  582. * @access public
  583. * @return void
  584. */
  585. function testWriteEvents() {
  586. $this->Javascript->cacheEvents();
  587. $result = $this->Javascript->event('myId', 'click', 'something();');
  588. $this->assertNull($result);
  589. $result = $this->Javascript->writeEvents();
  590. $expected = array(
  591. 'script' => array('type' => 'text/javascript'),
  592. $this->cDataStart,
  593. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  594. $this->cDataEnd,
  595. '/script'
  596. );
  597. $this->assertTags($result, $expected);
  598. $result = $this->Javascript->getCache();
  599. $this->assertTrue(empty($result));
  600. $this->Javascript->cacheEvents();
  601. $result = $this->Javascript->event('myId', 'click', 'something();');
  602. $this->assertNull($result);
  603. $result = $this->Javascript->writeEvents(false);
  604. $resultScripts = $this->View->scripts();
  605. reset($resultScripts);
  606. $this->assertNull($result);
  607. $this->assertEqual(count($resultScripts), 1);
  608. $result = current($resultScripts);
  609. $expected = array(
  610. 'script' => array('type' => 'text/javascript'),
  611. $this->cDataStart,
  612. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  613. $this->cDataEnd,
  614. '/script'
  615. );
  616. $this->assertTags($result, $expected);
  617. $result = $this->Javascript->getCache();
  618. $this->assertTrue(empty($result));
  619. }
  620. /**
  621. * testEscapeScript method
  622. *
  623. * @access public
  624. * @return void
  625. */
  626. function testEscapeScript() {
  627. $result = $this->Javascript->escapeScript('');
  628. $expected = '';
  629. $this->assertEqual($result, $expected);
  630. $result = $this->Javascript->escapeScript('CakePHP' . "\n" . 'Rapid Development Framework');
  631. $expected = 'CakePHP\\nRapid Development Framework';
  632. $this->assertEqual($result, $expected);
  633. $result = $this->Javascript->escapeScript('CakePHP' . "\r\n" . 'Rapid Development Framework' . "\r" . 'For PHP');
  634. $expected = 'CakePHP\\nRapid Development Framework\\nFor PHP';
  635. $this->assertEqual($result, $expected);
  636. $result = $this->Javascript->escapeScript('CakePHP: "Rapid Development Framework"');
  637. $expected = 'CakePHP: \\"Rapid Development Framework\\"';
  638. $this->assertEqual($result, $expected);
  639. $result = $this->Javascript->escapeScript('CakePHP: \'Rapid Development Framework\'');
  640. $expected = 'CakePHP: \\\'Rapid Development Framework\\\'';
  641. $this->assertEqual($result, $expected);
  642. }
  643. /**
  644. * testEscapeString method
  645. *
  646. * @access public
  647. * @return void
  648. */
  649. function testEscapeString() {
  650. $result = $this->Javascript->escapeString('');
  651. $expected = '';
  652. $this->assertEqual($result, $expected);
  653. $result = $this->Javascript->escapeString('CakePHP' . "\n" . 'Rapid Development Framework');
  654. $expected = 'CakePHP\\nRapid Development Framework';
  655. $this->assertEqual($result, $expected);
  656. $result = $this->Javascript->escapeString('CakePHP' . "\r\n" . 'Rapid Development Framework' . "\r" . 'For PHP');
  657. $expected = 'CakePHP\\nRapid Development Framework\\nFor PHP';
  658. $this->assertEqual($result, $expected);
  659. $result = $this->Javascript->escapeString('CakePHP: "Rapid Development Framework"');
  660. $expected = 'CakePHP: \\"Rapid Development Framework\\"';
  661. $this->assertEqual($result, $expected);
  662. $result = $this->Javascript->escapeString('CakePHP: \'Rapid Development Framework\'');
  663. $expected = "CakePHP: \\'Rapid Development Framework\\'";
  664. $this->assertEqual($result, $expected);
  665. $result = $this->Javascript->escapeString('my \\"string\\"');
  666. $expected = 'my \\\\\\"string\\\\\\"';
  667. $this->assertEqual($result, $expected);
  668. $result = $this->Javascript->escapeString('my string\nanother line');
  669. $expected = 'my string\\\nanother line';
  670. $this->assertEqual($result, $expected);
  671. $result = $this->Javascript->escapeString('String with \n string that looks like newline');
  672. $expected = 'String with \\\n string that looks like newline';
  673. $this->assertEqual($result, $expected);
  674. $result = $this->Javascript->escapeString('String with \n string that looks like newline');
  675. $expected = 'String with \\\n string that looks like newline';
  676. $this->assertEqual($result, $expected);
  677. }
  678. /**
  679. * test string escaping and compare to json_encode()
  680. *
  681. * @return void
  682. **/
  683. function testStringJsonEncodeCompliance() {
  684. if (!function_exists('json_encode')) {
  685. return;
  686. }
  687. $this->Javascript->useNative = false;
  688. $data = array();
  689. $data['mystring'] = "simple string";
  690. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  691. $data['mystring'] = "strïng with spécial chârs";
  692. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  693. $data['mystring'] = "a two lines\nstring";
  694. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  695. $data['mystring'] = "a \t tabbed \t string";
  696. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  697. $data['mystring'] = "a \"double-quoted\" string";
  698. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  699. $data['mystring'] = 'a \\"double-quoted\\" string';
  700. $this->assertEqual(json_encode($data), $this->Javascript->object($data));
  701. }
  702. /**
  703. * test that text encoded with Javascript::object decodes properly
  704. *
  705. * @return void
  706. **/
  707. function testObjectDecodeCompatibility() {
  708. if (!function_exists('json_decode')) {
  709. return;
  710. }
  711. $this->Javascript->useNative = false;
  712. $data = array("simple string");
  713. $result = $this->Javascript->object($data);
  714. $this->assertEqual(json_decode($result), $data);
  715. $data = array('my \"string\"');
  716. $result = $this->Javascript->object($data);
  717. $this->assertEqual(json_decode($result), $data);
  718. $data = array('my \\"string\\"');
  719. $result = $this->Javascript->object($data);
  720. $this->assertEqual(json_decode($result), $data);
  721. }
  722. /**
  723. * testAfterRender method
  724. *
  725. * @access public
  726. * @return void
  727. */
  728. function testAfterRender() {
  729. $this->Javascript->cacheEvents();
  730. $result = $this->Javascript->event('myId', 'click', 'something();');
  731. $this->assertNull($result);
  732. ob_start();
  733. $this->Javascript->afterRender();
  734. $result = ob_get_clean();
  735. $expected = array(
  736. 'script' => array('type' => 'text/javascript'),
  737. $this->cDataStart,
  738. "Event.observe($('myId'), 'click', function(event) { something(); }, false);",
  739. $this->cDataEnd,
  740. '/script'
  741. );
  742. $this->assertTags($result, $expected);
  743. $result = $this->Javascript->getCache();
  744. $this->assertTrue(empty($result));
  745. $old = $this->Javascript->enabled;
  746. $this->Javascript->enabled = false;
  747. $this->Javascript->cacheEvents();
  748. $result = $this->Javascript->event('myId', 'click', 'something();');
  749. $this->assertNull($result);
  750. ob_start();
  751. $this->Javascript->afterRender();
  752. $result = ob_get_clean();
  753. $this->assertTrue(empty($result));
  754. $result = $this->Javascript->getCache();
  755. $this->assertPattern('/^' . str_replace('/', '\\/', preg_quote('Event.observe($(\'myId\'), \'click\', function(event) { something(); }, false);')) . '$/s', $result);
  756. $this->Javascript->enabled = $old;
  757. }
  758. }
  759. ?>