UNPKG

simple-ascii-chart

Version:
744 lines (743 loc) 59.9 kB
"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',