// Copyright 2018 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-setnumberformatunitoptions
description: Checks handling of valid values for the numeric option to the RelativeTimeFormat constructor.
info: |
    SetNumberFormatUnitOptions ( intlObj, options )

    6. Let currencyDisplay be ? GetOption(options, "currencyDisplay", "string", « "code", "symbol", "narrow-symbol", "name" », "symbol").
    11. If style is "currency", then
        f. Set intlObj.[[CurrencyDisplay]] to currencyDisplay.

features: [Intl.NumberFormat-unified]
---*/

const validOptions = [
  [undefined, "symbol"],
  ["narrow-symbol", "narrow-symbol"],
  [{ toString() { return "narrow-symbol"; } }, "narrow-symbol"],
];

for (const [validOption, expected] of validOptions) {
  const nf = new Intl.NumberFormat([], {
    "style": "currency",
    "currency": "EUR",
    "currencyDisplay": validOption,
  });
  const resolvedOptions = nf.resolvedOptions();
  assert.sameValue(resolvedOptions.currencyDisplay, expected);
}

for (const [validOption] of validOptions) {
  const nf = new Intl.NumberFormat([], {
    "style": "percent",
    "currencyDisplay": validOption,
  });
  const resolvedOptions = nf.resolvedOptions();
  assert.sameValue(resolvedOptions.currencyDisplay, undefined);
}
