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,207 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 test/util/isDomainSpecifiedByUser.spec.ts (commit 7a23854).
|
|
2
|
+
// Pure-function unit test: import the functions and assert. No render/diagnostics.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
numericalDomainSpecifiedWithoutRequiringData,
|
|
6
|
+
parseNumericalUserDomain,
|
|
7
|
+
} from "../../src/util/isDomainSpecifiedByUser";
|
|
8
|
+
import { AxisDomain, NumberDomain } from "../../src/util/types";
|
|
9
|
+
|
|
10
|
+
// I need to add object wrapper because Jest likes to sometimes auto-flatten arrays of arrays
|
|
11
|
+
type MyTestCases = ReadonlyArray<{ domain: AxisDomain; expected?: NumberDomain }>;
|
|
12
|
+
|
|
13
|
+
describe("parsing axis domain provided by user", () => {
|
|
14
|
+
// These are valid domains without any further questions and without the need for calculated data domain as an input
|
|
15
|
+
const validCases: MyTestCases = [
|
|
16
|
+
{ domain: [-100, 100], expected: [-100, 100] },
|
|
17
|
+
{ domain: [-5, 0], expected: [-5, 0] },
|
|
18
|
+
{ domain: [0, 100], expected: [0, 100] },
|
|
19
|
+
{ domain: [100, 100], expected: [100, 100] },
|
|
20
|
+
/*
|
|
21
|
+
* I am surprised, but in Recharts it is valid to have domain where first element is larger than the second!
|
|
22
|
+
* This also makes the axis reversed.
|
|
23
|
+
*/
|
|
24
|
+
{ domain: [2, 1], expected: [2, 1] },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const casesThatDefaultToDataMinDataMax: MyTestCases = [
|
|
28
|
+
{ domain: [NaN, NaN] },
|
|
29
|
+
// sorry no string parsing. Although we could allow that, why not? Perhaps an opportunity for an improvement
|
|
30
|
+
{ domain: ["20", "30"] },
|
|
31
|
+
{ domain: ["", ""] },
|
|
32
|
+
// no percents in dataMin or dataMax, possible feature request perhaps
|
|
33
|
+
{ domain: ["dataMin - 10%", "dataMax + 5%"] },
|
|
34
|
+
/*
|
|
35
|
+
* This is interesting - Recharts allows dataMin to get smaller and dataMax to get bigger,
|
|
36
|
+
* but doesn't allow dataMin to get bigger and dataMax to get smaller!
|
|
37
|
+
* Even with allowDataOverflow = true.
|
|
38
|
+
*/
|
|
39
|
+
{ domain: ["dataMin + 11.2", "dataMax - 7.3"], expected: [-100, 100] },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
// These are always invalid domains
|
|
43
|
+
const invalidCases: MyTestCases = [
|
|
44
|
+
{ domain: [] },
|
|
45
|
+
{ domain: [0] },
|
|
46
|
+
{ domain: [100, 150, 200] },
|
|
47
|
+
{ domain: [0, Infinity] },
|
|
48
|
+
{ domain: [Infinity, 9] },
|
|
49
|
+
{ domain: [() => "1", 9] },
|
|
50
|
+
// @ts-expect-error typescript is correct here, but I want a test anyway
|
|
51
|
+
{ domain: () => ["1", 9] },
|
|
52
|
+
// @ts-expect-error typescript is correct here, but I want a test anyway
|
|
53
|
+
{ domain: () => [1, 2, 3] },
|
|
54
|
+
// toFixed returns a string and strings are not allowed
|
|
55
|
+
{ domain: [(min: number) => min.toFixed(3), (max: number) => max.toFixed(3)] },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
const numericalDataDomain: NumberDomain = [-100, 100];
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* These are valid - but only when the calculated chart data is present.
|
|
62
|
+
*/
|
|
63
|
+
const casesValidOnlyWhenDataDomainIsGiven: MyTestCases = [
|
|
64
|
+
{ domain: [() => 1, () => 2], expected: [1, 2] },
|
|
65
|
+
{ domain: () => [3, 4], expected: [3, 4] },
|
|
66
|
+
{ domain: [() => 1, 9], expected: [1, 9] },
|
|
67
|
+
{ domain: [100, NaN], expected: [100, 100] },
|
|
68
|
+
{ domain: [NaN, 200], expected: [-100, 200] },
|
|
69
|
+
{ domain: [11, "auto"], expected: [11, 100] },
|
|
70
|
+
{ domain: ["auto", 1], expected: [-100, 1] },
|
|
71
|
+
{ domain: [0, "dataMax"], expected: [0, 100] },
|
|
72
|
+
{ domain: ["dataMin", "dataMax"], expected: [-100, 100] },
|
|
73
|
+
{ domain: ["auto", "auto"], expected: [-100, 100] },
|
|
74
|
+
{ domain: ["dataMin - 11.2", "dataMax + 7.3"], expected: [-111.2, 107.3] },
|
|
75
|
+
{ domain: (d) => [Math.min(...d), 999], expected: [-100, 999] },
|
|
76
|
+
{ domain: (d) => [d[0] - 21, d[1] + 23], expected: [-121, 123] },
|
|
77
|
+
{
|
|
78
|
+
domain: [(min: number) => min.valueOf() - 17, (max: number) => max / 2],
|
|
79
|
+
expected: [-117, 50],
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* These are valid - but the prop allowDataOverflow = false means that
|
|
85
|
+
* recharts should ignore what user returned, and use the data domain instead.
|
|
86
|
+
*/
|
|
87
|
+
const casesWithDomainSmallerThanData: MyTestCases = [
|
|
88
|
+
{ domain: [11, 200], expected: [-100, 200] },
|
|
89
|
+
{ domain: [11, "auto"], expected: [-100, 100] },
|
|
90
|
+
{ domain: ["auto", 1], expected: [-100, 100] },
|
|
91
|
+
{ domain: [0, "dataMax"], expected: [-100, 100] },
|
|
92
|
+
{ domain: (d) => [Math.min(...d), 0], expected: [-100, 100] },
|
|
93
|
+
{
|
|
94
|
+
domain: [(min: number) => min.valueOf() + 17, (max: number) => max / 2],
|
|
95
|
+
expected: [-100, 100],
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
describe("numericalDomainSpecifiedWithoutRequiringData", () => {
|
|
100
|
+
it.each([true, false])(
|
|
101
|
+
"should return undefined when user input is undefined and allowDataOverflow = %s",
|
|
102
|
+
(allowDataOverflow) => {
|
|
103
|
+
expect(
|
|
104
|
+
numericalDomainSpecifiedWithoutRequiringData(undefined, allowDataOverflow),
|
|
105
|
+
).toBeUndefined();
|
|
106
|
+
expect(
|
|
107
|
+
numericalDomainSpecifiedWithoutRequiringData(undefined, allowDataOverflow),
|
|
108
|
+
).toBeUndefined();
|
|
109
|
+
},
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
it.each(validCases)(
|
|
113
|
+
"should return $expected when domain = $domain and allowDataOverflow = true",
|
|
114
|
+
({ domain, expected }) => {
|
|
115
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, true)).toEqual(expected);
|
|
116
|
+
},
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
it.each(validCases)(
|
|
120
|
+
"should return undefined when domain = $domain and allowDataOverflow = false",
|
|
121
|
+
({ domain }) => {
|
|
122
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, false)).toEqual(undefined);
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
it.each(invalidCases)("should return undefined when domain = $domain", ({ domain }) => {
|
|
127
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, true)).toEqual(undefined);
|
|
128
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, false)).toEqual(undefined);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it.each(casesThatDefaultToDataMinDataMax)(
|
|
132
|
+
"should return undefined when domain = $domain",
|
|
133
|
+
({ domain }) => {
|
|
134
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, true)).toEqual(undefined);
|
|
135
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, false)).toEqual(undefined);
|
|
136
|
+
},
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
it.each(casesValidOnlyWhenDataDomainIsGiven)(
|
|
140
|
+
"should return undefined when domain = $domain but data domain is undefined",
|
|
141
|
+
({ domain }) => {
|
|
142
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, true)).toBeUndefined();
|
|
143
|
+
expect(numericalDomainSpecifiedWithoutRequiringData(domain, false)).toBeUndefined();
|
|
144
|
+
},
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe("parseNumericalUserDomain", () => {
|
|
149
|
+
it.each([true, false])(
|
|
150
|
+
"should return undefined when user input is undefined and allowDataOverflow = %s",
|
|
151
|
+
(allowDataOverflow) => {
|
|
152
|
+
expect(
|
|
153
|
+
parseNumericalUserDomain(undefined, numericalDataDomain, allowDataOverflow),
|
|
154
|
+
).toBeUndefined();
|
|
155
|
+
expect(
|
|
156
|
+
parseNumericalUserDomain(undefined, numericalDataDomain, allowDataOverflow),
|
|
157
|
+
).toBeUndefined();
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
it.each(validCases)(
|
|
162
|
+
"should return $expected when domain = $domain and allowDataOverflow = true",
|
|
163
|
+
({ domain, expected }) => {
|
|
164
|
+
expect(parseNumericalUserDomain(domain, undefined, true)).toEqual(expected);
|
|
165
|
+
},
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
it.each(casesValidOnlyWhenDataDomainIsGiven)(
|
|
169
|
+
"should return $expected when domain = $domain",
|
|
170
|
+
({ domain, expected }) => {
|
|
171
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, true)).toEqual(expected);
|
|
172
|
+
},
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
it.each(casesValidOnlyWhenDataDomainIsGiven)(
|
|
176
|
+
"should return undefined when domain = $domain and data is undefined",
|
|
177
|
+
({ domain }) => {
|
|
178
|
+
expect(parseNumericalUserDomain(domain, undefined, true)).toEqual(undefined);
|
|
179
|
+
expect(parseNumericalUserDomain(domain, undefined, false)).toEqual(undefined);
|
|
180
|
+
},
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
it.each(casesWithDomainSmallerThanData)(
|
|
184
|
+
"should extend the domain to $expected when domain = $domain and allowDataOverflow = false",
|
|
185
|
+
({ domain, expected }) => {
|
|
186
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, false)).toEqual(expected);
|
|
187
|
+
},
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
it.each(invalidCases)("should return undefined when domain = $domain", ({ domain }) => {
|
|
191
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, true)).toBeUndefined();
|
|
192
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, false)).toBeUndefined();
|
|
193
|
+
expect(parseNumericalUserDomain(domain, undefined, true)).toBeUndefined();
|
|
194
|
+
expect(parseNumericalUserDomain(domain, undefined, false)).toBeUndefined();
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it.each(casesThatDefaultToDataMinDataMax)(
|
|
198
|
+
"should return data min, data max when domain = $domain",
|
|
199
|
+
({ domain }) => {
|
|
200
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, true)).toEqual([-100, 100]);
|
|
201
|
+
expect(parseNumericalUserDomain(domain, numericalDataDomain, false)).toEqual([-100, 100]);
|
|
202
|
+
expect(parseNumericalUserDomain(domain, undefined, true)).toBeUndefined();
|
|
203
|
+
expect(parseNumericalUserDomain(domain, undefined, false)).toBeUndefined();
|
|
204
|
+
},
|
|
205
|
+
);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { isPositiveNumber, isWellBehavedNumber } from "../../src/util/isWellBehavedNumber";
|
|
3
|
+
|
|
4
|
+
describe("isWellBehavedNumber", () => {
|
|
5
|
+
it.each([
|
|
6
|
+
[false, null],
|
|
7
|
+
[false, undefined],
|
|
8
|
+
[false, "a"],
|
|
9
|
+
[false, "1"],
|
|
10
|
+
[false, NaN],
|
|
11
|
+
[false, Symbol("a")],
|
|
12
|
+
[false, []],
|
|
13
|
+
[false, {}],
|
|
14
|
+
[false, () => {}],
|
|
15
|
+
[false, new Date()],
|
|
16
|
+
[false, new Map()],
|
|
17
|
+
[false, new Set()],
|
|
18
|
+
[false, Infinity],
|
|
19
|
+
[false, -Infinity],
|
|
20
|
+
[true, -0],
|
|
21
|
+
[true, 3],
|
|
22
|
+
[true, -3],
|
|
23
|
+
[true, -3.1],
|
|
24
|
+
[true, 0.1],
|
|
25
|
+
])("should return %s when the input is %s", (expected, value) => {
|
|
26
|
+
expect(isWellBehavedNumber(value)).toBe(expected);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe("isPositiveNumber", () => {
|
|
31
|
+
it.each([
|
|
32
|
+
[false, null],
|
|
33
|
+
[false, undefined],
|
|
34
|
+
[false, "a"],
|
|
35
|
+
[false, "1"],
|
|
36
|
+
[false, NaN],
|
|
37
|
+
[false, Symbol("a")],
|
|
38
|
+
[false, []],
|
|
39
|
+
[false, {}],
|
|
40
|
+
[false, () => {}],
|
|
41
|
+
[false, new Date()],
|
|
42
|
+
[false, new Map()],
|
|
43
|
+
[false, new Set()],
|
|
44
|
+
[false, -Infinity],
|
|
45
|
+
[false, 0],
|
|
46
|
+
[false, -0],
|
|
47
|
+
[false, -3.1],
|
|
48
|
+
[false, -0.1],
|
|
49
|
+
[true, 3],
|
|
50
|
+
[true, 3.1],
|
|
51
|
+
])("should return %s when the input is %s", (expected, value) => {
|
|
52
|
+
expect(isPositiveNumber(value)).toBe(expected);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { getUniqPayload } from "../../../src/util/payload/getUniqPayload";
|
|
2
|
+
|
|
3
|
+
type ExamplePayload = { name: string; value: number };
|
|
4
|
+
|
|
5
|
+
const payload = [
|
|
6
|
+
{
|
|
7
|
+
name: "a",
|
|
8
|
+
value: 5,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "b",
|
|
12
|
+
value: 5,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "a",
|
|
16
|
+
value: 7,
|
|
17
|
+
},
|
|
18
|
+
];
|
|
19
|
+
|
|
20
|
+
const defaultUniqBy = (o: ExamplePayload) => o.name;
|
|
21
|
+
|
|
22
|
+
describe("getUniqPayload", () => {
|
|
23
|
+
it("should return payload as-is if iteratee is false", () => {
|
|
24
|
+
const result = getUniqPayload(payload, false, defaultUniqBy);
|
|
25
|
+
expect(result).toBe(payload);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should use defaultUniqBy parameter if iteratee is true", () => {
|
|
29
|
+
const result = getUniqPayload(payload, true, defaultUniqBy);
|
|
30
|
+
expect(result).toEqual([
|
|
31
|
+
{
|
|
32
|
+
name: "a",
|
|
33
|
+
value: 5,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "b",
|
|
37
|
+
value: 5,
|
|
38
|
+
},
|
|
39
|
+
]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("should use iteratee if it is a function", () => {
|
|
43
|
+
const customIteratee = (o: ExamplePayload) => o.value;
|
|
44
|
+
const result = getUniqPayload(payload, customIteratee, defaultUniqBy);
|
|
45
|
+
expect(result).toEqual([
|
|
46
|
+
{
|
|
47
|
+
name: "a",
|
|
48
|
+
value: 5,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "a",
|
|
52
|
+
value: 7,
|
|
53
|
+
},
|
|
54
|
+
]);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { propsAreEqual } from "../../src/util/propsAreEqual";
|
|
3
|
+
|
|
4
|
+
describe("propsAreEqual", () => {
|
|
5
|
+
it("should return true for identical props", () => {
|
|
6
|
+
const props1 = { a: 1, b: "test", c: true };
|
|
7
|
+
const props2 = { a: 1, b: "test", c: true };
|
|
8
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("should return false for different props", () => {
|
|
12
|
+
const props1 = { a: 1, b: "test", c: true };
|
|
13
|
+
const props2 = { a: 2, b: "test", c: true };
|
|
14
|
+
expect(propsAreEqual(props1, props2)).toBe(false);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should return false for different nested props", () => {
|
|
18
|
+
const props1 = { a: 1, b: { x: 10, y: 20 } };
|
|
19
|
+
const props2 = { a: 1, b: { x: 10, y: 30 } };
|
|
20
|
+
expect(propsAreEqual(props1, props2)).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should return true for same reference nested props", () => {
|
|
24
|
+
const nested = { x: 10, y: 20 };
|
|
25
|
+
const props1 = { a: 1, b: nested };
|
|
26
|
+
const props2 = { a: 1, b: nested };
|
|
27
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("should return true for same value, different reference, allowlisted nested props", () => {
|
|
31
|
+
// dot is one of the special allowlisted props for shallow comparison
|
|
32
|
+
const props1 = { a: 1, dot: { x: 10, y: 20 } };
|
|
33
|
+
const props2 = { a: 1, dot: { x: 10, y: 20 } };
|
|
34
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("should return false for different value, different reference, allowlisted nested props", () => {
|
|
38
|
+
/*
|
|
39
|
+
* dot is one of the special allowlisted props for shallow comparison
|
|
40
|
+
* but the values differ
|
|
41
|
+
*/
|
|
42
|
+
const props1 = { a: 1, dot: { x: 10, y: 20 } };
|
|
43
|
+
const props2 = { a: 1, dot: { x: 10, y: 30 } };
|
|
44
|
+
expect(propsAreEqual(props1, props2)).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should treat undefined and null as if they were equal", () => {
|
|
48
|
+
type TestProps = { a?: number | null; b?: number | null };
|
|
49
|
+
const props1: TestProps = { a: undefined, b: null };
|
|
50
|
+
const props2: TestProps = { a: null, b: undefined };
|
|
51
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should treat positive and negative zero as equal", () => {
|
|
55
|
+
const props1 = { a: 0 };
|
|
56
|
+
const props2 = { a: -0 };
|
|
57
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("should treat NaN values as equal", () => {
|
|
61
|
+
const props1 = { a: NaN };
|
|
62
|
+
const props2 = { a: NaN };
|
|
63
|
+
expect(propsAreEqual(props1, props2)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it.each(["data", "points"])("should not attempt to shallow compare prop %s", (propName) => {
|
|
67
|
+
/*
|
|
68
|
+
* Let's specifically test that these props are not shallowly compared because these should not be allowlisted!
|
|
69
|
+
* We can receive large arrays/objects here that would be too costly to compare.
|
|
70
|
+
*/
|
|
71
|
+
const props1 = { a: 1, [propName]: { x: 10, y: 20 } };
|
|
72
|
+
const props2 = { a: 1, [propName]: { x: 10, y: 30 } };
|
|
73
|
+
expect(propsAreEqual(props1, props2)).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { round, roundTemplateLiteral } from "../../src/util/round";
|
|
3
|
+
|
|
4
|
+
describe("round", () => {
|
|
5
|
+
it("should round a number to default precision of 4", () => {
|
|
6
|
+
expect(round(1.23456789)).toBe(1.2346);
|
|
7
|
+
expect(round(5.67891234)).toBe(5.6789);
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
it("should round a number to specified precision", () => {
|
|
11
|
+
expect(round(1.23456789, 0)).toBe(1);
|
|
12
|
+
expect(round(1.23456789, 1)).toBe(1.2);
|
|
13
|
+
expect(round(1.23456789, 2)).toBe(1.23);
|
|
14
|
+
expect(round(1.23456789, 3)).toBe(1.235);
|
|
15
|
+
expect(round(1.23456789, 5)).toBe(1.23457);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should handle negative numbers", () => {
|
|
19
|
+
expect(round(-1.23456789, 4)).toBe(-1.2346);
|
|
20
|
+
expect(round(-5.6789, 2)).toBe(-5.68);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should convert -0 to 0", () => {
|
|
24
|
+
expect(round(-0.0001, 3)).toBe(0);
|
|
25
|
+
expect(Object.is(round(-0.0001, 3), -0)).toBe(false);
|
|
26
|
+
expect(Object.is(round(-0.0001, 3), 0)).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should handle zero", () => {
|
|
30
|
+
expect(round(0)).toBe(0);
|
|
31
|
+
expect(round(0, 2)).toBe(0);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should handle integers", () => {
|
|
35
|
+
expect(round(42)).toBe(42);
|
|
36
|
+
expect(round(100, 2)).toBe(100);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should handle very small numbers", () => {
|
|
40
|
+
expect(round(0.00001, 4)).toBe(0);
|
|
41
|
+
expect(round(0.00001, 5)).toBe(0.00001);
|
|
42
|
+
expect(round(0.00001, 6)).toBe(0.00001);
|
|
43
|
+
expect(round(1e-15, 6)).toBe(0);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should handle very large numbers", () => {
|
|
47
|
+
// eslint-disable-next-line no-loss-of-precision
|
|
48
|
+
expect(round(123456789.123456789, 2)).toBe(123456789.12);
|
|
49
|
+
expect(round(999999.999999, 4)).toBe(1000000);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should handle edge case rounding", () => {
|
|
53
|
+
expect(round(1.5, 0)).toBe(2);
|
|
54
|
+
expect(round(2.5, 0)).toBe(3);
|
|
55
|
+
expect(round(-1.5, 0)).toBe(-1);
|
|
56
|
+
expect(round(-2.5, 0)).toBe(-2);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe("roundTemplateLiteral", () => {
|
|
61
|
+
it("should round values in template literal", () => {
|
|
62
|
+
const result = roundTemplateLiteral`M${10.123456},${20.987654}L${30.555555},${40.444444}`;
|
|
63
|
+
expect(result).toBe("M10.1235,20.9877L30.5556,40.4444");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should handle template with no values", () => {
|
|
67
|
+
const result = roundTemplateLiteral`M10,20L30,40`;
|
|
68
|
+
expect(result).toBe("M10,20L30,40");
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should handle template with single value", () => {
|
|
72
|
+
const result = roundTemplateLiteral`M${10.123456},20`;
|
|
73
|
+
expect(result).toBe("M10.1235,20");
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should handle negative values", () => {
|
|
77
|
+
const result = roundTemplateLiteral`M${-10.123456},${-20.987654}`;
|
|
78
|
+
expect(result).toBe("M-10.1235,-20.9877");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should handle zero values", () => {
|
|
82
|
+
const result = roundTemplateLiteral`M${0},${0}L${0.0001},${-0.0001}`;
|
|
83
|
+
expect(result).toBe("M0,0L0.0001,-0.0001");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("should handle integers", () => {
|
|
87
|
+
const result = roundTemplateLiteral`M${10},${20}L${30},${40}`;
|
|
88
|
+
expect(result).toBe("M10,20L30,40");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should handle SVG path with multiple commands", () => {
|
|
92
|
+
const result = roundTemplateLiteral`M${10.1111},${20.2222}L${30.3333},${40.4444}Q${50.5555},${60.6666},${70.7777},${80.8888}Z`;
|
|
93
|
+
expect(result).toBe("M10.1111,20.2222L30.3333,40.4444Q50.5555,60.6666,70.7777,80.8888Z");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it("should handle empty string parts", () => {
|
|
97
|
+
const x = 10.12345;
|
|
98
|
+
const y = 20.6789;
|
|
99
|
+
const result = roundTemplateLiteral`${x},${y}`;
|
|
100
|
+
expect(result).toBe("10.1235,20.6789");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should preserve spacing and formatting", () => {
|
|
104
|
+
const result = roundTemplateLiteral`M ${10.123456} ${20.987654} L ${30.555555} ${40.444444}`;
|
|
105
|
+
expect(result).toBe("M 10.1235 20.9877 L 30.5556 40.4444");
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should allow string values without rounding", () => {
|
|
109
|
+
const result = roundTemplateLiteral`M${10.123456},${"20.987654"}L${"30.555555"},${40.444444}`;
|
|
110
|
+
expect(result).toBe("M10.1235,20.987654L30.555555,40.4444");
|
|
111
|
+
});
|
|
112
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { describe, expect } from "vitest";
|
|
2
|
+
// Uses the lib's own DecimalLite (decimal.js-light replacement) so spec args
|
|
3
|
+
// are the same Decimal type the implementation operates on.
|
|
4
|
+
import Decimal from "../../../src/util/scale/util/DecimalLite";
|
|
5
|
+
import { getDigitCount, rangeStep } from "../../../src/util/scale/util/arithmetic";
|
|
6
|
+
|
|
7
|
+
describe("arithmetic", () => {
|
|
8
|
+
describe("getDigitCount", () => {
|
|
9
|
+
it("should return 1 for value equals 0)", () => {
|
|
10
|
+
expect(getDigitCount(0)).toBe(1);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("should return 0 for value in [0.1, 1)", () => {
|
|
14
|
+
expect(getDigitCount(0.1)).toBe(0);
|
|
15
|
+
expect(getDigitCount(0.5)).toBe(0);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should return -1 for value in [0,01, 0.1)", () => {
|
|
19
|
+
expect(getDigitCount(0.01)).toBe(-1);
|
|
20
|
+
expect(getDigitCount(0.05)).toBe(-1);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should return -2 for value in [0.001, 0.01)", () => {
|
|
24
|
+
expect(getDigitCount(0.001)).toBe(-2);
|
|
25
|
+
expect(getDigitCount(0.005)).toBe(-2);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should return 2 for value in [10, 100)", () => {
|
|
29
|
+
expect(getDigitCount(10)).toBe(2);
|
|
30
|
+
expect(getDigitCount(99)).toBe(2);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should return correct digit count for large numbers", () => {
|
|
34
|
+
expect(getDigitCount(1.1e21)).toBe(22);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("should return correct digit count for small numbers", () => {
|
|
38
|
+
expect(getDigitCount(1.1e-21)).toBe(-20);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
describe("rangeStep", () => {
|
|
43
|
+
it("should generate correct range steps", () => {
|
|
44
|
+
const result = rangeStep(new Decimal(0), new Decimal(5), new Decimal(1));
|
|
45
|
+
expect(result).toEqual([0, 1, 2, 3, 4]);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should generate correct decimal range steps", () => {
|
|
49
|
+
const result = rangeStep(new Decimal(0), new Decimal(1), new Decimal(0.1));
|
|
50
|
+
expect(result).toEqual([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("should generate correct decimal range steps with small values", () => {
|
|
54
|
+
const result = rangeStep(new Decimal(0), new Decimal(0.0000035), new Decimal(0.00000035));
|
|
55
|
+
expect(result).toEqual([
|
|
56
|
+
0, 0.00000035, 0.0000007, 0.00000105, 0.0000014, 0.00000175, 0.0000021, 0.00000245,
|
|
57
|
+
0.0000028, 0.00000315,
|
|
58
|
+
]);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// Ported from recharts 3.8.1 test/util/scale/createCategoricalInverse.spec.ts (commit 7a23854).
|
|
2
|
+
import { describe, it, expect } from "vitest";
|
|
3
|
+
import { scaleLinear } from "d3-scale";
|
|
4
|
+
import { bisect, createCategoricalInverse } from "../../../src/util/scale/createCategoricalInverse";
|
|
5
|
+
import { CustomScaleDefinition } from "../../../src/util/scale/CustomScaleDefinition";
|
|
6
|
+
|
|
7
|
+
describe("bisect", () => {
|
|
8
|
+
it("should return the correct insertion index in an ascending array", () => {
|
|
9
|
+
const haystack = [1, 3, 5, 7, 9];
|
|
10
|
+
expect(bisect(haystack, 0)).toBe(0);
|
|
11
|
+
expect(bisect(haystack, 4)).toBe(2);
|
|
12
|
+
expect(bisect(haystack, 10)).toBe(5);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should return the correct insertion index in a descending array", () => {
|
|
16
|
+
const haystack = [9, 7, 5, 3, 1];
|
|
17
|
+
expect(bisect(haystack, 10)).toBe(0);
|
|
18
|
+
expect(bisect(haystack, 6)).toBe(2);
|
|
19
|
+
expect(bisect(haystack, 0)).toBe(5);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
it("should return 0 when the haystack has two identical elements", () => {
|
|
23
|
+
const haystack = [5, 5];
|
|
24
|
+
expect(bisect(haystack, 5)).toBe(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("should return 0 for an empty array", () => {
|
|
28
|
+
const haystack: number[] = [];
|
|
29
|
+
expect(bisect(haystack, 5)).toBe(0);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("should return 0 for a single-element array", () => {
|
|
33
|
+
const haystack = [3];
|
|
34
|
+
expect(bisect(haystack, 5)).toBe(0);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe("createCategoricalInverse", () => {
|
|
39
|
+
it("should return undefined when scale is undefined", () => {
|
|
40
|
+
const actual = createCategoricalInverse(undefined);
|
|
41
|
+
expect(actual).toBeUndefined();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should return undefined when domain is empty", () => {
|
|
45
|
+
// @ts-expect-error this type forces strings into a number scale
|
|
46
|
+
const mockScale: CustomScaleDefinition = scaleLinear().domain([]).range([0, 100]);
|
|
47
|
+
const actual = createCategoricalInverse(mockScale);
|
|
48
|
+
expect(actual).toBeUndefined();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("should return undefined when range has less than two elements", () => {
|
|
52
|
+
// @ts-expect-error this type forces strings into a number scale
|
|
53
|
+
const mockScale: CustomScaleDefinition = scaleLinear().domain([0, 1]).range([0]);
|
|
54
|
+
const actual = createCategoricalInverse(mockScale);
|
|
55
|
+
expect(actual).toBeUndefined();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should return a function that maps pixel values to domain values", () => {
|
|
59
|
+
// @ts-expect-error this type forces strings into a number scale
|
|
60
|
+
const mockScale: CustomScaleDefinition = scaleLinear().domain([0, 2]).range([0, 100]);
|
|
61
|
+
const inverse = createCategoricalInverse(mockScale);
|
|
62
|
+
expect(inverse).toBeDefined();
|
|
63
|
+
if (inverse) {
|
|
64
|
+
expect(inverse(0)).toBe(0);
|
|
65
|
+
expect(inverse(50)).toBe(0);
|
|
66
|
+
expect(inverse(75)).toBe(2);
|
|
67
|
+
expect(inverse(100)).toBe(2);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("should use allDataPointsOnAxis if provided", () => {
|
|
72
|
+
// @ts-expect-error this type forces strings into a number scale
|
|
73
|
+
const mockScale: CustomScaleDefinition = scaleLinear().domain([0, 2]).range([0, 100]);
|
|
74
|
+
const allDataPoints = [0, 1, 2];
|
|
75
|
+
const inverse = createCategoricalInverse(mockScale, allDataPoints);
|
|
76
|
+
expect(inverse).toBeDefined();
|
|
77
|
+
if (inverse) {
|
|
78
|
+
expect(inverse(0)).toBe(0);
|
|
79
|
+
expect(inverse(45)).toBe(1);
|
|
80
|
+
expect(inverse(75)).toBe(1);
|
|
81
|
+
expect(inverse(100)).toBe(2);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
});
|