2016-10-11 14:12:31 -07:00
|
|
|
'use strict';
|
|
|
|
|
2017-01-09 16:40:04 +01:00
|
|
|
const common = require('../common');
|
2016-10-11 14:12:31 -07:00
|
|
|
|
2017-07-01 02:29:09 +03:00
|
|
|
if (!common.hasIntl)
|
2017-01-16 22:34:04 +01:00
|
|
|
common.skip('missing Intl');
|
2017-01-09 16:40:04 +01:00
|
|
|
|
2017-01-16 22:34:04 +01:00
|
|
|
const buffer = require('buffer');
|
|
|
|
const assert = require('assert');
|
2019-02-01 08:49:28 +01:00
|
|
|
const orig = Buffer.from('těst ☕', 'utf8');
|
2016-10-11 14:12:31 -07:00
|
|
|
|
|
|
|
// Test Transcoding
|
|
|
|
const tests = {
|
2019-02-01 08:49:28 +01:00
|
|
|
'latin1': [0x74, 0x3f, 0x73, 0x74, 0x20, 0x3f],
|
2016-10-11 14:12:31 -07:00
|
|
|
'ascii': [0x74, 0x3f, 0x73, 0x74, 0x20, 0x3f],
|
2019-02-01 08:49:28 +01:00
|
|
|
'ucs2': [0x74, 0x00, 0x1b, 0x01, 0x73,
|
2016-10-11 14:12:31 -07:00
|
|
|
0x00, 0x74, 0x00, 0x20, 0x00,
|
2019-02-01 08:49:28 +01:00
|
|
|
0x15, 0x26]
|
2016-10-11 14:12:31 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
for (const test in tests) {
|
|
|
|
const dest = buffer.transcode(orig, 'utf8', test);
|
2017-02-19 20:04:10 -08:00
|
|
|
assert.strictEqual(dest.length, tests[test].length, `utf8->${test} length`);
|
2017-01-08 13:19:00 +00:00
|
|
|
for (let n = 0; n < tests[test].length; n++)
|
2017-02-19 20:04:10 -08:00
|
|
|
assert.strictEqual(dest[n], tests[test][n], `utf8->${test} char ${n}`);
|
2016-10-11 14:12:31 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
const dest = buffer.transcode(Buffer.from(tests.ucs2), 'ucs2', 'utf8');
|
|
|
|
assert.strictEqual(dest.toString(), orig.toString());
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
const utf8 = Buffer.from('€'.repeat(4000), 'utf8');
|
|
|
|
const ucs2 = Buffer.from('€'.repeat(4000), 'ucs2');
|
|
|
|
const utf8_to_ucs2 = buffer.transcode(utf8, 'utf8', 'ucs2');
|
|
|
|
const ucs2_to_utf8 = buffer.transcode(ucs2, 'ucs2', 'utf8');
|
|
|
|
assert.deepStrictEqual(utf8, ucs2_to_utf8);
|
|
|
|
assert.deepStrictEqual(ucs2, utf8_to_ucs2);
|
|
|
|
assert.strictEqual(ucs2_to_utf8.toString('utf8'),
|
|
|
|
utf8_to_ucs2.toString('ucs2'));
|
|
|
|
}
|
|
|
|
|
2019-12-25 18:02:16 +01:00
|
|
|
assert.throws(
|
2016-12-01 11:53:56 -06:00
|
|
|
() => buffer.transcode(null, 'utf8', 'ascii'),
|
2017-10-21 11:13:04 +08:00
|
|
|
{
|
2019-12-25 18:02:16 +01:00
|
|
|
name: 'TypeError',
|
2017-10-21 11:13:04 +08:00
|
|
|
code: 'ERR_INVALID_ARG_TYPE',
|
2019-09-23 08:17:25 +02:00
|
|
|
message: 'The "source" argument must be an instance of Buffer ' +
|
|
|
|
'or Uint8Array. Received null'
|
2017-10-21 11:13:04 +08:00
|
|
|
}
|
2016-12-01 11:53:56 -06:00
|
|
|
);
|
|
|
|
|
2016-10-11 14:12:31 -07:00
|
|
|
assert.throws(
|
|
|
|
() => buffer.transcode(Buffer.from('a'), 'b', 'utf8'),
|
2016-12-01 11:53:56 -06:00
|
|
|
/^Error: Unable to transcode Buffer \[U_ILLEGAL_ARGUMENT_ERROR\]/
|
2016-10-11 14:12:31 -07:00
|
|
|
);
|
2016-12-01 11:53:56 -06:00
|
|
|
|
2016-10-11 14:12:31 -07:00
|
|
|
assert.throws(
|
|
|
|
() => buffer.transcode(Buffer.from('a'), 'uf8', 'b'),
|
2016-12-01 11:53:56 -06:00
|
|
|
/^Error: Unable to transcode Buffer \[U_ILLEGAL_ARGUMENT_ERROR\]$/
|
2016-10-11 14:12:31 -07:00
|
|
|
);
|
2016-11-29 05:22:40 -06:00
|
|
|
|
|
|
|
assert.deepStrictEqual(
|
2017-07-25 10:37:08 -07:00
|
|
|
buffer.transcode(Buffer.from('hi', 'ascii'), 'ascii', 'utf16le'),
|
|
|
|
Buffer.from('hi', 'utf16le'));
|
2016-11-29 05:22:40 -06:00
|
|
|
assert.deepStrictEqual(
|
2017-07-25 10:37:08 -07:00
|
|
|
buffer.transcode(Buffer.from('hi', 'latin1'), 'latin1', 'utf16le'),
|
|
|
|
Buffer.from('hi', 'utf16le'));
|
2016-11-29 05:22:40 -06:00
|
|
|
assert.deepStrictEqual(
|
2017-07-25 10:37:08 -07:00
|
|
|
buffer.transcode(Buffer.from('hä', 'latin1'), 'latin1', 'utf16le'),
|
|
|
|
Buffer.from('hä', 'utf16le'));
|
2016-12-10 22:28:37 +01:00
|
|
|
|
|
|
|
// Test that Uint8Array arguments are okay.
|
|
|
|
{
|
|
|
|
const uint8array = new Uint8Array([...Buffer.from('hä', 'latin1')]);
|
|
|
|
assert.deepStrictEqual(
|
2017-07-25 10:37:08 -07:00
|
|
|
buffer.transcode(uint8array, 'latin1', 'utf16le'),
|
|
|
|
Buffer.from('hä', 'utf16le'));
|
2016-12-10 22:28:37 +01:00
|
|
|
}
|
2016-12-25 01:27:23 +08:00
|
|
|
|
|
|
|
{
|
|
|
|
const dest = buffer.transcode(new Uint8Array(), 'utf8', 'latin1');
|
|
|
|
assert.strictEqual(dest.length, 0);
|
|
|
|
}
|
2021-04-21 08:23:55 -07:00
|
|
|
|
|
|
|
// Test that it doesn't crash
|
|
|
|
{
|
2025-05-09 20:41:31 +01:00
|
|
|
buffer.transcode(new buffer.Buffer.allocUnsafeSlow(1), 'utf16le', 'ucs2');
|
2021-04-21 08:23:55 -07:00
|
|
|
}
|