simple-ascii-chart
Version:
Simple ascii chart generator
744 lines (743 loc) • 59.9 kB
JavaScript
"use strict";
var __read = (this && this.__read) || function (o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m) return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
}
catch (error) { e = { error: error }; }
finally {
try {
if (r && !r.done && (m = i["return"])) m.call(i);
}
finally { if (e) throw e.error; }
}
return ar;
};
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
Object.defineProperty(exports, "__esModule", { value: true });
var plot_1 = require("../plot");
describe('plot', function () {
var mockedData = [
[1, 1],
[2, 2],
];
describe('plot', function () {
describe('plot with yRange', function () {
var data = [
[1, 10],
[2, 20],
[3, 30],
[4, 40],
[5, 50],
];
it('filters out values outside of the yRange', function () {
var chart = (0, plot_1.plot)(data, { width: 10, height: 5, yRange: [15, 45] });
expect(chart).toBe("\n \u25B2 \n \u2502 \n40\u2524 \u250F\u2501 \n30\u2524 \u250F\u2501\u2501\u2501\u251B \n20\u2524\u2501\u2501\u2501\u2501\u251B \n \u2502 \n \u2514\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n 2 3 4 \n");
});
it('shows all values if yRange fully encompasses data', function () {
var chart = (0, plot_1.plot)(data, { width: 10, height: 5, yRange: [5, 55] });
expect(chart).toBe("\n \u25B2 \n50\u2524 \u250F\u2501 \n40\u2524 \u250F\u2501\u251B \n30\u2524 \u250F\u2501\u251B \n20\u2524 \u250F\u2501\u2501\u251B \n10\u2524\u2501\u251B \n \u2514\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u252C\u25B6\n 1 2 3 4 5 \n");
});
it('filters all points if they fall outside the yRange', function () {
var chart = (0, plot_1.plot)(data, { width: 10, height: 5, yRange: [60, 70] });
expect(chart).toBe("\n\u25B2 \n\u2502 \n\u2502 \n\u2502 \n\u2502 \n\u2502 \n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25B6\n");
});
it('displays partial data if only some points are in yRange', function () {
var partialData = [
[1, 10],
[2, 20],
[3, 5],
[4, 30],
[5, 15],
];
var chart = (0, plot_1.plot)(partialData, { width: 10, height: 5, yRange: [10, 30] });
expect(chart).toBe("\n \u25B2 \n30\u2524 \u250F\u2501\u2513 \n \u2502 \u2503 \u2503 \n20\u2524 \u250F\u2501\u2501\u2501\u2501\u251B \u2503 \n15\u2524 \u2503 \u2517\u2501 \n10\u2524\u2501\u251B \n \u2514\u252C\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u252C\u25B6\n 1 2 4 5 \n");
});
});
it('Return empty string if values are not present', function () {
var chart = (0, plot_1.plot)([]);
expect(chart).toStrictEqual('');
});
});
describe.each([
[
'generates output with custom formatter',
[
[0, 6000],
[100, 9000],
[200, 9100],
[300, 9200],
[400, 9344],
[500, 9877],
[600, 10200],
[700, 15000],
[800, 9100],
[900, 9200],
[1000, 9344],
[1100, 9877],
[1200, 10001],
[1300, 9000],
[1400, 9100],
[1500, 9200],
[1600, 9344],
[1700, 9877],
[1800, 10001],
[1900, 9000],
[2000, 9100],
[2100, 9200],
[2200, 9344],
[2300, 9877],
[2400, 10001],
[2500, 10001],
[2600, 9000],
[2700, 9100],
[2800, 9200],
[2900, 9344],
[3000, 9877],
[3100, 10001],
],
{
height: 12,
width: 60,
hideXAxis: true,
formatter: function (value) {
if (Math.abs(value) > 1000)
return "".concat(value / 1000, "k");
return value;
},
},
"\n \u25B2 \n 15k\u2524 \u250F\u2501\u2513 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n9.877k\u2524 \u250F\u2501\u2501\u251B \u2503 \u250F\u2501\u2501\u2501\u2513 \u250F\u2501\u2501\u2501\u2513 \u250F\u2501\u2501\u2501\u2501\u2513 \u250F\u2501\u2501\u2501 \n 9k\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 6k\u2524\u2501\u251B \n \u2502 \n",
],
[
'generates output with formatter for large numbers',
[
[-9000, 2000],
[-8000, -3000],
[-2000, -2000],
[2000, 2000],
[3000, 1500],
[4000, 5000],
[10000, 1400],
[11000, 20000],
[12000, 30000],
],
{
width: 60,
height: 20,
},
"\n \u25B2 \n30k\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n20k\u2524 \u250F\u2501\u2501\u251B \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 5k\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \u2503 \n \u2502 \u2503 \u2503 \u2503 \n 2k\u2524\u2501\u2501\u2513 \u250F\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u251B \n \u2502 \u2503 \u2503 \n-2k\u2524 \u2503 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n-3k\u2524 \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u25B6\n -9k-8k -2k 2k 3k 4k 10k11k12k \n",
],
[
'generates output with formatter for categorical data',
[
[0, -10],
[1, 0.001],
[2, 10],
[3, 200],
[4, 10000],
[5, 2000000],
[6, 50000000],
],
{
width: 30,
height: 20,
formatter: function (n, _a) {
var axis = _a.axis;
var labels = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
if (axis === 'y')
return n;
return labels[n] || 'X';
},
},
"\n \u25B2 \n50000000\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 2000000\u2524 \u250F\u2501\u2501\u2501\u2501\u251B \n -10\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u25B6\n A B C D E F G \n",
],
[
'generates shift for first item in y axis',
[
[-213213, 1],
[5, -2],
[30000, 3],
],
{ width: 30, height: 10 },
"\n \u25B2 \n 3\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 1\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n \u2502 \u2503 \u2503 \n -2\u2524 \u2517\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n-213.213k 5 30k \n",
],
[
'generates shift for formatted items',
[
[3, -2000000],
[5, -2],
[6, 3000000000],
],
{ width: 10, height: 10 },
"\n \u25B2 \n3000000k\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n -2000k\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u252C\u25B6\n 3 5 6 \n",
],
[
'adds label',
[
[3, -30],
[5, -2],
[6, 3],
],
{ width: 30, xLabel: 'x values', yLabel: 'y values', height: 10 },
"\n \u25B2 \n 3\u2524 \u250F\u2501 \n -2\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \ny \u2502 \u2503 \n \u2502 \u2503 \nv \u2502 \u2503 \na \u2502 \u2503 \nl \u2502 \u2503 \nu \u2502 \u2503 \ne \u2502 \u2503 \ns-30\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 3 5 6 \n x values \n",
],
[
'generates output y axis shift with formatter',
[
[0.001, 0.001],
[0.002, 0.004],
[0.003, 0.002],
[0.004, -0.001],
[0.005, 0.004],
[0.006, 0.014],
],
{
width: 20,
height: 10,
formatter: function (n) { return Number(n.toFixed(0)); },
},
"\n \u25B2 \n0\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u250F\u2501\u2501\u2501\u2513 \u250F\u2501\u2501\u2501\u251B \n0\u2524 \u2503 \u2517\u2501\u2501\u2513 \u2503 \n0\u2524\u2501\u2501\u2501\u251B \u2503 \u2503 \n0\u2524 \u2517\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n 0 0 0 0 0 0 \n",
],
[
'generates output y axis shift',
[
[0.001, 0.001],
[0.002, 0.004],
[0.003, 0.002],
[0.004, -0.001],
[0.005, 0.004],
[0.006, 0.014],
],
{
width: 20,
height: 10,
},
"\n \u25B2 \n 0.014\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 0.004\u2524 \u250F\u2501\u2501\u2501\u2513 \u250F\u2501\u2501\u2501\u251B \n 0.002\u2524 \u2503 \u2517\u2501\u2501\u2513 \u2503 \n 0.001\u2524\u2501\u2501\u2501\u251B \u2503 \u2503 \n-0.001\u2524 \u2517\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n 0.001 0.003 0.005 \n 0.002 0.004 0.006\n",
],
[
'adds border',
[
[1, 1],
[2, 4],
[3, 4],
[4, 2],
[5, -1],
[6, 3],
[7, -1],
[8, 9],
],
{ symbols: { border: '█' }, xLabel: 'x', yLabel: 'y', width: 20, height: 8 },
"\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\n\u2588 \u25B2 \u2588\n\u2588 9\u2524 \u250F\u2501 \u2588\n\u2588 \u2502 \u2503 \u2588\n\u2588 \u2502 \u2503 \u2588\n\u2588 4\u2524 \u250F\u2501\u2501\u2501\u2501\u2513 \u2503 \u2588\n\u2588 3\u2524 \u2503 \u2503 \u250F\u2501\u2513 \u2503 \u2588\n\u2588y 2\u2524 \u2503 \u2517\u2501\u2501\u2513 \u2503 \u2503 \u2503 \u2588\n\u2588 1\u2524\u2501\u2501\u251B \u2503 \u2503 \u2503 \u2503 \u2588\n\u2588 -1\u2524 \u2517\u2501\u2501\u251B \u2517\u2501\u2501\u251B \u2588\n\u2588 \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\u2588\n\u2588 1 2 3 4 5 6 7 8 \u2588\n\u2588 x \u2588\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\n",
],
[
'show tick labels',
[
[1, 0],
[2, 20],
[3, 29],
],
{ height: 10, width: 20, showTickLabel: true },
"\n \u25B2 \n26\u2524 \u250F\u2501 \n23\u2524 \u2503 \n20\u2524 \u2503 \n17\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n15\u2524 \u2503 \n12\u2524 \u2503 \n 9\u2524 \u2503 \n 6\u2524 \u2503 \n 3\u2524 \u2503 \n 0\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 \n",
],
[
'bar chart with ticks',
[
[1, 0],
[2, 20],
[3, 29],
],
{ height: 10, barChart: true, width: 20, showTickLabel: true },
"\n \u25B2 \u2588 \n26\u2524 \u2588 \n23\u2524 \u2588 \n20\u2524 \u2588 \u2588 \n17\u2524 \u2588 \u2588 \n15\u2524 \u2588 \u2588 \n12\u2524 \u2588 \u2588 \n 9\u2524 \u2588 \u2588 \n 6\u2524 \u2588 \u2588 \n 3\u2524\u2588 \u2588 \u2588 \n 0\u2524\u2588 \u2588 \u2588 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 \n",
],
[
'horizontal bar chart with ticks',
[
[1, 0],
[2, 20],
[3, 29],
],
{ height: 10, horizontalBarChart: true, width: 20, showTickLabel: true },
"\n \u25B2 \n26\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n23\u2524 \n20\u2524 \n17\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n15\u2524 \n12\u2524 \n 9\u2524 \n 6\u2524 \n 3\u2524 \n 0\u2524 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 \n",
],
[
'horizontal bar chart with axis center',
[
[0, 3],
[1, 2],
[2, 3],
[3, 4],
[4, -2],
[5, -5],
[6, 2],
[7, 0],
],
{
horizontalBarChart: true,
showTickLabel: true,
width: 40,
height: 20,
axisCenter: [3, 1],
},
"\n \u25B2 \n 4\u2524 \n \u2502 \n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u25883\u2524 \n \u2502 \n \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u25882\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2502 \n\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u25001\u2524\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u25B6\n0 1 2 3 4 5 6 7 \n 0\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2502 \n -1\u2524 \n \u2502 \n -2\u2524 \n \u2502\u2588\u2588\u2588\u2588\u2588 \n -3\u2524 \n \u2502 \n -4\u2524 \n \u2502 \n \u2502 \n -5\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2502 \n",
],
[
'adds single legend at top and overrides symbols',
[
[1, 5],
[3, 0],
],
{
width: 10,
height: 10,
legend: { position: 'top', series: 'first' },
symbols: { axis: { n: 'A' } },
},
"\n\u2588 first \n A \n5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 3 \n",
],
[
'bar chart with axis',
[
[0, 3],
[1, 2],
[2, 3],
[3, 4],
[4, -2],
[5, -5],
[6, 2],
[7, 0],
],
{
title: 'bar chart with axis',
barChart: true,
showTickLabel: true,
width: 40,
axisCenter: [0, 0],
},
"\nbar chart with axis \n \u25B2 \u2588 \n 4\u2524 \u2588 \u2588 \n 3\u2524 \u2588 \u2588 \u2588 \u2588 \n 2\u2524 \u2588 \u2588 \u2588 \u2588 \n 1\u2524 \u2588 \u2588 \u2588 \u2588 \u2588 \n 0\u2524\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u25B6\n-1\u2524 1 2 3 4 5 6 7 \n-2\u2524 \u2588 \n-3\u2524 \u2588 \n-4\u2524 \u2588 \n-5\u2524 \n \u2502 \n",
],
[
'adds single legend at bottom and overrides symbols',
[
[1, 5],
[3, 0],
],
{
width: 10,
height: 10,
legend: { position: 'bottom', series: 'first' },
symbols: { axis: { n: 'A' } },
},
"\n A \n5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 3 \n\u2588 first \n",
],
[
'adds single legend at left and overrides symbols',
[
[1, 5],
[3, 0],
],
{
width: 10,
height: 10,
legend: { position: 'left', series: 'first' },
symbols: { axis: { n: 'A' } },
},
"\n\u2588 first A \n 5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 3 \n",
],
[
'show threshold',
[
[1, 1],
[2, 4],
[3, 4],
[4, 2],
[5, -1],
[6, 3],
[7, -1],
[8, 9],
],
{
width: 40,
thresholds: [
{
y: 5,
x: 5,
},
{
x: 2,
},
],
},
"\n \u25B2 \u2503 \u2503 \n 9\u2524 \u2503 \u2503 \u250F\u2501 \n \u2502 \u2503 \u2503 \u2503 \n \u2502 \u2503 \u2503 \u2503 \n \u2502 \u2503 \u2503 \u2503 \n \u2502\u2501\u2501\u2501\u2501\u2501\u2501\u2503\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n 4\u2524 \u250F\u2503\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \u2503 \u2503 \n 3\u2524 \u2503\u2503 \u2503 \u2503 \u250F\u2501\u2501\u2501\u2501\u2513 \u2503 \n 2\u2524 \u2503\u2503 \u2517\u2501\u2501\u2501\u2501\u2513\u2503 \u2503 \u2503 \u2503 \n 1\u2524\u2501\u2501\u2501\u2501\u2501\u251B\u2503 \u2503\u2503 \u2503 \u2503 \u2503 \n \u2502 \u2503 \u2503\u2503 \u2503 \u2503 \u2503 \n-1\u2524 \u2503 \u2517\u2503\u2501\u2501\u2501\u2501\u251B \u2517\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'adds single legend at right and overrides symbols',
[
[1, 5],
[3, 0],
],
{
width: 10,
height: 10,
legend: { position: 'right', series: 'first' },
symbols: { axis: { n: 'A' } },
},
"\n A \u2588 first\n5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6 \n 1 3 \n",
],
[
'adds single legend',
[
[1, 5],
[3, 0],
],
{ width: 10, height: 10, legend: { position: 'bottom', series: 'first' } },
"\n \u25B2 \n5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 3 \n\u2588 first \n",
],
[
'adds legend bottom',
[
[
[1, 1],
[2, 2],
[3, 4],
[4, 6],
],
[
[5, 4],
[6, 1],
[7, 2],
[8, 3],
],
],
{
width: 20,
fillArea: true,
legend: { position: 'bottom', series: ['first', 'second'] },
},
"\n \u25B2 \n6\u2524 \u2588\u2588 \n \u2502 \u2588\u2588 \n4\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \n3\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588 \n2\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \n1\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n\u2588 first \n\u2588 second \n",
],
[
'adds legend top',
[
[
[1, 1],
[2, 2],
[3, 4],
[4, 6],
],
[
[5, 4],
[6, 1],
[7, 2],
[8, 3],
],
],
{
width: 20,
fillArea: true,
legend: { position: 'top', series: ['first', 'second'] },
},
"\n\u2588 first \n\u2588 second \n \u25B2 \n6\u2524 \u2588\u2588 \n \u2502 \u2588\u2588 \n4\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \n3\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588 \n2\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \n1\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'adds legend left',
[
[
[1, 1],
[2, 2],
[3, 4],
[4, 6],
],
[
[5, 4],
[6, 1],
[7, 2],
[8, 3],
],
],
{
width: 20,
fillArea: true,
legend: { position: 'left', series: ['first', 'second'] },
},
"\n\u2588 first \u25B2 \n\u2588 second6\u2524 \u2588\u2588 \n \u2502 \u2588\u2588 \n 4\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \n 3\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588 \n 2\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \n 1\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'adds legend right',
[
[
[1, 1],
[2, 2],
[3, 4],
[4, 6],
],
[
[5, 4],
[6, 1],
[7, 2],
[8, 3],
],
],
{
width: 20,
fillArea: true,
legend: { position: 'right', series: ['first', 'second'] },
},
"\n \u25B2 \u2588 first \n6\u2524 \u2588\u2588 \u2588 second\n \u2502 \u2588\u2588 \n4\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \n3\u2524 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588 \n2\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \n1\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6 \n 1 2 3 4 5 6 7 8 \n",
],
[
'custom line formatter for a single field',
[
[1, 0],
[2, 20],
[3, 29],
[4, 10],
[5, 3],
[6, 40],
[7, 0],
[8, 20],
],
{
height: 10,
width: 30,
lineFormatter: function (_a) {
var _b;
var y = _a.y, plotX = _a.plotX, plotY = _a.plotY, input = _a.input, index = _a.index;
var output = [{ x: plotX, y: plotY, symbol: '█' }];
if (((_b = input[index - 1]) === null || _b === void 0 ? void 0 : _b[1]) < y) {
return __spreadArray(__spreadArray([], __read(output), false), [{ x: plotX, y: plotY - 1, symbol: '▲' }], false);
}
return __spreadArray(__spreadArray([], __read(output), false), [{ x: plotX, y: plotY + 1, symbol: '▼' }], false);
},
},
"\n \u25B2 \u25B2 \n40\u2524 \u2588 \n \u2502 \u25B2 \n29\u2524 \u2588 \n \u2502 \u25B2 \u25B2 \n20\u2524 \u2588 \u2588 \n \u2502 \n \u2502 \n10\u2524 \u2588 \n 3\u2524 \u25BC \u2588 \n 0\u2524\u2588 \u25BC \u2588 \n \u2514\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'custom line formatter for a single field',
[
[1, 0],
[2, 20],
[3, 29],
[4, 10],
[5, 3],
[6, 40],
[7, 0],
[8, 20],
],
{
height: 10,
width: 30,
lineFormatter: function (_a) {
var _b;
var y = _a.y, plotX = _a.plotX, plotY = _a.plotY, input = _a.input, index = _a.index;
if (((_b = input[index - 1]) === null || _b === void 0 ? void 0 : _b[1]) < y) {
return { x: plotX, y: plotY, symbol: '+' };
}
return { x: plotX, y: plotY - 1, symbol: '-' };
},
},
"\n \u25B2 \n40\u2524 + \n \u2502 \n29\u2524 + \n \u2502 \n20\u2524 + + \n \u2502 \n \u2502 - \n10\u2524 - \n 3\u2524- - \n 0\u2524 \n \u2514\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'generates output with y shift',
[
[10, 10],
[-5, -5],
[2, 3],
[20, 4],
],
{ width: 20, height: 4 },
"\n \u25B2 \n10\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n 3\u2524 \u250F\u2501\u2501\u2501\u2501\u2501\u251B \u2517\u2501 \n \u2502 \u2503 \n-5\u2524\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n -5 2 10 20 \n",
],
[
'generates output with similar small y values',
[
[-8, 8],
[-4, 4],
[-3, 3],
[80, 80],
],
{ width: 60, height: 10 },
"\n \u25B2 \n80\u2524 \u250F\u2501 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n 8\u2524\u2501\u2501\u2513 \u2503 \n 4\u2524 \u2517\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n -8 -4 80 \n",
],
[
'generates output without specified size',
[
[1, 5],
[3, 0],
],
{ width: undefined, height: undefined },
"\n \u25B2 \n5\u2524\u2513 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n0\u2524\u2517\u2501 \n \u2514\u252C\u252C\u25B6\n 13 \n",
],
[
'generates output with title ',
[
[1, 5],
[3, 0],
],
{ width: 10, height: 10, title: 'title' },
"\ntitle \n \u25B2 \n5\u2524\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2513 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n \u2502 \u2503 \n0\u2524 \u2517\u2501 \n \u2514\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252C\u25B6\n 1 3 \n",
],
[
'generates output with title ',
[
[1, 5],
[3, 0],
],
{
title: 'verylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitle',
},
"\nverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitleverylongtitle\n \u25B2 \n5\u2524\u2513 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n0\u2524\u2517\u2501 \n \u2514\u252C\u252C\u25B6\n 13 \n",
],
[
'sorts output',
[
[3, 0],
[1, 5],
],
{ width: undefined, height: undefined },
"\n \u25B2 \n5\u2524\u2513 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n \u2502\u2503 \n0\u2524\u2517\u2501 \n \u2514\u252C\u252C\u25B6\n 13 \n",
],
[
'special case',
[
[1, 1000],
[3, 2000],
],
{ width: 2, height: 2 },
"\n \u25B2 \n2k\u2524\u250F\u2501 \n1k\u2524\u251B \n \u2514\u252C\u252C\u25B6\n 13 \n",
],
[
'fill area',
[
[1, -5],
[2, 2],
[3, 3],
[4, 4],
[5, 10],
[6, 0],
[7, -0.5],
[8, 3],
],
{ width: 20, height: 8, fillArea: true },
"\n \u25B2 \n10\u2524 \u2588\u2588\u2588\u2588 \n \u2502 \u2588\u2588\u2588\u2588 \n \u2502 \u2588\u2588\u2588\u2588 \n 3\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \n 2\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588 \n 0\u2524 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2502 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n-5\u2524\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'fill area with custom symbol',
[
[1, -5],
[2, 2],
[3, 3],
[4, 4],
[5, 10],
[6, 0],
[7, -0.5],
[8, 3],
],
{ width: 20, height: 8, fillArea: true, symbols: { chart: { area: 'O' } } },
"\n \u25B2 \n10\u2524 OOOO \n \u2502 OOOO \n \u2502 OOOO \n 3\u2524 OOOOOOOOOO OO \n 2\u2524 OOOOOOOOOOOO OO \n 0\u2524 OOOOOOOOOOOOOOOOOO \n \u2502 OOOOOOOOOOOOOOOOOO \n-5\u2524OOOOOOOOOOOOOOOOOOOO \n \u2514\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u2500\u252C\u2500\u252C\u2500\u2500\u252C\u25B6\n 1 2 3 4 5 6 7 8 \n",
],
[
'generates basic output',
mockedData,
{ width: 2, height: 2 },
"\n \u25B2 \n2\u2524\u250F\u2501 \n1\u2524\u251B \n \u2514\u252C\u252C\u25B6\n 12 \n",
],
[
'special case',
[
[1, 1],
[2, 2],
[3, 2],
],
{ width: 3, height: 3 },
"\n \u25B2 \n2\u2524\u250F\u2501\u2501 \n \u2502\u2503 \n1\u2524\u251B \n \u2514\u252C\u252C\u252C\u25B6\n 123 \n",
],
[
'scale vertically',
mockedData,
{ width: 4, height: 2 },
"\n \u25B2 \n2\u2524 \u250F\u2501 \n1\u2524\u2501\u2501\u251B \n \u2514\u252C\u2500\u2500\u252C\u25B6\n 1 2 \n",
],
[
'scale horizontally',
mockedData,
{ width: 2, height: 4 },
"\n \u25B2 \n2\u2524\u250F\u2501 \n \u2502\u2503 \n \u2502\u2503 \n1\u2524\u251B \n \u2514\u252C\u252C\u25B6\n 12 \n",
],
[
'generates more complex plot',
[
[1, 1],
[2, 2],
[3, 3],
[4, 4],
],
{ width: 4, height: 4 },
"\n \u25B2 \n4\u2524 \u250F\u2501 \n3\u2524 \u250F\u251B \n2\u2524\u250F\u251B \n1\u2524\u251B \n \u2514\u252C\u252C\u252C\u252C\u25B6\n 1234 \n",
],
[
'overrides symbols',
[
[1, 2],
[2, 0],
[3, 5],
[4, 2],
[5, -2],
[6, 3],
],
{
symbols: {
empty: '-',
axis: {
n: 'A',
ns: 'i',
y: 't',
nse: 'o',
x: 'j',
we: 'm',
e: 'B',
},
chart: {
we: '1',
wns: '2',
ns: '3',
nse: '4',
wsn: '5',
sne: '6',
},
},
width: 40,
height: 10,
},
"\n-A-----------------------------------------\n5t---------------61111112------------------\n-i---------------3------3------------------\n-i---------------3------3------------------\n3t---------------3------3---------------61-\n2t11111112-------3------411111112-------3--\n-i-------3-------3--------------3-------3--\n0t-------411111115--------------3-------3--\n-i------------------------------3-------3--\n-i------------------------------3-------3--\n2t------------------------------411111115--\n-ojmmmmmmmjmmmmmmmjmmmmmmjmmmmmmmjmmmmmmmjB\n--1-------2-------3------4-------5-------6-\n",
],
[
'overrides background',
[
[1, 2],
[2, 0],
[3, 5],
[4, 2],
[5, -2],
[6, 3],
],
{
symbols: {
background: '░',
empty: '-',
axis: {
n: 'A',
ns: 'i',
y: 't',
nse: 'o',
x: 'j',