1import { Platform } from 'expo-modules-core';
2
3import * as Localization from '../Localization';
4
5function validateString(result) {
6  expect(typeof result).toBe('string');
7  expect(result.length).toBeGreaterThan(0);
8}
9
10function validateStringArray(result) {
11  expect(result).toBeDefined();
12  expect(Array.isArray(result)).toBe(true);
13}
14
15if (Platform.isDOMAvailable) {
16  describe(`Localization methods`, () => {
17    it(`expect async to return locale`, async () => {
18      const {
19        currency,
20        decimalSeparator,
21        digitGroupingSeparator,
22        isoCurrencyCodes,
23        isMetric,
24        isRTL,
25        locale,
26        locales,
27        timezone,
28        region,
29      } = await Localization.getLocalizationAsync();
30
31      validateString(locale);
32      validateString(timezone);
33      validateString(region);
34      validateStringArray(isoCurrencyCodes);
35      validateStringArray(locales);
36      expect(locales[0]).toBe(Localization.locale);
37      expect(typeof isRTL).toBe('boolean');
38      expect(typeof isMetric).toBe('boolean');
39      validateString(decimalSeparator);
40      validateString(digitGroupingSeparator);
41      expect(currency).toBe(null);
42    });
43  });
44}
45
46if (Platform.isDOMAvailable) {
47  describe('region', () => {
48    it(`can resolve a region with a partial locale`, async () => {
49      jest.spyOn(navigator, 'language', 'get').mockReturnValue('en');
50
51      const Localization = require('../ExpoLocalization').default;
52      expect(Localization.locale).toBe('en');
53      expect(Localization.region).toBe(null);
54    });
55    xit(`can resolve a region from a full locale`, async () => {
56      jest.spyOn(navigator, 'language', 'get').mockReturnValue('en-us');
57
58      const Localization = require('../ExpoLocalization').default;
59      expect(Localization.locale).toBe('en-us');
60      expect(Localization.region).toBe('US');
61    });
62  });
63}
64
65describe(`Localization defines constants`, () => {
66  it('Gets the region', async () => {
67    const result = Localization.region;
68    if (Platform.isDOMAvailable) {
69      validateString(result);
70    } else {
71      expect(result).toBe(null);
72    }
73  });
74  it('Gets the locale', async () => {
75    const result = Localization.locale;
76    if (Platform.isDOMAvailable) {
77      expect(typeof result).toBe('string');
78      expect(result.length > 0).toBe(true);
79    } else {
80      // Empty in node env
81      expect(result).toBe('');
82    }
83  });
84  it('Gets the preferred locales', async () => {
85    const result = Localization.locales;
86    validateStringArray(result);
87    if (Platform.isDOMAvailable) {
88      expect(result.length).toBeGreaterThan(0);
89      expect(result[0]).toBe(Localization.locale);
90    } else {
91      expect(result.length).toBe(0);
92    }
93  });
94  it('Gets ISO currency codes', async () => {
95    const result = Localization.isoCurrencyCodes;
96    validateStringArray(result);
97    result.forEach(validateString);
98  });
99  it('Gets the timezone', async () => {
100    validateString(Localization.timezone);
101  });
102  it('Gets the layout direction (ltr only)', async () => {
103    const result = Localization.isRTL;
104    expect(typeof result).toBe('boolean');
105    expect(result).toBe(false);
106  });
107  it('Gets the measurement system (metric)', async () => {
108    const result = Localization.isMetric;
109    expect(typeof result).toBe('boolean');
110  });
111  it('Gets the decimal separator', async () => {
112    validateString(Localization.decimalSeparator);
113  });
114  it('Gets the digit grouping separator', async () => {
115    const result = Localization.digitGroupingSeparator;
116    expect(result).toBeDefined();
117    expect(typeof result).toBe('string');
118  });
119  it.skip('Gets the currency', async () => {
120    validateString(Localization.currency);
121  });
122});
123