Files
DefinitelyTyped/types/d3-dsv/d3-dsv-tests.ts
2022-06-24 14:05:01 -07:00

401 lines
14 KiB
TypeScript

/**
* Typescript definition tests for d3/d3-dsv module
*
* Note: These tests are intended to test the definitions only
* in the sense of typing and call signature consistency. They
* are not intended as functional tests.
*/
/* tslint:disable:no-unnecessary-type-assertion */
import * as d3Dsv from 'd3-dsv';
// ------------------------------------------------------------------------------------------
// Preparatory Steps
// ------------------------------------------------------------------------------------------
const csvTestString = '1997,Ford,E350,2.34\n2000,Mercury,Cougar,2.38';
const tsvTestString = '1997\tFord\tE350\t2.34\n2000\tMercury\tCougar\t2.38';
const pipedTestString = '1997|Ford|E350|2.34\n2000|Mercury|Cougar|2.38';
const csvTestStringWithHeader = `Year,Make,Model,Length\n${csvTestString}`;
const tsvTestStringWithHeader = `Year\tMake\tModel\tLength\n${tsvTestString}`;
const pipedTestStringWithHeader = `Year|Make|Model|Length\n${pipedTestString}`;
type Headers = "Year" | "Make" | "Model" | "Length";
type ParsedHeaders = "year" | "make" | "model" | "length";
interface ParsedTestObject {
year: Date | null;
make: string;
model: string;
length: number;
}
let parseRowsArray: string[][];
let parseRowsMappedArray: ParsedTestObject[];
let parsedTestObject: ParsedTestObject;
let num: number;
let str: string;
let strMaybe: string | undefined;
let columns: string[];
let headers: Headers[];
let parsedHeaders: ParsedHeaders[];
// ------------------------------------------------------------------------------------------
// Test Shared Types and Interfaces
// ------------------------------------------------------------------------------------------
declare let row: d3Dsv.DSVRowString;
strMaybe = row.property;
declare let row2: d3Dsv.DSVRowString<Headers>;
strMaybe = row2.Make;
// @ts-expect-error
strMaybe = row2.Property;
declare let raw: d3Dsv.DSVRaw<ParsedTestObject>;
strMaybe = raw.make;
// @ts-expect-error
strMaybe = raw.property;
declare let rowArray: d3Dsv.DSVRowArray;
strMaybe = rowArray[0].property;
columns = rowArray.columns;
num = rowArray.length;
declare let rowArrayHeader: d3Dsv.DSVRowArray<Headers>;
strMaybe = rowArrayHeader[0].Make;
// @ts-expect-error
strMaybe = rowArrayHeader[0].Property;
headers = rowArrayHeader.columns;
num = rowArrayHeader.length;
declare let parseMappedArray: d3Dsv.DSVParsedArray<ParsedTestObject>;
strMaybe = parseMappedArray[0].make;
// @ts-expect-error
strMaybe = parseMappedArray[0].property;
parsedTestObject = parseMappedArray[0];
parsedHeaders = parseMappedArray.columns;
num = parseMappedArray.length;
declare let parseArray: d3Dsv.DSVParsedArray<d3Dsv.DSVRowString>;
strMaybe = parseArray[0].property;
columns = parseArray.columns;
num = parseArray.length;
// ------------------------------------------------------------------------------------------
// Test CSV
// ------------------------------------------------------------------------------------------
// csvParse(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseArray = d3Dsv.csvParse(csvTestStringWithHeader);
rowArrayHeader = d3Dsv.csvParse<Headers>(csvTestStringWithHeader);
// with row mapper ---------------------------------------------------------------------------
parseMappedArray = d3Dsv.csvParse(csvTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString = rawRow;
const i: number = index;
const c: string[] = columns;
const d: number | null = rr.Year ? +rr.Year! : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr.Make ? rr.Make! : "Missing Value",
model: rr.Model ? rr.Model! : "Missing Value",
length: rr.Length ? +rr.Length! : NaN
}
: undefined
)
: null;
return pr;
});
parseMappedArray = d3Dsv.csvParse<ParsedTestObject, Headers>(csvTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString<Headers> = rawRow;
const i: number = index;
const c: Headers[] = columns;
return parsedTestObject;
});
// csvParseRows(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseRowsArray = d3Dsv.csvParseRows(csvTestString);
strMaybe = parseRowsArray[0][0]; // 'Year' of first row
// with row mapper ---------------------------------------------------------------------------
parseRowsMappedArray = d3Dsv.csvParseRows(csvTestString, (rawRow, index) => {
const rr: string[] = rawRow;
const i: number = index;
const d: number | null = rr[0].length ? +rr[0] : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr[1].length ? rr[1] : "Missing Value",
model: rr[2].length ? rr[2] : "Missing Value",
length: rr[3].length ? +rr[3] : NaN
}
: undefined
)
: null;
return pr;
});
// csvFormat(...) ============================================================================
str = d3Dsv.csvFormat(parseRowsMappedArray);
str = d3Dsv.csvFormat(parseRowsMappedArray, ["year", "length"]);
// @ts-expect-error
str = d3Dsv.csvFormat(parseRowsMappedArray, ["year", "unknown"]);
str = d3Dsv.csvFormat(parseRowsMappedArray as readonly ParsedTestObject[], ["year", "length"] as ReadonlyArray<keyof ParsedTestObject>);
// csvFormatBody(...) ========================================================================
str = d3Dsv.csvFormatBody(parseRowsMappedArray);
// csvFormatRows(...) ========================================================================
str = d3Dsv.csvFormatRows(parseRowsMappedArray.map((d) => [
d.year ? d.year.getFullYear().toString() : '',
d.make,
d.model,
d.length.toString()
]));
// csvFormatRow(...) ========================================================================
str = d3Dsv.csvFormatRow([
parseRowsMappedArray[0].year ? parseRowsMappedArray[0].year.getFullYear().toString() : '',
parseRowsMappedArray[0].make,
parseRowsMappedArray[0].model,
parseRowsMappedArray[0].length.toString()
]);
// csvFormatValue(...) ========================================================================
str = d3Dsv.csvFormatValue(parseRowsMappedArray[0].make);
// ------------------------------------------------------------------------------------------
// Test TSV
// ------------------------------------------------------------------------------------------
// tsvParse(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseArray = d3Dsv.tsvParse(tsvTestStringWithHeader);
rowArrayHeader = d3Dsv.tsvParse<Headers>(csvTestStringWithHeader);
// with row mapper ---------------------------------------------------------------------------
parseMappedArray = d3Dsv.tsvParse(tsvTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString = rawRow;
const i: number = index;
const c: string[] = columns;
const d: number | null = rr.Year ? +rr.Year! : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr.Make ? rr.Make! : "Missing Value",
model: rr.Model ? rr.Model! : "Missing Value",
length: rr.Length ? +rr.Length! : NaN
}
: undefined
)
: null;
return pr;
});
parseMappedArray = d3Dsv.tsvParse<ParsedTestObject, Headers>(tsvTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString<Headers> = rawRow;
const i: number = index;
const c: Headers[] = columns;
return parsedTestObject;
});
// tsvParseRows(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseRowsArray = d3Dsv.tsvParseRows(tsvTestString);
strMaybe = parseRowsArray[0][0]; // 'Year' of first row
// with row mapper ---------------------------------------------------------------------------
parseRowsMappedArray = d3Dsv.tsvParseRows(tsvTestString, (rawRow, index) => {
const rr: string[] = rawRow;
const i: number = index;
const d: number | null = rr[0].length ? +rr[0] : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr[1].length ? rr[1] : "Missing Value",
model: rr[2].length ? rr[2] : "Missing Value",
length: rr[3].length ? +rr[3] : NaN
}
: undefined
)
: null;
return pr;
});
// tsvFormat(...) ============================================================================
str = d3Dsv.tsvFormat(parseRowsMappedArray);
str = d3Dsv.tsvFormat(parseRowsMappedArray, ["year", "length"]);
// @ts-expect-error
str = d3Dsv.tsvFormat(parseRowsMappedArray, ["year", "unknown"]);
// tsvFormat(...) ============================================================================
str = d3Dsv.tsvFormatBody(parseRowsMappedArray);
// tsvFormatRows(...) ========================================================================
str = d3Dsv.tsvFormatRows(parseRowsMappedArray.map((d) => [
d.year ? d.year.getFullYear().toString() : '',
d.make,
d.model,
d.length.toString()
]));
// tsvFormatRow(...) ========================================================================
str = d3Dsv.tsvFormatRow([
parseRowsMappedArray[0].year ? parseRowsMappedArray[0].year.getFullYear().toString() : '',
parseRowsMappedArray[0].make,
parseRowsMappedArray[0].model,
parseRowsMappedArray[0].length.toString()
]);
// tsvFormatValue(...) ========================================================================
str = d3Dsv.tsvFormatValue(parseRowsMappedArray[0].make);
// ------------------------------------------------------------------------------------------
// Test DSV Generalized Parsers and Formatters
// ------------------------------------------------------------------------------------------
// Create custom-delimited Parser/Formatter =================================================
let dsv: d3Dsv.DSV;
dsv = d3Dsv.dsvFormat('|');
// parse(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseArray = dsv.parse(pipedTestStringWithHeader);
rowArrayHeader = dsv.parse<Headers>(csvTestStringWithHeader);
// with row mapper ---------------------------------------------------------------------------
parseMappedArray = dsv.parse(pipedTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString = rawRow;
const i: number = index;
const c: string[] = columns;
const d: number | null = rr.Year ? +rr.Year! : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr.Make ? rr.Make! : "Missing Value",
model: rr.Model ? rr.Model! : "Missing Value",
length: rr.Length ? +rr.Length! : NaN
}
: undefined
)
: null;
return pr;
});
parseMappedArray = dsv.parse<ParsedTestObject, Headers>(pipedTestStringWithHeader, (rawRow, index, columns) => {
const rr: d3Dsv.DSVRowString<Headers> = rawRow;
const i: number = index;
const c: Headers[] = columns;
return parsedTestObject;
});
// parseRows(...) ============================================================================
// without row mapper -----------------------------------------------------------------------
parseRowsArray = dsv.parseRows(pipedTestString);
strMaybe = parseRowsArray[0][0]; // 'Year' of first row
// with row mapper ---------------------------------------------------------------------------
parseRowsMappedArray = dsv.parseRows(pipedTestString, (rawRow, index) => {
const rr: string[] = rawRow;
const i: number = index;
const d: number | null = rr[0].length ? +rr[0] : null;
const pr: ParsedTestObject | null | undefined = d !== null
? (
d > 1997
? {
year: new Date(d, 0, 1),
make: rr[1].length ? rr[1] : "Missing Value",
model: rr[2].length ? rr[2] : "Missing Value",
length: rr[3].length ? +rr[3] : NaN
}
: undefined
)
: null;
return pr;
});
// format(...) ============================================================================
str = dsv.format(parseRowsMappedArray);
str = dsv.format(parseRowsMappedArray, ["year", "length"]);
// @ts-expect-error
str = dsv.format(parseRowsMappedArray, ["year", "unknown"]);
// formatBody(...) ========================================================================
str = dsv.formatBody(parseRowsMappedArray);
// formatRows(...) ========================================================================
str = dsv.formatRows(parseRowsMappedArray.map((d) => [
d.year ? d.year.getFullYear().toString() : '',
d.make,
d.model,
d.length.toString()
]));
// formatRow(...) ========================================================================
str = dsv.formatRow([
parseRowsMappedArray[0].year ? parseRowsMappedArray[0].year.getFullYear().toString() : '',
parseRowsMappedArray[0].make,
parseRowsMappedArray[0].model,
parseRowsMappedArray[0].length.toString()
]);
// formatValue(...) ========================================================================
str = dsv.formatValue(parseRowsMappedArray[0].make);
// autoType(...) ==========================================================================
parseMappedArray = d3Dsv.csvParse<ParsedTestObject, Headers>(csvTestStringWithHeader, d3Dsv.autoType);
parseRowsMappedArray = d3Dsv.csvParseRows<ParsedTestObject>(csvTestString, d3Dsv.autoType);