node/test/parallel/test-util-text-decoder.js
2025-12-04 14:23:01 +00:00

64 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'use strict';
const common = require('../common');
const test = require('node:test');
const assert = require('node:assert');
test('TextDecoder correctly decodes windows-1252 encoded data', { skip: !common.hasIntl }, () => {
const latin1Bytes = new Uint8Array([0xc1, 0xe9, 0xf3]);
const expectedString = 'Áéó';
const decoder = new TextDecoder('windows-1252');
const decodedString = decoder.decode(latin1Bytes);
assert.strictEqual(decodedString, expectedString);
});
// Test for the difference between Latin1 and Windows-1252 in the 128-159
// range
// Ref: https://github.com/nodejs/node/issues/60888
test('TextDecoder correctly decodes windows-1252 special characters in ' +
'128-159 range', { skip: !common.hasIntl }, () => {
const decoder = new TextDecoder('windows-1252');
// Test specific characters that differ between Latin1 and Windows-1252.
// € Euro sign
assert.strictEqual(decoder.decode(Uint8Array.of(128)).codePointAt(0),
8364);
// Single low-9 quotation mark
assert.strictEqual(decoder.decode(Uint8Array.of(130)).codePointAt(0),
8218);
// Latin small letter f with hook (ƒ)
assert.strictEqual(decoder.decode(Uint8Array.of(131)).codePointAt(0),
402);
// Ÿ Latin capital letter Y with diaeresis
assert.strictEqual(decoder.decode(Uint8Array.of(159)).codePointAt(0),
376);
// Test the full range to ensure no character is treated as Latin1
// Directly.
const expectedMappings = [
[128, 8364], [129, 129], [130, 8218], [131, 402], [132, 8222],
[133, 8230], [134, 8224], [135, 8225], [136, 710], [137, 8240],
[138, 352], [139, 8249], [140, 338], [141, 141], [142, 381],
[143, 143], [144, 144], [145, 8216], [146, 8217], [147, 8220],
[148, 8221], [149, 8226], [150, 8211], [151, 8212], [152, 732],
[153, 8482], [154, 353], [155, 8250], [156, 339], [157, 157],
[158, 382], [159, 376],
];
for (const [byte, expectedCodePoint] of expectedMappings) {
const result = decoder.decode(Uint8Array.of(byte));
const actualCodePoint = result.codePointAt(0);
assert.strictEqual(
actualCodePoint,
expectedCodePoint,
`Byte 0x${byte.toString(16)} should decode to ` +
`U+${expectedCodePoint.toString(16)} but got ` +
`U+${actualCodePoint.toString(16)}`
);
}
});