From 91164e8c66a4d767fc629d0a98ae5cce263efbbf Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 13 Jul 2020 20:20:05 +0300 Subject: [PATCH] Line hide (#7612) * Add support for description in fixtures * Update datasetController to draw active(s) last * Handle hiding of line by borderWidth * Disable filling of scatter charts by default * Make radar chart consistent with line --- src/controllers/controller.line.js | 49 +++----------- src/controllers/controller.radar.js | 26 +++++--- src/controllers/controller.scatter.js | 3 +- src/core/core.datasetController.js | 26 ++++++-- src/elements/element.line.js | 13 ++-- test/fixture.js | 3 +- .../controller.line/borderWidth/zero.js | 49 ++++++++++++++ .../controller.line/borderWidth/zero.png | Bin 0 -> 9636 bytes .../controller.line/showLines/dataset.js | 36 ++++++++++ .../controller.line/showLines/dataset.png | Bin 0 -> 6618 bytes .../controller.line/showLines/false.js | 28 ++++++++ .../controller.line/showLines/false.png | Bin 0 -> 10800 bytes .../controller.radar/borderWidth/zero.js | 46 +++++++++++++ .../controller.radar/borderWidth/zero.png | Bin 0 -> 15511 bytes .../controller.radar/showLines/value.js | 48 +++++++++++++ .../controller.radar/showLines/value.png | Bin 0 -> 33142 bytes .../controller.scatter/showLines/true.js | 33 +++++++++ .../controller.scatter/showLines/true.png | Bin 0 -> 3227 bytes .../controller.scatter/showLines/undefined.js | 32 +++++++++ .../showLines/undefined.png | Bin 0 -> 2016 bytes test/matchers.js | 5 +- test/specs/controller.line.tests.js | 63 ------------------ test/specs/controller.radar.tests.js | 12 ++-- test/specs/controller.scatter.tests.js | 49 +------------- 24 files changed, 334 insertions(+), 187 deletions(-) create mode 100644 test/fixtures/controller.line/borderWidth/zero.js create mode 100644 test/fixtures/controller.line/borderWidth/zero.png create mode 100644 test/fixtures/controller.line/showLines/dataset.js create mode 100644 test/fixtures/controller.line/showLines/dataset.png create mode 100644 test/fixtures/controller.line/showLines/false.js create mode 100644 test/fixtures/controller.line/showLines/false.png create mode 100644 test/fixtures/controller.radar/borderWidth/zero.js create mode 100644 test/fixtures/controller.radar/borderWidth/zero.png create mode 100644 test/fixtures/controller.radar/showLines/value.js create mode 100644 test/fixtures/controller.radar/showLines/value.png create mode 100644 test/fixtures/controller.scatter/showLines/true.js create mode 100644 test/fixtures/controller.scatter/showLines/true.png create mode 100644 test/fixtures/controller.scatter/showLines/undefined.js create mode 100644 test/fixtures/controller.scatter/showLines/undefined.png diff --git a/src/controllers/controller.line.js b/src/controllers/controller.line.js index a44f81115..53083db0e 100644 --- a/src/controllers/controller.line.js +++ b/src/controllers/controller.line.js @@ -5,23 +5,15 @@ import {resolve} from '../helpers/helpers.options'; export default class LineController extends DatasetController { - constructor(chart, datasetIndex) { - super(chart, datasetIndex); - - this._showLine = false; - } - update(mode) { const me = this; const meta = me._cachedMeta; const line = meta.dataset; const points = meta.data || []; - const options = me.chart.options; - const config = me._config; - const showLine = me._showLine = valueOrDefault(config.showLine, options.showLines); // Update Line - if (showLine && mode !== 'resize') { + // In resize mode only point locations change, so no need to set the points or options. + if (mode !== 'resize') { const properties = { points, options: me.resolveDatasetElementOptions() @@ -80,6 +72,7 @@ export default class LineController extends DatasetController { const options = me.chart.options; const lineOptions = options.elements.line; const values = super.resolveDatasetElementOptions(active); + const showLine = valueOrDefault(config.showLine, options.showLines); // The default behavior of lines is to break at null values, according // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 @@ -88,6 +81,10 @@ export default class LineController extends DatasetController { values.tension = valueOrDefault(config.lineTension, lineOptions.tension); values.stepped = resolve([config.stepped, lineOptions.stepped]); + if (!showLine) { + values.borderWidth = 0; + } + return values; } @@ -97,7 +94,7 @@ export default class LineController extends DatasetController { getMaxOverflow() { const me = this; const meta = me._cachedMeta; - const border = me._showLine && meta.dataset.options.borderWidth || 0; + const border = meta.dataset.options.borderWidth || 0; const data = meta.data || []; if (!data.length) { return border; @@ -106,36 +103,6 @@ export default class LineController extends DatasetController { const lastPoint = data[data.length - 1].size(); return Math.max(border, firstPoint, lastPoint) / 2; } - - draw() { - const me = this; - const ctx = me._ctx; - const chart = me.chart; - const meta = me._cachedMeta; - const points = meta.data || []; - const area = chart.chartArea; - const active = []; - let ilen = points.length; - let i, point; - - if (me._showLine) { - meta.dataset.draw(ctx, area); - } - - - // Draw the points - for (i = 0; i < ilen; ++i) { - point = points[i]; - if (point.active) { - active.push(point); - } else { - point.draw(ctx, area); - } - } - for (i = 0, ilen = active.length; i < ilen; ++i) { - active[i].draw(ctx, area); - } - } } LineController.id = 'line'; diff --git a/src/controllers/controller.radar.js b/src/controllers/controller.radar.js index b7dca8f6a..1c30e0c0f 100644 --- a/src/controllers/controller.radar.js +++ b/src/controllers/controller.radar.js @@ -23,19 +23,22 @@ export default class RadarController extends DatasetController { const line = meta.dataset; const points = meta.data || []; const labels = meta.iScale.getLabels(); - const properties = { - points, - _loop: true, - _fullLoop: labels.length === points.length, - options: me.resolveDatasetElementOptions() - }; - me.updateElement(line, undefined, properties, mode); + // Update Line + // In resize mode only point locations change, so no need to set the points or options. + if (mode !== 'resize') { + const properties = { + points, + _loop: true, + _fullLoop: labels.length === points.length, + options: me.resolveDatasetElementOptions() + }; + + me.updateElement(line, undefined, properties, mode); + } // Update Points me.updateElements(points, 0, mode); - - line.updateControlPoints(me.chart.chartArea); } updateElements(points, start, mode) { @@ -75,10 +78,15 @@ export default class RadarController extends DatasetController { const config = me._config; const options = me.chart.options; const values = super.resolveDatasetElementOptions(active); + const showLine = valueOrDefault(config.showLine, options.showLines); values.spanGaps = valueOrDefault(config.spanGaps, options.spanGaps); values.tension = valueOrDefault(config.lineTension, options.elements.line.tension); + if (!showLine) { + values.borderWidth = 0; + } + return values; } } diff --git a/src/controllers/controller.scatter.js b/src/controllers/controller.scatter.js index 75165a9d4..01200f86a 100644 --- a/src/controllers/controller.scatter.js +++ b/src/controllers/controller.scatter.js @@ -20,7 +20,8 @@ ScatterController.defaults = { }, datasets: { - showLine: false + showLine: false, + fill: false }, tooltips: { diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 551d4e8ba..fb15a4b51 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -620,18 +620,30 @@ export default class DatasetController { update(mode) {} // eslint-disable-line no-unused-vars draw() { - const ctx = this._ctx; - const meta = this._cachedMeta; + const me = this; + const ctx = me._ctx; + const chart = me.chart; + const meta = me._cachedMeta; const elements = meta.data || []; - const ilen = elements.length; - let i = 0; + const area = chart.chartArea; + const active = []; + let i, ilen; if (meta.dataset) { - meta.dataset.draw(ctx); + meta.dataset.draw(ctx, area); } - for (; i < ilen; ++i) { - elements[i].draw(ctx); + for (i = 0, ilen = elements.length; i < ilen; ++i) { + const element = elements[i]; + if (element.active) { + active.push(element); + } else { + element.draw(ctx, area); + } + } + + for (i = 0, ilen = active.length; i < ilen; ++i) { + active[i].draw(ctx, area); } } diff --git a/src/elements/element.line.js b/src/elements/element.line.js index 46b5ae6e8..55f3718e9 100644 --- a/src/elements/element.line.js +++ b/src/elements/element.line.js @@ -192,7 +192,6 @@ export default class Line extends Element { this.options = undefined; this._loop = undefined; this._fullLoop = undefined; - this._controlPointsUpdated = undefined; this._points = undefined; this._segments = undefined; @@ -203,9 +202,6 @@ export default class Line extends Element { updateControlPoints(chartArea) { const me = this; - if (me._controlPointsUpdated) { - return; - } const options = me.options; if (options.tension && !options.stepped) { const loop = options.spanGaps ? me._loop : me._fullLoop; @@ -323,19 +319,20 @@ export default class Line extends Element { * @param {CanvasRenderingContext2D} ctx */ draw(ctx) { - const me = this; + const options = this.options || {}; + const points = this.points || []; - if (!me.points.length) { + if (!points.length || !options.borderWidth) { return; } ctx.save(); - setStyle(ctx, me.options); + setStyle(ctx, options); ctx.beginPath(); - if (me.path(ctx)) { + if (this.path(ctx)) { ctx.closePath(); } diff --git a/test/fixture.js b/test/fixture.js index d00eb3f7d..c6055d1cc 100644 --- a/test/fixture.js +++ b/test/fixture.js @@ -42,9 +42,10 @@ function specFromFixture(description, inputs) { var input = inputs.js || inputs.json; it(input, function(done) { loadConfig(input, function(json) { + var descr = json.description || (json.description = description); var chart = utils.acquireChart(json.config, json.options); if (!inputs.png) { - fail('Missing PNG comparison file for ' + input); + fail(descr + '\r\nMissing PNG comparison file for ' + input); done(); } diff --git a/test/fixtures/controller.line/borderWidth/zero.js b/test/fixtures/controller.line/borderWidth/zero.js new file mode 100644 index 000000000..35cfc7da0 --- /dev/null +++ b/test/fixtures/controller.line/borderWidth/zero.js @@ -0,0 +1,49 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + // option in dataset + data: [0, 5, 10, null, -10, -5], + backgroundColor: '#0000ff', + borderColor: '#0000ff', + borderWidth: 0 + }, + { + // option in element (fallback) + data: [4, -5, -10, null, 10, 5], + } + ] + }, + options: { + legend: false, + title: false, + elements: { + line: { + borderColor: '#00ff00', + borderWidth: 3, + fill: false, + }, + point: { + backgroundColor: '#00ff00', + radius: 10, + } + }, + layout: { + padding: 32 + }, + scales: { + x: {display: false}, + y: {display: false} + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.line/borderWidth/zero.png b/test/fixtures/controller.line/borderWidth/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..febae92e5e5d4045378b186098eb9f5ebabde5cd GIT binary patch literal 9636 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.line/showLines/dataset.js b/test/fixtures/controller.line/showLines/dataset.js new file mode 100644 index 000000000..b1f47db14 --- /dev/null +++ b/test/fixtures/controller.line/showLines/dataset.js @@ -0,0 +1,36 @@ +module.exports = { + description: 'should draw all elements except lines turned off per dataset', + config: { + type: 'line', + data: { + datasets: [{ + data: [10, 15, 0, -4], + label: 'dataset1', + borderColor: 'red', + backgroundColor: 'green', + showLine: false, + fill: false + }], + labels: ['label1', 'label2', 'label3', 'label4'] + }, + options: { + legend: false, + title: false, + showLines: true, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + }, + options: { + canvas: { + width: 512, + height: 512 + } + } +}; diff --git a/test/fixtures/controller.line/showLines/dataset.png b/test/fixtures/controller.line/showLines/dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..79e1628f2ee28c1a2261b1b397e52cc0b31f25cb GIT binary patch literal 6618 zcmeHM|5H;(5WhTvgjggfN`($Y5fH(k)|yd-1T|0w2p}RLU{Wc?0s*N;zC!|95Co)J zMH~tWB8dwbxa=@;1AuW_iq_>6`K*WE2W__k{H-gaW% zK$qgaMhH9@Mnu73OmTqiMcjt);6U8p5jR)_3Aq#U3~G9c_~)j@;;4a6YoW5|Vm4F8 z&A8KTf+y2iEbwVV)qox0Cbc6nLcAc8F?)zDK^@PVxyFl~mct5ixZ>JgrVls271p6| z9Ukm5O^=|UPcpbp;ceFm@5iKt8S22qz{Sy0zVz%~rZR8A&&meYJQvnHL~(y>Jc*N$ zpl+KS7GF`%&UL8|iPfdf(sqi7v1(%G8(7)eWhhjGdGn~zQUHChny(Cv8Z2};oT_M{ zwRcS>(&`s2j0fFgH5Qs4(?<)=x6BfQg6SbmGG7ZR(JDQnY@zaDpwm*QXxv%)z)Q~Q zjdS(8#G5XfPu75c3xih=I%nRs@a4?*}ogL6aCgVgAfq zPIhmtobilSPCMX|bxNDQf>ludaVPG$Dy}AFTs$YNQ%Q%LNR5Vn=3h$qL7~Umsdsx^ zPAC_fnEp)$%eBd{p;_P3m}R`wJeg18c&!Nxs*@G_cxaQ~ZcEVC8D`uO8{d)Q&$M2H zBup}$vD|S-TKh#aiQn8kskHF+3enn_)UbXy%V|CR>7U|%r*fGq4pheWV$E>ixdA;5LjP1MXpEkH^m)ugvYcbKpt{sNRi}KD zI5`nD5>%fVO}ZzsZP*4u^vJOE9|0TB*6Zc!)hA^#-U+|2+?)A(P@uCqSmL6RGrz)} z_BSxZu-t?*2Ve!jT&nQda+#djf?z zmw|d=N3NiZKAB^_H#8pnW!@?%XDQixF+!+LnZGuvyjY~duvg=7z=1V+9*r5pI^KNZ z#9i?MTauQ?0ws<1a_w!u0D>w^`fniJI)Nz)wIwoO#1pw#n8VFK>uO)5eqh_f%JfvX zpGT^i?QpBe-Mf4}QZ59**1q7AY=;yKN8xT=L5V8`0jP#8Yky^iiqt24aCgsqYkD36 z;BA5f0XxRakOp9dKN)O4qBKPSO4j2+b!?9_QXi2kS>Wh>g*^hWg+d12&n_gc)WkHl zI||j8`zindpz9QZEuz~Y_yFmS9PAPQTOYDzM~d{J3d8;=Z8(cIdwToo$@b|HzA`6N znhSzuLo=@0XtbfB_7H)P`Z@w;7yZS)CP`7g*wt0XOCHiM>X@O$=d@ZIzTQ><|FZ#} L6zV?S9(vXvTsw}Y literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.line/showLines/false.js b/test/fixtures/controller.line/showLines/false.js new file mode 100644 index 000000000..d88f9ebdd --- /dev/null +++ b/test/fixtures/controller.line/showLines/false.js @@ -0,0 +1,28 @@ +module.exports = { + description: 'should draw all elements except lines', + config: { + type: 'line', + data: { + datasets: [{ + data: [10, 15, 0, -4], + label: 'dataset1', + borderColor: 'red', + backgroundColor: 'green' + }], + labels: ['label1', 'label2', 'label3', 'label4'] + }, + options: { + legend: false, + title: false, + showLines: false, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + } +}; diff --git a/test/fixtures/controller.line/showLines/false.png b/test/fixtures/controller.line/showLines/false.png new file mode 100644 index 0000000000000000000000000000000000000000..2d2ac9a3ac7d30d765133a784b1f7852e18ef49b GIT binary patch literal 10800 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 N%eA%^`D-|b{~uoEkhcH; literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.radar/borderWidth/zero.js b/test/fixtures/controller.radar/borderWidth/zero.js new file mode 100644 index 000000000..dd1bb6555 --- /dev/null +++ b/test/fixtures/controller.radar/borderWidth/zero.js @@ -0,0 +1,46 @@ +module.exports = { + config: { + type: 'radar', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + // option in dataset + data: [0, 5, 10, null, -10, -5], + backgroundColor: '#0000ff', + borderColor: '#0000ff', + borderWidth: 0, + }, + { + // option in element (fallback) + data: [4, -5, -10, null, 10, 5] + } + ] + }, + options: { + legend: false, + title: false, + elements: { + line: { + borderColor: '#00ff00', + borderWidth: 1, + fill: false + }, + point: { + backgroundColor: '#00ff00', + radius: 10 + } + }, + scale: { + display: false, + min: -15 + } + } + }, + options: { + canvas: { + height: 512, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.radar/borderWidth/zero.png b/test/fixtures/controller.radar/borderWidth/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..130348dab18b381a1f34ef041844a7c9eda3f1b9 GIT binary patch literal 15511 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 AzyJUM literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.radar/showLines/value.js b/test/fixtures/controller.radar/showLines/value.js new file mode 100644 index 000000000..eab88702b --- /dev/null +++ b/test/fixtures/controller.radar/showLines/value.js @@ -0,0 +1,48 @@ +module.exports = { + config: { + type: 'radar', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + // option in dataset + data: [0, 5, 10, null, -10, -5], + backgroundColor: '#ff0000', + fill: false, + showLine: true + }, + { + // option in element (fallback) + data: [4, -5, -10, null, 10, 5] + }, + { + data: [1, 1, 1, 1, 1, 1], + showLine: true, + backgroundColor: 'rgba(0,0,255,0.5)' + } + ] + }, + options: { + legend: false, + title: false, + showLines: false, + elements: { + line: { + borderColor: '#ff0000', + backgroundColor: 'rgba(0,255,0,0.5)', + fill: true + } + }, + scale: { + display: false, + min: -15 + } + } + }, + options: { + canvas: { + height: 512, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.radar/showLines/value.png b/test/fixtures/controller.radar/showLines/value.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6a9d94e7dc5bf75d73b14ecc3190317c67853e GIT binary patch literal 33142 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.scatter/showLines/true.js b/test/fixtures/controller.scatter/showLines/true.js new file mode 100644 index 000000000..a98262653 --- /dev/null +++ b/test/fixtures/controller.scatter/showLines/true.js @@ -0,0 +1,33 @@ +module.exports = { + description: 'showLines option should draw a line if true', + config: { + type: 'scatter', + data: { + datasets: [{ + data: [{x: 10, y: 15}, {x: 15, y: 10}], + pointRadius: 10, + backgroundColor: 'red', + showLine: true, + label: 'dataset1' + }], + }, + options: { + legend: false, + title: false, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + }, + options: { + canvas: { + width: 256, + height: 256 + } + } +}; diff --git a/test/fixtures/controller.scatter/showLines/true.png b/test/fixtures/controller.scatter/showLines/true.png new file mode 100644 index 0000000000000000000000000000000000000000..78bd3ac4f034092cb5f34e6207c6d7f096b0dccd GIT binary patch literal 3227 zcmW-kdpuO>AIHymJaUd!%^ak*!I&AQmP$7%mkwr_sW4p@m6%O#r8N;z9<1jd{W!>}J#DrIg<5`sRyb~_s#YI^T;9C@p-{Al_=lTOQc`}R8W zHX0ZmJ6KcFY9vlSs+___7ISWDNqWukC#5P@cql`E;oaJ^<~{jcjRQj|y$x&5wZ-15 zeKGK2O>)ZIo34RVzBD-TKb2<$N6W5%eUUyzUjFLTk)Bw{JMGcbK;hqJHdhqOoK5*d zMHdb!`E-*BD+dX)n-Ao8ed~Mr%jTUJxJ2Zea4DkZ6X}*oPR%ctojo`PhdzAAiHyHE z=waXx$igyuPL<_`6xdz=0wEFVC*_H>OBbw#(~8n%&%XsOcHMxmbR^Gp2lW!Op%A zSyJmuQlgCacbW8Ocb=yw%ONL_O110bl(b+fvZDTFN0%@ubA;i*AMBr zmJV83QUO_Ysl-!}#+tFdsZf*FkAB8-q4O1|BluevCD~BEuy18#Y8WGTaFuWJg$++`bMy2?n-)%z2n; zJk}bcCIrE^kCp1#s~Y4A;`dMK5fu*bfMp zc4F!xOJF(-><`b#sG*!d-U;0hMgl z!aO<@0YA1Mbj8_!5D;2Vb6)|>5io8byfc+tkLDo=loS*zb$d`LVFupGLiSfA)T?f( z>mk;gaNbmct*D{UEGL8id_V1vx^=m1-9}?@7&X&--sNhNL156I=Rkj3q-Gy4O;1vK%yy_J!2@_`+5 zw$fr}x^Hmxqk^$^%T|RHc&X!&VPe^5KVtwpg0#N^Z^O0Oagb;lx~@>K*x+2xV0eYC}^qZLRgEMg8 z_%I#%Oz)H}1hB-;kqWq5wYY-dah;q(J=@lIj1`UjyG6vtU3Wg5kKu)*)8YT7cX=)X zP!nV?(OAriwieS^n}IuMyU-Ozq038o63w`|(UuDsZ1QLZP7Z&UmWp^|J0$kojxCP2 zp|Q8j9?o&U&&v!9&(ik>A&GO=h5%@9VNYg-|5Kig#13kudVGT8{2e!#)=?M~!}J1_kGC?T_to1BmjCo^q-tsSNX zMmz0;y?=jPBSrtdn_97h2M3xbAwceGEjRUba*r6TugueO>pmoZbww??Y$(y#4ZXkV zgWdCI;LgYDmn0$d>XvB5+uxrQGS0j9&`0b}9!$ex z>Ar(|vHP-~b{z_);_f<%?oW4h5Ry-;?LL-6t-~QF12KE(>WREV*c1652||=K_ft#x zLgrmaSlp`6({dF=n+t<&T;&T~VqPbY1kcUChFMD3hc&$}x!A_g`Jk-x zb<%k7T=2QwQpnctdNwG;pFV6as#5C0i|&+)m^X?#fdWJxt#l&rmWN^Gt0eYYR=%B1 z=+<5N;xA^uk1Hs%!t=9>o@Po^KNSsbvt|YZEC;PA$2n|Tqm)VeEy|H1qlnVxTBw?O zsXEMtt?s+DF%Mf-aW!Eay6-bzQell#wo7fqa0*17NSNcdW(YDNwQU|odPF)?q-5j)Y`6ZjTaFU#gjGOca#watOYbfrg-V|BPB%ch zOBrajz!{JNfh#T$FpmvLK>z@byc@nLGy_Ndq=yS&L-<@zw4R`k3$S`=v^5Q!4y0o7 zBidu7q?S|4-dYHmb#{km?8L~dki<46EHREKSnAC{Kk@P*fER|hW)Bit?rtHe4&ip* z%*DvStd3qiLhW&7rv)N!`|VqY8!X`m+#7|ub7z+)j~k&fzd8=5#%AqD4|?3|R;W-5 zSAwxb-NI{pA?tRURPz+~KKL+jgiy-hJo9y9aq0@s1rH=@{@rfecN%`@^ZkeVE};ap zV_J4~Lq*erbfRg2CTPAF10SWQVUL*BeHRfnbOtP;a_`j{3t3Y>pEC@wnB>90F`ja4 zq+4R40H*?YUD6LlELnp-cfe(A`mh6)I|sL`8pJ=>ZpnN4rXj8 z5?(c2^XfC4Hy;VjZfA7yC)grkaiK%QHd=|S9YQt#XzB1#?cnU;R`M_Q)Ejm<6eEV)} z;Y``}ln|?sse{3A(F5B)ts##8N%9zXk>&^1WEM(jo1|d5u)>?cO!#aFDcEQ%WJ2zI ziG!ockPL{lshky(Rq}644$G{+m2Q zcEzs%>LQ31o09hk8?!xn4s;lXZLw0NayAHd8o~I_|ATF%CjpOW09Ce0bt3z2#5deZ zdjk)IP)$!-EVlnol}4`xX7y-(@qH(~nvM=z@_-AGABQY0-n;_rrCF?js2P7``!)gKTaahy2^&lk0{5l_V(HRu(2lcf30;$uUjrwvW%b^eez1ATO0O1Y1$ I$X&hV|H#Y*P5=M^ literal 0 HcmV?d00001 diff --git a/test/fixtures/controller.scatter/showLines/undefined.js b/test/fixtures/controller.scatter/showLines/undefined.js new file mode 100644 index 000000000..42b8bef9f --- /dev/null +++ b/test/fixtures/controller.scatter/showLines/undefined.js @@ -0,0 +1,32 @@ +module.exports = { + description: 'showLines option should not draw a line if undefined', + config: { + type: 'scatter', + data: { + datasets: [{ + data: [{x: 10, y: 15}, {x: 15, y: 10}], + pointRadius: 10, + backgroundColor: 'red', + label: 'dataset1' + }], + }, + options: { + legend: false, + title: false, + scales: { + x: { + display: false + }, + y: { + display: false + } + } + } + }, + options: { + canvas: { + width: 256, + height: 256 + } + } +}; diff --git a/test/fixtures/controller.scatter/showLines/undefined.png b/test/fixtures/controller.scatter/showLines/undefined.png new file mode 100644 index 0000000000000000000000000000000000000000..4e01c86f4168e927d69e5720c775262b445b65d6 GIT binary patch literal 2016 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|GzJFt<(@8%Ar*0NZ~32ITFh|l zWA-JH#VsBc%wow?l+;olnns+uRrHKiBm2!BhUoPNf|f1QoM``9EWqpEl7&ZJXm-t- zX`EdCtM1%4yYqM7|BAc**>?Hv;#a@QYT4uL^X%<6*zS6JYvK1@eGE*;ogZ9z%kg0L z+fR>gpT1pZKQF_ti-D<~^{r1Ay7jDL2${q*gU_U)yQyPj_0P$;lw$Z`(yuRRUf|o z&syc>TMik;#$fv#``Fv->h{O}O#S`n&$mYQI`4GuFH7+X$@%Q7-;U}QPO z!l4ke?*)fI1FwRBnghebPp<9_3^@#q28>J`)Ag;GSQ3~yS~vw9cGO%HRA7*HQ1EGB zIP|o;kAd+915+Xsi-2By3D63*Q7c9RYBWWS=8Mq+gw&E&t?}}0KVgT>H7jScyxX^D zZ`J#ltN}`c}yZHQj_o@r3Kdq}zRd2Wns@jy z?6vifQTp)n+qdA`M`ydLHC&Kz$rZHtdF%hBZy$T@e*RZ+|j3|LY!10SY=Jd5gQu&X%Q~loCIFB7 BqgVg{ literal 0 HcmV?d00001 diff --git a/test/matchers.js b/test/matchers.js index 146e80318..f7d41da2b 100644 --- a/test/matchers.js +++ b/test/matchers.js @@ -20,9 +20,10 @@ function canvasFromImageData(data) { return canvas; } -function buildPixelMatchPreview(actual, expected, diff, threshold, tolerance, count) { +function buildPixelMatchPreview(actual, expected, diff, threshold, tolerance, count, description) { var ratio = count / (actual.width * actual.height); var wrapper = document.createElement('div'); + wrapper.appendChild(document.createTextNode(description)); wrapper.style.cssText = 'display: flex; overflow-y: auto'; @@ -195,7 +196,7 @@ function toEqualImageData() { ratio = count / (w * h); if ((ratio > tolerance) || debug) { - message = buildPixelMatchPreview(idata, expected, ddata, threshold, tolerance, count); + message = buildPixelMatchPreview(idata, expected, ddata, threshold, tolerance, count, opts.description); } } else { message = 'Input value is not a valid image source.'; diff --git a/test/specs/controller.line.tests.js b/test/specs/controller.line.tests.js index 3f46f145b..e66ed7101 100644 --- a/test/specs/controller.line.tests.js +++ b/test/specs/controller.line.tests.js @@ -93,69 +93,6 @@ describe('Chart.controllers.line', function() { expect(meta.data[3].draw.calls.count()).toBe(1); }); - it('should draw all elements except lines', function() { - var chart = window.acquireChart({ - type: 'line', - data: { - datasets: [{ - data: [10, 15, 0, -4], - label: 'dataset1' - }], - labels: ['label1', 'label2', 'label3', 'label4'] - }, - options: { - showLines: false - } - }); - - var meta = chart.getDatasetMeta(0); - spyOn(meta.dataset, 'draw'); - spyOn(meta.data[0], 'draw'); - spyOn(meta.data[1], 'draw'); - spyOn(meta.data[2], 'draw'); - spyOn(meta.data[3], 'draw'); - - chart.update(); - - expect(meta.dataset.draw.calls.count()).toBe(0); - expect(meta.data[0].draw.calls.count()).toBe(1); - expect(meta.data[1].draw.calls.count()).toBe(1); - expect(meta.data[2].draw.calls.count()).toBe(1); - expect(meta.data[3].draw.calls.count()).toBe(1); - }); - - it('should draw all elements except lines turned off per dataset', function() { - var chart = window.acquireChart({ - type: 'line', - data: { - datasets: [{ - data: [10, 15, 0, -4], - label: 'dataset1', - showLine: false - }], - labels: ['label1', 'label2', 'label3', 'label4'] - }, - options: { - showLines: true - } - }); - - var meta = chart.getDatasetMeta(0); - spyOn(meta.dataset, 'draw'); - spyOn(meta.data[0], 'draw'); - spyOn(meta.data[1], 'draw'); - spyOn(meta.data[2], 'draw'); - spyOn(meta.data[3], 'draw'); - - chart.update(); - - expect(meta.dataset.draw.calls.count()).toBe(0); - expect(meta.data[0].draw.calls.count()).toBe(1); - expect(meta.data[1].draw.calls.count()).toBe(1); - expect(meta.data[2].draw.calls.count()).toBe(1); - expect(meta.data[3].draw.calls.count()).toBe(1); - }); - it('should update elements when modifying data', function() { var chart = window.acquireChart({ type: 'line', diff --git a/test/specs/controller.radar.tests.js b/test/specs/controller.radar.tests.js index 8f3cf935b..10a08e6a0 100644 --- a/test/specs/controller.radar.tests.js +++ b/test/specs/controller.radar.tests.js @@ -131,17 +131,13 @@ describe('Chart.controllers.radar', function() { })); [ - {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260}, - {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260}, - {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260}, - {x: 256, y: 260, cppx: 256, cppy: 260, cpnx: 256, cpny: 260}, + {x: 256, y: 260}, + {x: 256, y: 260}, + {x: 256, y: 260}, + {x: 256, y: 260}, ].forEach(function(expected, i) { expect(meta.data[i].x).toBeCloseToPixel(expected.x); expect(meta.data[i].y).toBeCloseToPixel(expected.y); - expect(meta.data[i].controlPointPreviousX).toBeCloseToPixel(expected.cppx); - expect(meta.data[i].controlPointPreviousY).toBeCloseToPixel(expected.cppy); - expect(meta.data[i].controlPointNextX).toBeCloseToPixel(expected.cpnx); - expect(meta.data[i].controlPointNextY).toBeCloseToPixel(expected.cpny); expect(meta.data[i].options).toEqual(jasmine.objectContaining({ backgroundColor: Chart.defaults.color, borderWidth: 1, diff --git a/test/specs/controller.scatter.tests.js b/test/specs/controller.scatter.tests.js index ace955b6c..df5168361 100644 --- a/test/specs/controller.scatter.tests.js +++ b/test/specs/controller.scatter.tests.js @@ -1,4 +1,6 @@ describe('Chart.controllers.scatter', function() { + describe('auto', jasmine.fixture.specs('controller.scatter')); + it('should be registered as dataset controller', function() { expect(typeof Chart.controllers.scatter).toBe('function'); }); @@ -29,51 +31,4 @@ describe('Chart.controllers.scatter', function() { jasmine.triggerMouseEvent(chart, 'mousemove', point); }); - - describe('showLines option', function() { - it('should not draw a line if undefined', function() { - var chart = window.acquireChart({ - type: 'scatter', - data: { - datasets: [{ - data: [{x: 10, y: 15}], - label: 'dataset1' - }], - }, - options: {} - }); - - var meta = chart.getDatasetMeta(0); - spyOn(meta.dataset, 'draw'); - spyOn(meta.data[0], 'draw'); - - chart.update(); - - expect(meta.dataset.draw.calls.count()).toBe(0); - expect(meta.data[0].draw.calls.count()).toBe(1); - }); - - it('should draw a line if true', function() { - var chart = window.acquireChart({ - type: 'scatter', - data: { - datasets: [{ - data: [{x: 10, y: 15}], - showLine: true, - label: 'dataset1' - }], - }, - options: {} - }); - - var meta = chart.getDatasetMeta(0); - spyOn(meta.dataset, 'draw'); - spyOn(meta.data[0], 'draw'); - - chart.update(); - - expect(meta.dataset.draw.calls.count()).toBe(1); - expect(meta.data[0].draw.calls.count()).toBe(1); - }); - }); });