@lion/ui 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/components/checkbox-group/src/LionCheckboxIndeterminate.js +2 -2
  2. package/components/checkbox-group/test/lion-checkbox-indeterminate-integrations.test.js +6 -0
  3. package/components/checkbox-group/{test/lion-checkbox-indeterminate.test.js → test-suites/CheckboxIndeterminate.suite.js} +209 -187
  4. package/components/combobox/src/LionCombobox.js +3 -1
  5. package/components/combobox/test/lion-combobox.test.js +52 -0
  6. package/components/listbox/src/ListboxMixin.js +3 -2
  7. package/components/listbox/test-suites/ListboxMixin.suite.js +31 -1
  8. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceNoSpaceBetweenCurrencySymbolAndNumber.js +22 -0
  9. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceSymbols.js +64 -0
  10. package/components/localize/src/number/utils/normalize-format-number-to-parts/normalizeIntl.js +13 -7
  11. package/components/localize/test/number/formatNumber.test.js +6 -28
  12. package/custom-elements.json +358 -201
  13. package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts +12 -0
  14. package/dist-types/components/checkbox-group/test-suites/CheckboxIndeterminate.suite.d.ts.map +1 -0
  15. package/dist-types/components/combobox/src/LionCombobox.d.ts.map +1 -1
  16. package/dist-types/components/combobox/test/lion-combobox.test.d.ts.map +1 -1
  17. package/dist-types/components/listbox/src/ListboxMixin.d.ts.map +1 -1
  18. package/dist-types/components/listbox/test-suites/ListboxMixin.suite.d.ts.map +1 -1
  19. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceNoSpaceBetweenCurrencySymbolAndNumber.d.ts +14 -0
  20. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceNoSpaceBetweenCurrencySymbolAndNumber.d.ts.map +1 -0
  21. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceSymbols.d.ts +20 -0
  22. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceSymbols.d.ts.map +1 -0
  23. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/normalizeIntl.d.ts.map +1 -1
  24. package/dist-types/exports/checkbox-group-test-suites.d.ts +2 -0
  25. package/dist-types/exports/checkbox-group-test-suites.d.ts.map +1 -0
  26. package/dist-types/tsconfig.tsbuildinfo +1 -1
  27. package/docs/components/checkbox-group/overview.md +9 -10
  28. package/docs/components/checkbox-group/use-cases.md +110 -142
  29. package/docs/components/collapsible/overview.md +1 -1
  30. package/docs/components/combobox/overview.md +1 -1
  31. package/docs/components/combobox/use-cases.md +1 -1
  32. package/docs/components/dialog/overview.md +1 -1
  33. package/docs/components/fieldset/overview.md +5 -5
  34. package/docs/components/form/overview.md +3 -3
  35. package/docs/components/icon/use-cases.md +1 -1
  36. package/docs/components/input/overview.md +1 -1
  37. package/docs/components/input-amount/overview.md +3 -3
  38. package/docs/components/input-date/overview.md +3 -3
  39. package/docs/components/input-datepicker/overview.md +5 -5
  40. package/docs/components/input-email/overview.md +2 -2
  41. package/docs/components/input-file/overview.md +1 -1
  42. package/docs/components/input-iban/overview.md +2 -2
  43. package/docs/components/input-range/overview.md +2 -2
  44. package/docs/components/input-stepper/overview.md +1 -1
  45. package/docs/components/input-tel/overview.md +1 -1
  46. package/docs/components/input-tel/use-cases.md +6 -6
  47. package/docs/components/input-tel-dropdown/overview.md +1 -1
  48. package/docs/components/radio-group/overview.md +3 -3
  49. package/docs/components/select-rich/use-cases.md +1 -1
  50. package/docs/components/tabs/examples.md +1 -1
  51. package/docs/fundamentals/index.md +4 -4
  52. package/docs/fundamentals/node-tools/providence-analytics/LocalConfiguration.md +1 -1
  53. package/docs/fundamentals/node-tools/providence-analytics/QueryResult.md +1 -1
  54. package/docs/fundamentals/node-tools/providence-analytics/analyzer.md +1 -1
  55. package/docs/fundamentals/node-tools/providence-analytics/dashboard.md +1 -1
  56. package/docs/fundamentals/node-tools/providence-analytics/overview.md +3 -3
  57. package/docs/fundamentals/node-tools/publish-docs/overview.md +3 -3
  58. package/docs/fundamentals/node-tools/rocket-preset-extend-lion-docs/overview.md +2 -2
  59. package/docs/fundamentals/rationales/accessibility.md +1 -1
  60. package/docs/fundamentals/systems/core/SlotMixin.md +1 -1
  61. package/docs/fundamentals/systems/core/overview.md +1 -1
  62. package/docs/fundamentals/systems/form/formatting-and-parsing.md +4 -4
  63. package/docs/fundamentals/systems/form/model-value.md +1 -1
  64. package/docs/fundamentals/systems/form/overview.md +28 -28
  65. package/docs/fundamentals/systems/form/validate.md +1 -1
  66. package/docs/fundamentals/systems/localize/overview.md +4 -4
  67. package/docs/fundamentals/systems/overlays/configuration.md +2 -2
  68. package/docs/fundamentals/systems/overlays/overview.md +5 -5
  69. package/docs/fundamentals/systems/overlays/use-cases.md +2 -2
  70. package/docs/fundamentals/tools/helpers/overview.md +1 -1
  71. package/docs/fundamentals/tools/singleton-manager/overview.md +4 -4
  72. package/docs/guides/how-to/create-a-custom-field.md +5 -5
  73. package/docs/guides/how-to/create-a-form.md +4 -4
  74. package/docs/guides/how-to/extend-a-native-input.md +2 -2
  75. package/docs/guides/how-to/get-started.md +28 -1
  76. package/docs/guides/index.md +8 -8
  77. package/docs/guides/principles/index.md +5 -5
  78. package/docs/guides/principles/styling.md +1 -1
  79. package/exports/checkbox-group-test-suites.js +1 -0
  80. package/package.json +1 -1
  81. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceENAUSymbols.js +0 -25
  82. package/components/localize/src/number/utils/normalize-format-number-to-parts/forceYenSymbol.js +0 -15
  83. package/dist-types/components/checkbox-group/test/lion-checkbox-indeterminate.test.d.ts +0 -4
  84. package/dist-types/components/checkbox-group/test/lion-checkbox-indeterminate.test.d.ts.map +0 -1
  85. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceENAUSymbols.d.ts +0 -14
  86. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceENAUSymbols.d.ts.map +0 -1
  87. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceYenSymbol.d.ts +0 -9
  88. package/dist-types/components/localize/src/number/utils/normalize-format-number-to-parts/forceYenSymbol.d.ts.map +0 -1
@@ -12,6 +12,7 @@ import '@lion/ui/define/lion-listbox.js';
12
12
  import '@lion/ui/define/lion-option.js';
13
13
  import { Required, Unparseable } from '@lion/ui/form-core.js';
14
14
  import { defineCE, expect, fixture, html, unsafeStatic } from '@open-wc/testing';
15
+ import { sendKeys } from '@web/test-runner-commands';
15
16
  import { LitElement } from 'lit';
16
17
  import sinon from 'sinon';
17
18
 
@@ -2678,6 +2679,57 @@ describe('lion-combobox', () => {
2678
2679
  mimicKeyPress(visibleOptions[1], 'Enter');
2679
2680
  expect(el.opened).to.equal(true);
2680
2681
  });
2682
+
2683
+ it('submits form on [Enter] when listbox is closed', async () => {
2684
+ const submitSpy = sinon.spy(e => e.preventDefault());
2685
+ const el = /** @type {HTMLFormElement} */ (
2686
+ await fixture(html`
2687
+ <form @submit=${submitSpy}>
2688
+ <lion-combobox name="foo" multiple-choice>
2689
+ <lion-option .choiceValue="${'Artichoke'}">Artichoke</lion-option>
2690
+ <lion-option .choiceValue="${'Chard'}">Chard</lion-option>
2691
+ <lion-option .choiceValue="${'Chicory'}">Chicory</lion-option>
2692
+ <lion-option .choiceValue="${'Victoria Plum'}">Victoria Plum</lion-option>
2693
+ </lion-combobox>
2694
+ <button type="submit">submit</button>
2695
+ </form>
2696
+ `)
2697
+ );
2698
+ const combobox = /** @type {LionCombobox} */ (el.querySelector('[name="foo"]'));
2699
+ const { _inputNode } = getComboboxMembers(combobox);
2700
+ await combobox.updateComplete;
2701
+ _inputNode.focus();
2702
+ await sendKeys({
2703
+ press: 'Enter',
2704
+ });
2705
+ expect(submitSpy.callCount).to.equal(1);
2706
+ });
2707
+
2708
+ it('does not submit form on [Enter] when listbox is opened', async () => {
2709
+ const submitSpy = sinon.spy(e => e.preventDefault());
2710
+ const el = /** @type {HTMLFormElement} */ (
2711
+ await fixture(html`
2712
+ <form @submit=${submitSpy}>
2713
+ <lion-combobox name="foo" multiple-choice>
2714
+ <lion-option .choiceValue="${'Artichoke'}">Artichoke</lion-option>
2715
+ <lion-option .choiceValue="${'Chard'}">Chard</lion-option>
2716
+ <lion-option .choiceValue="${'Chicory'}">Chicory</lion-option>
2717
+ <lion-option .choiceValue="${'Victoria Plum'}">Victoria Plum</lion-option>
2718
+ </lion-combobox>
2719
+ <button type="submit">submit</button>
2720
+ </form>
2721
+ `)
2722
+ );
2723
+ const combobox = /** @type {LionCombobox} */ (el.querySelector('[name="foo"]'));
2724
+ const { _inputNode } = getComboboxMembers(combobox);
2725
+ combobox.opened = true;
2726
+ await combobox.updateComplete;
2727
+ _inputNode.focus();
2728
+ await sendKeys({
2729
+ press: 'Enter',
2730
+ });
2731
+ expect(submitSpy.callCount).to.equal(0);
2732
+ });
2681
2733
  });
2682
2734
 
2683
2735
  describe('Match Mode', () => {
@@ -294,7 +294,6 @@ const ListboxMixinImplementation = superclass =>
294
294
  * @protected
295
295
  */
296
296
  this._repropagationRole = 'choice-group'; // configures FormControlMixin
297
-
298
297
  /**
299
298
  * When listbox is coupled to a textbox (in case we are dealing with a combobox),
300
299
  * spaces should not select an element (they need to be put in the textbox)
@@ -612,7 +611,9 @@ const ListboxMixinImplementation = superclass =>
612
611
  if (key === ' ' && this._listboxReceivesNoFocus) {
613
612
  return;
614
613
  }
615
- ev.preventDefault();
614
+ if (key === ' ') {
615
+ ev.preventDefault();
616
+ }
616
617
  if (!this.formElements[this.activeIndex]) {
617
618
  return;
618
619
  }
@@ -13,6 +13,7 @@ import {
13
13
  nextFrame,
14
14
  unsafeStatic,
15
15
  } from '@open-wc/testing';
16
+ import { sendKeys } from '@web/test-runner-commands';
16
17
  import sinon from 'sinon';
17
18
  import { getListboxMembers } from '../../../exports/listbox-test-helpers.js';
18
19
 
@@ -673,12 +674,41 @@ export function runListboxMixinSuite(customConfig = {}) {
673
674
  mimicKeyPress(_listboxNode, 'Enter');
674
675
  expect(options[1].checked).to.be.true;
675
676
  });
677
+
678
+ it('submits form on [Enter] when inputNode is an instance of HTMLInputNode', async () => {
679
+ const submitSpy = sinon.spy(e => e.preventDefault());
680
+ const el = /** @type {HTMLFormElement} */ (
681
+ await _fixture(html`
682
+ <form @submit=${submitSpy}>
683
+ <${tag} name="foo">
684
+ <${optionTag} .choiceValue="${'Artichoke'}">Artichoke</${optionTag}>
685
+ <${optionTag} .choiceValue="${'Bla'}">Bla</${optionTag}>
686
+ <${optionTag} .choiceValue="${'Chard'}">Chard</${optionTag}>
687
+ </${tag}>
688
+ <button type="submit">submit</button>
689
+ </form>
690
+ `)
691
+ );
692
+ const listbox = /** @type {LionListbox} */ (el.querySelector('[name="foo"]'));
693
+ const { _inputNode } = getListboxMembers(listbox);
694
+ if (!(_inputNode instanceof HTMLInputElement)) {
695
+ return;
696
+ }
697
+ await listbox.updateComplete;
698
+ // @ts-ignore allow protected members in tests
699
+
700
+ _inputNode.focus();
701
+ await sendKeys({
702
+ press: 'Enter',
703
+ });
704
+ expect(submitSpy.callCount).to.equal(1);
705
+ });
676
706
  });
677
707
 
678
708
  describe('Space', () => {
679
709
  it('selects active option when "_listboxReceivesNoFocus" is true', async () => {
680
710
  // When listbox is not focusable (in case of a combobox), the user should be allowed
681
- // to enter a space in the focusable element (texbox)
711
+ // to enter a space in the focusable element (textbox)
682
712
  const el = /** @type {LionListbox} */ (
683
713
  await fixture(html`
684
714
  <${tag} opened name="foo" ._listboxReceivesNoFocus="${false}" autocomplete="none" show-all-on-empty>
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Force no space between currency symbol and amount
3
+ *
4
+ * @typedef {import('../../../../types/LocalizeMixinTypes.js').FormatNumberPart} FormatNumberPart
5
+ * @param {FormatNumberPart[]} formattedParts
6
+ * @param {import('../../../../types/LocalizeMixinTypes.js').FormatNumberOptions} options
7
+ * @returns {FormatNumberPart[]}
8
+ */
9
+ export function forceNoSpaceBetweenCurrencySymbolAndNumber(
10
+ formattedParts,
11
+ { currency, currencyDisplay } = {},
12
+ ) {
13
+ const result = formattedParts;
14
+ if (formattedParts.length > 1 && currencyDisplay === 'symbol' && currency) {
15
+ formattedParts.forEach((part, i) => {
16
+ if (part.type === 'literal') {
17
+ result[i].value = '';
18
+ }
19
+ });
20
+ }
21
+ return result;
22
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @typedef {import('../../../../types/LocalizeMixinTypes.js').FormatNumberPart} FormatNumberPart
3
+ */
4
+
5
+ /** @type {Object.<string,string>} */
6
+ const CURRENCY_CODE_SYMBOL_MAP = {
7
+ EUR: '€',
8
+ USD: '$',
9
+ JPY: '¥',
10
+ };
11
+
12
+ /**
13
+ * Change the symbols differences in browsers
14
+ *
15
+ * @param {FormatNumberPart[]} formattedParts
16
+ * @param {import('../../../../types/LocalizeMixinTypes.js').FormatNumberOptions} options
17
+ * @param {string[]} currencyScope
18
+ * @returns {FormatNumberPart[]}
19
+ */
20
+ export function forceSymbols(formattedParts, { currency, currencyDisplay } = {}, currencyScope) {
21
+ const result = formattedParts;
22
+ if (
23
+ formattedParts.length > 1 &&
24
+ currencyDisplay === 'symbol' &&
25
+ currency &&
26
+ currencyScope.includes(currency)
27
+ ) {
28
+ formattedParts.forEach((part, i) => {
29
+ if (part.type === 'currency' && Object.keys(CURRENCY_CODE_SYMBOL_MAP).includes(currency)) {
30
+ result[i].value = CURRENCY_CODE_SYMBOL_MAP[currency];
31
+ }
32
+ });
33
+ }
34
+ return result;
35
+ }
36
+
37
+ /**
38
+ * Change the symbols for fr-BE differences in browsers
39
+ *
40
+ * @param {FormatNumberPart[]} formattedParts
41
+ * @param {import('../../../../types/LocalizeMixinTypes.js').FormatNumberOptions} options
42
+ * @param {string[]} currencyScope
43
+ * @returns {FormatNumberPart[]}
44
+ */
45
+ export function forceFRBESymbols(
46
+ formattedParts,
47
+ { currency, currencyDisplay } = {},
48
+ currencyScope,
49
+ ) {
50
+ const result = formattedParts;
51
+ if (
52
+ formattedParts.length > 1 &&
53
+ currencyDisplay === 'symbol' &&
54
+ currency &&
55
+ currencyScope.includes(currency)
56
+ ) {
57
+ formattedParts.forEach((part, i) => {
58
+ if (part.type === 'currency' && Object.keys(CURRENCY_CODE_SYMBOL_MAP).includes(currency)) {
59
+ result[i].value = '$US';
60
+ }
61
+ });
62
+ }
63
+ return result;
64
+ }
@@ -1,12 +1,12 @@
1
1
  import { getGroupSeparator } from '../../getGroupSeparator.js';
2
2
  import { forceAddGroupSeparators } from './forceAddGroupSeparators.js';
3
3
  import { forceCurrencyToEnd } from './forceCurrencyToEnd.js';
4
+ import { forceNoSpaceBetweenCurrencySymbolAndNumber } from './forceNoSpaceBetweenCurrencySymbolAndNumber.js';
4
5
  import { forceNormalSpaces } from './forceNormalSpaces.js';
5
6
  import { forceSpaceBetweenCurrencyCodeAndNumber } from './forceSpaceBetweenCurrencyCodeAndNumber.js';
6
- import { forceYenSymbol } from './forceYenSymbol.js';
7
7
  import { forceSpaceInsteadOfZeroForGroup } from './forceSpaceInsteadOfZeroForGroup.js';
8
8
  import { forceTryCurrencyCode } from './forceTryCurrencyCode.js';
9
- import { forceENAUSymbols } from './forceENAUSymbols.js';
9
+ import { forceFRBESymbols, forceSymbols } from './forceSymbols.js';
10
10
 
11
11
  /**
12
12
  * Normalizes function "formatNumberToParts"
@@ -33,9 +33,18 @@ export function normalizeIntl(formattedParts, options = {}, _locale) {
33
33
  if (_locale === 'en-GB' || _locale === 'en-US' || _locale === 'en-AU' || _locale === 'en-PH') {
34
34
  normalize = forceSpaceBetweenCurrencyCodeAndNumber(normalize, options);
35
35
  }
36
- // Force missing Japanese Yen symbol
36
+ if (_locale === 'en-AU') {
37
+ normalize = forceSymbols(normalize, options, ['EUR', 'USD', 'JPY']);
38
+ normalize = forceNoSpaceBetweenCurrencySymbolAndNumber(normalize, options);
39
+ }
40
+ if (_locale === 'en-PH') {
41
+ normalize = forceSymbols(normalize, options, ['USD', 'JPY']);
42
+ }
37
43
  if (_locale === 'fr-FR' || _locale === 'fr-BE') {
38
- normalize = forceYenSymbol(normalize, options);
44
+ normalize = forceSymbols(normalize, options, ['JPY']);
45
+ }
46
+ if (_locale === 'fr-BE') {
47
+ normalize = forceFRBESymbols(normalize, options, ['USD']);
39
48
  }
40
49
  if (_locale === 'tr-TR') {
41
50
  normalize = forceTryCurrencyCode(normalize, options);
@@ -43,9 +52,6 @@ export function normalizeIntl(formattedParts, options = {}, _locale) {
43
52
  normalize = forceCurrencyToEnd(normalize);
44
53
  }
45
54
  }
46
- if (_locale === 'en-AU') {
47
- normalize = forceENAUSymbols(normalize, options);
48
- }
49
55
  }
50
56
  return normalize;
51
57
  }
@@ -2,12 +2,6 @@ import { expect } from '@open-wc/testing';
2
2
  import { getLocalizeManager, formatNumber } from '@lion/ui/localize-no-side-effects.js';
3
3
  import { localizeTearDown } from '@lion/ui/localize-test-helpers.js';
4
4
 
5
- // TODO: This is broken only in Safari 13.1.2 Wait till ci is on 13.1.3 and remove
6
- const isSafari = (() => {
7
- const ua = navigator.userAgent.toLowerCase();
8
- return ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1;
9
- })();
10
-
11
5
  const currencyCode = /** @param {string} currency */ currency => ({
12
6
  style: 'currency',
13
7
  currencyDisplay: 'code',
@@ -278,19 +272,17 @@ Please specify .groupSeparator / .decimalSeparator on the formatOptions object t
278
272
  });
279
273
 
280
274
  describe('en-AU', () => {
281
- // TODO: This is broken only in Safari 13.1.2 Wait till ci is on 13.1.3 and remove
282
- if (isSafari) {
283
- return;
284
- }
285
-
286
275
  it('supports basics', () => {
287
276
  localizeManager.locale = 'en-AU';
288
277
  expect(formatNumber(123456.789, currencyCode('EUR'))).to.equal('EUR 123,456.79');
289
278
  expect(formatNumber(123456.789, currencyCode('USD'))).to.equal('USD 123,456.79');
290
279
  expect(formatNumber(123456.789, currencyCode('JPY'))).to.equal('JPY 123,457');
291
- expect(formatNumber(123456.789, currencySymbol('EUR'))).to.equal('€123,456.79'); // TODO: fix
292
- expect(formatNumber(123456.789, currencySymbol('USD'))).to.equal('$123,456.79'); // TODO: fix
293
- expect(formatNumber(123456.789, currencySymbol('JPY'))).to.equal('¥123,457'); // TODO: fix
280
+ expect(formatNumber(123456.789, currencySymbol('EUR'))).to.equal('€123,456.79');
281
+ expect(formatNumber(-123456.789, currencySymbol('EUR'))).to.equal('−€123,456.79');
282
+ expect(formatNumber(123456.789, currencySymbol('USD'))).to.equal('$123,456.79');
283
+ expect(formatNumber(-123456.789, currencySymbol('USD'))).to.equal('−$123,456.79');
284
+ expect(formatNumber(123456.789, currencySymbol('JPY'))).to.equal('¥123,457');
285
+ expect(formatNumber(-123456.789, currencySymbol('JPY'))).to.equal('−¥123,457');
294
286
  });
295
287
  });
296
288
 
@@ -319,11 +311,6 @@ Please specify .groupSeparator / .decimalSeparator on the formatOptions object t
319
311
  });
320
312
 
321
313
  describe('nl-BE', () => {
322
- // TODO: This is broken only in Safari 13.1.2 Wait till ci is on 13.1.3 and remove
323
- if (isSafari) {
324
- return;
325
- }
326
-
327
314
  it('supports basics', () => {
328
315
  localizeManager.locale = 'nl-BE';
329
316
  expect(formatNumber(123456.789, currencyCode('EUR'))).to.equal('123.456,79 EUR');
@@ -349,10 +336,6 @@ Please specify .groupSeparator / .decimalSeparator on the formatOptions object t
349
336
 
350
337
  describe('fr-BE', () => {
351
338
  it('supports basics', () => {
352
- // TODO: This test is broken on Safari, check and fix when the intl change is permanent
353
- if (isSafari) {
354
- return;
355
- }
356
339
  localizeManager.locale = 'fr-BE';
357
340
  expect(formatNumber(123456.789, currencyCode('EUR'))).to.equal('123 456,79 EUR');
358
341
  expect(formatNumber(123456.789, currencyCode('USD'))).to.equal('123 456,79 USD');
@@ -397,11 +380,6 @@ Please specify .groupSeparator / .decimalSeparator on the formatOptions object t
397
380
  });
398
381
 
399
382
  describe('tr-TR', () => {
400
- // TODO: This is broken only in Safari 13.1.2 Wait till ci is on 13.1.3 and remove
401
- if (isSafari) {
402
- return;
403
- }
404
-
405
383
  it('supports basics', () => {
406
384
  localizeManager.locale = 'tr-TR';
407
385
  expect(formatNumber(123456.789, currencyCode('EUR'))).to.equal('123.456,79 EUR');