PageRenderTime 47ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/code/ryzom/tools/server/www/webtt/cake/tests/cases/libs/view/helpers/javascript.test.php

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