mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-04 05:33:50 +01:00 
			
		
		
		
	sourceRevisionAtLastExport: 33f2fb0e53d135f0ee17cfccd9d993eb2a6f47de targetRevisionAtLastExport: 31340cbd9add103f586d501b0c3354b7b182abc0
		
			
				
	
	
		
			124 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright 2015 the V8 project authors. All rights reserved.
 | 
						|
// Use of this source code is governed by a BSD-style license that can be
 | 
						|
// found in the LICENSE file.
 | 
						|
 | 
						|
var r1 = /abc/gi;
 | 
						|
assertEquals("abc", r1.source);
 | 
						|
assertTrue(r1.global);
 | 
						|
assertTrue(r1.ignoreCase);
 | 
						|
assertFalse(r1.multiline);
 | 
						|
assertFalse(r1.sticky);
 | 
						|
assertFalse(r1.unicode);
 | 
						|
 | 
						|
// Internal slot of prototype is not read.
 | 
						|
var r2 = { __proto__: r1 };
 | 
						|
assertThrows(function() { r2.source; }, TypeError);
 | 
						|
assertThrows(function() { r2.global; }, TypeError);
 | 
						|
assertThrows(function() { r2.ignoreCase; }, TypeError);
 | 
						|
assertThrows(function() { r2.multiline; }, TypeError);
 | 
						|
assertThrows(function() { r2.sticky; }, TypeError);
 | 
						|
assertThrows(function() { r2.unicode; }, TypeError);
 | 
						|
 | 
						|
var r3 = /I/;
 | 
						|
var string = "iIiIi";
 | 
						|
var expected = "iXiIi";
 | 
						|
assertFalse(r3.global);
 | 
						|
assertFalse(r3.ignoreCase);
 | 
						|
assertEquals("", r3.flags);
 | 
						|
assertEquals(expected, string.replace(r3, "X"));
 | 
						|
 | 
						|
var get_count = 0;
 | 
						|
Object.defineProperty(r3, "global", {
 | 
						|
  get: function() { get_count++; return true; }
 | 
						|
});
 | 
						|
Object.defineProperty(r3, "ignoreCase", {
 | 
						|
  get: function() { get_count++; return true; }
 | 
						|
});
 | 
						|
 | 
						|
assertTrue(r3.global);
 | 
						|
assertEquals(1, get_count);
 | 
						|
assertTrue(r3.ignoreCase);
 | 
						|
assertEquals(2, get_count);
 | 
						|
// Overridden flag getters affects the flags getter.
 | 
						|
assertEquals("gi", r3.flags);
 | 
						|
assertEquals(4, get_count);
 | 
						|
// Overridden flag getters affect string.replace
 | 
						|
// TODO(adamk): Add more tests here once we've switched
 | 
						|
// to use [[OriginalFlags]] in more cases.
 | 
						|
// TODO(jgruber): This exact case actually causes an infinite loop in the spec
 | 
						|
// (@@replace sees global = true while BuiltinExec sees global = false).
 | 
						|
// Comment the test for now and remove / fix once this has been resolved on
 | 
						|
// the spec side.
 | 
						|
//assertEquals(expected, string.replace(r3, "X"));
 | 
						|
//assertEquals(5, get_count);
 | 
						|
 | 
						|
 | 
						|
function testName(name) {
 | 
						|
  // Test for ES2017 RegExp web compatibility semantics
 | 
						|
  // https://github.com/tc39/ecma262/pull/511
 | 
						|
  assertEquals(name === "source" ? "(?:)" : undefined,
 | 
						|
               RegExp.prototype[name]);
 | 
						|
  assertEquals(
 | 
						|
      "get " + name,
 | 
						|
      Object.getOwnPropertyDescriptor(RegExp.prototype, name).get.name);
 | 
						|
}
 | 
						|
 | 
						|
testName("global");
 | 
						|
testName("ignoreCase");
 | 
						|
testName("multiline");
 | 
						|
testName("source");
 | 
						|
testName("sticky");
 | 
						|
testName("unicode");
 | 
						|
 | 
						|
 | 
						|
RegExp.prototype.flags = 'setter should be undefined';
 | 
						|
 | 
						|
assertEquals('', RegExp('').flags);
 | 
						|
assertEquals('', /./.flags);
 | 
						|
assertEquals('gimuy', RegExp('', 'yugmi').flags);
 | 
						|
assertEquals('gimuy', /foo/yumig.flags);
 | 
						|
 | 
						|
var descriptor = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags');
 | 
						|
assertTrue(descriptor.configurable);
 | 
						|
assertFalse(descriptor.enumerable);
 | 
						|
assertInstanceof(descriptor.get, Function);
 | 
						|
assertEquals(undefined, descriptor.set);
 | 
						|
 | 
						|
function testGenericFlags(object) {
 | 
						|
  return descriptor.get.call(object);
 | 
						|
}
 | 
						|
 | 
						|
assertEquals('', testGenericFlags({}));
 | 
						|
assertEquals('i', testGenericFlags({ ignoreCase: true }));
 | 
						|
assertEquals('uy', testGenericFlags({ global: 0, sticky: 1, unicode: 1 }));
 | 
						|
assertEquals('m', testGenericFlags({ __proto__: { multiline: true } }));
 | 
						|
assertThrows(function() { testGenericFlags(); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(undefined); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(null); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(true); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(false); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(''); }, TypeError);
 | 
						|
assertThrows(function() { testGenericFlags(42); }, TypeError);
 | 
						|
 | 
						|
var counter = 0;
 | 
						|
var map = {};
 | 
						|
var object = {
 | 
						|
  get global() {
 | 
						|
    map.g = counter++;
 | 
						|
  },
 | 
						|
  get ignoreCase() {
 | 
						|
    map.i = counter++;
 | 
						|
  },
 | 
						|
  get multiline() {
 | 
						|
    map.m = counter++;
 | 
						|
  },
 | 
						|
  get unicode() {
 | 
						|
    map.u = counter++;
 | 
						|
  },
 | 
						|
  get sticky() {
 | 
						|
    map.y = counter++;
 | 
						|
  }
 | 
						|
};
 | 
						|
testGenericFlags(object);
 | 
						|
assertEquals({ g: 0, i: 1, m: 2, u: 3, y: 4 }, map);
 |