mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 11:44:31 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			119 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright 2008 the V8 project authors. All rights reserved.
 | |
| // Redistribution and use in source and binary forms, with or without
 | |
| // modification, are permitted provided that the following conditions are
 | |
| // met:
 | |
| //
 | |
| //     * Redistributions of source code must retain the above copyright
 | |
| //       notice, this list of conditions and the following disclaimer.
 | |
| //     * Redistributions in binary form must reproduce the above
 | |
| //       copyright notice, this list of conditions and the following
 | |
| //       disclaimer in the documentation and/or other materials provided
 | |
| //       with the distribution.
 | |
| //     * Neither the name of Google Inc. nor the names of its
 | |
| //       contributors may be used to endorse or promote products derived
 | |
| //       from this software without specific prior written permission.
 | |
| //
 | |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
| 
 | |
| /**
 | |
|  * @fileoverview Check that the global escape and unescape functions work
 | |
|  * right.
 | |
|  */
 | |
| 
 | |
| // Section B.2.1 of ECMAScript 3
 | |
| var unescaped = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@*_+-./";
 | |
| 
 | |
| // Check the unescape chars are not escaped
 | |
| assertEquals(unescaped, escape(unescaped));
 | |
| // Check spaces are escaped
 | |
| assertEquals("%20/%20", escape(" / "));
 | |
| // Check that null chars are escaped and do not terminate the string
 | |
| assertEquals("%000", escape("\0" + "0"));
 | |
| // Check a unicode escape
 | |
| assertEquals("A%20B%u1234%00%20C", escape(String.fromCharCode(0x41, 0x20, 0x42, 0x1234, 0, 0x20, 0x43)));
 | |
| // Check unicode escapes have a leading zero to pad to 4 digits
 | |
| assertEquals("%u0123", escape(String.fromCharCode(0x123)));
 | |
| // Check escapes are upper case
 | |
| assertEquals("%uABCD", escape(String.fromCharCode(0xabcd)));
 | |
| assertEquals("%AB", escape(String.fromCharCode(0xab)));
 | |
| assertEquals("%0A", escape("\n"));
 | |
| 
 | |
| // Check first 1000 chars individually for escaped/not escaped
 | |
| for (var i = 0; i < 1000; i++) {
 | |
|   var s = String.fromCharCode(i);
 | |
|   if (unescaped.indexOf(s, 0) == -1) {
 | |
|     assertFalse(s == escape(s));
 | |
|   } else {
 | |
|     assertTrue(s == escape(s));
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Check all chars up to 1000 in groups of 10 using unescape as a check
 | |
| for (var i = 0; i < 1000; i += 10) {
 | |
|   var s = String.fromCharCode(i, i+1, i+2, i+3, i+4, i+5, i+6, i+7, i+8, i+9);
 | |
|   assertEquals(s, unescape(escape(s)));
 | |
| }
 | |
| 
 | |
| // Benchmark
 | |
| var example = "Now is the time for all good men to come to the aid of the party.";
 | |
| example = example + String.fromCharCode(267, 0x1234, 0x6667, 0xabcd);
 | |
| example = example + " The quick brown fox jumps over the lazy dog."
 | |
| example = example + String.fromCharCode(171, 172, 173, 174, 175, 176, 178, 179);
 | |
| 
 | |
| for (var i = 0; i < 3000; i++) {
 | |
|   assertEquals(example, unescape(escape(example)));
 | |
| }
 | |
| 
 | |
| // Check unescape can cope with upper and lower case
 | |
| assertEquals(unescape("%41%4A%4a"), "AJJ");
 | |
| 
 | |
| // Check upper case U
 | |
| assertEquals("%U1234", unescape("%U1234"));
 | |
| 
 | |
| // Check malformed unescapes
 | |
| assertEquals("%", unescape("%"));
 | |
| assertEquals("%4", unescape("%4"));
 | |
| assertEquals("%u", unescape("%u"));
 | |
| assertEquals("%u4", unescape("%u4"));
 | |
| assertEquals("%u44", unescape("%u44"));
 | |
| assertEquals("%u444", unescape("%u444"));
 | |
| assertEquals("%4z", unescape("%4z"));
 | |
| assertEquals("%uzzzz", unescape("%uzzzz"));
 | |
| assertEquals("%u4zzz", unescape("%u4zzz"));
 | |
| assertEquals("%u44zz", unescape("%u44zz"));
 | |
| assertEquals("%u444z", unescape("%u444z"));
 | |
| assertEquals("%4<", unescape("%4<"));
 | |
| assertEquals("%u<<<<", unescape("%u<<<<"));
 | |
| assertEquals("%u4<<<", unescape("%u4<<<"));
 | |
| assertEquals("%u44<<", unescape("%u44<<"));
 | |
| assertEquals("%u444<", unescape("%u444<"));
 | |
| assertEquals("foo%4<", unescape("foo%4<"));
 | |
| assertEquals("foo%u<<<<", unescape("foo%u<<<<"));
 | |
| assertEquals("foo%u4<<<", unescape("foo%u4<<<"));
 | |
| assertEquals("foo%u44<<", unescape("foo%u44<<"));
 | |
| assertEquals("foo%u444<", unescape("foo%u444<"));
 | |
| assertEquals("foo%4<bar", unescape("foo%4<bar"));
 | |
| assertEquals("foo%u<<<<bar", unescape("foo%u<<<<bar"));
 | |
| assertEquals("foo%u4<<<bar", unescape("foo%u4<<<bar"));
 | |
| assertEquals("foo%u44<<bar", unescape("foo%u44<<bar"));
 | |
| assertEquals("foo%u444<bar", unescape("foo%u444<bar"));
 | |
| assertEquals("% ", unescape("%%20"));
 | |
| assertEquals("%% ", unescape("%%%20"));
 | |
| 
 | |
| // Unescape stress
 | |
| var eexample = escape(example);
 | |
| 
 | |
| for (var i = 1; i < 3000; i++) {
 | |
|   assertEquals(example, unescape(eexample));
 | |
| }
 |