| 'use strict'; |
| |
| const common = require('../common'); |
| |
| if (!common.hasIntl) |
| common.skip('missing Intl'); |
| |
| const buffer = require('buffer'); |
| const assert = require('assert'); |
| const orig = Buffer.from('těst ☕', 'utf8'); |
| |
| // Test Transcoding |
| const tests = { |
| 'latin1': [0x74, 0x3f, 0x73, 0x74, 0x20, 0x3f], |
| 'ascii': [0x74, 0x3f, 0x73, 0x74, 0x20, 0x3f], |
| 'ucs2': [0x74, 0x00, 0x1b, 0x01, 0x73, |
| 0x00, 0x74, 0x00, 0x20, 0x00, |
| 0x15, 0x26] |
| }; |
| |
| for (const test in tests) { |
| const dest = buffer.transcode(orig, 'utf8', test); |
| assert.strictEqual(dest.length, tests[test].length, `utf8->${test} length`); |
| for (let n = 0; n < tests[test].length; n++) |
| assert.strictEqual(dest[n], tests[test][n], `utf8->${test} char ${n}`); |
| } |
| |
| { |
| 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')); |
| } |
| |
| assert.throws( |
| () => buffer.transcode(null, 'utf8', 'ascii'), |
| { |
| name: 'TypeError', |
| code: 'ERR_INVALID_ARG_TYPE', |
| message: 'The "source" argument must be an instance of Buffer ' + |
| 'or Uint8Array. Received null' |
| } |
| ); |
| |
| assert.throws( |
| () => buffer.transcode(Buffer.from('a'), 'b', 'utf8'), |
| /^Error: Unable to transcode Buffer \[U_ILLEGAL_ARGUMENT_ERROR\]/ |
| ); |
| |
| assert.throws( |
| () => buffer.transcode(Buffer.from('a'), 'uf8', 'b'), |
| /^Error: Unable to transcode Buffer \[U_ILLEGAL_ARGUMENT_ERROR\]$/ |
| ); |
| |
| assert.deepStrictEqual( |
| buffer.transcode(Buffer.from('hi', 'ascii'), 'ascii', 'utf16le'), |
| Buffer.from('hi', 'utf16le')); |
| assert.deepStrictEqual( |
| buffer.transcode(Buffer.from('hi', 'latin1'), 'latin1', 'utf16le'), |
| Buffer.from('hi', 'utf16le')); |
| assert.deepStrictEqual( |
| buffer.transcode(Buffer.from('hä', 'latin1'), 'latin1', 'utf16le'), |
| Buffer.from('hä', 'utf16le')); |
| |
| // Test that Uint8Array arguments are okay. |
| { |
| const uint8array = new Uint8Array([...Buffer.from('hä', 'latin1')]); |
| assert.deepStrictEqual( |
| buffer.transcode(uint8array, 'latin1', 'utf16le'), |
| Buffer.from('hä', 'utf16le')); |
| } |
| |
| { |
| const dest = buffer.transcode(new Uint8Array(), 'utf8', 'latin1'); |
| assert.strictEqual(dest.length, 0); |
| } |
| |
| // Test that it doesn't crash |
| { |
| buffer.transcode(new buffer.Buffer.allocUnsafeSlow(1), 'utf16le', 'ucs2'); |
| } |