// Copyright 2018 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. // Locale constructor can't be called as function. assertThrows(() => Intl.Locale('sr'), TypeError); // Non-string locale. assertThrows(() => new Intl.Locale(5), TypeError); assertThrows(() => new Intl.Locale(Symbol()), TypeError); assertThrows(() => new Intl.Locale(null), TypeError); assertThrows(() => new Intl.Locale(undefined), TypeError); assertThrows(() => new Intl.Locale(false), TypeError); assertThrows(() => new Intl.Locale(true), TypeError); // Invalid locale string. assertThrows(() => new Intl.Locale('abcdefghi'), RangeError); // Options will be force converted into Object. assertDoesNotThrow(() => new Intl.Locale('sr', 5)); // Regression for http://bugs.icu-project.org/trac/ticket/13417. assertDoesNotThrow( () => new Intl.Locale( 'sr-cyrl-rs-t-ja-u-ca-islamic-cu-rsd-tz-uslax-x-whatever', { calendar: 'buddhist', caseFirst: 'true', collation: 'phonebk', hourCycle: 'h23', caseFirst: 'upper', numeric: 'true', numberingSystem: 'roman', }), RangeError); // Throws only once during construction. // Check for all getters to prevent regression. assertThrows( () => new Intl.Locale('en-US', { get calendar() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get caseFirst() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get collation() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get hourCycle() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get numeric() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get numberingSystem() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get language() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get script() { throw new Error('foo'); } }), Error); assertThrows( () => new Intl.Locale('en-US', { get region() { throw new Error('foo'); } }), Error); // There won't be an override for baseName so we don't expect it to throw. assertDoesNotThrow( () => new Intl.Locale('en-US', { get baseName() { throw new Error('foo'); } }), Error); // Preserve the order of getter initialization. let getCount = 0; let calendar = -1; let collation = -1; let hourCycle = -1; let caseFirst = -1; let numeric = -1; let numberingSystem = -1; new Intl.Locale('en-US', { get calendar() { calendar = ++getCount; }, get collation() { collation = ++getCount; }, get hourCycle() { hourCycle = ++getCount; }, get caseFirst() { caseFirst = ++getCount; }, get numeric() { numeric = ++getCount; }, get numberingSystem() { numberingSystem = ++getCount; }, }); assertEquals(1, calendar); assertEquals(2, collation); assertEquals(3, hourCycle); assertEquals(4, caseFirst); assertEquals(5, numeric); assertEquals(6, numberingSystem); // Check getter properties against the spec. function checkProperties(property) { let desc = Object.getOwnPropertyDescriptor(Intl.Locale.prototype, property); assertEquals(`get ${property}`, desc.get.name); assertEquals('function', typeof desc.get) assertEquals(undefined, desc.set); assertFalse(desc.enumerable); assertTrue(desc.configurable); } checkProperties('language'); checkProperties('script'); checkProperties('region'); checkProperties('baseName'); checkProperties('calendar'); checkProperties('collation'); checkProperties('hourCycle'); checkProperties('caseFirst'); checkProperties('numeric'); checkProperties('numberingSystem');