@@ -303,4 +303,56 @@ describe('Arc element tests', function() {
303303
304304 expect ( arc . inRange ( center . x , 1 ) ) . toBe ( false ) ;
305305 } ) ;
306+
307+ it ( 'should use circular spacing only for circular arcs' , function ( ) {
308+ function createArc ( circular ) {
309+ return new Chart . elements . ArcElement ( {
310+ startAngle : 0 ,
311+ endAngle : Math . PI / 2 ,
312+ x : 0 ,
313+ y : 0 ,
314+ innerRadius : 0 ,
315+ outerRadius : 100 ,
316+ options : {
317+ circular : circular ,
318+ spacing : 20 ,
319+ offset : 0 ,
320+ borderWidth : 0 ,
321+ borderRadius : 0 ,
322+ backgroundColor : 'red' ,
323+ borderColor : 'black'
324+ }
325+ } ) ;
326+ }
327+
328+ function firstOuterArcStartAngle ( arc ) {
329+ var ctx = window . createMockContext ( ) ;
330+ arc . draw ( ctx ) ;
331+
332+ var arcCall = ctx . getCalls ( ) . filter ( function ( x ) {
333+ return x . name === 'arc' ;
334+ } ) [ 0 ] ;
335+ if ( arcCall ) {
336+ return arcCall . args [ 3 ] ;
337+ }
338+
339+ var lineToCall = ctx . getCalls ( ) . filter ( function ( x ) {
340+ return x . name === 'lineTo' ;
341+ } ) [ 0 ] ;
342+ var dx = lineToCall . args [ 0 ] - arc . x ;
343+ var dy = lineToCall . args [ 1 ] - arc . y ;
344+ return Math . atan2 ( dy , dx ) ;
345+ }
346+
347+ var nonCircularStart = firstOuterArcStartAngle ( createArc ( false ) ) ;
348+ var circularStart = firstOuterArcStartAngle ( createArc ( true ) ) ;
349+ var alpha = Math . PI / 2 ;
350+ var spacing = 10 ; // draw() passes spacing / 2 to pathArc
351+ var avgNoSpacingRadius = 50 ;
352+ var adjustedAngle = ( alpha * avgNoSpacingRadius ) / ( avgNoSpacingRadius + spacing ) ;
353+ var linearSpacingOffset = ( alpha - adjustedAngle ) / 2 ;
354+ var circularSpacingOffset = Math . asin ( Math . min ( 1 , spacing / avgNoSpacingRadius ) ) ;
355+
356+ expect ( circularStart - nonCircularStart ) . toBeCloseTo ( circularSpacingOffset - linearSpacingOffset , 6 ) ;
357+ } ) ;
306358} ) ;
0 commit comments