// |reftest| skip-if(!this.hasOwnProperty("Intl"))
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

//-----------------------------------------------------------------------------
var BUGNUMBER = 1093421;
var summary =
  "new Intl.NumberFormat(..., { style: 'currency', currency: '...', " +
  "currencyDisplay: 'name' or 'code' }) should have behavior other than " +
  "throwing";

print(BUGNUMBER + ": " + summary);

//-----------------------------------------------------------------------------

// Test that currencyDisplay: "code" behaves correctly and doesn't throw.

var usdCodeOptions =
  {
    style: "currency",
    currency: "USD",
    currencyDisplay: "code",
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  };
var usDollarsCode = new Intl.NumberFormat("en-US", usdCodeOptions);
assertEq(/USD/.test(usDollarsCode.format(25)), true);

// ISO 4217 currency codes are formed from an ISO 3166-1 alpha-2 country code
// followed by a third letter.  ISO 3166 guarantees that no country code
// starting with "X" will ever be assigned.  Stepping carefully around a few
// 4217-designated special "currencies", XQQ will never have a representation.
// Thus, yes: this really is specified to work, as unrecognized or unsupported
// codes pass into the string unmodified.
var xqqCodeOptions =
  {
    style: "currency",
    currency: "XQQ",
    currencyDisplay: "code",
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  };
var xqqMoneyCode = new Intl.NumberFormat("en-US", xqqCodeOptions);
assertEq(/XQQ/.test(xqqMoneyCode.format(25)), true);

// Test that currencyDisplay: "name" behaves without throwing.  (Unlike the two
// above tests, the results here aren't guaranteed as the name is
// implementation-defined.)
var usdNameOptions =
  {
    style: "currency",
    currency: "USD",
    currencyDisplay: "name",
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  };
var usDollarsName = new Intl.NumberFormat("en-US", usdNameOptions);
assertEq(usDollarsName.format(25), "25 US dollars");

// But if the implementation doesn't recognize the currency, the provided code
// is used in place of a proper name, unmolested.
var xqqNameOptions =
  {
    style: "currency",
    currency: "XQQ",
    currencyDisplay: "name",
    minimumFractionDigits: 0,
    maximumFractionDigits: 0,
  };
var xqqMoneyName = new Intl.NumberFormat("en-US", xqqNameOptions);
assertEq(/XQQ/.test(xqqMoneyName.format(25)), true);

if (typeof reportCompare === "function")
  reportCompare(true, true);