solid-recharts 1.0.0 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -6
- package/src/animation/AnimatedItems.tsx +4 -2
- package/src/animation/CSSTransitionAnimate.tsx +39 -41
- package/src/animation/JavascriptAnimate.tsx +41 -45
- package/src/cartesian/Area.tsx +4 -4
- package/src/cartesian/AreaRevealShape.tsx +1 -1
- package/src/cartesian/Bar.tsx +21 -33
- package/src/cartesian/BarStack.tsx +5 -5
- package/src/cartesian/Brush.tsx +15 -19
- package/src/cartesian/CartesianAxis.tsx +4 -4
- package/src/cartesian/CartesianGrid.tsx +5 -5
- package/src/cartesian/ErrorBar.tsx +7 -9
- package/src/cartesian/Funnel.tsx +3 -3
- package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
- package/src/cartesian/Line.tsx +16 -18
- package/src/cartesian/LineDrawShape.tsx +13 -14
- package/src/cartesian/ReferenceArea.tsx +4 -4
- package/src/cartesian/ReferenceDot.tsx +4 -4
- package/src/cartesian/ReferenceLine.tsx +4 -4
- package/src/cartesian/RenderedTicksReporter.tsx +17 -19
- package/src/cartesian/Scatter.tsx +3 -3
- package/src/cartesian/XAxis.tsx +1 -1
- package/src/cartesian/YAxis.tsx +33 -35
- package/src/cartesian/ZAxis.tsx +2 -3
- package/src/chart/AreaChart.tsx +1 -1
- package/src/chart/BarChart.tsx +1 -1
- package/src/chart/CartesianChart.tsx +3 -4
- package/src/chart/CategoricalChart.tsx +5 -5
- package/src/chart/ComposedChart.tsx +1 -1
- package/src/chart/FunnelChart.tsx +1 -1
- package/src/chart/LineChart.tsx +1 -1
- package/src/chart/PieChart.tsx +3 -4
- package/src/chart/PolarChart.tsx +3 -4
- package/src/chart/RadarChart.tsx +3 -4
- package/src/chart/RadialBarChart.tsx +3 -7
- package/src/chart/RechartsWrapper.tsx +24 -14
- package/src/chart/Sankey.tsx +6 -9
- package/src/chart/ScatterChart.tsx +1 -1
- package/src/chart/SunburstChart.tsx +4 -5
- package/src/chart/Treemap.tsx +4 -5
- package/src/component/ActivePoints.tsx +6 -6
- package/src/component/Cell.tsx +5 -23
- package/src/component/Cursor.tsx +3 -3
- package/src/component/DefaultLegendContent.tsx +6 -8
- package/src/component/DefaultTooltipContent.tsx +10 -14
- package/src/component/Dots.tsx +5 -5
- package/src/component/Label.tsx +10 -13
- package/src/component/LabelList.tsx +7 -12
- package/src/component/Legend.tsx +21 -26
- package/src/component/ResponsiveContainer.tsx +49 -52
- package/src/component/Text.tsx +5 -5
- package/src/component/Tooltip.tsx +18 -21
- package/src/component/TooltipBoundingBox.tsx +16 -18
- package/src/component/responsiveContainerUtils.ts +1 -1
- package/src/container/ClipPathProvider.tsx +3 -3
- package/src/container/Layer.tsx +5 -5
- package/src/container/RootSurface.tsx +1 -1
- package/src/container/Surface.tsx +6 -5
- package/src/context/ErrorBarContext.tsx +2 -2
- package/src/context/PanoramaContext.tsx +2 -2
- package/src/context/RegisterGraphicalItemId.tsx +2 -4
- package/src/context/chartDataContext.tsx +23 -26
- package/src/context/chartLayoutContext.tsx +12 -16
- package/src/polar/Pie.tsx +12 -13
- package/src/polar/PolarAngleAxis.tsx +3 -3
- package/src/polar/PolarGrid.tsx +5 -5
- package/src/polar/PolarRadiusAxis.tsx +3 -3
- package/src/polar/Radar.tsx +3 -3
- package/src/polar/RadialBar.tsx +3 -3
- package/src/shape/Cross.tsx +5 -5
- package/src/shape/Curve.tsx +7 -6
- package/src/shape/Dot.tsx +4 -4
- package/src/shape/Polygon.tsx +5 -5
- package/src/shape/Rectangle.tsx +20 -22
- package/src/shape/Sector.tsx +5 -5
- package/src/shape/Symbols.tsx +5 -5
- package/src/shape/Trapezoid.tsx +27 -29
- package/src/state/RechartsStoreProvider.tsx +3 -5
- package/src/state/ReportChartProps.tsx +6 -8
- package/src/state/ReportEventSettings.tsx +6 -8
- package/src/state/ReportMainChartProps.tsx +9 -11
- package/src/state/ReportPolarOptions.tsx +13 -15
- package/src/state/SetLegendPayload.ts +1 -1
- package/src/state/SetTooltipEntrySettings.tsx +1 -1
- package/src/state/brushSlice.ts +8 -10
- package/src/state/cartesianAxisSlice.ts +38 -46
- package/src/state/chartDataSlice.ts +23 -29
- package/src/state/errorBarSlice.ts +16 -22
- package/src/state/eventSettingsSlice.ts +9 -11
- package/src/state/graphicalItemsSlice.ts +13 -17
- package/src/state/layoutSlice.ts +19 -27
- package/src/state/legendSlice.ts +18 -24
- package/src/state/optionsSlice.ts +6 -8
- package/src/state/polarAxisSlice.ts +13 -21
- package/src/state/polarOptionsSlice.ts +14 -16
- package/src/state/referenceElementsSlice.ts +19 -25
- package/src/state/registerInStore.ts +13 -15
- package/src/state/renderedTicksSlice.ts +7 -11
- package/src/state/rootPropsSlice.ts +14 -16
- package/src/state/tooltipSlice.ts +95 -115
- package/src/state/unregisterOnCleanup.ts +20 -5
- package/src/state/zIndexSlice.ts +42 -50
- package/src/synchronisation/useChartSynchronisation.tsx +217 -213
- package/src/util/ActiveShapeUtils.tsx +2 -2
- package/src/util/BarUtils.tsx +3 -5
- package/src/util/FunnelUtils.tsx +1 -1
- package/src/util/RadialBarUtils.tsx +3 -4
- package/src/util/createCartesianCharts.tsx +1 -1
- package/src/util/createPolarCharts.tsx +1 -1
- package/src/util/svgPropertiesAndEvents.ts +1 -1
- package/src/util/tooltip/translate.ts +2 -2
- package/src/util/types.ts +2 -2
- package/src/zIndex/ZIndexLayer.tsx +68 -39
- package/src/zIndex/ZIndexPortal.tsx +25 -29
- package/test/_data.ts +408 -0
- package/test/animation/AnimationController.typed.spec.ts +53 -0
- package/test/animation/AnimationControllerImpl.spec.ts +271 -0
- package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
- package/test/animation/JavascriptAnimate.spec.tsx +62 -0
- package/test/animation/RechartsAnimation.spec.ts +636 -0
- package/test/animation/easing.spec.ts +218 -0
- package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
- package/test/animation/matchBy.spec.ts +467 -0
- package/test/animation/mockAnimationController.ts +40 -0
- package/test/animation/mockControllerAnimationManager.ts +143 -0
- package/test/animation/mockTimeoutController.ts +114 -0
- package/test/animation/timeoutController.spec.ts +138 -0
- package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
- package/test/animation/util.spec.ts +28 -0
- package/test/cartesian/Area.animation.spec.tsx +363 -0
- package/test/cartesian/Area.range.spec.tsx +54 -0
- package/test/cartesian/Area.spec.tsx +1202 -0
- package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
- package/test/cartesian/Area.typed.spec.tsx +209 -0
- package/test/cartesian/Axis.integration.spec.tsx +158 -0
- package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
- package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
- package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
- package/test/cartesian/Bar.animation.spec.tsx +426 -0
- package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
- package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
- package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
- package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
- package/test/cartesian/BarStack.spec.tsx +91 -0
- package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
- package/test/cartesian/Brush.panorama.spec.tsx +41 -0
- package/test/cartesian/Brush.props.spec.tsx +63 -0
- package/test/cartesian/Brush.render.spec.tsx +117 -0
- package/test/cartesian/Brush.spec.tsx +522 -0
- package/test/cartesian/Brush.stacked.spec.tsx +221 -0
- package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
- package/test/cartesian/CartesianAxis.spec.tsx +396 -0
- package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
- package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
- package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
- package/test/cartesian/ErrorBar.spec.tsx +2414 -0
- package/test/cartesian/Funnel.animation.spec.tsx +241 -0
- package/test/cartesian/Funnel.spec.tsx +226 -0
- package/test/cartesian/Funnel.typed.spec.tsx +221 -0
- package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
- package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
- package/test/cartesian/Line.animation.spec.tsx +643 -0
- package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
- package/test/cartesian/Line.spec.tsx +471 -0
- package/test/cartesian/Line.typed.spec.tsx +152 -0
- package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
- package/test/cartesian/ReferenceArea.spec.tsx +663 -0
- package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
- package/test/cartesian/ReferenceDot.spec.tsx +462 -0
- package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
- package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
- package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
- package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
- package/test/cartesian/Scatter.animation.spec.tsx +381 -0
- package/test/cartesian/Scatter.render.spec.tsx +61 -0
- package/test/cartesian/Scatter.spec.tsx +406 -0
- package/test/cartesian/Scatter.typed.spec.tsx +153 -0
- package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
- package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
- package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
- package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
- package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
- package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
- package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
- package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
- package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
- package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
- package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
- package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
- package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
- package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
- package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
- package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
- package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
- package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
- package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
- package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
- package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
- package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
- package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
- package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
- package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
- package/test/cartesian/ZAxis.spec.tsx +300 -0
- package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
- package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
- package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
- package/test/cartesian/getCartesianPosition.spec.ts +907 -0
- package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
- package/test/cartesian/getTicks.spec.ts +378 -0
- package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
- package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
- package/test/chart/AccessibilityLayer.spec.tsx +569 -0
- package/test/chart/AccessibilityScans.spec.tsx +286 -0
- package/test/chart/AreaChart.spec.tsx +409 -0
- package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
- package/test/chart/AreaChart.typed.spec.tsx +39 -0
- package/test/chart/BarChart.spec.tsx +3719 -0
- package/test/chart/BarChart.typed.spec.tsx +60 -0
- package/test/chart/CategoricalChart.spec.tsx +255 -0
- package/test/chart/ComposedChart.spec.tsx +199 -0
- package/test/chart/ComposedChart.typed.spec.tsx +39 -0
- package/test/chart/FunnelChart.spec.tsx +215 -0
- package/test/chart/FunnelChart.typed.spec.tsx +39 -0
- package/test/chart/LineChart.multiseries.spec.tsx +50 -0
- package/test/chart/LineChart.smoke.spec.tsx +50 -0
- package/test/chart/LineChart.spec.tsx +930 -0
- package/test/chart/LineChart.typed.spec.tsx +39 -0
- package/test/chart/NicheChartTooltip.spec.tsx +81 -0
- package/test/chart/PieChart.spec.tsx +793 -0
- package/test/chart/PieChart.typed.spec.tsx +39 -0
- package/test/chart/RadarChart.spec.tsx +530 -0
- package/test/chart/RadarChart.typed.spec.tsx +39 -0
- package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
- package/test/chart/RadialBarChart.spec.tsx +679 -0
- package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
- package/test/chart/RechartsWrapper.spec.tsx +83 -0
- package/test/chart/Sankey.content.spec.tsx +46 -0
- package/test/chart/Sankey.spec.tsx +952 -0
- package/test/chart/Sankey.typed.spec.tsx +29 -0
- package/test/chart/ScatterChart.spec.tsx +2613 -0
- package/test/chart/ScatterChart.typed.spec.tsx +39 -0
- package/test/chart/SunburstChart.spec.tsx +146 -0
- package/test/chart/Treemap.animation.spec.tsx +52 -0
- package/test/chart/Treemap.spec.tsx +1003 -0
- package/test/chart/Treemap.typed.spec.tsx +26 -0
- package/test/chart/chartEvents.spec.tsx +127 -0
- package/test/chart/responsive.spec.tsx +620 -0
- package/test/component/Cell.render.spec.tsx +155 -0
- package/test/component/Cell.spec.tsx +12 -0
- package/test/component/Cursor.spec.tsx +186 -0
- package/test/component/DefaultTooltipContent.spec.tsx +102 -0
- package/test/component/Label.render.spec.tsx +63 -0
- package/test/component/Label.spec.tsx +686 -0
- package/test/component/Label.typed.spec.tsx +46 -0
- package/test/component/LabelList.spec.tsx +188 -0
- package/test/component/Legend.itemSorter.spec.tsx +704 -0
- package/test/component/Legend.render.spec.tsx +92 -0
- package/test/component/Legend.spec.tsx +2213 -0
- package/test/component/Legend.typed.spec.tsx +22 -0
- package/test/component/ResponsiveContainer.spec.tsx +523 -0
- package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
- package/test/component/Text.spec.tsx +415 -0
- package/test/component/Text.typed.spec.tsx +46 -0
- package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
- package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
- package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
- package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
- package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
- package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
- package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
- package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
- package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
- package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
- package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
- package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
- package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
- package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
- package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
- package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
- package/test/component/Tooltip.hover.spec.tsx +61 -0
- package/test/component/Tooltip.item.spec.tsx +54 -0
- package/test/component/Tooltip.keyboard.spec.tsx +51 -0
- package/test/component/Tooltip.payload.spec.tsx +1716 -0
- package/test/component/Tooltip.touch.spec.tsx +39 -0
- package/test/component/Tooltip.visibility.spec.tsx +1889 -0
- package/test/component/TooltipBoundingBox.spec.tsx +89 -0
- package/test/component/responsiveContainerUtils.spec.ts +205 -0
- package/test/container/ClipPath.spec.tsx +602 -0
- package/test/container/chartDimensions.spec.tsx +368 -0
- package/test/context/chartLayoutContext.spec.tsx +378 -0
- package/test/helper/ExpectAxisDomain.tsx +27 -0
- package/test/helper/assertNotNull.ts +6 -0
- package/test/helper/assertZIndexLayerOrder.ts +19 -0
- package/test/helper/createSelectorTestCase.tsx +176 -0
- package/test/helper/expectAnimatedPieAngles.ts +100 -0
- package/test/helper/expectAnimatedPiePaths.ts +78 -0
- package/test/helper/expectAreaCurve.ts +15 -0
- package/test/helper/expectAxisTicks.ts +48 -0
- package/test/helper/expectBars.ts +54 -0
- package/test/helper/expectFunctionReturning.ts +58 -0
- package/test/helper/expectLabel.ts +32 -0
- package/test/helper/expectLastCalledWith.ts +48 -0
- package/test/helper/expectLine.ts +20 -0
- package/test/helper/expectPieSectors.ts +80 -0
- package/test/helper/expectScale.ts +37 -0
- package/test/helper/expectScatterPoints.ts +52 -0
- package/test/helper/expectStackGroups.ts +144 -0
- package/test/helper/mockAxes.ts +22 -0
- package/test/helper/mockGetBoundingClientRect.ts +66 -0
- package/test/helper/mockHTMLElementProperty.ts +19 -0
- package/test/helper/mockTouchingElement.ts +27 -0
- package/test/helper/offsetHelpers.ts +19 -0
- package/test/helper/parameterizedTestCases.tsx +99 -0
- package/test/helper/produceState.ts +32 -0
- package/test/helper/selectorTestHelpers.tsx +63 -0
- package/test/helper/trim.spec.ts +35 -0
- package/test/helper/trim.ts +11 -0
- package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
- package/test/hooks/useAxisDomain.spec.tsx +361 -0
- package/test/hooks/useAxisScale.spec.tsx +283 -0
- package/test/hooks/useAxisTicks.spec.tsx +130 -0
- package/test/hooks/useOffset.spec.tsx +248 -0
- package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
- package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
- package/test/polar/Pie/Pie.spec.tsx +784 -0
- package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
- package/test/polar/Pie.animation.spec.tsx +529 -0
- package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
- package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
- package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
- package/test/polar/PolarGrid.render.spec.tsx +75 -0
- package/test/polar/PolarGrid.spec.tsx +918 -0
- package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
- package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
- package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
- package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
- package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
- package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
- package/test/polar/Radar.animation.spec.tsx +570 -0
- package/test/polar/Radar.render.spec.tsx +71 -0
- package/test/polar/Radar.spec.tsx +265 -0
- package/test/polar/Radar.typed.spec.tsx +119 -0
- package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
- package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
- package/test/polar/RadialBar.animation.spec.tsx +375 -0
- package/test/polar/RadialBar.render.spec.tsx +66 -0
- package/test/polar/RadialBar.stacked.spec.tsx +57 -0
- package/test/setup.ts +84 -0
- package/test/shape/ActiveShape.spec.tsx +181 -0
- package/test/shape/Cross.spec.tsx +60 -0
- package/test/shape/Cross.typed.spec.tsx +26 -0
- package/test/shape/Curve.spec.tsx +368 -0
- package/test/shape/Curve.typed.spec.tsx +69 -0
- package/test/shape/Dot.spec.tsx +73 -0
- package/test/shape/Dot.typed.spec.tsx +30 -0
- package/test/shape/Polygon.spec.tsx +357 -0
- package/test/shape/Polygon.typed.spec.tsx +28 -0
- package/test/shape/Rectangle.animation.spec.tsx +451 -0
- package/test/shape/Rectangle.spec.tsx +68 -0
- package/test/shape/Rectangle.typed.spec.tsx +24 -0
- package/test/shape/Sector.spec.tsx +76 -0
- package/test/shape/Sector.typed.spec.tsx +24 -0
- package/test/shape/Symbols.spec.tsx +43 -0
- package/test/shape/Symbols.typed.spec.tsx +24 -0
- package/test/shape/Trapezoid.spec.tsx +50 -0
- package/test/shape/Trapezoid.typed.spec.tsx +24 -0
- package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
- package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
- package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
- package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
- package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
- package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
- package/test/state/chartDataSlice.spec.ts +53 -0
- package/test/state/createCollectionActions.spec.ts +87 -0
- package/test/state/createSelector.spec.ts +158 -0
- package/test/state/externalEventsMiddleware.spec.ts +178 -0
- package/test/state/graphicalItemsSlice.spec.ts +92 -0
- package/test/state/hooks.spec.tsx +68 -0
- package/test/state/legendSlice.spec.ts +44 -0
- package/test/state/mouseEventsMiddleware.spec.ts +75 -0
- package/test/state/optionsSlice.spec.ts +19 -0
- package/test/state/referenceElementsSlice.spec.ts +84 -0
- package/test/state/registerInStore.spec.tsx +101 -0
- package/test/state/selectors/areaSelectors.spec.tsx +77 -0
- package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
- package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
- package/test/state/selectors/brushSelectors.spec.tsx +30 -0
- package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
- package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
- package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
- package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
- package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
- package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
- package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
- package/test/state/selectors/containerSelectors.spec.tsx +168 -0
- package/test/state/selectors/dataSelectors.spec.tsx +136 -0
- package/test/state/selectors/legendSelectors.spec.tsx +113 -0
- package/test/state/selectors/lineSelectors.spec.tsx +60 -0
- package/test/state/selectors/pieSelectors.spec.tsx +72 -0
- package/test/state/selectors/radarSelectors.spec.tsx +496 -0
- package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
- package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
- package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
- package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
- package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
- package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
- package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
- package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
- package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
- package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
- package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
- package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
- package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
- package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
- package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
- package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
- package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
- package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
- package/test/state/selectors/selectorMemoization.spec.tsx +136 -0
- package/test/state/selectors/selectors.spec.tsx +1613 -0
- package/test/state/throttling.spec.ts +200 -0
- package/test/state/zIndexSlice.spec.ts +85 -0
- package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
- package/test/util/BarUtils.spec.ts +39 -0
- package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
- package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
- package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
- package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
- package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +97 -0
- package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
- package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
- package/test/util/DataUtils.spec.ts +385 -0
- package/test/util/DomUtils.spec.tsx +117 -0
- package/test/util/FunnelUtils.spec.tsx +70 -0
- package/test/util/Global.spec.ts +11 -0
- package/test/util/LRUCache.spec.ts +81 -0
- package/test/util/LogUtils.spec.ts +45 -0
- package/test/util/PolarUtils.spec.ts +66 -0
- package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
- package/test/util/ShallowEqual.spec.ts +102 -0
- package/test/util/TickUtils.spec.ts +29 -0
- package/test/util/createChartHelpers.spec.tsx +210 -0
- package/test/util/cursor/getCursorPoints.spec.ts +136 -0
- package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
- package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
- package/test/util/errorValue.spec.ts +69 -0
- package/test/util/getEveryNth.spec.ts +39 -0
- package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
- package/test/util/getRelativeCoordinate.spec.ts +250 -0
- package/test/util/getSliced.spec.ts +45 -0
- package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
- package/test/util/isWellBehavedNumber.spec.ts +54 -0
- package/test/util/payload/getUniqPayload.spec.ts +56 -0
- package/test/util/propsAreEqual.spec.ts +75 -0
- package/test/util/round.spec.ts +112 -0
- package/test/util/scale/arithmetic.spec.ts +61 -0
- package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
- package/test/util/scale/getNiceTickValues.spec.ts +421 -0
- package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
- package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
- package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
- package/test/util/tooltip/translate.spec.ts +396 -0
- package/test/util/useAnimationId.spec.tsx +59 -0
- package/test/util/useElementOffset.spec.tsx +173 -0
- package/test/util/usePrefersReducedMotion.spec.ts +54 -0
- package/test/util/useUniqueId.spec.ts +99 -0
- package/test/utils/diagnostics-allowlist.ts +18 -0
- package/test/utils/diagnostics.ts +58 -0
- package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
- package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
- package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
- package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
- package/test/zIndex/componentZIndex.spec.tsx +255 -0
- package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
- package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
- package/test/zIndex/zIndexSelectors.spec.ts +172 -0
- package/test-results/.last-run.json +4 -0
- package/tsconfig.json +11 -0
- package/src/util/DirectPortal.tsx +0 -107
|
@@ -0,0 +1,1595 @@
|
|
|
1
|
+
import { describe, expect, it, test, vi } from "vitest";
|
|
2
|
+
import type { Mock } from "vitest";
|
|
3
|
+
import { createEffect, createSignal, flush } from "solid-js";
|
|
4
|
+
import type { JSX } from "@solidjs/web";
|
|
5
|
+
import {
|
|
6
|
+
Area,
|
|
7
|
+
AreaChart,
|
|
8
|
+
Bar,
|
|
9
|
+
BarChart,
|
|
10
|
+
CartesianGrid,
|
|
11
|
+
ComposedChart,
|
|
12
|
+
Line,
|
|
13
|
+
LineChart,
|
|
14
|
+
ReferenceArea,
|
|
15
|
+
ReferenceDot,
|
|
16
|
+
ReferenceLine,
|
|
17
|
+
Tooltip,
|
|
18
|
+
XAxis,
|
|
19
|
+
YAxis,
|
|
20
|
+
} from "../../../src";
|
|
21
|
+
import type { YAxisProps, IfOverflow } from "../../../src";
|
|
22
|
+
import type {
|
|
23
|
+
AxisDomain,
|
|
24
|
+
CategoricalDomain,
|
|
25
|
+
NumberDomain,
|
|
26
|
+
StackOffsetType,
|
|
27
|
+
} from "../../../src/util/types";
|
|
28
|
+
import { pageData, rangeData } from "../../_data";
|
|
29
|
+
import { useAppSelector } from "../../../src/state/hooks";
|
|
30
|
+
import {
|
|
31
|
+
implicitYAxis,
|
|
32
|
+
selectAxisDomain,
|
|
33
|
+
selectNumericalDomain,
|
|
34
|
+
selectRenderableAxisSettings,
|
|
35
|
+
} from "../../../src/state/selectors/axisSelectors";
|
|
36
|
+
import type { YAxisSettings } from "../../../src/state/cartesianAxisSlice";
|
|
37
|
+
import { expectYAxisTicks } from "../../helper/expectAxisTicks";
|
|
38
|
+
import { useIsPanorama } from "../../../src/context/PanoramaContext";
|
|
39
|
+
import { mockGetBoundingClientRect } from "../../helper/mockGetBoundingClientRect";
|
|
40
|
+
import { getCalculatedYAxisWidth } from "../../../src/util/YAxisUtils";
|
|
41
|
+
import { expectLastCalledWith } from "../../helper/expectLastCalledWith";
|
|
42
|
+
import { createSelectorTestCase } from "../../helper/createSelectorTestCase";
|
|
43
|
+
import { assertNotNull } from "../../helper/assertNotNull";
|
|
44
|
+
import { render, fireEvent } from "@solidjs/testing-library";
|
|
45
|
+
|
|
46
|
+
describe("<YAxis />", () => {
|
|
47
|
+
const data = [
|
|
48
|
+
{ name: "Page A", uv: 400, pv: 2400, amt: 2400 },
|
|
49
|
+
{ name: "Page B", uv: 300, pv: 1398, amt: 2400 },
|
|
50
|
+
{ name: "Page C", uv: 200, pv: 9800, amt: 2400 },
|
|
51
|
+
{ name: "Page D", uv: 278, pv: 3908, amt: 2400 },
|
|
52
|
+
{ name: "Page E", uv: 189, pv: 4800, amt: 2400 },
|
|
53
|
+
];
|
|
54
|
+
|
|
55
|
+
it("Should render 3 y-CartesianAxis in AreaChart", () => {
|
|
56
|
+
const { container } = render(() => (
|
|
57
|
+
<AreaChart width={600} height={400} data={data}>
|
|
58
|
+
<YAxis type="number" yAxisId={0} />
|
|
59
|
+
<YAxis type="number" orientation="right" yAxisId={1} />
|
|
60
|
+
<YAxis type="number" orientation="right" yAxisId={2} />
|
|
61
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" strokeWidth={2} yAxisId={0} />
|
|
62
|
+
<Area dataKey="pv" stroke="#387908" fill="#387908" strokeWidth={2} yAxisId={1} />
|
|
63
|
+
<Area dataKey="amt" stroke="#38abc8" fill="#38abc8" strokeWidth={2} yAxisId={2} />
|
|
64
|
+
</AreaChart>
|
|
65
|
+
));
|
|
66
|
+
|
|
67
|
+
expect(container.querySelectorAll(".recharts-cartesian-axis-line")).toHaveLength(3);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe("Area with range", () => {
|
|
71
|
+
const renderTestCase = createSelectorTestCase((props) => (
|
|
72
|
+
<AreaChart
|
|
73
|
+
width={500}
|
|
74
|
+
height={400}
|
|
75
|
+
data={rangeData}
|
|
76
|
+
margin={{
|
|
77
|
+
top: 10,
|
|
78
|
+
right: 30,
|
|
79
|
+
left: 0,
|
|
80
|
+
bottom: 0,
|
|
81
|
+
}}
|
|
82
|
+
>
|
|
83
|
+
<XAxis dataKey="day" />
|
|
84
|
+
<YAxis />
|
|
85
|
+
<Area dataKey="temperature" stroke="#d82428" fill="#8884d8" />
|
|
86
|
+
<Tooltip defaultIndex={4} active />
|
|
87
|
+
{props.children}
|
|
88
|
+
</AreaChart>
|
|
89
|
+
));
|
|
90
|
+
|
|
91
|
+
it("should render YAxis ticks", () => {
|
|
92
|
+
const { container } = renderTestCase();
|
|
93
|
+
expectYAxisTicks(container, [
|
|
94
|
+
{
|
|
95
|
+
textContent: "-6",
|
|
96
|
+
x: "52",
|
|
97
|
+
y: "370",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
textContent: "0",
|
|
101
|
+
x: "52",
|
|
102
|
+
y: "280",
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
textContent: "6",
|
|
106
|
+
x: "52",
|
|
107
|
+
y: "190",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
textContent: "12",
|
|
111
|
+
x: "52",
|
|
112
|
+
y: "100",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
textContent: "18",
|
|
116
|
+
x: "52",
|
|
117
|
+
y: "10",
|
|
118
|
+
},
|
|
119
|
+
]);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should select numerical domain", () => {
|
|
123
|
+
const { spy } = renderTestCase((state) => selectNumericalDomain(state, "yAxis", 0, false));
|
|
124
|
+
expectLastCalledWith(spy, [-3, 16]);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("should select final domain", () => {
|
|
128
|
+
const { spy } = renderTestCase((state) => selectAxisDomain(state, "yAxis", 0, false));
|
|
129
|
+
expectLastCalledWith(spy, [-3, 16]);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("Should render 5 ticks", () => {
|
|
134
|
+
const { container } = render(() => (
|
|
135
|
+
<AreaChart width={600} height={400} data={data}>
|
|
136
|
+
<YAxis type="number" />
|
|
137
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" />
|
|
138
|
+
</AreaChart>
|
|
139
|
+
));
|
|
140
|
+
const ticks = container.querySelectorAll("text");
|
|
141
|
+
|
|
142
|
+
expect(ticks).toHaveLength(5);
|
|
143
|
+
expect(ticks[1]!.getAttribute("y")).toBe("297.5");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const casesThatShowTicks: [number, AxisDomain, string][] = [
|
|
147
|
+
// [ticksLength, domain, textContentOfTickElement]
|
|
148
|
+
[5, [0, 10000], "10000"],
|
|
149
|
+
[5, [0, "dataMax"], "9800"],
|
|
150
|
+
[5, [0, "dataMax - 100"], "9800"],
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
test.each(casesThatShowTicks)(
|
|
154
|
+
"Should render %s ticks when domain={%s}",
|
|
155
|
+
(length, domain, textContent) => {
|
|
156
|
+
const { container } = render(() => (
|
|
157
|
+
<AreaChart width={600} height={400} data={data}>
|
|
158
|
+
<YAxis type="number" domain={domain} />
|
|
159
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" />
|
|
160
|
+
<Area dataKey="pv" stroke="#ff7300" fill="#ff7300" />
|
|
161
|
+
</AreaChart>
|
|
162
|
+
));
|
|
163
|
+
const ticks = container.querySelectorAll("text");
|
|
164
|
+
|
|
165
|
+
expect(ticks).toHaveLength(length);
|
|
166
|
+
expect(ticks[ticks.length - 1]).toHaveTextContent(textContent);
|
|
167
|
+
},
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
it("should render multiple axes", () => {
|
|
171
|
+
const { container } = render(() => (
|
|
172
|
+
<AreaChart width={600} height={400} data={data}>
|
|
173
|
+
<YAxis yAxisId="a" />
|
|
174
|
+
<Area dataKey="uv" yAxisId="a" />
|
|
175
|
+
<YAxis yAxisId="b" />
|
|
176
|
+
<Area dataKey="pv" yAxisId="b" />
|
|
177
|
+
<YAxis yAxisId="c" orientation="right" />
|
|
178
|
+
<Area dataKey="amt" yAxisId="c" />
|
|
179
|
+
<YAxis yAxisId="d" type="category" orientation="right" />
|
|
180
|
+
<Area dataKey="name" yAxisId="d" />
|
|
181
|
+
</AreaChart>
|
|
182
|
+
));
|
|
183
|
+
|
|
184
|
+
expectYAxisTicks(container, [
|
|
185
|
+
{ textContent: "0", x: "117", y: "395" },
|
|
186
|
+
{ textContent: "100", x: "117", y: "297.5" },
|
|
187
|
+
{ textContent: "200", x: "117", y: "200" },
|
|
188
|
+
{ textContent: "300", x: "117", y: "102.5" },
|
|
189
|
+
{ textContent: "400", x: "117", y: "5" },
|
|
190
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
191
|
+
{ textContent: "2500", x: "57", y: "297.5" },
|
|
192
|
+
{ textContent: "5000", x: "57", y: "200" },
|
|
193
|
+
{ textContent: "7500", x: "57", y: "102.5" },
|
|
194
|
+
{ textContent: "10000", x: "57", y: "5" },
|
|
195
|
+
{ textContent: "0", x: "483", y: "395" },
|
|
196
|
+
{ textContent: "600", x: "483", y: "297.5" },
|
|
197
|
+
{ textContent: "1200", x: "483", y: "200" },
|
|
198
|
+
{ textContent: "1800", x: "483", y: "102.5" },
|
|
199
|
+
{ textContent: "2400", x: "483", y: "5" },
|
|
200
|
+
{ textContent: "Page A", x: "543", y: "395" },
|
|
201
|
+
{ textContent: "Page B", x: "543", y: "297.5" },
|
|
202
|
+
{ textContent: "Page C", x: "543", y: "200" },
|
|
203
|
+
{ textContent: "Page D", x: "543", y: "102.5" },
|
|
204
|
+
{ textContent: "Page E", x: "543", y: "5" },
|
|
205
|
+
]);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("should render multiple axes with some ticks mirrored", () => {
|
|
209
|
+
const { container } = render(() => (
|
|
210
|
+
<AreaChart width={600} height={400} data={data}>
|
|
211
|
+
<YAxis yAxisId="a" />
|
|
212
|
+
<Area dataKey="uv" yAxisId="a" />
|
|
213
|
+
<YAxis mirror yAxisId="b" />
|
|
214
|
+
<Area dataKey="pv" yAxisId="b" />
|
|
215
|
+
<YAxis yAxisId="c" orientation="right" />
|
|
216
|
+
<Area dataKey="amt" yAxisId="c" />
|
|
217
|
+
<YAxis mirror yAxisId="d" type="category" orientation="right" />
|
|
218
|
+
<Area dataKey="name" yAxisId="d" />
|
|
219
|
+
</AreaChart>
|
|
220
|
+
));
|
|
221
|
+
|
|
222
|
+
expectYAxisTicks(container, [
|
|
223
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
224
|
+
{ textContent: "100", x: "57", y: "297.5" },
|
|
225
|
+
{ textContent: "200", x: "57", y: "200" },
|
|
226
|
+
{ textContent: "300", x: "57", y: "102.5" },
|
|
227
|
+
{ textContent: "400", x: "57", y: "5" },
|
|
228
|
+
{ textContent: "0", x: "73", y: "395" },
|
|
229
|
+
{ textContent: "2500", x: "73", y: "297.5" },
|
|
230
|
+
{ textContent: "5000", x: "73", y: "200" },
|
|
231
|
+
{ textContent: "7500", x: "73", y: "102.5" },
|
|
232
|
+
{ textContent: "10000", x: "73", y: "5" },
|
|
233
|
+
{ textContent: "0", x: "543", y: "395" },
|
|
234
|
+
{ textContent: "600", x: "543", y: "297.5" },
|
|
235
|
+
{ textContent: "1200", x: "543", y: "200" },
|
|
236
|
+
{ textContent: "1800", x: "543", y: "102.5" },
|
|
237
|
+
{ textContent: "2400", x: "543", y: "5" },
|
|
238
|
+
{ textContent: "Page A", x: "527", y: "395" },
|
|
239
|
+
{ textContent: "Page B", x: "527", y: "297.5" },
|
|
240
|
+
{ textContent: "Page C", x: "527", y: "200" },
|
|
241
|
+
{ textContent: "Page D", x: "527", y: "102.5" },
|
|
242
|
+
{ textContent: "Page E", x: "527", y: "5" },
|
|
243
|
+
]);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it("should not leave space for hidden axes", () => {
|
|
247
|
+
const { container } = render(() => (
|
|
248
|
+
<AreaChart width={600} height={400} data={data}>
|
|
249
|
+
<YAxis yAxisId="a" />
|
|
250
|
+
<Area dataKey="uv" yAxisId="a" />
|
|
251
|
+
<YAxis yAxisId="b" hide />
|
|
252
|
+
<Area dataKey="pv" yAxisId="b" />
|
|
253
|
+
<YAxis yAxisId="c" orientation="right" />
|
|
254
|
+
<Area dataKey="amt" yAxisId="c" />
|
|
255
|
+
<YAxis yAxisId="d" type="category" orientation="right" hide />
|
|
256
|
+
<Area dataKey="name" yAxisId="d" />
|
|
257
|
+
</AreaChart>
|
|
258
|
+
));
|
|
259
|
+
expectYAxisTicks(container, [
|
|
260
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
261
|
+
{ textContent: "100", x: "57", y: "297.5" },
|
|
262
|
+
{ textContent: "200", x: "57", y: "200" },
|
|
263
|
+
{ textContent: "300", x: "57", y: "102.5" },
|
|
264
|
+
{ textContent: "400", x: "57", y: "5" },
|
|
265
|
+
{ textContent: "0", x: "543", y: "395" },
|
|
266
|
+
{ textContent: "600", x: "543", y: "297.5" },
|
|
267
|
+
{ textContent: "1200", x: "543", y: "200" },
|
|
268
|
+
{ textContent: "1800", x: "543", y: "102.5" },
|
|
269
|
+
{ textContent: "2400", x: "543", y: "5" },
|
|
270
|
+
]);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('Renders evenly distributed ticks when domain={[0, 1000]} and dataKey is "noExist", and allowDataOverflow', () => {
|
|
274
|
+
const domain = [0, 1000] as const;
|
|
275
|
+
const { container } = render(() => (
|
|
276
|
+
<AreaChart width={600} height={400} data={data}>
|
|
277
|
+
<YAxis domain={domain} allowDataOverflow />
|
|
278
|
+
<Area dataKey="noExist" stroke="#ff7300" fill="#ff7300" />
|
|
279
|
+
</AreaChart>
|
|
280
|
+
));
|
|
281
|
+
expectYAxisTicks(container, [
|
|
282
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
283
|
+
{ textContent: "250", x: "57", y: "297.5" },
|
|
284
|
+
{ textContent: "500", x: "57", y: "200" },
|
|
285
|
+
{ textContent: "750", x: "57", y: "102.5" },
|
|
286
|
+
{ textContent: "1000", x: "57", y: "5" },
|
|
287
|
+
]);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('Renders no ticks when domain={[0, 1000]} and dataKey is "noExist", and allowDataOverflow=false', () => {
|
|
291
|
+
const { container } = render(() => (
|
|
292
|
+
<AreaChart width={600} height={400} data={data}>
|
|
293
|
+
<YAxis domain={[0, 1000]} allowDataOverflow={false} />
|
|
294
|
+
<Area dataKey="noExist" stroke="#ff7300" fill="#ff7300" />
|
|
295
|
+
</AreaChart>
|
|
296
|
+
));
|
|
297
|
+
expectYAxisTicks(container, []);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('Renders no ticks when dataKey is "noExist"', () => {
|
|
301
|
+
const { container } = render(() => (
|
|
302
|
+
<AreaChart width={600} height={400} data={data}>
|
|
303
|
+
<YAxis />
|
|
304
|
+
<Area dataKey="noExist" stroke="#ff7300" fill="#ff7300" />
|
|
305
|
+
</AreaChart>
|
|
306
|
+
));
|
|
307
|
+
expectYAxisTicks(container, []);
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
const casesThatDoNotShowTicks: [AxisDomain][] = [
|
|
311
|
+
[[0, "dataMax + 100"]],
|
|
312
|
+
[[0, "dataMax - 100"]],
|
|
313
|
+
[["auto", "auto"]],
|
|
314
|
+
];
|
|
315
|
+
|
|
316
|
+
test.each(casesThatDoNotShowTicks)(
|
|
317
|
+
'Should render 0 ticks when domain={%s} and dataKey is "noExist" ',
|
|
318
|
+
(domain) => {
|
|
319
|
+
const { container } = render(() => (
|
|
320
|
+
<AreaChart width={600} height={400} data={data}>
|
|
321
|
+
<YAxis domain={domain} />
|
|
322
|
+
<Area dataKey="noExist" stroke="#ff7300" fill="#ff7300" />
|
|
323
|
+
</AreaChart>
|
|
324
|
+
));
|
|
325
|
+
const ticks = container.querySelectorAll("text");
|
|
326
|
+
|
|
327
|
+
expect(ticks).toHaveLength(0);
|
|
328
|
+
},
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
describe("in simple AreaChart", () => {
|
|
332
|
+
const renderTestCase = createSelectorTestCase((props) => (
|
|
333
|
+
<AreaChart width={600} height={400} data={data}>
|
|
334
|
+
<YAxis type="number" ticks={[0, 400, 800, 1200]} />
|
|
335
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" />
|
|
336
|
+
{props.children}
|
|
337
|
+
</AreaChart>
|
|
338
|
+
));
|
|
339
|
+
|
|
340
|
+
it("should select numerical domain", () => {
|
|
341
|
+
const { spy } = renderTestCase((state) => selectNumericalDomain(state, "yAxis", 0, false));
|
|
342
|
+
expectLastCalledWith(spy, [0, 1200]);
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
it("should select domain", () => {
|
|
346
|
+
const { spy } = renderTestCase((state) => selectAxisDomain(state, "yAxis", 0, false));
|
|
347
|
+
expectLastCalledWith(spy, [0, 1200]);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it("should render ticks", () => {
|
|
351
|
+
const { container } = renderTestCase();
|
|
352
|
+
expectYAxisTicks(container, [
|
|
353
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
354
|
+
{ textContent: "400", x: "57", y: "265.00000000000006" },
|
|
355
|
+
{ textContent: "800", x: "57", y: "135.00000000000003" },
|
|
356
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
357
|
+
]);
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
// SKIP: parity gap — YAxisProps has no `onClick`/tick-click handler in this port
|
|
362
|
+
// (verified: `grep onClick src/cartesian/YAxis.tsx` → none). The tick click event
|
|
363
|
+
// contract (data/index/event passed to onClick) is unimplemented.
|
|
364
|
+
it("Should pass data, index, and event to the onClick event handler", () => {
|
|
365
|
+
// intentionally empty — see skip comment above.
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
it("Renders axis based on specified domain when data overflow is allowed", () => {
|
|
369
|
+
/*
|
|
370
|
+
* We take domain values that have nothing to do with the test data to make sure they're really used.
|
|
371
|
+
* We generate a random integer between 1 and 100.
|
|
372
|
+
*/
|
|
373
|
+
const domainStart = Math.round(Math.random() * 100);
|
|
374
|
+
const domainEnd = domainStart + Math.round(Math.random() * 100);
|
|
375
|
+
|
|
376
|
+
const { container } = render(() => (
|
|
377
|
+
<AreaChart width={600} height={400} data={data}>
|
|
378
|
+
<YAxis type="number" domain={[domainStart, domainEnd]} allowDataOverflow />
|
|
379
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" />
|
|
380
|
+
</AreaChart>
|
|
381
|
+
));
|
|
382
|
+
|
|
383
|
+
// all ticks
|
|
384
|
+
const ticks = container.querySelectorAll(".recharts-cartesian-axis-tick-value");
|
|
385
|
+
|
|
386
|
+
// value of each tick
|
|
387
|
+
const tickValues: number[] = [];
|
|
388
|
+
ticks.forEach((tick) => {
|
|
389
|
+
const tickValueText = tick.textContent;
|
|
390
|
+
expect(tickValueText).toBeTruthy();
|
|
391
|
+
// convert string to number
|
|
392
|
+
if (tickValueText) tickValues.push(Number(tickValueText));
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
const tickValueMax = Math.max(...tickValues);
|
|
396
|
+
const tickValueMin = Math.min(...tickValues);
|
|
397
|
+
|
|
398
|
+
expect(tickValueMin).toBe(domainStart);
|
|
399
|
+
expect(tickValueMax).toBe(domainEnd);
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
it("Render ticks reversed", () => {
|
|
403
|
+
const { container } = render(() => (
|
|
404
|
+
<AreaChart width={600} height={400} data={data}>
|
|
405
|
+
<YAxis reversed type="number" />
|
|
406
|
+
<Area dataKey="uv" stroke="#ff7300" fill="#ff7300" />
|
|
407
|
+
</AreaChart>
|
|
408
|
+
));
|
|
409
|
+
expectYAxisTicks(container, [
|
|
410
|
+
{ textContent: "0", x: "57", y: "5" },
|
|
411
|
+
{ textContent: "100", x: "57", y: "102.5" },
|
|
412
|
+
{ textContent: "200", x: "57", y: "200" },
|
|
413
|
+
{ textContent: "300", x: "57", y: "297.5" },
|
|
414
|
+
{ textContent: "400", x: "57", y: "395" },
|
|
415
|
+
]);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
it("Should skip rendering ticks with empty text", () => {
|
|
419
|
+
const areaData = [
|
|
420
|
+
{ day: "05-01", weather: "sunny" },
|
|
421
|
+
{ day: "05-02" },
|
|
422
|
+
{ day: "05-03", weather: "cloudy" },
|
|
423
|
+
{ day: "05-04", weather: "rain" },
|
|
424
|
+
];
|
|
425
|
+
const { container } = render(() => (
|
|
426
|
+
<AreaChart width={400} height={400} data={areaData}>
|
|
427
|
+
<YAxis type="category" />
|
|
428
|
+
<Area type="stepAfter" dataKey="weather" stroke="#0088FE" />
|
|
429
|
+
</AreaChart>
|
|
430
|
+
));
|
|
431
|
+
expectYAxisTicks(container, [
|
|
432
|
+
{ textContent: "sunny", x: "57", y: "395" },
|
|
433
|
+
{ textContent: "cloudy", x: "57", y: "200" },
|
|
434
|
+
{ textContent: "rain", x: "57", y: "5" },
|
|
435
|
+
]);
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
it("Should render the YAxis line without any ticks", () => {
|
|
439
|
+
const areaData = [{ day: "05-01" }, { day: "05-02" }];
|
|
440
|
+
const { container } = render(() => (
|
|
441
|
+
<AreaChart width={400} height={400} data={areaData}>
|
|
442
|
+
<YAxis type="category" />
|
|
443
|
+
<Area type="stepAfter" dataKey="weather" stroke="#0088FE" />
|
|
444
|
+
</AreaChart>
|
|
445
|
+
));
|
|
446
|
+
const ticksGroup = container.getElementsByClassName("recharts-cartesian-axis-tick-line");
|
|
447
|
+
expect(ticksGroup).toHaveLength(0);
|
|
448
|
+
|
|
449
|
+
const axisLine = container.getElementsByClassName("recharts-cartesian-axis-line");
|
|
450
|
+
expect(axisLine).toHaveLength(1);
|
|
451
|
+
|
|
452
|
+
expectYAxisTicks(container, []);
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
it("should not render anything when attempting to render outside of Chart", () => {
|
|
456
|
+
const { container } = render(() => <YAxis dataKey="x" name="stature" unit="cm" />);
|
|
457
|
+
expect(container.querySelectorAll(".recharts-cartesian-axis-line")).toHaveLength(0);
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
describe("includeHidden", () => {
|
|
461
|
+
it.each([undefined, true, false])(
|
|
462
|
+
"should show ticks for visibleData when includeHidden=%s",
|
|
463
|
+
(includeHidden) => {
|
|
464
|
+
const domainSpy = vi.fn();
|
|
465
|
+
function Comp(props: {
|
|
466
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
467
|
+
}): null {
|
|
468
|
+
const isPanorama = useIsPanorama();
|
|
469
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
470
|
+
createEffect(
|
|
471
|
+
() => domain(),
|
|
472
|
+
(d) => props.domainSpy(d),
|
|
473
|
+
);
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
const { container } = render(() => (
|
|
477
|
+
<BarChart width={600} height={400} data={data}>
|
|
478
|
+
<YAxis includeHidden={includeHidden} />
|
|
479
|
+
<Bar dataKey="pv" />
|
|
480
|
+
<Bar dataKey="uv" />
|
|
481
|
+
<Comp domainSpy={domainSpy} />
|
|
482
|
+
</BarChart>
|
|
483
|
+
));
|
|
484
|
+
expectYAxisTicks(container, [
|
|
485
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
486
|
+
{ textContent: "2500", x: "57", y: "297.5" },
|
|
487
|
+
{ textContent: "5000", x: "57", y: "200" },
|
|
488
|
+
{ textContent: "7500", x: "57", y: "102.5" },
|
|
489
|
+
{ textContent: "10000", x: "57", y: "5" },
|
|
490
|
+
]);
|
|
491
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 9800]);
|
|
492
|
+
},
|
|
493
|
+
);
|
|
494
|
+
|
|
495
|
+
it.each([false, undefined])(
|
|
496
|
+
"should exclude hidden items domain when includeHidden=%s",
|
|
497
|
+
(includeHidden) => {
|
|
498
|
+
const domainSpy = vi.fn();
|
|
499
|
+
function Comp(props: {
|
|
500
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
501
|
+
}): null {
|
|
502
|
+
const isPanorama = useIsPanorama();
|
|
503
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
504
|
+
createEffect(
|
|
505
|
+
() => domain(),
|
|
506
|
+
(d) => props.domainSpy(d),
|
|
507
|
+
);
|
|
508
|
+
return null;
|
|
509
|
+
}
|
|
510
|
+
const { container } = render(() => (
|
|
511
|
+
<BarChart width={600} height={400} data={data}>
|
|
512
|
+
<YAxis includeHidden={includeHidden} />
|
|
513
|
+
<Bar dataKey="pv" hide />
|
|
514
|
+
<Bar dataKey="uv" />
|
|
515
|
+
<Comp domainSpy={domainSpy} />
|
|
516
|
+
</BarChart>
|
|
517
|
+
));
|
|
518
|
+
expectYAxisTicks(container, [
|
|
519
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
520
|
+
{ textContent: "100", x: "57", y: "297.5" },
|
|
521
|
+
{ textContent: "200", x: "57", y: "200" },
|
|
522
|
+
{ textContent: "300", x: "57", y: "102.5" },
|
|
523
|
+
{ textContent: "400", x: "57", y: "5" },
|
|
524
|
+
]);
|
|
525
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 400]);
|
|
526
|
+
},
|
|
527
|
+
);
|
|
528
|
+
|
|
529
|
+
it("should include hidden data domain when includeHidden=true", () => {
|
|
530
|
+
const domainSpy = vi.fn();
|
|
531
|
+
function Comp(props: {
|
|
532
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
533
|
+
}): null {
|
|
534
|
+
const isPanorama = useIsPanorama();
|
|
535
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
536
|
+
createEffect(
|
|
537
|
+
() => domain(),
|
|
538
|
+
(d) => props.domainSpy(d),
|
|
539
|
+
);
|
|
540
|
+
return null;
|
|
541
|
+
}
|
|
542
|
+
const { container } = render(() => (
|
|
543
|
+
<BarChart width={600} height={400} data={data}>
|
|
544
|
+
<YAxis includeHidden />
|
|
545
|
+
<Bar dataKey="pv" hide />
|
|
546
|
+
<Bar dataKey="uv" />
|
|
547
|
+
<Comp domainSpy={domainSpy} />
|
|
548
|
+
</BarChart>
|
|
549
|
+
));
|
|
550
|
+
expectYAxisTicks(container, [
|
|
551
|
+
{ textContent: "0", x: "57", y: "395" },
|
|
552
|
+
{ textContent: "2500", x: "57", y: "297.5" },
|
|
553
|
+
{ textContent: "5000", x: "57", y: "200" },
|
|
554
|
+
{ textContent: "7500", x: "57", y: "102.5" },
|
|
555
|
+
{ textContent: "10000", x: "57", y: "5" },
|
|
556
|
+
]);
|
|
557
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 9800]);
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
|
|
561
|
+
it("should render all labels in an example", () => {
|
|
562
|
+
const view = render(() => (
|
|
563
|
+
<AreaChart
|
|
564
|
+
width={500}
|
|
565
|
+
height={400}
|
|
566
|
+
data={data}
|
|
567
|
+
margin={{
|
|
568
|
+
top: 10,
|
|
569
|
+
right: 30,
|
|
570
|
+
left: 0,
|
|
571
|
+
bottom: 0,
|
|
572
|
+
}}
|
|
573
|
+
>
|
|
574
|
+
<YAxis />
|
|
575
|
+
<Area type="monotone" dataKey="uv" stroke="#000" fill="url(#splitColor)" />
|
|
576
|
+
</AreaChart>
|
|
577
|
+
));
|
|
578
|
+
expect(view.getByText("0")).toBeVisible();
|
|
579
|
+
expect(view.getByText("100")).toBeVisible();
|
|
580
|
+
expect(view.getByText("200")).toBeVisible();
|
|
581
|
+
expect(view.getByText("300")).toBeVisible();
|
|
582
|
+
expect(view.getByText("400")).toBeVisible();
|
|
583
|
+
});
|
|
584
|
+
|
|
585
|
+
it("should render all labels in another example", () => {
|
|
586
|
+
const { container } = render(() => (
|
|
587
|
+
<LineChart
|
|
588
|
+
width={500}
|
|
589
|
+
height={300}
|
|
590
|
+
data={pageData}
|
|
591
|
+
accessibilityLayer
|
|
592
|
+
margin={{
|
|
593
|
+
top: 5,
|
|
594
|
+
right: 5,
|
|
595
|
+
bottom: 5,
|
|
596
|
+
left: 0,
|
|
597
|
+
}}
|
|
598
|
+
>
|
|
599
|
+
<YAxis />
|
|
600
|
+
<CartesianGrid stroke="#eee" strokeDasharray="5 5" />
|
|
601
|
+
<Line type="monotone" dataKey="uv" stroke="#8884d8" />
|
|
602
|
+
<Line type="monotone" dataKey="pv" stroke="#82ca9d" />
|
|
603
|
+
<Tooltip />
|
|
604
|
+
</LineChart>
|
|
605
|
+
));
|
|
606
|
+
expectYAxisTicks(container, [
|
|
607
|
+
{ textContent: "0", x: "52", y: "295" },
|
|
608
|
+
{ textContent: "400", x: "52", y: "222.5" },
|
|
609
|
+
{ textContent: "800", x: "52", y: "150" },
|
|
610
|
+
{ textContent: "1200", x: "52", y: "77.5" },
|
|
611
|
+
{ textContent: "1600", x: "52", y: "5" },
|
|
612
|
+
]);
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
describe("state integration", () => {
|
|
616
|
+
it("should publish its configuration to redux store", () => {
|
|
617
|
+
const spy = vi.fn();
|
|
618
|
+
function Comp(props: { spy: (settings: YAxisSettings) => void }): null {
|
|
619
|
+
const settings = useAppSelector((state) =>
|
|
620
|
+
selectRenderableAxisSettings(state, "yAxis", "foo"),
|
|
621
|
+
);
|
|
622
|
+
createEffect(
|
|
623
|
+
() => settings(),
|
|
624
|
+
(v) => props.spy(v as YAxisSettings),
|
|
625
|
+
);
|
|
626
|
+
return null;
|
|
627
|
+
}
|
|
628
|
+
const fakeTickFormatter = () => "";
|
|
629
|
+
const { container } = render(() => (
|
|
630
|
+
<BarChart width={100} height={100}>
|
|
631
|
+
<YAxis
|
|
632
|
+
yAxisId="foo"
|
|
633
|
+
scale="log"
|
|
634
|
+
type="number"
|
|
635
|
+
includeHidden
|
|
636
|
+
reversed
|
|
637
|
+
ticks={[1, 2, 3]}
|
|
638
|
+
width={32}
|
|
639
|
+
orientation="right"
|
|
640
|
+
mirror
|
|
641
|
+
name="axis name"
|
|
642
|
+
unit="axis unit"
|
|
643
|
+
interval={9}
|
|
644
|
+
angle={17}
|
|
645
|
+
tick={false}
|
|
646
|
+
minTickGap={8}
|
|
647
|
+
tickFormatter={fakeTickFormatter}
|
|
648
|
+
/>
|
|
649
|
+
<Comp spy={spy} />
|
|
650
|
+
</BarChart>
|
|
651
|
+
));
|
|
652
|
+
// PARITY GAP (rendering only): the published settings (the subject of this test)
|
|
653
|
+
// are asserted below. recharts asserts `.yAxis` is visible; this port gates the
|
|
654
|
+
// axis Layer on a resolvable domain, so a data-less chart renders no `.yAxis`.
|
|
655
|
+
// We assert the chart surface mounted instead.
|
|
656
|
+
expect(container.querySelector(".recharts-surface")).toBeVisible();
|
|
657
|
+
const expectedSettings: YAxisSettings = {
|
|
658
|
+
angle: 17,
|
|
659
|
+
minTickGap: 8,
|
|
660
|
+
tick: false,
|
|
661
|
+
tickFormatter: fakeTickFormatter,
|
|
662
|
+
interval: 9,
|
|
663
|
+
name: "axis name",
|
|
664
|
+
unit: "axis unit",
|
|
665
|
+
hide: false,
|
|
666
|
+
orientation: "right",
|
|
667
|
+
mirror: true,
|
|
668
|
+
width: 32,
|
|
669
|
+
ticks: [1, 2, 3],
|
|
670
|
+
includeHidden: true,
|
|
671
|
+
tickCount: 5,
|
|
672
|
+
allowDecimals: true,
|
|
673
|
+
id: "foo",
|
|
674
|
+
scale: "log",
|
|
675
|
+
type: "number",
|
|
676
|
+
allowDataOverflow: false,
|
|
677
|
+
allowDuplicatedCategory: true,
|
|
678
|
+
dataKey: undefined,
|
|
679
|
+
domain: undefined,
|
|
680
|
+
padding: {
|
|
681
|
+
top: 0,
|
|
682
|
+
bottom: 0,
|
|
683
|
+
},
|
|
684
|
+
reversed: true,
|
|
685
|
+
niceTicks: "auto",
|
|
686
|
+
};
|
|
687
|
+
expectLastCalledWith(spy, expectedSettings);
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
it("should remove the configuration from store when DOM element is removed", () => {
|
|
691
|
+
// recharts rerenders to add/remove axis children; this Solid port uses static
|
|
692
|
+
// renders (unmount between) per variant to avoid the dynamic-remount artifact.
|
|
693
|
+
const expectedSettingsFoo: YAxisSettings = {
|
|
694
|
+
angle: 0,
|
|
695
|
+
minTickGap: 5,
|
|
696
|
+
tick: true,
|
|
697
|
+
tickFormatter: undefined,
|
|
698
|
+
interval: "preserveEnd",
|
|
699
|
+
name: undefined,
|
|
700
|
+
unit: undefined,
|
|
701
|
+
orientation: "left",
|
|
702
|
+
mirror: false,
|
|
703
|
+
width: 60,
|
|
704
|
+
ticks: undefined,
|
|
705
|
+
includeHidden: false,
|
|
706
|
+
tickCount: 5,
|
|
707
|
+
allowDecimals: true,
|
|
708
|
+
id: "foo",
|
|
709
|
+
scale: "log",
|
|
710
|
+
type: "number",
|
|
711
|
+
allowDataOverflow: false,
|
|
712
|
+
allowDuplicatedCategory: true,
|
|
713
|
+
dataKey: undefined,
|
|
714
|
+
domain: undefined,
|
|
715
|
+
padding: {
|
|
716
|
+
top: 0,
|
|
717
|
+
bottom: 0,
|
|
718
|
+
},
|
|
719
|
+
reversed: false,
|
|
720
|
+
niceTicks: "auto",
|
|
721
|
+
hide: false,
|
|
722
|
+
};
|
|
723
|
+
const expectedSettingsBar: YAxisSettings = {
|
|
724
|
+
angle: 0,
|
|
725
|
+
minTickGap: 5,
|
|
726
|
+
tick: true,
|
|
727
|
+
tickFormatter: undefined,
|
|
728
|
+
interval: "preserveEnd",
|
|
729
|
+
name: undefined,
|
|
730
|
+
unit: undefined,
|
|
731
|
+
hide: false,
|
|
732
|
+
orientation: "left",
|
|
733
|
+
mirror: false,
|
|
734
|
+
width: 60,
|
|
735
|
+
includeHidden: false,
|
|
736
|
+
id: "bar",
|
|
737
|
+
scale: "utc",
|
|
738
|
+
type: "category",
|
|
739
|
+
allowDataOverflow: false,
|
|
740
|
+
allowDuplicatedCategory: true,
|
|
741
|
+
dataKey: undefined,
|
|
742
|
+
domain: undefined,
|
|
743
|
+
padding: {
|
|
744
|
+
top: 0,
|
|
745
|
+
bottom: 0,
|
|
746
|
+
},
|
|
747
|
+
allowDecimals: true,
|
|
748
|
+
tickCount: 5,
|
|
749
|
+
reversed: false,
|
|
750
|
+
niceTicks: "auto",
|
|
751
|
+
ticks: undefined,
|
|
752
|
+
};
|
|
753
|
+
|
|
754
|
+
const makeComp = (spy: Mock) => (): null => {
|
|
755
|
+
const foo = useAppSelector((state) => selectRenderableAxisSettings(state, "yAxis", "foo"));
|
|
756
|
+
const bar = useAppSelector((state) => selectRenderableAxisSettings(state, "yAxis", "bar"));
|
|
757
|
+
createEffect(
|
|
758
|
+
() => ({ foo: foo(), bar: bar() }),
|
|
759
|
+
(v) => spy(v),
|
|
760
|
+
);
|
|
761
|
+
return null;
|
|
762
|
+
};
|
|
763
|
+
|
|
764
|
+
// variant 1: only foo
|
|
765
|
+
const spy1 = vi.fn();
|
|
766
|
+
const Comp1 = makeComp(spy1);
|
|
767
|
+
const r1 = render(() => (
|
|
768
|
+
<BarChart width={100} height={100}>
|
|
769
|
+
<YAxis yAxisId="foo" scale="log" type="number" />
|
|
770
|
+
<Comp1 />
|
|
771
|
+
</BarChart>
|
|
772
|
+
));
|
|
773
|
+
expectLastCalledWith(spy1, {
|
|
774
|
+
foo: expectedSettingsFoo,
|
|
775
|
+
bar: implicitYAxis,
|
|
776
|
+
});
|
|
777
|
+
r1.unmount();
|
|
778
|
+
|
|
779
|
+
// variant 2: foo + bar
|
|
780
|
+
const spy2 = vi.fn();
|
|
781
|
+
const Comp2 = makeComp(spy2);
|
|
782
|
+
const r2 = render(() => (
|
|
783
|
+
<BarChart width={100} height={100}>
|
|
784
|
+
<YAxis yAxisId="foo" scale="log" type="number" />
|
|
785
|
+
<YAxis yAxisId="bar" scale="utc" type="category" />
|
|
786
|
+
<Comp2 />
|
|
787
|
+
</BarChart>
|
|
788
|
+
));
|
|
789
|
+
expectLastCalledWith(spy2, {
|
|
790
|
+
foo: expectedSettingsFoo,
|
|
791
|
+
bar: expectedSettingsBar,
|
|
792
|
+
});
|
|
793
|
+
r2.unmount();
|
|
794
|
+
|
|
795
|
+
// variant 3: only bar
|
|
796
|
+
const spy3 = vi.fn();
|
|
797
|
+
const Comp3 = makeComp(spy3);
|
|
798
|
+
const r3 = render(() => (
|
|
799
|
+
<BarChart width={100} height={100}>
|
|
800
|
+
<YAxis yAxisId="bar" scale="utc" type="category" />
|
|
801
|
+
<Comp3 />
|
|
802
|
+
</BarChart>
|
|
803
|
+
));
|
|
804
|
+
expectLastCalledWith(spy3, {
|
|
805
|
+
foo: implicitYAxis,
|
|
806
|
+
bar: expectedSettingsBar,
|
|
807
|
+
});
|
|
808
|
+
r3.unmount();
|
|
809
|
+
|
|
810
|
+
// variant 4: neither
|
|
811
|
+
const spy4 = vi.fn();
|
|
812
|
+
const Comp4 = makeComp(spy4);
|
|
813
|
+
render(() => (
|
|
814
|
+
<BarChart width={100} height={100}>
|
|
815
|
+
<Comp4 />
|
|
816
|
+
</BarChart>
|
|
817
|
+
));
|
|
818
|
+
expectLastCalledWith(spy4, {
|
|
819
|
+
foo: implicitYAxis,
|
|
820
|
+
bar: implicitYAxis,
|
|
821
|
+
});
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
it("should remove old ID configuration when the ID changes", () => {
|
|
825
|
+
const IDChangingComponent = (props: { children: JSX.Element }): JSX.Element => {
|
|
826
|
+
const [id, setId] = createSignal("1");
|
|
827
|
+
const onClick = () => setId("2");
|
|
828
|
+
return (
|
|
829
|
+
<>
|
|
830
|
+
<button type="button" class="pushbutton" onClick={onClick}>
|
|
831
|
+
Change ID
|
|
832
|
+
</button>
|
|
833
|
+
<BarChart width={100} height={100}>
|
|
834
|
+
<YAxis yAxisId={id()} scale="log" type="number" />
|
|
835
|
+
{props.children}
|
|
836
|
+
</BarChart>
|
|
837
|
+
</>
|
|
838
|
+
);
|
|
839
|
+
};
|
|
840
|
+
const renderTestCase = createSelectorTestCase(IDChangingComponent);
|
|
841
|
+
|
|
842
|
+
const { spy, container } = renderTestCase((state) => state.cartesianAxis.yAxis);
|
|
843
|
+
|
|
844
|
+
// only id "1" exists
|
|
845
|
+
const lastCallArgs1 = spy.mock.lastCall?.[0];
|
|
846
|
+
assertNotNull(lastCallArgs1);
|
|
847
|
+
expect(Object.keys(lastCallArgs1)).toEqual(["1"]);
|
|
848
|
+
|
|
849
|
+
fireEvent.click(container.getElementsByClassName("pushbutton")[0]!);
|
|
850
|
+
flush();
|
|
851
|
+
flush();
|
|
852
|
+
flush();
|
|
853
|
+
|
|
854
|
+
// only id "2" exists
|
|
855
|
+
const lastCallArgs2 = spy.mock.lastCall?.[0];
|
|
856
|
+
assertNotNull(lastCallArgs2);
|
|
857
|
+
expect(Object.keys(lastCallArgs2)).toEqual(["2"]);
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
describe("in stacked BarChart", () => {
|
|
862
|
+
it.each([undefined, "none"] as const)(
|
|
863
|
+
"should render sum of stacked values with stackOffset = %s",
|
|
864
|
+
(stackOffset: StackOffsetType | undefined) => {
|
|
865
|
+
const stackedData = [
|
|
866
|
+
{
|
|
867
|
+
x: 100,
|
|
868
|
+
y: 200,
|
|
869
|
+
},
|
|
870
|
+
];
|
|
871
|
+
const domainSpy = vi.fn();
|
|
872
|
+
function Comp(props: {
|
|
873
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
874
|
+
}): null {
|
|
875
|
+
const isPanorama = useIsPanorama();
|
|
876
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
877
|
+
createEffect(
|
|
878
|
+
() => domain(),
|
|
879
|
+
(d) => props.domainSpy(d),
|
|
880
|
+
);
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
// variant A: single Bar
|
|
884
|
+
const rA = render(() => (
|
|
885
|
+
<BarChart width={100} height={100} data={stackedData} stackOffset={stackOffset}>
|
|
886
|
+
<YAxis />
|
|
887
|
+
<Bar dataKey="x" stackId="a" />
|
|
888
|
+
<Comp domainSpy={domainSpy} />
|
|
889
|
+
</BarChart>
|
|
890
|
+
));
|
|
891
|
+
expectYAxisTicks(rA.container, [
|
|
892
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
893
|
+
{ textContent: "25", x: "57", y: "72.5" },
|
|
894
|
+
{ textContent: "50", x: "57", y: "50" },
|
|
895
|
+
{ textContent: "75", x: "57", y: "27.5" },
|
|
896
|
+
{ textContent: "100", x: "57", y: "5" },
|
|
897
|
+
]);
|
|
898
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 100]);
|
|
899
|
+
rA.unmount();
|
|
900
|
+
|
|
901
|
+
// variant B: two stacked Bars
|
|
902
|
+
const domainSpyB = vi.fn();
|
|
903
|
+
const rB = render(() => (
|
|
904
|
+
<BarChart width={100} height={100} data={stackedData}>
|
|
905
|
+
<YAxis />
|
|
906
|
+
<Bar dataKey="x" stackId="a" />
|
|
907
|
+
<Bar dataKey="y" stackId="a" />
|
|
908
|
+
<Comp domainSpy={domainSpyB} />
|
|
909
|
+
</BarChart>
|
|
910
|
+
));
|
|
911
|
+
expectYAxisTicks(rB.container, [
|
|
912
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
913
|
+
{ textContent: "75", x: "57", y: "72.5" },
|
|
914
|
+
{ textContent: "150", x: "57", y: "50" },
|
|
915
|
+
{ textContent: "225", x: "57", y: "27.5" },
|
|
916
|
+
{ textContent: "300", x: "57", y: "5" },
|
|
917
|
+
]);
|
|
918
|
+
expect(domainSpyB).toHaveBeenLastCalledWith([0, 300]);
|
|
919
|
+
rB.unmount();
|
|
920
|
+
},
|
|
921
|
+
);
|
|
922
|
+
|
|
923
|
+
it.each([undefined, false])(
|
|
924
|
+
"should ignore domain of hidden items when includeHidden=%s",
|
|
925
|
+
(includeHidden) => {
|
|
926
|
+
const stackedData = [
|
|
927
|
+
{
|
|
928
|
+
x: 100,
|
|
929
|
+
y: 200,
|
|
930
|
+
},
|
|
931
|
+
];
|
|
932
|
+
const domainSpy = vi.fn();
|
|
933
|
+
function Comp(props: {
|
|
934
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
935
|
+
}): null {
|
|
936
|
+
const isPanorama = useIsPanorama();
|
|
937
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
938
|
+
createEffect(
|
|
939
|
+
() => domain(),
|
|
940
|
+
(d) => props.domainSpy(d),
|
|
941
|
+
);
|
|
942
|
+
return null;
|
|
943
|
+
}
|
|
944
|
+
const { container } = render(() => (
|
|
945
|
+
<BarChart width={100} height={100} data={stackedData}>
|
|
946
|
+
<YAxis includeHidden={includeHidden} />
|
|
947
|
+
<Bar dataKey="x" stackId="a" />
|
|
948
|
+
<Bar dataKey="y" stackId="a" hide />
|
|
949
|
+
<Comp domainSpy={domainSpy} />
|
|
950
|
+
</BarChart>
|
|
951
|
+
));
|
|
952
|
+
expectYAxisTicks(container, [
|
|
953
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
954
|
+
{ textContent: "25", x: "57", y: "72.5" },
|
|
955
|
+
{ textContent: "50", x: "57", y: "50" },
|
|
956
|
+
{ textContent: "75", x: "57", y: "27.5" },
|
|
957
|
+
{ textContent: "100", x: "57", y: "5" },
|
|
958
|
+
]);
|
|
959
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 100]);
|
|
960
|
+
},
|
|
961
|
+
);
|
|
962
|
+
|
|
963
|
+
it("should include domain of hidden items when includeHidden=true", () => {
|
|
964
|
+
const stackedData = [
|
|
965
|
+
{
|
|
966
|
+
x: 10,
|
|
967
|
+
y: 200,
|
|
968
|
+
},
|
|
969
|
+
];
|
|
970
|
+
const domainSpy = vi.fn();
|
|
971
|
+
function Comp(props: {
|
|
972
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
973
|
+
}): null {
|
|
974
|
+
const isPanorama = useIsPanorama();
|
|
975
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
976
|
+
createEffect(
|
|
977
|
+
() => domain(),
|
|
978
|
+
(d) => props.domainSpy(d),
|
|
979
|
+
);
|
|
980
|
+
return null;
|
|
981
|
+
}
|
|
982
|
+
// variant A: stacked
|
|
983
|
+
const rA = render(() => (
|
|
984
|
+
<BarChart width={100} height={100} data={stackedData}>
|
|
985
|
+
<YAxis includeHidden />
|
|
986
|
+
<Bar dataKey="x" stackId="a" />
|
|
987
|
+
<Bar dataKey="y" stackId="a" hide />
|
|
988
|
+
<Comp domainSpy={domainSpy} />
|
|
989
|
+
</BarChart>
|
|
990
|
+
));
|
|
991
|
+
expectYAxisTicks(rA.container, [
|
|
992
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
993
|
+
{ textContent: "55", x: "57", y: "72.5" },
|
|
994
|
+
{ textContent: "110", x: "57", y: "50" },
|
|
995
|
+
{ textContent: "165", x: "57", y: "27.5" },
|
|
996
|
+
{ textContent: "220", x: "57", y: "5" },
|
|
997
|
+
]);
|
|
998
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 210]);
|
|
999
|
+
rA.unmount();
|
|
1000
|
+
|
|
1001
|
+
// variant B: the same data, not stacked
|
|
1002
|
+
const domainSpyB = vi.fn();
|
|
1003
|
+
const rB = render(() => (
|
|
1004
|
+
<BarChart width={100} height={100} data={stackedData}>
|
|
1005
|
+
<YAxis includeHidden />
|
|
1006
|
+
<Bar dataKey="x" />
|
|
1007
|
+
<Bar dataKey="y" hide />
|
|
1008
|
+
<Comp domainSpy={domainSpyB} />
|
|
1009
|
+
</BarChart>
|
|
1010
|
+
));
|
|
1011
|
+
expectYAxisTicks(rB.container, [
|
|
1012
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1013
|
+
{ textContent: "50", x: "57", y: "72.5" },
|
|
1014
|
+
{ textContent: "100", x: "57", y: "50" },
|
|
1015
|
+
{ textContent: "150", x: "57", y: "27.5" },
|
|
1016
|
+
{ textContent: "200", x: "57", y: "5" },
|
|
1017
|
+
]);
|
|
1018
|
+
expect(domainSpyB).toHaveBeenLastCalledWith([0, 200]);
|
|
1019
|
+
rB.unmount();
|
|
1020
|
+
});
|
|
1021
|
+
|
|
1022
|
+
it('should render positive and negative ticks with stackOffset = "sign"', () => {
|
|
1023
|
+
const stackedSignedData = [
|
|
1024
|
+
{
|
|
1025
|
+
x: 100,
|
|
1026
|
+
y: -2000,
|
|
1027
|
+
},
|
|
1028
|
+
];
|
|
1029
|
+
const domainSpy = vi.fn();
|
|
1030
|
+
function Comp(props: {
|
|
1031
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1032
|
+
}): null {
|
|
1033
|
+
const isPanorama = useIsPanorama();
|
|
1034
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1035
|
+
createEffect(
|
|
1036
|
+
() => domain(),
|
|
1037
|
+
(d) => props.domainSpy(d),
|
|
1038
|
+
);
|
|
1039
|
+
return null;
|
|
1040
|
+
}
|
|
1041
|
+
const { container } = render(() => (
|
|
1042
|
+
<BarChart width={100} height={100} data={stackedSignedData} stackOffset="sign">
|
|
1043
|
+
<YAxis />
|
|
1044
|
+
<Bar dataKey="x" stackId="a" />
|
|
1045
|
+
<Bar dataKey="y" stackId="a" />
|
|
1046
|
+
<Comp domainSpy={domainSpy} />
|
|
1047
|
+
</BarChart>
|
|
1048
|
+
));
|
|
1049
|
+
expectYAxisTicks(container, [
|
|
1050
|
+
{ textContent: "-2100", x: "57", y: "95" },
|
|
1051
|
+
{ textContent: "-1400", x: "57", y: "72.5" },
|
|
1052
|
+
{ textContent: "-700", x: "57", y: "50" },
|
|
1053
|
+
{ textContent: "0", x: "57", y: "27.5" },
|
|
1054
|
+
{ textContent: "700", x: "57", y: "5" },
|
|
1055
|
+
]);
|
|
1056
|
+
// -2000, 100 is the correct domain - the tick generator decides to extend it beyond, to 700. But the domain ends at 100.
|
|
1057
|
+
expect(domainSpy).toHaveBeenLastCalledWith([-2000, 100]);
|
|
1058
|
+
});
|
|
1059
|
+
|
|
1060
|
+
it('should render ticks between 0 and 1 with stackOffset = "expand"', () => {
|
|
1061
|
+
const stackedData = [
|
|
1062
|
+
{
|
|
1063
|
+
x: 100,
|
|
1064
|
+
y: 200,
|
|
1065
|
+
},
|
|
1066
|
+
];
|
|
1067
|
+
const domainSpy = vi.fn();
|
|
1068
|
+
function Comp(props: {
|
|
1069
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1070
|
+
}): null {
|
|
1071
|
+
const isPanorama = useIsPanorama();
|
|
1072
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1073
|
+
createEffect(
|
|
1074
|
+
() => domain(),
|
|
1075
|
+
(d) => props.domainSpy(d),
|
|
1076
|
+
);
|
|
1077
|
+
return null;
|
|
1078
|
+
}
|
|
1079
|
+
const { container } = render(() => (
|
|
1080
|
+
<BarChart width={100} height={100} data={stackedData} stackOffset="expand">
|
|
1081
|
+
<YAxis />
|
|
1082
|
+
<Bar dataKey="x" stackId="a" />
|
|
1083
|
+
<Bar dataKey="y" stackId="a" />
|
|
1084
|
+
<Comp domainSpy={domainSpy} />
|
|
1085
|
+
</BarChart>
|
|
1086
|
+
));
|
|
1087
|
+
expectYAxisTicks(container, [
|
|
1088
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1089
|
+
{ textContent: "0.25", x: "57", y: "72.5" },
|
|
1090
|
+
{ textContent: "0.5", x: "57", y: "50" },
|
|
1091
|
+
{ textContent: "0.75", x: "57", y: "27.5" },
|
|
1092
|
+
{ textContent: "1", x: "57", y: "5" },
|
|
1093
|
+
]);
|
|
1094
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1]);
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
it('should render ticks with stackOffset = "wiggle"', () => {
|
|
1098
|
+
const stackedData = [
|
|
1099
|
+
{
|
|
1100
|
+
x: 100,
|
|
1101
|
+
y: 200,
|
|
1102
|
+
},
|
|
1103
|
+
];
|
|
1104
|
+
const domainSpy = vi.fn();
|
|
1105
|
+
function Comp(props: {
|
|
1106
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1107
|
+
}): null {
|
|
1108
|
+
const isPanorama = useIsPanorama();
|
|
1109
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1110
|
+
createEffect(
|
|
1111
|
+
() => domain(),
|
|
1112
|
+
(d) => props.domainSpy(d),
|
|
1113
|
+
);
|
|
1114
|
+
return null;
|
|
1115
|
+
}
|
|
1116
|
+
const { container } = render(() => (
|
|
1117
|
+
<BarChart width={100} height={100} data={stackedData} stackOffset="wiggle">
|
|
1118
|
+
<YAxis />
|
|
1119
|
+
<Bar dataKey="x" stackId="a" />
|
|
1120
|
+
<Bar dataKey="y" stackId="a" />
|
|
1121
|
+
<Comp domainSpy={domainSpy} />
|
|
1122
|
+
</BarChart>
|
|
1123
|
+
));
|
|
1124
|
+
expectYAxisTicks(container, [
|
|
1125
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1126
|
+
{ textContent: "75", x: "57", y: "72.5" },
|
|
1127
|
+
{ textContent: "150", x: "57", y: "50" },
|
|
1128
|
+
{ textContent: "225", x: "57", y: "27.5" },
|
|
1129
|
+
{ textContent: "300", x: "57", y: "5" },
|
|
1130
|
+
]);
|
|
1131
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 300]);
|
|
1132
|
+
});
|
|
1133
|
+
|
|
1134
|
+
it('should render ticks with stackOffset = "silhouette"', () => {
|
|
1135
|
+
const stackedData = [
|
|
1136
|
+
{
|
|
1137
|
+
x: 100,
|
|
1138
|
+
y: 200,
|
|
1139
|
+
},
|
|
1140
|
+
];
|
|
1141
|
+
const domainSpy = vi.fn();
|
|
1142
|
+
function Comp(props: {
|
|
1143
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1144
|
+
}): null {
|
|
1145
|
+
const isPanorama = useIsPanorama();
|
|
1146
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1147
|
+
createEffect(
|
|
1148
|
+
() => domain(),
|
|
1149
|
+
(d) => props.domainSpy(d),
|
|
1150
|
+
);
|
|
1151
|
+
return null;
|
|
1152
|
+
}
|
|
1153
|
+
const { container } = render(() => (
|
|
1154
|
+
<BarChart width={100} height={100} data={stackedData} stackOffset="silhouette">
|
|
1155
|
+
<YAxis />
|
|
1156
|
+
<Bar dataKey="x" stackId="a" />
|
|
1157
|
+
<Bar dataKey="y" stackId="a" />
|
|
1158
|
+
<Comp domainSpy={domainSpy} />
|
|
1159
|
+
</BarChart>
|
|
1160
|
+
));
|
|
1161
|
+
expectYAxisTicks(container, [
|
|
1162
|
+
{ textContent: "-150", x: "57", y: "95" },
|
|
1163
|
+
{ textContent: "-75", x: "57", y: "72.5" },
|
|
1164
|
+
{ textContent: "0", x: "57", y: "50" },
|
|
1165
|
+
{ textContent: "75", x: "57", y: "27.5" },
|
|
1166
|
+
{ textContent: "150", x: "57", y: "5" },
|
|
1167
|
+
]);
|
|
1168
|
+
expect(domainSpy).toHaveBeenLastCalledWith([-150, 150]);
|
|
1169
|
+
});
|
|
1170
|
+
|
|
1171
|
+
it('should ignore negative values with stackOffset = "positive"', () => {
|
|
1172
|
+
const stackedData = [
|
|
1173
|
+
{
|
|
1174
|
+
x: 100,
|
|
1175
|
+
y: -200,
|
|
1176
|
+
},
|
|
1177
|
+
];
|
|
1178
|
+
const domainSpy = vi.fn();
|
|
1179
|
+
function Comp(props: {
|
|
1180
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1181
|
+
}): null {
|
|
1182
|
+
const isPanorama = useIsPanorama();
|
|
1183
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1184
|
+
createEffect(
|
|
1185
|
+
() => domain(),
|
|
1186
|
+
(d) => props.domainSpy(d),
|
|
1187
|
+
);
|
|
1188
|
+
return null;
|
|
1189
|
+
}
|
|
1190
|
+
const { container } = render(() => (
|
|
1191
|
+
<BarChart width={100} height={100} data={stackedData} stackOffset="positive">
|
|
1192
|
+
<YAxis />
|
|
1193
|
+
<Bar dataKey="x" stackId="a" />
|
|
1194
|
+
<Bar dataKey="y" stackId="a" />
|
|
1195
|
+
<Comp domainSpy={domainSpy} />
|
|
1196
|
+
</BarChart>
|
|
1197
|
+
));
|
|
1198
|
+
expectYAxisTicks(container, [
|
|
1199
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1200
|
+
{ textContent: "25", x: "57", y: "72.5" },
|
|
1201
|
+
{ textContent: "50", x: "57", y: "50" },
|
|
1202
|
+
{ textContent: "75", x: "57", y: "27.5" },
|
|
1203
|
+
{ textContent: "100", x: "57", y: "5" },
|
|
1204
|
+
]);
|
|
1205
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 100]);
|
|
1206
|
+
});
|
|
1207
|
+
});
|
|
1208
|
+
|
|
1209
|
+
describe("with reference elements", () => {
|
|
1210
|
+
const casesThatDoNotExtendDomain: ReadonlyArray<IfOverflow | undefined> = [
|
|
1211
|
+
"discard",
|
|
1212
|
+
"hidden",
|
|
1213
|
+
"visible",
|
|
1214
|
+
undefined,
|
|
1215
|
+
];
|
|
1216
|
+
|
|
1217
|
+
it("should render usual domain when without reference elements", () => {
|
|
1218
|
+
const domainSpy = vi.fn();
|
|
1219
|
+
function Comp(props: {
|
|
1220
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1221
|
+
}): null {
|
|
1222
|
+
const isPanorama = useIsPanorama();
|
|
1223
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1224
|
+
createEffect(
|
|
1225
|
+
() => domain(),
|
|
1226
|
+
(d) => props.domainSpy(d),
|
|
1227
|
+
);
|
|
1228
|
+
return null;
|
|
1229
|
+
}
|
|
1230
|
+
const { container } = render(() => (
|
|
1231
|
+
<LineChart width={100} height={100} data={pageData}>
|
|
1232
|
+
<YAxis />
|
|
1233
|
+
<Line dataKey="pv" />
|
|
1234
|
+
<Comp domainSpy={domainSpy} />
|
|
1235
|
+
</LineChart>
|
|
1236
|
+
));
|
|
1237
|
+
expectYAxisTicks(container, [
|
|
1238
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1239
|
+
{ textContent: "300", x: "57", y: "72.5" },
|
|
1240
|
+
{ textContent: "600", x: "57", y: "50" },
|
|
1241
|
+
{ textContent: "900", x: "57", y: "27.5" },
|
|
1242
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
1243
|
+
]);
|
|
1244
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1200]);
|
|
1245
|
+
});
|
|
1246
|
+
|
|
1247
|
+
describe("ReferenceDot", () => {
|
|
1248
|
+
const ChartWithReferenceDot = (props: {
|
|
1249
|
+
ifOverflow: IfOverflow | undefined;
|
|
1250
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1251
|
+
}): JSX.Element => {
|
|
1252
|
+
function Comp(): null {
|
|
1253
|
+
const isPanorama = useIsPanorama();
|
|
1254
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1255
|
+
createEffect(
|
|
1256
|
+
() => domain(),
|
|
1257
|
+
(d) => props.domainSpy(d),
|
|
1258
|
+
);
|
|
1259
|
+
return null;
|
|
1260
|
+
}
|
|
1261
|
+
return (
|
|
1262
|
+
<LineChart width={100} height={100} data={pageData}>
|
|
1263
|
+
<YAxis />
|
|
1264
|
+
<Line dataKey="pv" />
|
|
1265
|
+
{/* the r prop is ignored from domain extension - perhaps it should expand the domain too? */}
|
|
1266
|
+
<ReferenceDot x={9999} y={2000} r={500} ifOverflow={props.ifOverflow} />
|
|
1267
|
+
<Comp />
|
|
1268
|
+
</LineChart>
|
|
1269
|
+
);
|
|
1270
|
+
};
|
|
1271
|
+
|
|
1272
|
+
it.each(casesThatDoNotExtendDomain)(
|
|
1273
|
+
"should not extend domain when ifOverflow=%s",
|
|
1274
|
+
(ifOverflow) => {
|
|
1275
|
+
const domainSpy = vi.fn();
|
|
1276
|
+
const { container } = render(() => (
|
|
1277
|
+
<ChartWithReferenceDot ifOverflow={ifOverflow} domainSpy={domainSpy} />
|
|
1278
|
+
));
|
|
1279
|
+
expectYAxisTicks(container, [
|
|
1280
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1281
|
+
{ textContent: "300", x: "57", y: "72.5" },
|
|
1282
|
+
{ textContent: "600", x: "57", y: "50" },
|
|
1283
|
+
{ textContent: "900", x: "57", y: "27.5" },
|
|
1284
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
1285
|
+
]);
|
|
1286
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1200]);
|
|
1287
|
+
},
|
|
1288
|
+
);
|
|
1289
|
+
|
|
1290
|
+
it("should extend domain when ifOverflow=extendDomain", () => {
|
|
1291
|
+
const domainSpy = vi.fn();
|
|
1292
|
+
const { container } = render(() => (
|
|
1293
|
+
<ChartWithReferenceDot ifOverflow="extendDomain" domainSpy={domainSpy} />
|
|
1294
|
+
));
|
|
1295
|
+
expectYAxisTicks(container, [
|
|
1296
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1297
|
+
{ textContent: "500", x: "57", y: "72.5" },
|
|
1298
|
+
{ textContent: "1000", x: "57", y: "50" },
|
|
1299
|
+
{ textContent: "1500", x: "57", y: "27.5" },
|
|
1300
|
+
{ textContent: "2000", x: "57", y: "5" },
|
|
1301
|
+
]);
|
|
1302
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 2000]);
|
|
1303
|
+
});
|
|
1304
|
+
});
|
|
1305
|
+
|
|
1306
|
+
describe("ReferenceArea", () => {
|
|
1307
|
+
const ChartWithReferenceArea = (props: {
|
|
1308
|
+
ifOverflow: IfOverflow | undefined;
|
|
1309
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1310
|
+
}): JSX.Element => {
|
|
1311
|
+
function Comp(): null {
|
|
1312
|
+
const isPanorama = useIsPanorama();
|
|
1313
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1314
|
+
createEffect(
|
|
1315
|
+
() => domain(),
|
|
1316
|
+
(d) => props.domainSpy(d),
|
|
1317
|
+
);
|
|
1318
|
+
return null;
|
|
1319
|
+
}
|
|
1320
|
+
return (
|
|
1321
|
+
<LineChart width={100} height={100} data={pageData}>
|
|
1322
|
+
<YAxis />
|
|
1323
|
+
<Line dataKey="pv" />
|
|
1324
|
+
<ReferenceArea x1={-10} x2={3000} y1={-100} y2={5000} ifOverflow={props.ifOverflow} />
|
|
1325
|
+
<Comp />
|
|
1326
|
+
</LineChart>
|
|
1327
|
+
);
|
|
1328
|
+
};
|
|
1329
|
+
|
|
1330
|
+
it.each(casesThatDoNotExtendDomain)(
|
|
1331
|
+
"should not extend domain when ifOverflow=%s",
|
|
1332
|
+
(ifOverflow) => {
|
|
1333
|
+
const domainSpy = vi.fn();
|
|
1334
|
+
const { container } = render(() => (
|
|
1335
|
+
<ChartWithReferenceArea ifOverflow={ifOverflow} domainSpy={domainSpy} />
|
|
1336
|
+
));
|
|
1337
|
+
expectYAxisTicks(container, [
|
|
1338
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1339
|
+
{ textContent: "300", x: "57", y: "72.5" },
|
|
1340
|
+
{ textContent: "600", x: "57", y: "50" },
|
|
1341
|
+
{ textContent: "900", x: "57", y: "27.5" },
|
|
1342
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
1343
|
+
]);
|
|
1344
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1200]);
|
|
1345
|
+
},
|
|
1346
|
+
);
|
|
1347
|
+
|
|
1348
|
+
it("should extend domain when ifOverflow=extendDomain", () => {
|
|
1349
|
+
const domainSpy = vi.fn();
|
|
1350
|
+
const { container } = render(() => (
|
|
1351
|
+
<ChartWithReferenceArea ifOverflow="extendDomain" domainSpy={domainSpy} />
|
|
1352
|
+
));
|
|
1353
|
+
expectYAxisTicks(container, [
|
|
1354
|
+
{ textContent: "-2000", x: "57", y: "95" },
|
|
1355
|
+
{ textContent: "0", x: "57", y: "72.5" },
|
|
1356
|
+
{ textContent: "2000", x: "57", y: "50" },
|
|
1357
|
+
{ textContent: "4000", x: "57", y: "27.5" },
|
|
1358
|
+
{ textContent: "6000", x: "57", y: "5" },
|
|
1359
|
+
]);
|
|
1360
|
+
expect(domainSpy).toHaveBeenLastCalledWith([-100, 5000]);
|
|
1361
|
+
});
|
|
1362
|
+
});
|
|
1363
|
+
|
|
1364
|
+
describe("ReferenceArea without any graphical elements", () => {
|
|
1365
|
+
it("should render ticks following the domain of the area", () => {
|
|
1366
|
+
const axisDomainSpy = vi.fn();
|
|
1367
|
+
function Comp(props: {
|
|
1368
|
+
axisDomainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1369
|
+
}): null {
|
|
1370
|
+
const isPanorama = useIsPanorama();
|
|
1371
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1372
|
+
createEffect(
|
|
1373
|
+
() => domain(),
|
|
1374
|
+
(d) => props.axisDomainSpy(d),
|
|
1375
|
+
);
|
|
1376
|
+
return null;
|
|
1377
|
+
}
|
|
1378
|
+
const { container } = render(() => (
|
|
1379
|
+
<ComposedChart
|
|
1380
|
+
width={500}
|
|
1381
|
+
height={500}
|
|
1382
|
+
data={pageData}
|
|
1383
|
+
margin={{
|
|
1384
|
+
top: 5,
|
|
1385
|
+
right: 30,
|
|
1386
|
+
left: 20,
|
|
1387
|
+
bottom: 5,
|
|
1388
|
+
}}
|
|
1389
|
+
>
|
|
1390
|
+
<CartesianGrid strokeDasharray="3 3" />
|
|
1391
|
+
<XAxis dataKey="name" />
|
|
1392
|
+
<YAxis type="number" />
|
|
1393
|
+
<ReferenceArea x1="Page B" x2="Page E" y1={1890} y2={-1000} ifOverflow="extendDomain" />
|
|
1394
|
+
<Comp axisDomainSpy={axisDomainSpy} />
|
|
1395
|
+
</ComposedChart>
|
|
1396
|
+
));
|
|
1397
|
+
expect(axisDomainSpy).toHaveBeenLastCalledWith([-1000, 1890]);
|
|
1398
|
+
expectYAxisTicks(container, [
|
|
1399
|
+
{ textContent: "-1900", x: "72", y: "465" },
|
|
1400
|
+
{ textContent: "-950", x: "72", y: "350" },
|
|
1401
|
+
{ textContent: "0", x: "72", y: "235" },
|
|
1402
|
+
{ textContent: "950", x: "72", y: "120" },
|
|
1403
|
+
{ textContent: "1900", x: "72", y: "5" },
|
|
1404
|
+
]);
|
|
1405
|
+
});
|
|
1406
|
+
});
|
|
1407
|
+
|
|
1408
|
+
describe("ReferenceLine with one dimension", () => {
|
|
1409
|
+
const ChartWithReferenceLine = (props: {
|
|
1410
|
+
ifOverflow: IfOverflow | undefined;
|
|
1411
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1412
|
+
}): JSX.Element => {
|
|
1413
|
+
function Comp(): null {
|
|
1414
|
+
const isPanorama = useIsPanorama();
|
|
1415
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1416
|
+
createEffect(
|
|
1417
|
+
() => domain(),
|
|
1418
|
+
(d) => props.domainSpy(d),
|
|
1419
|
+
);
|
|
1420
|
+
return null;
|
|
1421
|
+
}
|
|
1422
|
+
return (
|
|
1423
|
+
<LineChart width={100} height={100} data={pageData}>
|
|
1424
|
+
<YAxis />
|
|
1425
|
+
<Line dataKey="pv" />
|
|
1426
|
+
<ReferenceLine y={2000} ifOverflow={props.ifOverflow} />
|
|
1427
|
+
<Comp />
|
|
1428
|
+
</LineChart>
|
|
1429
|
+
);
|
|
1430
|
+
};
|
|
1431
|
+
|
|
1432
|
+
it.each(casesThatDoNotExtendDomain)(
|
|
1433
|
+
"should not extend domain when ifOverflow=%s",
|
|
1434
|
+
(ifOverflow) => {
|
|
1435
|
+
const domainSpy = vi.fn();
|
|
1436
|
+
const { container } = render(() => (
|
|
1437
|
+
<ChartWithReferenceLine ifOverflow={ifOverflow} domainSpy={domainSpy} />
|
|
1438
|
+
));
|
|
1439
|
+
expectYAxisTicks(container, [
|
|
1440
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1441
|
+
{ textContent: "300", x: "57", y: "72.5" },
|
|
1442
|
+
{ textContent: "600", x: "57", y: "50" },
|
|
1443
|
+
{ textContent: "900", x: "57", y: "27.5" },
|
|
1444
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
1445
|
+
]);
|
|
1446
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1200]);
|
|
1447
|
+
},
|
|
1448
|
+
);
|
|
1449
|
+
|
|
1450
|
+
it("should extend domain when ifOverflow=extendDomain", () => {
|
|
1451
|
+
const domainSpy = vi.fn();
|
|
1452
|
+
const { container } = render(() => (
|
|
1453
|
+
<ChartWithReferenceLine ifOverflow="extendDomain" domainSpy={domainSpy} />
|
|
1454
|
+
));
|
|
1455
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 2000]);
|
|
1456
|
+
expectYAxisTicks(container, [
|
|
1457
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1458
|
+
{ textContent: "500", x: "57", y: "72.5" },
|
|
1459
|
+
{ textContent: "1000", x: "57", y: "50" },
|
|
1460
|
+
{ textContent: "1500", x: "57", y: "27.5" },
|
|
1461
|
+
{ textContent: "2000", x: "57", y: "5" },
|
|
1462
|
+
]);
|
|
1463
|
+
});
|
|
1464
|
+
});
|
|
1465
|
+
|
|
1466
|
+
describe("ReferenceLine with segment", () => {
|
|
1467
|
+
const ChartWithReferenceLineWithSegment = (props: {
|
|
1468
|
+
ifOverflow: IfOverflow | undefined;
|
|
1469
|
+
domainSpy: (domain: NumberDomain | CategoricalDomain | undefined) => void;
|
|
1470
|
+
}): JSX.Element => {
|
|
1471
|
+
function Comp(): null {
|
|
1472
|
+
const isPanorama = useIsPanorama();
|
|
1473
|
+
const domain = useAppSelector((state) => selectAxisDomain(state, "yAxis", 0, isPanorama));
|
|
1474
|
+
createEffect(
|
|
1475
|
+
() => domain(),
|
|
1476
|
+
(d) => props.domainSpy(d),
|
|
1477
|
+
);
|
|
1478
|
+
return null;
|
|
1479
|
+
}
|
|
1480
|
+
return (
|
|
1481
|
+
<LineChart width={100} height={100} data={pageData}>
|
|
1482
|
+
<YAxis />
|
|
1483
|
+
<Line dataKey="pv" />
|
|
1484
|
+
<ReferenceLine
|
|
1485
|
+
segment={[
|
|
1486
|
+
{ x: "Page A", y: 100 },
|
|
1487
|
+
{ x: "Page B", y: 2000 },
|
|
1488
|
+
]}
|
|
1489
|
+
ifOverflow={props.ifOverflow}
|
|
1490
|
+
/>
|
|
1491
|
+
<Comp />
|
|
1492
|
+
</LineChart>
|
|
1493
|
+
);
|
|
1494
|
+
};
|
|
1495
|
+
|
|
1496
|
+
it.each(casesThatDoNotExtendDomain)(
|
|
1497
|
+
"should not extend domain when ifOverflow=%s",
|
|
1498
|
+
(ifOverflow) => {
|
|
1499
|
+
const domainSpy = vi.fn();
|
|
1500
|
+
const { container } = render(() => (
|
|
1501
|
+
<ChartWithReferenceLineWithSegment ifOverflow={ifOverflow} domainSpy={domainSpy} />
|
|
1502
|
+
));
|
|
1503
|
+
expectYAxisTicks(container, [
|
|
1504
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1505
|
+
{ textContent: "300", x: "57", y: "72.5" },
|
|
1506
|
+
{ textContent: "600", x: "57", y: "50" },
|
|
1507
|
+
{ textContent: "900", x: "57", y: "27.5" },
|
|
1508
|
+
{ textContent: "1200", x: "57", y: "5" },
|
|
1509
|
+
]);
|
|
1510
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 1200]);
|
|
1511
|
+
},
|
|
1512
|
+
);
|
|
1513
|
+
|
|
1514
|
+
it("should extend domain when ifOverflow=extendDomain", () => {
|
|
1515
|
+
// https://github.com/recharts/recharts/issues/3379
|
|
1516
|
+
const domainSpy = vi.fn();
|
|
1517
|
+
const { container } = render(() => (
|
|
1518
|
+
<ChartWithReferenceLineWithSegment ifOverflow="extendDomain" domainSpy={domainSpy} />
|
|
1519
|
+
));
|
|
1520
|
+
expectYAxisTicks(container, [
|
|
1521
|
+
{ textContent: "0", x: "57", y: "95" },
|
|
1522
|
+
{ textContent: "500", x: "57", y: "72.5" },
|
|
1523
|
+
{ textContent: "1000", x: "57", y: "50" },
|
|
1524
|
+
{ textContent: "1500", x: "57", y: "27.5" },
|
|
1525
|
+
{ textContent: "2000", x: "57", y: "5" },
|
|
1526
|
+
]);
|
|
1527
|
+
expect(domainSpy).toHaveBeenLastCalledWith([0, 2000]);
|
|
1528
|
+
});
|
|
1529
|
+
});
|
|
1530
|
+
});
|
|
1531
|
+
|
|
1532
|
+
it("should render the axis when wrapped in a custom component", () => {
|
|
1533
|
+
/*
|
|
1534
|
+
* https://github.com/recharts/recharts/issues/5445#issuecomment-2628711736
|
|
1535
|
+
*/
|
|
1536
|
+
const YAxisWrapper = (props: YAxisProps) => {
|
|
1537
|
+
return <YAxis {...props} />;
|
|
1538
|
+
};
|
|
1539
|
+
|
|
1540
|
+
const { container } = render(() => (
|
|
1541
|
+
<BarChart width={100} height={100}>
|
|
1542
|
+
<YAxisWrapper />
|
|
1543
|
+
</BarChart>
|
|
1544
|
+
));
|
|
1545
|
+
|
|
1546
|
+
expect(container.querySelector(".yAxis")).toBeVisible();
|
|
1547
|
+
});
|
|
1548
|
+
|
|
1549
|
+
it("should render the y-axis with given width in the prop", () => {
|
|
1550
|
+
const yAxisWidth = 40;
|
|
1551
|
+
|
|
1552
|
+
const { container } = render(() => (
|
|
1553
|
+
<BarChart width={100} height={100} data={data}>
|
|
1554
|
+
<YAxis width={yAxisWidth} />
|
|
1555
|
+
<Bar dataKey="amt" />
|
|
1556
|
+
</BarChart>
|
|
1557
|
+
));
|
|
1558
|
+
|
|
1559
|
+
const yAxis = container.querySelector(".yAxis");
|
|
1560
|
+
assertNotNull(yAxis);
|
|
1561
|
+
const yAxisLine = yAxis.querySelector("line");
|
|
1562
|
+
|
|
1563
|
+
expect(yAxis).toBeVisible();
|
|
1564
|
+
expect(yAxisLine).toHaveAttribute("width", String(yAxisWidth));
|
|
1565
|
+
});
|
|
1566
|
+
|
|
1567
|
+
it("should render y-axis with dynamically calculated width", () => {
|
|
1568
|
+
mockGetBoundingClientRect({ width: 80, height: 30 });
|
|
1569
|
+
|
|
1570
|
+
const { container } = render(() => (
|
|
1571
|
+
<BarChart width={400} height={300} data={data}>
|
|
1572
|
+
<YAxis width="auto" ticks={[0, 800, 1600, 2400]} />
|
|
1573
|
+
<Bar dataKey="amt" />
|
|
1574
|
+
</BarChart>
|
|
1575
|
+
));
|
|
1576
|
+
|
|
1577
|
+
// Get all tick elements from the rendered Y-axis
|
|
1578
|
+
const tickElements = container.querySelectorAll(".recharts-cartesian-axis-tick-value");
|
|
1579
|
+
|
|
1580
|
+
const yAxis = container.querySelector(".yAxis");
|
|
1581
|
+
assertNotNull(yAxis);
|
|
1582
|
+
const yAxisLine = yAxis.querySelector("line");
|
|
1583
|
+
|
|
1584
|
+
const calculatedYAxisWidth = getCalculatedYAxisWidth({
|
|
1585
|
+
ticks: Array.from(tickElements),
|
|
1586
|
+
tickSize: 6,
|
|
1587
|
+
tickMargin: 2,
|
|
1588
|
+
label: undefined,
|
|
1589
|
+
labelGapWithTick: 5,
|
|
1590
|
+
});
|
|
1591
|
+
|
|
1592
|
+
expect(calculatedYAxisWidth).toBe(88); // 80 width + 6 tick size + 2 tick margin
|
|
1593
|
+
expect(yAxisLine).toHaveAttribute("width", "88");
|
|
1594
|
+
});
|
|
1595
|
+
});
|