1'use strict';
2// Flags: --expose-internals
3const common = require('../common');
4
5if (!common.hasIntl)
6  common.skip('missing Intl');
7
8const { internalBinding } = require('internal/test/binding');
9const icu = internalBinding('icu');
10const assert = require('assert');
11
12// Test hasConverter method
13assert(icu.hasConverter('utf-8'),
14       'hasConverter should report converter exists for utf-8');
15assert(!icu.hasConverter('x'),
16       'hasConverter should report converter does not exist for x');
17
18const tests = require('../fixtures/url-idna.js');
19const fixtures = require('../fixtures/icu-punycode-toascii.json');
20
21{
22  for (const [i, { ascii, unicode }] of tests.entries()) {
23    assert.strictEqual(ascii, icu.toASCII(unicode), `toASCII(${i + 1})`);
24    assert.strictEqual(unicode, icu.toUnicode(ascii), `toUnicode(${i + 1})`);
25    assert.strictEqual(ascii, icu.toASCII(icu.toUnicode(ascii)),
26                       `toASCII(toUnicode(${i + 1}))`);
27    assert.strictEqual(unicode, icu.toUnicode(icu.toASCII(unicode)),
28                       `toUnicode(toASCII(${i + 1}))`);
29  }
30}
31
32{
33  for (const [i, test] of fixtures.entries()) {
34    if (typeof test === 'string')
35      continue; // skip comments
36    const { comment, input, output } = test;
37    let caseComment = `case ${i + 1}`;
38    if (comment)
39      caseComment += ` (${comment})`;
40    if (output === null) {
41      assert.throws(
42        () => icu.toASCII(input),
43        {
44          code: 'ERR_INVALID_ARG_VALUE',
45          name: 'TypeError',
46          message: 'Cannot convert name to ASCII'
47        }
48      );
49      icu.toASCII(input, true); // Should not throw.
50    } else {
51      assert.strictEqual(icu.toASCII(input), output, `ToASCII ${caseComment}`);
52      assert.strictEqual(icu.toASCII(input, true), output,
53                         `ToASCII ${caseComment} in lenient mode`);
54    }
55    icu.toUnicode(input); // Should not throw.
56  }
57}
58