Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 6 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /ai/translator/translator-locale.https.window.html - WPT Dashboard Interop Dashboard
// META: title=Translator locale tests
// META: global=window
// META: timeout=long
// META: script=resources/util.js
// META: script=/resources/testdriver.js
// META: script=../resources/util.js
// META: script=../resources/locale-util.js
'use strict';
function getAvailability(sourceLanguage, targetLanguage) {
return Translator.availability({sourceLanguage, targetLanguage});
}
promise_test(async t => {
for (const [sourceLanguageSubtag, sourceVariations] of Object.entries(
valid_language_tags)) {
for (const [targetLanguageSubtag, targetVariations] of Object.entries(
valid_language_tags)) {
const languageSubtagAvailability =
await getAvailability(sourceLanguageSubtag, targetLanguageSubtag);
// All variations should be consistent with the language subtag.
for (const sourceVariation of sourceVariations) {
for (const targetVariation of targetVariations) {
assert_availability_consistent(
await getAvailability(sourceVariation, targetVariation),
languageSubtagAvailability);
}
}
}
}
}, 'Translator.availability() is consistent between language tag variations');
async function assert_valid_languages(inSourceLanguage, inTargetLanguage) {
if (['downloading', 'downloadable'].includes(
await getAvailability(inSourceLanguage, inTargetLanguage))) {
await test_driver.bless();
}
const {sourceLanguage: outSourceLanguage, targetLanguage: outTargetLanguage} =
await Translator.create(
{sourceLanguage: inSourceLanguage, targetLanguage: inTargetLanguage});
assert_is_variation(inSourceLanguage, outSourceLanguage);
assert_is_canonical(outSourceLanguage);
assert_is_variation(inTargetLanguage, outTargetLanguage);
assert_is_canonical(outTargetLanguage);
}
promise_test(async t => {
for (const [sourceLanguageSubtag, sourceVariations] of Object.entries(
valid_language_tags)) {
for (const [targetLanguageSubtag, targetVariations] of Object.entries(
valid_language_tags)) {
if (await getAvailability(sourceLanguageSubtag, targetLanguageSubtag) ===
'unavailable') {
continue;
}
await assert_valid_languages(sourceLanguageSubtag, targetLanguageSubtag);
for (const sourceVariation of sourceVariations) {
for (const targetVariation of targetVariations) {
await assert_valid_languages(sourceVariation, targetVariation);
}
}
}
}
}, 'Translator has valid source and target languages');
function assert_rejects_invalid_languages(
t, method, sourceLanguage, targetLanguage) {
return promise_rejects_js(
t, RangeError, method({sourceLanguage, targetLanguage}));
}
function testInvalidLanguagePairs(t, method) {
const allValidLanguageTags = Object.values(valid_language_tags).flat();
// Invalid source language.
for (const sourceLanguage of invalid_language_tags) {
for (const targetLanguage of allValidLanguageTags) {
assert_rejects_invalid_languages(
t, method, sourceLanguage, targetLanguage);
}
}
// Invalid target language.
for (const sourceLanguage of allValidLanguageTags) {
for (const targetLanguage of invalid_language_tags) {
assert_rejects_invalid_languages(
t, method, sourceLanguage, targetLanguage);
}
}
// Invalid source and target language
for (const sourceLanguage of invalid_language_tags) {
for (const targetLanguage of invalid_language_tags) {
assert_rejects_invalid_languages(
t, method, sourceLanguage, targetLanguage);
}
}
}
promise_test(async t => {
// We don't need to consume user activation since it should throw a RangeError
// before it even can check if it needs to consume user activation.
testInvalidLanguagePairs(t, Translator.create);
}, 'Translator.create() throws RangeError for invalid language tags');
promise_test(async t => {
testInvalidLanguagePairs(t, Translator.availability);
}, 'Translator.availability() throws RangeError for invalid language tags');