mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-25 00:44:10 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			841 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			841 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
 | |
| 
 | |
| describe('XY Chart', () => {
 | |
|   it('should render the simplest possible xy-beta chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart-beta
 | |
|         line [10, 30, 20]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('should render the simplest possible xy chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         line [10, 30, 20]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Should render a complete chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Should render a chart without title', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('y-axis title not required', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Should render a chart without y-axis with different range', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 14000, 3200, 9200, 9900, 3400, 6000]
 | |
|         line [2000, 7000, 6500, 9200, 9500, 7500, 11000, 10200, 3200, 8500, 7000, 8800]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('x axis title not required', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         x-axis [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 14000, 3200, 9200, 9900, 3400, 6000]
 | |
|         line [2000, 7000, 6500, 9200, 9500, 7500, 11000, 10200, 3200, 8500, 7000, 8800]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Multiple plots can be rendered', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         line [23, 46, 77, 34]
 | |
|         line [45, 32, 33, 12]
 | |
|         bar [87, 54, 99, 85]
 | |
|         line [78, 88, 22, 4]
 | |
|         line [22, 29, 75, 33]
 | |
|         bar [52, 96, 35, 10]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Decimals and negative numbers are supported', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         y-axis -2.4 --> 3.5
 | |
|         line [+1.3, .6, 2.4, -.34]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render spark line with "plotReservedSpacePercent"', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         theme: dark
 | |
|         xyChart:
 | |
|           width: 200
 | |
|           height: 20
 | |
|           plotReservedSpacePercent: 100
 | |
|       ---
 | |
|       xychart
 | |
|         line [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render spark bar without displaying other property', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         theme: dark
 | |
|         xyChart:
 | |
|           width: 200
 | |
|           height: 20
 | |
|           xAxis:
 | |
|             showLabel: false
 | |
|             showTitle: false
 | |
|             showTick: false
 | |
|             showAxisLine: false
 | |
|           yAxis:
 | |
|             showLabel: false
 | |
|             showTitle: false
 | |
|             showTick: false
 | |
|             showAxisLine: false
 | |
|       ---
 | |
|       xychart
 | |
|         bar [5000, 9000, 7500, 6200, 9500, 5500, 11000, 8200, 9200, 9500, 7000, 8800]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Should use all the config from directive', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       %%{init: {"xyChart": {"width": 1000, "height": 600, "titlePadding": 5, "titleFontSize": 10, "xAxis": {"labelFontSize": "20", "labelPadding": 10, "titleFontSize": 30, "titlePadding": 20, "tickLength": 10, "tickWidth": 5},  "yAxis": {"labelFontSize": "20", "labelPadding": 10, "titleFontSize": 30, "titlePadding": 20, "tickLength": 10, "tickWidth": 5}, "plotBorderWidth": 5, "chartOrientation": "horizontal", "plotReservedSpacePercent": 60  }}}%%
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Should use all the config from yaml', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         theme: forest
 | |
|         xyChart:
 | |
|           width: 1000
 | |
|           height: 600
 | |
|           titlePadding: 5
 | |
|           titleFontSize: 10
 | |
|           xAxis:
 | |
|             labelFontSize: 20
 | |
|             labelPadding: 10
 | |
|             titleFontSize: 30
 | |
|             titlePadding: 20
 | |
|             tickLength: 10
 | |
|             tickWidth: 5
 | |
|             axisLineWidth: 5
 | |
|           yAxis:
 | |
|             labelFontSize: 20
 | |
|             labelPadding: 10
 | |
|             titleFontSize: 30
 | |
|             titlePadding: 20
 | |
|             tickLength: 10
 | |
|             tickWidth: 5
 | |
|             axisLineWidth: 5
 | |
|           chartOrientation: horizontal
 | |
|           plotReservedSpacePercent: 60
 | |
|           showDataLabel: true
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render with show axis title false', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         xyChart:
 | |
|           xAxis:
 | |
|             showTitle: false
 | |
|           yAxis:
 | |
|             showTitle: false
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render with show axis label false', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         xyChart:
 | |
|           xAxis:
 | |
|             showLabel: false
 | |
|           yAxis:
 | |
|             showLabel: false
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render with show axis tick false', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         xyChart:
 | |
|           xAxis:
 | |
|             showTick: false
 | |
|           yAxis:
 | |
|             showTick: false
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render with show axis line false', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         xyChart:
 | |
|           xAxis:
 | |
|             showAxisLine: false
 | |
|           yAxis:
 | |
|             showAxisLine: false
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('Render all the theme color', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         themeVariables:
 | |
|           xyChart:
 | |
|             titleColor: "#ff0000"
 | |
|             backgroundColor: "#f0f8ff"
 | |
|             yAxisLabelColor: "#ee82ee"
 | |
|             yAxisTitleColor: "#7fffd4"
 | |
|             yAxisTickColor: "#87ceeb"
 | |
|             yAxisLineColor: "#ff6347"
 | |
|             xAxisLabelColor: "#7fffd4"
 | |
|             xAxisTitleColor: "#ee82ee"
 | |
|             xAxisTickColor: "#ff6347"
 | |
|             xAxisLineColor: "#87ceeb"
 | |
|             plotColorPalette: "#008000, #faba63"
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|         y-axis "Revenue (in $)" 4000 --> 11000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|         line [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
|   it('should use the correct distances between data points', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       xychart
 | |
|         x-axis 0 --> 2
 | |
|         line [0, 1, 0, 1]
 | |
|         bar [1, 0, 1, 0]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|     cy.get('svg');
 | |
|   });
 | |
| 
 | |
|   it('should render vertical bar chart with labels', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|     xychart
 | |
|       title "Sales Revenue"
 | |
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|       y-axis "Revenue (in $)" 4000 --> 11000
 | |
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render horizontal bar chart with labels', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|     xychart
 | |
|       title "Sales Revenue"
 | |
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|       y-axis "Revenue (in $)" 4000 --> 11000
 | |
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render vertical bar chart without labels by default', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     xychart
 | |
|       title "Sales Revenue"
 | |
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|       y-axis "Revenue (in $)" 4000 --> 11000
 | |
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render horizontal bar chart without labels by default', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|     xychart
 | |
|       title "Sales Revenue"
 | |
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec]
 | |
|       y-axis "Revenue (in $)" 4000 --> 11000
 | |
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render multiple bar plots vertically with labels correctly', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|       xychart
 | |
|         title "Multiple Bar Plots"
 | |
|         x-axis Categories [A, B, C]
 | |
|         y-axis "Values" 0 --> 100
 | |
|         bar [10, 50, 90]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render multiple bar plots horizontally with labels correctly', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|       xychart
 | |
|         title "Multiple Bar Plots"
 | |
|         x-axis Categories [A, B, C]
 | |
|         y-axis "Values" 0 --> 100
 | |
|         bar [10, 50, 90]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render a single bar with label for a vertical xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|       xychart
 | |
|         title "Single Bar Chart"
 | |
|         x-axis Categories [A]
 | |
|         y-axis "Value" 0 --> 100
 | |
|         bar [75]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render a single bar with label for a horizontal xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|       xychart
 | |
|         title "Single Bar Chart"
 | |
|         x-axis Categories [A]
 | |
|         y-axis "Value" 0 --> 100
 | |
|         bar [75]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render negative and decimal values with correct labels for vertical xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|       xychart
 | |
|         title "Decimal and Negative Values"
 | |
|         x-axis Categories [A, B, C]
 | |
|         y-axis -10 --> 10
 | |
|         bar [ -2.5, 0.75, 5.1 ]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render negative and decimal values with correct labels for horizontal xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|       xychart
 | |
|         title "Decimal and Negative Values"
 | |
|         x-axis Categories [A, B, C]
 | |
|         y-axis -10 --> 10
 | |
|         bar [ -2.5, 0.75, 5.1 ]
 | |
|       `,
 | |
|       {}
 | |
|     );
 | |
|   });
 | |
| 
 | |
|   it('should render data labels within each bar in the vertical xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|     xychart
 | |
|             title "Sales Revenue"
 | |
|             x-axis Months [jan,b,c]
 | |
|             y-axis "Revenue (in $)" 4000 --> 12000
 | |
|             bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             // Check horizontal alignment (within tolerance)
 | |
|             expect(textProps.x + textProps.width / 2).to.be.closeTo(
 | |
|               barProps.x + barProps.width / 2,
 | |
|               5
 | |
|             );
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should render data labels within each bar in the horizontal xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|     xychart
 | |
|             title "Sales Revenue"
 | |
|             x-axis Months [jan,b,c]
 | |
|             y-axis "Revenue (in $)" 4000 --> 12000
 | |
|             bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|             expect(textProps.y + textProps.height / 2).to.be.closeTo(
 | |
|               barProps.y + barProps.height / 2,
 | |
|               5
 | |
|             );
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should render data labels within each bar in the vertical xy-chart with a lot of bars of different sizes', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|       ---
 | |
|       config:
 | |
|         xyChart:
 | |
|           showDataLabel: true
 | |
|       ---
 | |
|       xychart
 | |
|         title "Sales Revenue"
 | |
|         x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]
 | |
|         y-axis "Revenue (in $)" 4000 --> 12000
 | |
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             // Check horizontal alignment (within tolerance)
 | |
|             expect(textProps.x + textProps.width / 2).to.be.closeTo(
 | |
|               barProps.x + barProps.width / 2,
 | |
|               5
 | |
|             );
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should render data labels within each bar in the horizontal xy-chart with a lot of bars of different sizes', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|     xychart
 | |
|       title "Sales Revenue"
 | |
|       x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s]
 | |
|       y-axis "Revenue (in $)" 4000 --> 12000
 | |
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|             expect(textProps.y + textProps.height / 2).to.be.closeTo(
 | |
|               barProps.y + barProps.height / 2,
 | |
|               5
 | |
|             );
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should render data labels correctly for a bar in the vertical xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|     ---
 | |
|     xychart
 | |
|             title "Sales Revenue"
 | |
|             x-axis Months [jan]
 | |
|             y-axis "Revenue (in $)" 3000 --> 12000
 | |
|             bar [4000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             // Check horizontal alignment (within tolerance)
 | |
|             expect(textProps.x + textProps.width / 2).to.be.closeTo(
 | |
|               barProps.x + barProps.width / 2,
 | |
|               5
 | |
|             );
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('should render data labels correctly for a bar in the horizontal xy-chart', () => {
 | |
|     imgSnapshotTest(
 | |
|       `
 | |
|     ---
 | |
|     config:
 | |
|       xyChart:
 | |
|         showDataLabel: true
 | |
|         chartOrientation: horizontal
 | |
|     ---
 | |
|     xychart
 | |
|             title "Sales Revenue"
 | |
|             x-axis Months [jan]
 | |
|             y-axis "Revenue (in $)" 3000 --> 12000
 | |
|             bar [4000]
 | |
|     `,
 | |
|       {}
 | |
|     );
 | |
| 
 | |
|     cy.get('g.bar-plot-0').within(() => {
 | |
|       cy.get('rect').each(($rect, index) => {
 | |
|         // Extract bar properties
 | |
|         const barProps = {
 | |
|           x: parseFloat($rect.attr('x')),
 | |
|           y: parseFloat($rect.attr('y')),
 | |
|           width: parseFloat($rect.attr('width')),
 | |
|           height: parseFloat($rect.attr('height')),
 | |
|         };
 | |
| 
 | |
|         // Get the text element corresponding to this bar by index.
 | |
|         cy.get('text')
 | |
|           .eq(index)
 | |
|           .then(($text) => {
 | |
|             const bbox = $text[0].getBBox();
 | |
|             const textProps = {
 | |
|               x: bbox.x,
 | |
|               y: bbox.y,
 | |
|               width: bbox.width,
 | |
|               height: bbox.height,
 | |
|             };
 | |
| 
 | |
|             // Verify that the text label is positioned within the boundaries of the bar.
 | |
|             expect(textProps.x).to.be.greaterThan(barProps.x);
 | |
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width);
 | |
| 
 | |
|             expect(textProps.y).to.be.greaterThan(barProps.y);
 | |
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height);
 | |
|             expect(textProps.y + textProps.height / 2).to.be.closeTo(
 | |
|               barProps.y + barProps.height / 2,
 | |
|               5
 | |
|             );
 | |
|           });
 | |
|       });
 | |
|     });
 | |
|   });
 | |
| });
 | 
