Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions packages/csv-generate/lib/api/read.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,10 @@ const read = (options, state, size, push, close) => {
}
// Obtain record length
if (options.objectMode) {
recordLength = 0;
// recordLength is currently equal to the number of columns
// This is wrong and shall equal to 1 record only
for (const column of record) {
recordLength += column.length;
}
// Let the stream request each record independently of its column values.
state.count_created++;
push(record);
return;
} else {
// Stringify the record
record =
Expand Down
13 changes: 13 additions & 0 deletions packages/csv-generate/test/api.sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,17 @@ describe("api sync", function () {
const data = generate({ length: 1000, objectMode: true });
data.length.should.eql(1000);
});

it("preserves supported column values in objectMode", function () {
const data = generate({
length: 3,
objectMode: true,
columns: [() => "value", () => null, () => 42, () => ""],
});
data.should.eql([
["value", null, 42, ""],
["value", null, 42, ""],
["value", null, 42, ""],
]);
});
});
29 changes: 29 additions & 0 deletions packages/csv-generate/test/options.object_mode.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,35 @@ import "should";
import { generate } from "../lib/index.js";

describe("Option `objectMode`", function () {
for (const value of [42, "", "value"]) {
it(`streams ${JSON.stringify(value)} without generating all records first`, function (next) {
let generated = 0;
let generatedAtFirstRecord;
const records = [];
const generator = generate({
objectMode: true,
highWaterMark: 1,
length: 100,
columns: [
() => {
generated++;
return value;
},
],
});
generator.on("data", (record) => {
generatedAtFirstRecord ??= generated;
records.push(record);
});
generator.on("error", next);
generator.on("end", () => {
generatedAtFirstRecord.should.be.within(1, 2);
records.should.eql(Array.from({ length: 100 }, () => [value]));
next();
});
});
}

it("return an array of array", function (next) {
this.timeout(1000000);
generate({ seed: 1, objectMode: true, length: 4 }, (err, data) => {
Expand Down
17 changes: 17 additions & 0 deletions packages/csv-generate/test/options.sleep.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@ import "should";
import { generate } from "../lib/index.js";

describe("Option `sleep`", function () {
for (const value of [42, "", null, "value"]) {
it(`preserves all object records containing ${JSON.stringify(value)}`, async function () {
const data = await new Promise((resolve, reject) => {
generate(
{
objectMode: true,
length: 5,
sleep: 5,
columns: [() => value],
},
(err, data) => (err ? reject(err) : resolve(data)),
);
});
data.should.eql(Array.from({ length: 5 }, () => [value]));
});
}

it("as integer above 0", function (next) {
this.timeout(10000);
generate({ duration: 1000, sleep: 100, objectMode: true }, (err, data) => {
Expand Down
Loading