summaryrefslogtreecommitdiffstats
path: root/js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js')
-rw-r--r--js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js52
1 files changed, 52 insertions, 0 deletions
diff --git a/js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js b/js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js
new file mode 100644
index 0000000000..c2d01bc0b9
--- /dev/null
+++ b/js/src/tests/test262/intl402/Locale/reject-duplicate-variants-in-tlang.js
@@ -0,0 +1,52 @@
+// Copyright 2020 Jeff Walden, Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-isstructurallyvalidlanguagetag
+description: >
+ Verifies that just as duplicate variants in a tag ("en-emodeng-emodeng") make
+ the tag structurally invalid, so too do duplicate variants in the tlang
+ component of an otherwise structurally valid tag ("de-t-emodeng-emodeng"),
+ make it structurally invalid.
+info: |
+ if a `transformed_extensions` component that contains a `tlang` component is
+ present, then
+ the `tlang` component contains no duplicate `unicode_variant_subtag`
+ subtags.
+features: [Intl.Locale]
+---*/
+
+assert.sameValue(typeof Intl.Locale, "function");
+
+function mustReject(tag) {
+ assert.throws(RangeError, () => {
+ // Direct matches are rejected.
+ new Intl.Locale(tag);
+ }, `tag "${tag}" must be considered structurally invalid`);
+}
+
+// BCP47 since forever, and ECMA-402 as consequence, do not consider tags that
+// contain duplicate variants to be structurally valid. This restriction also
+// applies within the |tlang| component (indicating the source locale from which
+// relevant content was transformed) of a broader language tag.
+
+// Direct matches are rejected.
+mustReject("de-t-en-emodeng-emodeng");
+// Case-insensitive matches are also rejected.
+mustReject("de-t-en-Emodeng-emodeng");
+// ...and in either order.
+mustReject("de-t-en-emodeng-Emodeng");
+
+// Repeat the above tests with additional variants interspersed at each point
+// for completeness.
+mustReject("de-t-en-variant-emodeng-emodeng");
+mustReject("de-t-en-variant-Emodeng-emodeng");
+mustReject("de-t-en-variant-emodeng-Emodeng");
+mustReject("de-t-en-emodeng-variant-emodeng");
+mustReject("de-t-en-Emodeng-variant-emodeng");
+mustReject("de-t-en-emodeng-variant-Emodeng");
+mustReject("de-t-en-emodeng-emodeng-variant");
+mustReject("de-t-en-Emodeng-emodeng-variant");
+mustReject("de-t-en-emodeng-Emodeng-variant");
+
+reportCompare(0, 0);