comma-separated-values
Version:
Simple, blazing-fast CSV parsing/encoding in JavaScript. Full RFC 4180 compliance.
137 lines (128 loc) • 4.85 kB
JavaScript
var CSV = require("./csv"),
assert = require("assert"),
deepEqual = require("deep-equal"),
fs = require("fs"),
sets = ["marriage_census", "worldbank"],
data = {
marriage_census: {},
worldbank: {}
};
sets.forEach(function(set) {
fs.readFile("./datasets/csv/" + set + ".csv", "utf8", function(err, res) {
data[set].csv = res;
});
fs.readFile("./datasets/json/" + set + ".json", "utf8", function(err, res) {
data[set].json = JSON.parse(res);
});
});
describe("CSV", function() {
describe("#parse()", function() {
it("should return nothing if no data", function() {
var expected = [],
actual = "";
assert.deepEqual(expected, new CSV(actual).parse());
});
it("should parse edge cases", function() {
var expected = [
[[1, 2, "3,4"]],
[[1, 2, "\"3,4\""]],
[[1, 2, "3\n4"]]
],
actual = [
'1,2,"3,4"',
'1,2,"""3,4"""',
'1,2,"3\n4"'
];
expected.map(function(result, index) {
assert.deepEqual(result, new CSV(actual[index]).parse());
});
});
it("should parse with no headers", function() {
var expected = [[1, 2, 3, 4], [5, 6, 7, 8]],
actual = '1,2,3,4\r\n5,6,7,8\r\n';
assert.deepEqual(expected, new CSV(actual).parse());
});
it("should parse with headers", function() {
var expected = [{ name: "Will", age: 32 }],
actual = "name,age\r\nWill,32\r\n";
assert.deepEqual(expected, new CSV(actual, { header: true }).parse());
});
it("should parse files", function() {
sets.forEach(function(set) {
assert.deepEqual(data[set].json, new CSV(data[set].csv, { header: true }).parse());
});
});
it("should parse with headers and cast", function() {
var expected = [{ name: "Will", age: 32, tel: "1009999" }],
actual = "name,age,tel\r\nWill,32,1009999\r\n";
assert.ok(deepEqual(expected, new CSV(actual, { header: true, cast: ["String", "Number", "String"] }).parse(), {strict: true}));
});
it("should parse with cast", function() {
var expected = [["123", 456], ["", 0]],
actual = "123,456\r\n,\r\n";
assert.deepEqual(expected, new CSV(actual, { cast: ["String", "Number"] }).parse());
});
it("should parse with custom cast", function() {
var customFunc = function(val) { return val === '' ? null : String(val); },
options = { cast: [customFunc, customFunc] },
expected = [["123", "456"], [null, ""]],
actual = "123,456\r\n,\r\n";
assert.deepEqual(expected, new CSV(actual, { cast: [customFunc, "String"] }).parse());
});
});
describe("#encode()", function() {
it("should return an empty string if no data", function() {
var expected = "",
actual = [];
assert.deepEqual(expected, new CSV(actual).encode());
});
it("should encode edge cases", function() {
var expected = [
'1,2,"3,4"',
'1,2,"""3,4"""',
'1,2,"3\n4"',
'1,2,"3\n4"',
'1,2,"3\n4"'
],
actual = [
[[1, 2, "3,4"]],
[[1, 2, "\"3,4\""]],
[[1, 2, "3\n4"]],
[[1, 2, "3\n4"]],
[[1, 2, "3\n4"]]
];
expected.map(function(result, index) {
assert.deepEqual(result, new CSV(actual[index], { line: "\n" }).encode());
});
});
it("should encode with no headers", function() {
var expected = '1,2,3,4\r\n5,6,7,8',
actual = [[1, 2, 3, 4], [5, 6, 7, 8]];
assert.deepEqual(expected, new CSV(actual).encode());
});
it("should encode with headers", function() {
var expected = "\"name\",\"age\"\r\n\"Will\",32",
actual = [{ name: "Will", age: 32 }];
assert.deepEqual(expected, new CSV(actual, { header: true }).encode());
});
it("should encode files", function() {
var options = { header: true, lineDelimiter: "\n" };
sets.forEach(function(set) {
assert.deepEqual(data[set].csv, new CSV(data[set].json, options).encode());
});
});
it("should encode with cast", function() {
var options = { cast: ["String", "Primitive"] },
expected = "\"123\",\r\n\"null\",456",
actual = [["123", null], [null, "456"]];
assert.deepEqual(expected, new CSV(actual, options).encode());
});
it("should encode with custom cast", function() {
var customFunc = function(val) { return val === null ? '' : this.string(val); },
options = { cast: [customFunc, customFunc] },
expected = "\"123\",\r\n,\"456\"",
actual = [["123", null], [null, "456"]];
assert.deepEqual(expected, new CSV(actual, options).encode());
});
});
});