@@ -573,4 +573,115 @@ describe('gradients', function() {
573573 done ( ) ;
574574 } , done . fail ) ;
575575 } ) ;
576+
577+ describe ( 'addCustomMarker' , function ( ) {
578+ it ( 'should register a new custom marker symbol' , function ( ) {
579+ var initialLength = Drawing . symbolNames . length ;
580+
581+ var customFunc = function ( r ) {
582+ return 'M' + r + ',0L0,' + r + 'L-' + r + ',0L0,-' + r + 'Z' ;
583+ } ;
584+
585+ var symbolNumber = Drawing . addCustomMarker ( 'my-custom-marker' , customFunc ) ;
586+
587+ expect ( symbolNumber ) . toBe ( initialLength ) ;
588+ expect ( Drawing . symbolNames [ symbolNumber ] ) . toBe ( 'my-custom-marker' ) ;
589+ expect ( Drawing . symbolFuncs [ symbolNumber ] ) . toBe ( customFunc ) ;
590+ expect ( Drawing . symbolNames . length ) . toBe ( initialLength + 1 ) ;
591+ } ) ;
592+
593+ it ( 'should return existing symbol number if marker already registered' , function ( ) {
594+ var customFunc = function ( r ) {
595+ return 'M' + r + ',0L0,' + r + 'L-' + r + ',0L0,-' + r + 'Z' ;
596+ } ;
597+
598+ var firstAdd = Drawing . addCustomMarker ( 'my-marker-2' , customFunc ) ;
599+ var secondAdd = Drawing . addCustomMarker ( 'my-marker-2' , customFunc ) ;
600+
601+ expect ( firstAdd ) . toBe ( secondAdd ) ;
602+ } ) ;
603+
604+ it ( 'should add marker to symbolList with variants' , function ( ) {
605+ var initialListLength = Drawing . symbolList . length ;
606+ var customFunc = function ( r ) {
607+ return 'M0,0L' + r + ',0' ;
608+ } ;
609+
610+ var symbolNumber = Drawing . addCustomMarker ( 'my-marker-3' , customFunc ) ;
611+
612+ // Should add 6 entries: n, String(n), name, n+100, String(n+100), name-open
613+ // Plus 6 more for dot variants if noDot is not set
614+ expect ( Drawing . symbolList . length ) . toBeGreaterThan ( initialListLength ) ;
615+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-3' ) ;
616+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-3-open' ) ;
617+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-3-dot' ) ;
618+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-3-open-dot' ) ;
619+ } ) ;
620+
621+ it ( 'should respect noDot option' , function ( ) {
622+ var customFunc = function ( r ) {
623+ return 'M0,0L' + r + ',0' ;
624+ } ;
625+
626+ Drawing . addCustomMarker ( 'my-marker-4' , customFunc , { noDot : true } ) ;
627+
628+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-4' ) ;
629+ expect ( Drawing . symbolList ) . toContain ( 'my-marker-4-open' ) ;
630+ expect ( Drawing . symbolList ) . not . toContain ( 'my-marker-4-dot' ) ;
631+ expect ( Drawing . symbolList ) . not . toContain ( 'my-marker-4-open-dot' ) ;
632+ } ) ;
633+
634+ it ( 'should allow using custom marker in scatter plot' , function ( done ) {
635+ var customFunc = function ( r ) {
636+ return 'M' + r + ',0L0,' + r + 'L-' + r + ',0L0,-' + r + 'Z' ;
637+ } ;
638+
639+ Drawing . addCustomMarker ( 'my-scatter-marker' , customFunc ) ;
640+
641+ Plotly . newPlot ( gd , [ {
642+ type : 'scatter' ,
643+ x : [ 1 , 2 , 3 ] ,
644+ y : [ 2 , 3 , 4 ] ,
645+ mode : 'markers' ,
646+ marker : {
647+ symbol : 'my-scatter-marker' ,
648+ size : 12
649+ }
650+ } ] )
651+ . then ( function ( ) {
652+ var points = d3Select ( gd ) . selectAll ( '.point' ) ;
653+ expect ( points . size ( ) ) . toBe ( 3 ) ;
654+
655+ var firstPoint = points . node ( ) ;
656+ var path = firstPoint . getAttribute ( 'd' ) ;
657+ expect ( path ) . toContain ( 'M' ) ;
658+ expect ( path ) . toContain ( 'L' ) ;
659+ } )
660+ . then ( done , done . fail ) ;
661+ } ) ;
662+
663+ it ( 'should work with marker symbol variants' , function ( done ) {
664+ var customFunc = function ( r ) {
665+ return 'M' + r + ',0L0,' + r + 'L-' + r + ',0L0,-' + r + 'Z' ;
666+ } ;
667+
668+ Drawing . addCustomMarker ( 'my-variant-marker' , customFunc ) ;
669+
670+ Plotly . newPlot ( gd , [ {
671+ type : 'scatter' ,
672+ x : [ 1 , 2 , 3 ] ,
673+ y : [ 2 , 3 , 4 ] ,
674+ mode : 'markers' ,
675+ marker : {
676+ symbol : [ 'my-variant-marker' , 'my-variant-marker-open' , 'my-variant-marker-dot' ] ,
677+ size : 12
678+ }
679+ } ] )
680+ . then ( function ( ) {
681+ var points = d3Select ( gd ) . selectAll ( '.point' ) ;
682+ expect ( points . size ( ) ) . toBe ( 3 ) ;
683+ } )
684+ . then ( done , done . fail ) ;
685+ } ) ;
686+ } ) ;
576687} ) ;
0 commit comments