Mercurial > hg > Members > shoshi > webvirt
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 } |