From b5fd799fa055388786edcda6ae54b35483b18145 Mon Sep 17 00:00:00 2001 From: Frank Yung-Fong Tang Date: Tue, 26 Sep 2023 08:58:27 -0700 Subject: [PATCH] Add Tests for ECMA402 PR811 (#3911) * Add Tests for ECMA402 PR811 Add tests to check the order of option readings and output keys in resolvedOptions of Intl.NumberFormat and PluralRules. * Address reveiw feedback Hard code the list of property to be inspect for GetOption Use compareArray * Update test/intl402/NumberFormat/constructor-option-read-order.js Co-authored-by: Richard Gibson * Update test/intl402/NumberFormat/constructor-option-read-order.js Co-authored-by: Richard Gibson * Update test/intl402/NumberFormat/prototype/resolvedOptions/return-keys-order-default.js Co-authored-by: Richard Gibson * Update test/intl402/PluralRules/constructor-option-read-order.js Co-authored-by: Richard Gibson * Update test/intl402/PluralRules/constructor-option-read-order.js Co-authored-by: Richard Gibson * Fix intl402/PluralRules/prototype/resolvedOptions/return-keys-order-default.js To test all options * Add more tests --------- Co-authored-by: Richard Gibson --- .../constructor-option-read-order.js | 55 +++++++++++++++++++ .../return-keys-order-default.js | 47 ++++++++++++++++ .../constructor-option-read-order.js | 41 ++++++++++++++ .../return-keys-order-default.js | 37 +++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 test/intl402/NumberFormat/constructor-option-read-order.js create mode 100644 test/intl402/NumberFormat/prototype/resolvedOptions/return-keys-order-default.js create mode 100644 test/intl402/PluralRules/constructor-option-read-order.js create mode 100644 test/intl402/PluralRules/prototype/resolvedOptions/return-keys-order-default.js diff --git a/test/intl402/NumberFormat/constructor-option-read-order.js b/test/intl402/NumberFormat/constructor-option-read-order.js new file mode 100644 index 0000000000..04532a0998 --- /dev/null +++ b/test/intl402/NumberFormat/constructor-option-read-order.js @@ -0,0 +1,55 @@ +/// Copyright 2023 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializenumberformat +description: Checks the order of option read. +features: [Intl.NumberFormat-v3] +includes: [compareArray.js] +---*/ + +let optionKeys = [ + // Inside InitializeNumberFormat + "localeMatcher", + "numberingSystem", + // Inside SetNumberFormatUnitOptions + "style", + "currency", + "currencyDisplay", + "currencySign", + "unit", + "unitDisplay", + // End of SetNumberFormatUnitOptions + // Back to InitializeNumberFormat + "notation", + // Inside SetNumberFormatDigitOptions + "minimumIntegerDigits", + "minimumFractionDigits", + "maximumFractionDigits", + "minimumSignificantDigits", + "maximumSignificantDigits", + "roundingIncrement", + "roundingMode", + "roundingPriority", + "trailingZeroDisplay", + // End of SetNumberFormatDigitOptions + // Back to InitializeNumberFormat + "compactDisplay", + "useGrouping", + "signDisplay" +]; + +// Use getters to track the order of reading known properties. +// TODO: Should we use a Proxy to detect *unexpected* property reads? +let reads = new Array(); +let options = {}; +optionKeys.forEach((key) => { + Object.defineProperty(options, key, { + get() { + reads.push(key); + return undefined; + }, + }); +}); +new Intl.NumberFormat(undefined, options); +assert.compareArray(reads, optionKeys, "Intl.NumberFormat options read order"); diff --git a/test/intl402/NumberFormat/prototype/resolvedOptions/return-keys-order-default.js b/test/intl402/NumberFormat/prototype/resolvedOptions/return-keys-order-default.js new file mode 100644 index 0000000000..f77c5340b6 --- /dev/null +++ b/test/intl402/NumberFormat/prototype/resolvedOptions/return-keys-order-default.js @@ -0,0 +1,47 @@ +// Copyright 2023 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-intl.numberformat.prototype.resolvedoptions +description: order of property keys for the object returned by resolvedOptions() +features: [Intl.NumberFormat-v3] +includes: [compareArray.js] +---*/ + +const allKeys = [ + 'locale', + 'numberingSystem', + 'style', + 'currency', + 'currencyDisplay', + 'currencySign', + 'unit', + 'unitDisplay', + 'minimumIntegerDigits', + 'minimumFractionDigits', + 'maximumFractionDigits', + 'minimumSignificantDigits', + 'maximumSignificantDigits', + 'useGrouping', + 'notation', + 'compactDisplay', + 'signDisplay', + 'roundingIncrement', + 'roundingMode', + 'roundingPriority', + 'trailingZeroDisplay' +]; + +const optionsBase = { notation: 'compact' }; +const optionsExtensions = [ + { style: 'currency', currency: 'XTS' }, + { style: 'unit', unit: 'percent' }, +]; +optionsExtensions.forEach((optionsExtension) => { + const options = Object.assign({}, optionsBase, optionsExtension); + const nf = new Intl.NumberFormat(undefined, options); + const resolved = nf.resolvedOptions(); + const resolvedKeys = Reflect.ownKeys(resolved); + const expectedKeys = allKeys.filter(key => key in resolved); + assert.compareArray(resolvedKeys, expectedKeys, + 'resolvedOptions() property key order with options ' + JSON.stringify(options)); +}); diff --git a/test/intl402/PluralRules/constructor-option-read-order.js b/test/intl402/PluralRules/constructor-option-read-order.js new file mode 100644 index 0000000000..d5bac7a633 --- /dev/null +++ b/test/intl402/PluralRules/constructor-option-read-order.js @@ -0,0 +1,41 @@ +/// Copyright 2023 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-initializepluralrules +description: Checks the order of option read. +features: [Intl.NumberFormat-v3] +includes: [compareArray.js] +---*/ + +let optionKeys = [ + // Inside InitializePluralRules + "localeMatcher", + "type", + // Inside SetNumberFormatDigitOptions + "minimumIntegerDigits", + "minimumFractionDigits", + "maximumFractionDigits", + "minimumSignificantDigits", + "maximumSignificantDigits", + "roundingIncrement", + "roundingMode", + "roundingPriority", + "trailingZeroDisplay", + // End of SetNumberFormatDigitOptions +]; + +// Use getters to track the order of reading known properties. +// TODO: Should we use a Proxy to detect *unexpected* property reads? +let reads = new Array(); +let options = {}; +optionKeys.forEach((key) => { + Object.defineProperty(options, key, { + get() { + reads.push(key); + return undefined; + }, + }); +}); +new Intl.PluralRules(undefined, options); +assert.compareArray(reads, optionKeys, "Intl.PluralRules options read order"); diff --git a/test/intl402/PluralRules/prototype/resolvedOptions/return-keys-order-default.js b/test/intl402/PluralRules/prototype/resolvedOptions/return-keys-order-default.js new file mode 100644 index 0000000000..298c424879 --- /dev/null +++ b/test/intl402/PluralRules/prototype/resolvedOptions/return-keys-order-default.js @@ -0,0 +1,37 @@ +// Copyright 2023 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-intl.pluralrules.prototype.resolvedoptions +description: order of property keys for the object returned by resolvedOptions() +features: [Intl.NumberFormat-v3] +includes: [compareArray.js] +---*/ + +const allKeys = [ + 'locale', + 'type', + 'minimumIntegerDigits', + 'minimumFractionDigits', + 'maximumFractionDigits', + 'minimumSignificantDigits', + 'maximumSignificantDigits', + 'pluralCategories', + 'roundingIncrement', + 'roundingMode', + 'roundingPriority', + 'trailingZeroDisplay' +]; + +const options = [ + { }, + { minimumSignificantDigits: 3 }, + { minimumFractionDigits: 3 }, +]; +options.forEach((option) => { + const nf = new Intl.PluralRules(undefined, option); + const resolved = nf.resolvedOptions(); + const resolvedKeys = Reflect.ownKeys(resolved); + const expectedKeys = allKeys.filter(key => key in resolved); + assert.compareArray(resolvedKeys, expectedKeys, + 'resolvedOptions() property key order with options ' + JSON.stringify(options)); +});