New tests and test fixes for ECMAScript Internationalization API.

Updated copyright notice for 2013.
This commit is contained in:
Norbert Lindenberg 2013-03-24 23:48:59 -07:00
parent a2380a4257
commit 96321f30c9
28 changed files with 408 additions and 24 deletions

View File

@ -5,7 +5,7 @@ are granted under this license even if the third party concerned is a member of
CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR CODE OF CONDUCT IN PATENT MATTERS AVAILABLE AT http://www.ecma-international.org/memento/codeofconduct.htm FOR
INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS*. INFORMATION REGARDING THE LICENSING OF PATENT CLAIMS THAT ARE REQUIRED TO IMPLEMENT ECMA INTERNATIONAL STANDARDS*.
Copyright (C) <<2012>> <<Ecma International>> Copyright (C) 2012-2013 Ecma International
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the Redistribution and use in source and binary forms, with or without modification, are permitted provided that the

View File

@ -1,5 +1,5 @@
// Copyright 2011-2012 Norbert Lindenberg. All rights reserved. // Copyright 2011-2012 Norbert Lindenberg. All rights reserved.
// Copyright 2012 Mozilla Corporation. All rights reserved. // Copyright 2012-2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/** /**
@ -860,6 +860,44 @@ function mustNotHaveProperty(obj, property) {
} }
/**
* Properties of the RegExp constructor that may be affected by use of regular
* expressions, and the default values of these properties. Properties are from
* https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties
*/
var regExpProperties = ["$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9",
"$_", "$*", "$&", "$+", "$`", "$'",
"input", "lastMatch", "lastParen", "leftContext", "rightContext"
];
var regExpPropertiesDefaultValues = (function () {
var values = Object.create(null);
regExpProperties.forEach(function (property) {
values[property] = RegExp[property];
});
return values;
}());
/**
* Tests that executing the provided function (which may use regular expressions
* in its implementation) does not create or modify unwanted properties on the
* RegExp constructor.
*/
function testForUnwantedRegExpChanges(testFunc) {
regExpProperties.forEach(function (property) {
RegExp[property] = regExpPropertiesDefaultValues[property];
});
testFunc();
regExpProperties.forEach(function (property) {
if (RegExp[property] !== regExpPropertiesDefaultValues[property]) {
$ERROR("RegExp has unexpected property " + property + " with value " +
RegExp[property] + ".");
}
});
}
/** /**
* Tests whether name is a valid BCP 47 numbering system name * Tests whether name is a valid BCP 47 numbering system name
* and not excluded from use in the ECMAScript Internationalization API. * and not excluded from use in the ECMAScript Internationalization API.

View File

@ -1,5 +1,5 @@
// Copyright 2011-2012 Norbert Lindenberg. All rights reserved. // Copyright 2011-2012 Norbert Lindenberg. All rights reserved.
// Copyright 2012 Mozilla Corporation. All rights reserved. // Copyright 2012-2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/** /**
@ -860,6 +860,44 @@ function mustNotHaveProperty(obj, property) {
} }
/**
* Properties of the RegExp constructor that may be affected by use of regular
* expressions, and the default values of these properties. Properties are from
* https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties
*/
var regExpProperties = ["$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9",
"$_", "$*", "$&", "$+", "$`", "$'",
"input", "lastMatch", "lastParen", "leftContext", "rightContext"
];
var regExpPropertiesDefaultValues = (function () {
var values = Object.create(null);
regExpProperties.forEach(function (property) {
values[property] = RegExp[property];
});
return values;
}());
/**
* Tests that executing the provided function (which may use regular expressions
* in its implementation) does not create or modify unwanted properties on the
* RegExp constructor.
*/
function testForUnwantedRegExpChanges(testFunc) {
regExpProperties.forEach(function (property) {
RegExp[property] = regExpPropertiesDefaultValues[property];
});
testFunc();
regExpProperties.forEach(function (property) {
if (RegExp[property] !== regExpPropertiesDefaultValues[property]) {
$ERROR("RegExp has unexpected property " + property + " with value " +
RegExp[property] + ".");
}
});
}
/** /**
* Tests whether name is a valid BCP 47 numbering system name * Tests whether name is a valid BCP 47 numbering system name
* and not excluded from use in the ECMAScript Internationalization API. * and not excluded from use in the ECMAScript Internationalization API.

View File

@ -21,7 +21,13 @@ var validLanguageTags = [
"i-klingon", // grandfathered tag "i-klingon", // grandfathered tag
"cmn-hans-cn-t-ca-u-ca-x-t-u", // singleton subtags can also be used as private use subtags "cmn-hans-cn-t-ca-u-ca-x-t-u", // singleton subtags can also be used as private use subtags
"enochian-enochian", // language and variant subtags may be the same "enochian-enochian", // language and variant subtags may be the same
"de-gregory-u-ca-gregory" // variant and extension subtags may be the same "de-gregory-u-ca-gregory", // variant and extension subtags may be the same
"aa-a-foo-x-a-foo-bar", // variant subtags can also be used as private use subtags
"x-en-US-12345", // anything goes in private use tags
"x-12345-12345-en-US",
"x-en-US-12345-12345",
"x-en-u-foo",
"x-en-u-foo-u-bar"
]; ];
testWithIntlConstructors(function (Constructor) { testWithIntlConstructors(function (Constructor) {

View File

@ -7,6 +7,7 @@
*/ */
var invalidCurrencyCodes = [ var invalidCurrencyCodes = [
"",
"€", "€",
"$", "$",
"SFr.", "SFr.",
@ -26,9 +27,9 @@ invalidCurrencyCodes.forEach(function (code) {
error = e; error = e;
} }
if (error === undefined) { if (error === undefined) {
$ERROR("Invalid currency code " + code + " was not rejected."); $ERROR("Invalid currency code '" + code + "' was not rejected.");
} else if (error.name !== "RangeError") { } else if (error.name !== "RangeError") {
$ERROR("Invalid currency code " + code + " was rejected with wrong error " + error.name + "."); $ERROR("Invalid currency code '" + code + "' was rejected with wrong error " + error.name + ".");
} }
}); });

View File

@ -0,0 +1,12 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Intl has Object.prototype as its prototype.
* @author Norbert Lindenberg
*/
if (Object.getPrototypeOf(Intl) !== Object.prototype) {
$ERROR("Intl doesn't have Object.prototype as its prototype.");
}

View File

@ -0,0 +1,14 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/**
* @description Tests that constructing a Collator doesn't create or modify
* unwanted properties on the RegExp constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
testForUnwantedRegExpChanges(function () {
new Intl.Collator("de-DE-u-co-phonebk");
});

View File

@ -0,0 +1,13 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Intl.Collator.supportedLocalesOf
* doesn't access arguments that it's not given.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Object.prototype, "1");
new Intl.Collator("und");

View File

@ -7,7 +7,7 @@
* @author Norbert Lindenberg * @author Norbert Lindenberg
*/ */
// data from http://www.currency-iso.org/dl_iso_table_a1.xml, 2012-08-10 // data from http://www.currency-iso.org/dl_iso_table_a1.xml, 2013-02-25
var currencyDigits = { var currencyDigits = {
AED: 2, AED: 2,
AFN: 2, AFN: 2,
@ -158,7 +158,7 @@ var currencyDigits = {
TWD: 2, TWD: 2,
TZS: 2, TZS: 2,
UAH: 2, UAH: 2,
UGX: 2, // UGX: 2, will be changed to 0 when maintenance agency releases updated table
USD: 2, USD: 2,
USN: 2, USN: 2,
USS: 2, USS: 2,
@ -175,7 +175,7 @@ var currencyDigits = {
XPF: 0, XPF: 0,
YER: 2, YER: 2,
ZAR: 2, ZAR: 2,
ZMK: 2, ZMW: 2,
ZWL: 2 ZWL: 2
}; };

View File

@ -0,0 +1,44 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/**
* @description Tests that the options minimumSignificantDigits and
* maximumSignificantDigits are read in the right sequence.
* @author Norbert Lindenberg
*/
var read = 0;
function readMinimumSignificantDigits() {
++read;
if (read === 1) {
return 0; // invalid value, but on first read that's OK
} else if (read === 3) {
return 1; // valid value
} else {
$ERROR("minimumSignificantDigits read out of sequence: " + read + ".");
}
}
function readMaximumSignificantDigits() {
++read;
if (read === 2) {
return 0; // invalid value, but on first read that's OK
} else if (read === 4) {
return 1; // valid value
} else {
$ERROR("maximumSignificantDigits read out of sequence: " + read + ".");
}
}
var options = {};
Object.defineProperty(options, "minimumSignificantDigits",
{ get: readMinimumSignificantDigits });
Object.defineProperty(options, "maximumSignificantDigits",
{ get: readMaximumSignificantDigits });
new Intl.NumberFormat("de", options);
if (read !== 4) {
$ERROR("insuffient number of property reads: " + read + ".");
}

View File

@ -0,0 +1,18 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/**
* @description Tests that constructing a NumberFormat doesn't create or modify
* unwanted properties on the RegExp constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
testForUnwantedRegExpChanges(function () {
new Intl.NumberFormat("de-DE-u-nu-latn");
});
testForUnwantedRegExpChanges(function () {
new Intl.NumberFormat("de-DE-u-nu-latn", {style: "currency", currency: "EUR"});
});

View File

@ -0,0 +1,13 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Intl.NumberFormat.supportedLocalesOf
* doesn't access arguments that it's not given.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Object.prototype, "1");
new Intl.NumberFormat("und");

View File

@ -8,7 +8,7 @@
*/ */
var formatter = new Intl.NumberFormat(); var formatter = new Intl.NumberFormat();
var testData = [undefined, null, true, '0.6666666']; var testData = [undefined, null, true, '0.6666666', {valueOf: function () { return '0.1234567';}}];
var number; var number;
var i, input, correctResult, result; var i, input, correctResult, result;

View File

@ -0,0 +1,18 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/**
* @description Tests that constructing a DateTimeFormat doesn't create or modify
* unwanted properties on the RegExp constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
testForUnwantedRegExpChanges(function () {
new Intl.DateTimeFormat("de-DE-u-ca-gregory");
});
testForUnwantedRegExpChanges(function () {
new Intl.DateTimeFormat("de-DE-u-ca-gregory", {timeZone: "UTC"});
});

View File

@ -0,0 +1,13 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Intl.DateTimeFormat.supportedLocalesOf
* doesn't access arguments that it's not given.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Object.prototype, "1");
new Intl.DateTimeFormat("und");

View File

@ -0,0 +1,13 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that String.prototype.localeCompare uses the standard
* built-in Intl.Collator constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Intl, "Collator");
"a".localeCompare("b");

View File

@ -0,0 +1,13 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Number.prototype.toLocaleString uses the standard
* built-in Intl.NumberFormat constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Intl, "NumberFormat");
(0.0).toLocaleString();

View File

@ -0,0 +1,15 @@
// Copyright 2013 Mozilla Corporation. All rights reserved.
// This code is governed by the license found in the LICENSE file.
/**
* @description Tests that Date.prototype.toLocaleString & Co. use the standard
* built-in Intl.DateTimeFormat constructor.
* @author Norbert Lindenberg
*/
$INCLUDE("testIntl.js");
taintDataProperty(Intl, "DateTimeFormat");
new Date().toLocaleString();
new Date().toLocaleDateString();
new Date().toLocaleTimeString();

View File

@ -1,5 +1,5 @@
// Copyright 2011-2012 Norbert Lindenberg. All rights reserved. // Copyright 2011-2012 Norbert Lindenberg. All rights reserved.
// Copyright 2012 Mozilla Corporation. All rights reserved. // Copyright 2012-2013 Mozilla Corporation. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file. // This code is governed by the BSD license found in the LICENSE file.
/** /**
@ -860,6 +860,44 @@ function mustNotHaveProperty(obj, property) {
} }
/**
* Properties of the RegExp constructor that may be affected by use of regular
* expressions, and the default values of these properties. Properties are from
* https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties
*/
var regExpProperties = ["$1", "$2", "$3", "$4", "$5", "$6", "$7", "$8", "$9",
"$_", "$*", "$&", "$+", "$`", "$'",
"input", "lastMatch", "lastParen", "leftContext", "rightContext"
];
var regExpPropertiesDefaultValues = (function () {
var values = Object.create(null);
regExpProperties.forEach(function (property) {
values[property] = RegExp[property];
});
return values;
}());
/**
* Tests that executing the provided function (which may use regular expressions
* in its implementation) does not create or modify unwanted properties on the
* RegExp constructor.
*/
function testForUnwantedRegExpChanges(testFunc) {
regExpProperties.forEach(function (property) {
RegExp[property] = regExpPropertiesDefaultValues[property];
});
testFunc();
regExpProperties.forEach(function (property) {
if (RegExp[property] !== regExpPropertiesDefaultValues[property]) {
$ERROR("RegExp has unexpected property " + property + " with value " +
RegExp[property] + ".");
}
});
}
/** /**
* Tests whether name is a valid BCP 47 numbering system name * Tests whether name is a valid BCP 47 numbering system name
* and not excluded from use in the ECMAScript Internationalization API. * and not excluded from use in the ECMAScript Internationalization API.

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"date":"2013-02-07","version":"ES5.1"} {"date":"2013-03-24","version":"ES5.1"}

View File

@ -1,5 +1,5 @@
{ {
"numTests":142, "numTests":153,
"testSuite":[ "testSuite":[
"json/intl402.json" "json/intl402.json"
] ]