comparison cake/tests/cases/libs/view/helpers/javascript.test.php @ 0:261e66bd5a0c

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