Bug 1560342 - Add basic tests for Localization. r=stas
authorZibi Braniecki <zbraniecki@mozilla.com>
Wed, 26 Jun 2019 17:04:36 +0000
changeset 543033 2de3bf73a764aac6b20142f3d4295d93eee72e0c
parent 543032 84ffa3e268c4afcb7289a9f1eb75823717d1cb68
child 543034 1663fcb7bfd753ff1f52fe753db5f9bb9d766529
push id2131
push userffxbld-merge
push dateMon, 26 Aug 2019 18:30:20 +0000
treeherdermozilla-release@b19ffb3ca153 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersstas
bugs1560342
milestone69.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1560342 - Add basic tests for Localization. r=stas Differential Revision: https://phabricator.services.mozilla.com/D35587
intl/l10n/moz.build
intl/l10n/test/mochitest/chrome.ini
intl/l10n/test/mochitest/localization/test_formatMessages.html
intl/l10n/test/mochitest/localization/test_formatValue.html
intl/l10n/test/mochitest/localization/test_formatValues.html
--- a/intl/l10n/moz.build
+++ b/intl/l10n/moz.build
@@ -28,12 +28,13 @@ XPIDL_SOURCES += [
 
 XPIDL_MODULE = 'locale'
 
 LOCAL_INCLUDES += [
     '/dom/base',
 ]
 
 XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell.ini']
+MOCHITEST_CHROME_MANIFESTS += ['test/mochitest/chrome.ini']
 
 SPHINX_TREES['l10n'] = 'docs'
 
 FINAL_LIBRARY = 'xul'
new file mode 100644
--- /dev/null
+++ b/intl/l10n/test/mochitest/chrome.ini
@@ -0,0 +1,3 @@
+[localization/test_formatValue.html]
+[localization/test_formatValues.html]
+[localization/test_formatMessages.html]
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/intl/l10n/test/mochitest/localization/test_formatMessages.html
@@ -0,0 +1,87 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test Localization.prototype.formatMessages API</title>
+  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+  <script type="application/javascript">
+  "use strict";
+  const { FluentBundle } =
+    ChromeUtils.import("resource://gre/modules/Fluent.jsm");
+
+  async function* mockGenerateMessages(locales, resourceIds) {
+    const bundle = new FluentBundle(locales, {
+      useIsolating: false,
+    });
+    bundle.addMessages(`
+key1 = Value
+  .title = Title 1
+  .accesskey = K
+key2 =
+  .label = This is a label for { $user }
+    `);
+    yield bundle;
+  }
+
+  (async () => {
+    SimpleTest.waitForExplicitFinish();
+
+    const loc = new Localization(
+      ['mock.ftl'],
+      mockGenerateMessages,
+    );
+
+    {
+      // Simple mix works.
+      let msgs = await loc.formatMessages([
+        {id: "key1"},
+        {id: "key2", args: { user: "Amy"}},
+      ]);
+      is(msgs[0].value, "Value");
+      is(msgs[0].attributes[0].name, "title");
+      is(msgs[0].attributes[0].value, "Title 1");
+      is(msgs[0].attributes[1].name, "accesskey");
+      is(msgs[0].attributes[1].value, "K");
+
+      is(msgs[1].value, null);
+      is(msgs[1].attributes[0].name, "label");
+      is(msgs[1].attributes[0].value, "This is a label for Amy");
+    }
+
+    {
+      // Missing arguments cause exception in automation.
+      try {
+        let msgs = await loc.formatMessages([
+          {id: "key1"},
+          {id: "key2"},
+        ]);
+        ok(false, "Missing argument didn't cause an exception.");
+      } catch (e) {
+        is(e,
+          "[fluent][resolver] errors in mock.ftl/key2: ReferenceError: Unknown variable: user.",
+          "Missing key causes an exception.");
+      }
+    }
+
+    {
+      // Missing keys cause exception in automation.
+      try {
+        let msgs = await loc.formatMessages([
+          { id: "key1" },
+          { id: "key4" },
+        ]);
+        ok(false, "Missing key didn't cause an exception.");
+      } catch (e) {
+        is(e,
+           "[fluent] Missing translations in mock.ftl: key4.",
+           "Missing key causes an exception.");
+      }
+    }
+    SimpleTest.finish();
+  })();
+  </script>
+</head>
+<body>
+</body>
+</html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/intl/l10n/test/mochitest/localization/test_formatValue.html
@@ -0,0 +1,78 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test Localization.prototype.formatValue API</title>
+  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+  <script type="application/javascript">
+  "use strict";
+  const { FluentBundle } =
+    ChromeUtils.import("resource://gre/modules/Fluent.jsm");
+
+  async function* mockGenerateMessages(locales, resourceIds) {
+    const bundle = new FluentBundle(locales, {
+      useIsolating: false,
+    });
+    bundle.addMessages(`
+key1 = Value
+key2 = Value { $user }
+key3 = Value { $count }
+    `);
+    yield bundle;
+  }
+
+  (async () => {
+    SimpleTest.waitForExplicitFinish();
+
+    const loc = new Localization(
+      ['mock.ftl'],
+      mockGenerateMessages,
+    );
+
+    {
+      // Simple value works.
+      let val = await loc.formatValue("key1");
+      is(val, "Value");
+    }
+
+    {
+      // Value with a string argument works.
+      let val = await loc.formatValue("key2", { user: "John" });
+      is(val, "Value John");
+    }
+
+    {
+      // Value with a number argument works.
+      let val = await loc.formatValue("key3", { count: -3.21 });
+      is(val, "Value -3.21");
+    }
+
+    {
+      // Verify that in automation, a missing
+      // argument causes an exception.
+      try {
+        let val = await loc.formatValue("key3");
+        ok(false, "Missing argument didn't cause an exception.");
+      } catch (e) {
+        is(e,
+          "[fluent][resolver] errors in mock.ftl/key3: ReferenceError: Unknown variable: count.",
+          "Missing key causes an exception.");
+      }
+    }
+
+    {
+      // Incorrect argument type works.
+      // Due to how WebIDL handles union types, it'll convert
+      // the argument to a string `[object Object]`.
+      let val = await loc.formatValue("key2", { user: { name: true } });
+      is(val, "Value [object Object]");
+    }
+
+    SimpleTest.finish();
+  })();
+  </script>
+</head>
+<body>
+</body>
+</html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/intl/l10n/test/mochitest/localization/test_formatValues.html
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Test Localization.prototype.formatValues API</title>
+  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+  <script type="application/javascript">
+  "use strict";
+  const { FluentBundle } =
+    ChromeUtils.import("resource://gre/modules/Fluent.jsm");
+
+  async function* mockGenerateMessages(locales, resourceIds) {
+    const bundle = new FluentBundle(locales,
+    {
+      useIsolating: false,
+    });
+    bundle.addMessages(`
+key1 = Value
+key2 = Value { $user }
+key3 = Value { $count }
+    `);
+    yield bundle;
+  }
+
+  (async () => {
+    SimpleTest.waitForExplicitFinish();
+
+    const loc = new Localization(
+      ['mock.ftl'],
+      mockGenerateMessages,
+    );
+
+    {
+      // Simple mix works.
+      let vals = await loc.formatValues([
+        {id: "key1"},
+        {id: "key2", args: { user: "Amy"}},
+        {id: "key3", args: { count: -32.12 }},
+      ]);
+      is(vals[0], "Value");
+      is(vals[1], "Value Amy");
+      is(vals[2], "Value -32.12");
+    }
+
+    {
+      // Missing arguments cause exception in automation.
+      try {
+        let vals = await loc.formatValues([
+          {id: "key1"},
+          {id: "key2"},
+          {id: "key3", args: { count: -32.12 }},
+        ]);
+        ok(false, "Missing argument didn't cause an exception.");
+      } catch (e) {
+        is(e,
+          "[fluent][resolver] errors in mock.ftl/key2: ReferenceError: Unknown variable: user.",
+          "Missing key causes an exception.");
+      }
+    }
+
+    {
+      // Missing keys cause exception in automation.
+      try {
+        let vals = await loc.formatValues([
+          { id: "key1" },
+          { id: "key4", args: { count: -32.12 } },
+        ]);
+        ok(false, "Missing key didn't cause an exception.");
+      } catch (e) {
+        is(e,
+           "[fluent] Missing translations in mock.ftl: key4.",
+           "Missing key causes an exception.");
+      }
+    }
+
+    SimpleTest.finish();
+  })();
+  </script>
+</head>
+<body>
+</body>
+</html>
\ No newline at end of file