| 'use strict'; |
| const common = require('../common'); |
| const assert = require('assert'); |
| |
| const fs = require('fs'); |
| const rl = require('readline'); |
| const fixtures = require('../common/fixtures'); |
| |
| const BOM = '\uFEFF'; |
| |
| // Get the data using a non-stream way to compare with the streamed data. |
| const modelData = fixtures.readSync('file-to-read-without-bom.txt', 'utf8'); |
| const modelDataFirstCharacter = modelData[0]; |
| |
| // Detect the number of forthcoming 'line' events for mustCall() 'expected' arg. |
| const lineCount = modelData.match(/\n/g).length; |
| |
| // Ensure both without-bom and with-bom test files are textwise equal. |
| assert.strictEqual(fixtures.readSync('file-to-read-with-bom.txt', 'utf8'), |
| `${BOM}${modelData}` |
| ); |
| |
| // An unjustified BOM stripping with a non-BOM character unshifted to a stream. |
| const inputWithoutBOM = |
| fs.createReadStream(fixtures.path('file-to-read-without-bom.txt'), 'utf8'); |
| |
| inputWithoutBOM.once('readable', common.mustCall(() => { |
| const maybeBOM = inputWithoutBOM.read(1); |
| assert.strictEqual(maybeBOM, modelDataFirstCharacter); |
| assert.notStrictEqual(maybeBOM, BOM); |
| |
| inputWithoutBOM.unshift(maybeBOM); |
| |
| let streamedData = ''; |
| rl.createInterface({ |
| input: inputWithoutBOM, |
| }).on('line', common.mustCall((line) => { |
| streamedData += `${line}\n`; |
| }, lineCount)).on('close', common.mustCall(() => { |
| assert.strictEqual(streamedData, modelData); |
| })); |
| })); |
| |
| // A justified BOM stripping. |
| const inputWithBOM = |
| fs.createReadStream(fixtures.path('file-to-read-with-bom.txt'), 'utf8'); |
| |
| inputWithBOM.once('readable', common.mustCall(() => { |
| const maybeBOM = inputWithBOM.read(1); |
| assert.strictEqual(maybeBOM, BOM); |
| |
| let streamedData = ''; |
| rl.createInterface({ |
| input: inputWithBOM, |
| }).on('line', common.mustCall((line) => { |
| streamedData += `${line}\n`; |
| }, lineCount)).on('close', common.mustCall(() => { |
| assert.strictEqual(streamedData, modelData); |
| })); |
| })); |