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 = 0, ilen = elements.length; i < ilen; ++i) { + const element = elements[i]; + if (element.active) { + active.push(element); + } else { + element.draw(ctx, area); + } } - for (; i < ilen; ++i) { - elements[i].draw(ctx); + 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 Hc-jL100001 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 zc-rlk|1;Ei9LL}Lv9h+4Rm#N;TSB5$UDr;DUDa|1izI}0FXwbva<%!+E_Fo6)s-}k zBH4{4g{*JeTsJy9MaQOwwYni?TPs#-mvtYXz5amv<>qeY^O^a~XJ4PsYo4#i^Ywbo zeD-tBkM3cFH^&12j6AJ~kOMIA6D%Ib5#6-7iUc@7rXsf?eJpkKj{xf?IhfHE%f&d<3J$=935$_(9B@KU$KXc=Sd#P+5>UZ?41z}3Oa#!C zxNnhw2!;_90?w2GxL)KPNI(E_{{%N!0*Uz($_#pXiuBi}#p0-ePHVBc=W;e%!OytY zZ9=3nVW`g=ss`*xx9J^`5z+;Pg55)I3F>&+%r{=_v>aAZ!&Nu-vwisat+0o_4MecV zG(CcbJ<)%!J>0?C~TV}~Y!OV~*g|CI2Y?U5Swov&v&}k`DGVUyY6xP?nndPOFtA@+kD!8S$24%jP zS#ZM}F#C00^a1*7`@bC98E&Q<9WBt^JeJ-cei%o3*CWDna+YQb7 zmc|_8rRK?e3eRg@U{IZ+*vCU>bFU?6>kKpQh>h<^@n>7F)4kZ4td)+t(%LVZ$^7OX z$mNB1S4q~#q=xmI==>Jp9amX}<|y~_1Vd@@9Vh+SxKE|t>n~71OlG(3CM0voh6ujU zN4EmSMR8GF6c@!saZy|p7sdUL;8wVe_R8gT-A;17Zbx~mv1KT^bBr1;tP!@o?00oz z(y&-jUW0lw2J(bb>4Fxe%bm^y$?m2p;a&bnYJlV{d2nQ_CVJ>bG~=hUArm+pXLsAo zK?r-8Cn~d(Fk~}@dlc3Eg|5>lDYsMlr-VOfT;_@c)v>*JGXi*Nz)XX%zm$p^qi3Id z88eZr{DPc0dp_GA#XPz$J3^dii?wNtvt<;vXyb zXZ{%!=&TKvxoDK^ZwP1o4GeJ{H}T9NnBbPEu2;}IywI+Gese;S&_=IInVsT0WE`1i zNrNUF`Eem-_3!zoFqjJ&m{)ex3fkziIrc|G_RoyXLsh(O6kBB+k-aYj~-TFC*&AFAvTfo(J@ z@P2VAaW%r@j=}Whz6sEM`JjeSL#QFtkS#Y-q7PLV_DAW+qs^Y*y?(lVdPJzs3687eO;2Oe6g#mPLMpLU(_+fh|g)YHhjCI0KkVQjebC| HkD2usTsw}Y literal 0 Hc-jL100001 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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 P_@}O-rCfU3EcpKeDy@mZ literal 0 Hc-jL100001 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 zc-kG8dpuO>AIHymJaUd!%^ak*!I&AQmP$7%)WHlh6{gFg60^yzv?d~ooD&rx(_K+! zyYD9Kc2QgER21n#+Fw_fWU1Yf+!D#}nf>Fu=FIc@Jnzr>e!s8td1f+IzTPIr-y35X zW};Nc7GoHW=`Ugg`Ur|W6OLiuty0R|mnH^(c;$XJCd~Zqr+D&aQN^*0e|}&TcuF>;1L=$xmB$Vc;TBV8*42T25wIC%d#fUw-z`7##ZYohLE@ z;@~f>Z^$=`#=(Qb0iT~<8E8tCsO(qNi!^(<9Z=IdeoKk`T32kv=)zt7 zp|a$*7oh-` z%q<(Tv8DpE>(huQB8@F$dqbfnZ666$+1z40=$sr>-kLcXoFPv=X^dz)9&{+J)Q#~5ja;_Jv09gb`1lH%ufHtc%@ zOg}kwu{AK)0|&zQu7fCOLvwNV9|VN9(>zuJO9YG`jOa=uH=ub4f+U3{O5I*mO1P0vije&o2@Psm z>wAd}W}FX|XfJ9kvdGQkKRZANpl)3%U%$x|96`MN@ocj(-6ab z(YaC+b{VpG*>m^TO7gx$KPmq=xl+e`G^ykr1%Y{7wtiCEW)1{`^JwCC`l_Pjz?^Y2Tf6ets0frZi&Vc`$-tDy* zKuxftL}N88##T&Y?M5D;{d{*gg_f7`B${#aVyqW3*yPa+oE-5sJq_{3c1j$#A77GS zM`Lf8y`1v_-xrw}o^9v@LX+mK3kA^8%8|^D_@^QViJjC+_4s06OT-vqP@W(lqwoH& zT2B#b%LJa_Wmo*bHdLGkGcs7p8fsl*zr(?^9WLbi+s_01DIv3;o19nxCo}DTt<%$j zVqEsazP~@Lm7;Io%x&1ALxU}o5Fl@jmYe!2rB{sZFVEL<>))q*nTuL-$ylOs7=Cxd z7rPt4z+I2jFGxb@-6PS8cf30#WL$UerH?wCI+TvZ%6-6NcxzT3>Edb?R zuad`uXM#^1)}83SS@kfy6Vkz zLbv|%=KwMLZCqiw4PKB_{3J`F`k{DeyDc*mXgy?0InQC!o1{$oFVW5v8BLV6)IrtM zi#6ePY)${gP5IdJ$}5TE&~yLxIStmjG+n(UW|PhjtK&f4RfvM_n>)7Gf(w~3XCqFi zJH9qGHTtL@Tk*IPH=9bG$c4`gL7roei@zOPJwRi74X>+LQi0g7HDXw6TmAcHEf;t+ z%1_K(s1wW`OQKfv8SuEiZ2MFe{&2cXod5!{s4j1XZauEA!vNL6I!?EgV}~ABxs4=S zAGR00Bbpte>#xhegJV)Aob4zbMZU+9O8j_S@QKYSJK*6~CFZl$Rc%5!V*_vfC@%6? z+!1e3*=@(P;C5pRA(gJ_AfRUQ?2jv@G>{L{m^^KPvlA)#?(ZiGsM)D4EU}@%+DO~P z0~nQF8x5%mW)pBT^=Y|Inwg2ug?LPy*@%aJ6{TERJ zIxwxfd!VBEeg@IJP!qhsn}H8A(y@n3+x`m(8#V)$Qh9glO@*vEpU)WwT21m~;21AC zHqt$*NPts;ym9|A{y+@b2B^C9azu!NfgKo9tZ4oHFo__c`nvEh@(6i77l6d>|(Puf*{PByVoj;$}YYzDug$9-wRS@0BysPct=GDN~04ebIy4KdvQC{7Lc{50U0O)@&9^XuISPxvsOs_0xO|pCACU$@j5nXTj@y zV|L}w0O}%%R=d)72phX2W)5`H!?xO}(l|Q=JA+{SXaB*r(UX8@41g;82rObGz0zVz?5=d KS+R$D>;D1B%mq#W literal 0 Hc-jL100001 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 zc-rd>@N?(olHy`uVBq!ia0y~yU}OMc4mKbaQ?w$Dfq{Lwr;B4qMcmt4{->7~GaUPv zeMw|-i$?{sSn?DlwUmdZ5vOhyJ!93#ezS)mdi{Z*Wy>@t+J6=c@cOr8;gJ`bU9)By zCzt=KJNM1*{N4Az;;w(TUB0{c)vvNz_Bi`Id;1NxyWZYf_MGmT;2t$ViHV{J-|uM0Xn*ufzqazOs}x}5dK?houTouQh_()pIvW1eY>Q6d+Fn@r&~A_3anZ3v>NQU z*Y4W;^Ub$wZ||I_7I1j*gX2yBgZlhG;eS8N$ItfbIUpJZa6V^U|~IKU^sA*|3)@NBNNATeJduG1ZIvFP63AR-I zJ?-veV7$S=l*q&)pch{Pw1REaicu>@tr)dp)Cy9qP;0z=+fUeGbIr=xEbsR1*<1C# z?A^k*JB@EgGG*{NzLIF<-!4A?-o5IA>QC$HQ`H-82poAU_#>zKdFR_hw&opv40~-o zWRyPq{Pr#Q_R-m{Y7G}8Tyh01e%|_j>D$L%yPy9R9U0d8dfZkl_+EZnoj*T4Uvwse zRr3TBmj{==-THj{_y4*F<%@r?2uQWAkY$R`dvCKd)?&&G20p 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); - }); - }); }); -- 2.47.3