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.
Files changed (488) hide show
  1. package/package.json +4 -6
  2. package/src/animation/AnimatedItems.tsx +4 -2
  3. package/src/animation/CSSTransitionAnimate.tsx +39 -41
  4. package/src/animation/JavascriptAnimate.tsx +41 -45
  5. package/src/cartesian/Area.tsx +4 -4
  6. package/src/cartesian/AreaRevealShape.tsx +1 -1
  7. package/src/cartesian/Bar.tsx +21 -33
  8. package/src/cartesian/BarStack.tsx +5 -5
  9. package/src/cartesian/Brush.tsx +15 -19
  10. package/src/cartesian/CartesianAxis.tsx +4 -4
  11. package/src/cartesian/CartesianGrid.tsx +5 -5
  12. package/src/cartesian/ErrorBar.tsx +7 -9
  13. package/src/cartesian/Funnel.tsx +3 -3
  14. package/src/cartesian/GraphicalItemClipPath.tsx +1 -1
  15. package/src/cartesian/Line.tsx +16 -18
  16. package/src/cartesian/LineDrawShape.tsx +13 -14
  17. package/src/cartesian/ReferenceArea.tsx +4 -4
  18. package/src/cartesian/ReferenceDot.tsx +4 -4
  19. package/src/cartesian/ReferenceLine.tsx +4 -4
  20. package/src/cartesian/RenderedTicksReporter.tsx +17 -19
  21. package/src/cartesian/Scatter.tsx +3 -3
  22. package/src/cartesian/XAxis.tsx +1 -1
  23. package/src/cartesian/YAxis.tsx +33 -35
  24. package/src/cartesian/ZAxis.tsx +2 -3
  25. package/src/chart/AreaChart.tsx +1 -1
  26. package/src/chart/BarChart.tsx +1 -1
  27. package/src/chart/CartesianChart.tsx +3 -4
  28. package/src/chart/CategoricalChart.tsx +5 -5
  29. package/src/chart/ComposedChart.tsx +1 -1
  30. package/src/chart/FunnelChart.tsx +1 -1
  31. package/src/chart/LineChart.tsx +1 -1
  32. package/src/chart/PieChart.tsx +3 -4
  33. package/src/chart/PolarChart.tsx +3 -4
  34. package/src/chart/RadarChart.tsx +3 -4
  35. package/src/chart/RadialBarChart.tsx +3 -7
  36. package/src/chart/RechartsWrapper.tsx +24 -14
  37. package/src/chart/Sankey.tsx +6 -9
  38. package/src/chart/ScatterChart.tsx +1 -1
  39. package/src/chart/SunburstChart.tsx +4 -5
  40. package/src/chart/Treemap.tsx +4 -5
  41. package/src/component/ActivePoints.tsx +6 -6
  42. package/src/component/Cell.tsx +5 -23
  43. package/src/component/Cursor.tsx +3 -3
  44. package/src/component/DefaultLegendContent.tsx +6 -8
  45. package/src/component/DefaultTooltipContent.tsx +10 -14
  46. package/src/component/Dots.tsx +5 -5
  47. package/src/component/Label.tsx +10 -13
  48. package/src/component/LabelList.tsx +7 -12
  49. package/src/component/Legend.tsx +21 -26
  50. package/src/component/ResponsiveContainer.tsx +49 -52
  51. package/src/component/Text.tsx +5 -5
  52. package/src/component/Tooltip.tsx +18 -21
  53. package/src/component/TooltipBoundingBox.tsx +16 -18
  54. package/src/component/responsiveContainerUtils.ts +1 -1
  55. package/src/container/ClipPathProvider.tsx +3 -3
  56. package/src/container/Layer.tsx +5 -5
  57. package/src/container/RootSurface.tsx +1 -1
  58. package/src/container/Surface.tsx +6 -5
  59. package/src/context/ErrorBarContext.tsx +2 -2
  60. package/src/context/PanoramaContext.tsx +2 -2
  61. package/src/context/RegisterGraphicalItemId.tsx +2 -4
  62. package/src/context/chartDataContext.tsx +23 -26
  63. package/src/context/chartLayoutContext.tsx +12 -16
  64. package/src/polar/Pie.tsx +12 -13
  65. package/src/polar/PolarAngleAxis.tsx +3 -3
  66. package/src/polar/PolarGrid.tsx +5 -5
  67. package/src/polar/PolarRadiusAxis.tsx +3 -3
  68. package/src/polar/Radar.tsx +3 -3
  69. package/src/polar/RadialBar.tsx +3 -3
  70. package/src/shape/Cross.tsx +5 -5
  71. package/src/shape/Curve.tsx +7 -6
  72. package/src/shape/Dot.tsx +4 -4
  73. package/src/shape/Polygon.tsx +5 -5
  74. package/src/shape/Rectangle.tsx +20 -22
  75. package/src/shape/Sector.tsx +5 -5
  76. package/src/shape/Symbols.tsx +5 -5
  77. package/src/shape/Trapezoid.tsx +27 -29
  78. package/src/state/RechartsStoreProvider.tsx +3 -5
  79. package/src/state/ReportChartProps.tsx +6 -8
  80. package/src/state/ReportEventSettings.tsx +6 -8
  81. package/src/state/ReportMainChartProps.tsx +9 -11
  82. package/src/state/ReportPolarOptions.tsx +13 -15
  83. package/src/state/SetLegendPayload.ts +1 -1
  84. package/src/state/SetTooltipEntrySettings.tsx +1 -1
  85. package/src/state/brushSlice.ts +8 -10
  86. package/src/state/cartesianAxisSlice.ts +38 -46
  87. package/src/state/chartDataSlice.ts +23 -29
  88. package/src/state/errorBarSlice.ts +16 -22
  89. package/src/state/eventSettingsSlice.ts +9 -11
  90. package/src/state/graphicalItemsSlice.ts +13 -17
  91. package/src/state/layoutSlice.ts +19 -27
  92. package/src/state/legendSlice.ts +18 -24
  93. package/src/state/optionsSlice.ts +6 -8
  94. package/src/state/polarAxisSlice.ts +13 -21
  95. package/src/state/polarOptionsSlice.ts +14 -16
  96. package/src/state/referenceElementsSlice.ts +19 -25
  97. package/src/state/registerInStore.ts +13 -15
  98. package/src/state/renderedTicksSlice.ts +7 -11
  99. package/src/state/rootPropsSlice.ts +14 -16
  100. package/src/state/tooltipSlice.ts +95 -115
  101. package/src/state/unregisterOnCleanup.ts +20 -5
  102. package/src/state/zIndexSlice.ts +42 -50
  103. package/src/synchronisation/useChartSynchronisation.tsx +217 -213
  104. package/src/util/ActiveShapeUtils.tsx +2 -2
  105. package/src/util/BarUtils.tsx +3 -5
  106. package/src/util/FunnelUtils.tsx +1 -1
  107. package/src/util/RadialBarUtils.tsx +3 -4
  108. package/src/util/createCartesianCharts.tsx +1 -1
  109. package/src/util/createPolarCharts.tsx +1 -1
  110. package/src/util/svgPropertiesAndEvents.ts +1 -1
  111. package/src/util/tooltip/translate.ts +2 -2
  112. package/src/util/types.ts +2 -2
  113. package/src/zIndex/ZIndexLayer.tsx +68 -39
  114. package/src/zIndex/ZIndexPortal.tsx +25 -29
  115. package/test/_data.ts +408 -0
  116. package/test/animation/AnimationController.typed.spec.ts +53 -0
  117. package/test/animation/AnimationControllerImpl.spec.ts +271 -0
  118. package/test/animation/CSSTransitionAnimate.timing.spec.tsx +473 -0
  119. package/test/animation/JavascriptAnimate.spec.tsx +62 -0
  120. package/test/animation/RechartsAnimation.spec.ts +636 -0
  121. package/test/animation/easing.spec.ts +218 -0
  122. package/test/animation/legacyAnimationLengthChange.spec.tsx +803 -0
  123. package/test/animation/matchBy.spec.ts +467 -0
  124. package/test/animation/mockAnimationController.ts +40 -0
  125. package/test/animation/mockControllerAnimationManager.ts +143 -0
  126. package/test/animation/mockTimeoutController.ts +114 -0
  127. package/test/animation/timeoutController.spec.ts +138 -0
  128. package/test/animation/useAnimationStartSnapshot.spec.ts +147 -0
  129. package/test/animation/util.spec.ts +28 -0
  130. package/test/cartesian/Area.animation.spec.tsx +363 -0
  131. package/test/cartesian/Area.range.spec.tsx +54 -0
  132. package/test/cartesian/Area.spec.tsx +1202 -0
  133. package/test/cartesian/Area.stacked.render.spec.tsx +69 -0
  134. package/test/cartesian/Area.typed.spec.tsx +209 -0
  135. package/test/cartesian/Axis.integration.spec.tsx +158 -0
  136. package/test/cartesian/Bar/Bar.csstransition.spec.tsx +299 -0
  137. package/test/cartesian/Bar/Bar.spec.tsx +2314 -0
  138. package/test/cartesian/Bar/Bar.typed.spec.tsx +192 -0
  139. package/test/cartesian/Bar.animation.spec.tsx +426 -0
  140. package/test/cartesian/Bar.stackDomain.spec.tsx +66 -0
  141. package/test/cartesian/Bar.stacked.render.spec.tsx +53 -0
  142. package/test/cartesian/Bar.truncateByDomain.spec.tsx +237 -0
  143. package/test/cartesian/Bar.zeroDimensionFiltering.spec.tsx +336 -0
  144. package/test/cartesian/BarStack.spec.tsx +91 -0
  145. package/test/cartesian/Brush.keyboard.spec.tsx +88 -0
  146. package/test/cartesian/Brush.panorama.spec.tsx +41 -0
  147. package/test/cartesian/Brush.props.spec.tsx +63 -0
  148. package/test/cartesian/Brush.render.spec.tsx +117 -0
  149. package/test/cartesian/Brush.spec.tsx +522 -0
  150. package/test/cartesian/Brush.stacked.spec.tsx +221 -0
  151. package/test/cartesian/CartesianAxis.render.spec.tsx +50 -0
  152. package/test/cartesian/CartesianAxis.spec.tsx +396 -0
  153. package/test/cartesian/CartesianGrid.render.spec.tsx +39 -0
  154. package/test/cartesian/CartesianGrid.spec.tsx +2103 -0
  155. package/test/cartesian/ErrorBar.render.spec.tsx +69 -0
  156. package/test/cartesian/ErrorBar.spec.tsx +2414 -0
  157. package/test/cartesian/Funnel.animation.spec.tsx +241 -0
  158. package/test/cartesian/Funnel.spec.tsx +226 -0
  159. package/test/cartesian/Funnel.typed.spec.tsx +221 -0
  160. package/test/cartesian/GraphicalItemClipPath.scale-behavior.spec.tsx +627 -0
  161. package/test/cartesian/GraphicalItemClipPath.spec.tsx +427 -0
  162. package/test/cartesian/Line.animation.spec.tsx +643 -0
  163. package/test/cartesian/Line.sparseAnimationPath.spec.tsx +98 -0
  164. package/test/cartesian/Line.spec.tsx +471 -0
  165. package/test/cartesian/Line.typed.spec.tsx +152 -0
  166. package/test/cartesian/ReferenceArea.render.spec.tsx +63 -0
  167. package/test/cartesian/ReferenceArea.spec.tsx +663 -0
  168. package/test/cartesian/ReferenceArea.typed.spec.tsx +74 -0
  169. package/test/cartesian/ReferenceDot.render.spec.tsx +55 -0
  170. package/test/cartesian/ReferenceDot.spec.tsx +462 -0
  171. package/test/cartesian/ReferenceDot.typed.spec.tsx +76 -0
  172. package/test/cartesian/ReferenceLine/ReferenceLine.panorama.spec.tsx +184 -0
  173. package/test/cartesian/ReferenceLine/ReferenceLine.spec.tsx +744 -0
  174. package/test/cartesian/ReferenceLine/ReferenceLine.typed.spec.tsx +74 -0
  175. package/test/cartesian/ReferenceLine/getEndPoints.spec.ts +399 -0
  176. package/test/cartesian/ReferenceLine.render.spec.tsx +134 -0
  177. package/test/cartesian/Scatter.animation.spec.tsx +381 -0
  178. package/test/cartesian/Scatter.render.spec.tsx +61 -0
  179. package/test/cartesian/Scatter.spec.tsx +406 -0
  180. package/test/cartesian/Scatter.typed.spec.tsx +153 -0
  181. package/test/cartesian/XAxis/XAxis.barSize.spec.tsx +336 -0
  182. package/test/cartesian/XAxis/XAxis.brush.spec.tsx +266 -0
  183. package/test/cartesian/XAxis/XAxis.categorydomain.spec.tsx +872 -0
  184. package/test/cartesian/XAxis/XAxis.dataKey.spec.tsx +86 -0
  185. package/test/cartesian/XAxis/XAxis.datatypes.spec.tsx +127 -0
  186. package/test/cartesian/XAxis/XAxis.hide.spec.tsx +106 -0
  187. package/test/cartesian/XAxis/XAxis.multiaxis.spec.tsx +336 -0
  188. package/test/cartesian/XAxis/XAxis.numberdomain.spec.tsx +1466 -0
  189. package/test/cartesian/XAxis/XAxis.padding.spec.tsx +758 -0
  190. package/test/cartesian/XAxis/XAxis.padding_clip.spec.tsx +65 -0
  191. package/test/cartesian/XAxis/XAxis.state.spec.tsx +355 -0
  192. package/test/cartesian/XAxis/XAxis.tick.spec.tsx +493 -0
  193. package/test/cartesian/XAxis/XAxis.timescale.spec.tsx +233 -0
  194. package/test/cartesian/XAxis/XAxis.type.spec.tsx +107 -0
  195. package/test/cartesian/XAxis/XAxis.typed.spec.tsx +102 -0
  196. package/test/cartesian/XAxis/XAxis.vertical.spec.tsx +265 -0
  197. package/test/cartesian/XAxis.tickFormatter.spec.tsx +54 -0
  198. package/test/cartesian/YAxis/YAxis.7362.derivedDomain.spec.tsx +230 -0
  199. package/test/cartesian/YAxis/YAxis.7362.spec.tsx +104 -0
  200. package/test/cartesian/YAxis/YAxis.interval-zero.spec.tsx +88 -0
  201. package/test/cartesian/YAxis/YAxis.label.spec.tsx +219 -0
  202. package/test/cartesian/YAxis/YAxis.spec.tsx +1595 -0
  203. package/test/cartesian/YAxis/YAxis.tick.spec.tsx +428 -0
  204. package/test/cartesian/YAxis/YAxis.tickFormatter.spec.tsx +54 -0
  205. package/test/cartesian/YAxis/YAxis.ticks.spec.tsx +263 -0
  206. package/test/cartesian/YAxis/YAxis.type.spec.tsx +107 -0
  207. package/test/cartesian/YAxis/YAxis.typed.spec.tsx +102 -0
  208. package/test/cartesian/ZAxis.spec.tsx +300 -0
  209. package/test/cartesian/ZAxis.typed.spec.tsx +33 -0
  210. package/test/cartesian/__snapshots__/Brush.spec.tsx.snap +5 -0
  211. package/test/cartesian/axisLineAndStroke.spec.tsx +72 -0
  212. package/test/cartesian/getCartesianPosition.spec.ts +907 -0
  213. package/test/cartesian/getEquidistantTicks.spec.ts +88 -0
  214. package/test/cartesian/getTicks.spec.ts +378 -0
  215. package/test/cartesian/miscFeatureGaps.spec.tsx +89 -0
  216. package/test/cartesian/useAnimatedLineLength.spec.ts +168 -0
  217. package/test/chart/AccessibilityLayer.spec.tsx +569 -0
  218. package/test/chart/AccessibilityScans.spec.tsx +286 -0
  219. package/test/chart/AreaChart.spec.tsx +409 -0
  220. package/test/chart/AreaChart.stacked.spec.tsx +1407 -0
  221. package/test/chart/AreaChart.typed.spec.tsx +39 -0
  222. package/test/chart/BarChart.spec.tsx +3719 -0
  223. package/test/chart/BarChart.typed.spec.tsx +60 -0
  224. package/test/chart/CategoricalChart.spec.tsx +255 -0
  225. package/test/chart/ComposedChart.spec.tsx +199 -0
  226. package/test/chart/ComposedChart.typed.spec.tsx +39 -0
  227. package/test/chart/FunnelChart.spec.tsx +215 -0
  228. package/test/chart/FunnelChart.typed.spec.tsx +39 -0
  229. package/test/chart/LineChart.multiseries.spec.tsx +50 -0
  230. package/test/chart/LineChart.smoke.spec.tsx +50 -0
  231. package/test/chart/LineChart.spec.tsx +930 -0
  232. package/test/chart/LineChart.typed.spec.tsx +39 -0
  233. package/test/chart/NicheChartTooltip.spec.tsx +81 -0
  234. package/test/chart/PieChart.spec.tsx +793 -0
  235. package/test/chart/PieChart.typed.spec.tsx +39 -0
  236. package/test/chart/RadarChart.spec.tsx +530 -0
  237. package/test/chart/RadarChart.typed.spec.tsx +39 -0
  238. package/test/chart/RadialBarChart.5966.spec.tsx +48 -0
  239. package/test/chart/RadialBarChart.spec.tsx +679 -0
  240. package/test/chart/RadialBarChart.typed.spec.tsx +39 -0
  241. package/test/chart/RechartsWrapper.spec.tsx +83 -0
  242. package/test/chart/Sankey.content.spec.tsx +46 -0
  243. package/test/chart/Sankey.spec.tsx +952 -0
  244. package/test/chart/Sankey.typed.spec.tsx +29 -0
  245. package/test/chart/ScatterChart.spec.tsx +2613 -0
  246. package/test/chart/ScatterChart.typed.spec.tsx +39 -0
  247. package/test/chart/SunburstChart.spec.tsx +146 -0
  248. package/test/chart/Treemap.animation.spec.tsx +52 -0
  249. package/test/chart/Treemap.spec.tsx +1003 -0
  250. package/test/chart/Treemap.typed.spec.tsx +26 -0
  251. package/test/chart/chartEvents.spec.tsx +127 -0
  252. package/test/chart/responsive.spec.tsx +620 -0
  253. package/test/component/Cell.render.spec.tsx +155 -0
  254. package/test/component/Cell.spec.tsx +12 -0
  255. package/test/component/Cursor.spec.tsx +186 -0
  256. package/test/component/DefaultTooltipContent.spec.tsx +102 -0
  257. package/test/component/Label.render.spec.tsx +63 -0
  258. package/test/component/Label.spec.tsx +686 -0
  259. package/test/component/Label.typed.spec.tsx +46 -0
  260. package/test/component/LabelList.spec.tsx +188 -0
  261. package/test/component/Legend.itemSorter.spec.tsx +704 -0
  262. package/test/component/Legend.render.spec.tsx +92 -0
  263. package/test/component/Legend.spec.tsx +2213 -0
  264. package/test/component/Legend.typed.spec.tsx +22 -0
  265. package/test/component/ResponsiveContainer.spec.tsx +523 -0
  266. package/test/component/ResponsiveContainerDataTest.spec.tsx +51 -0
  267. package/test/component/Text.spec.tsx +415 -0
  268. package/test/component/Text.typed.spec.tsx +46 -0
  269. package/test/component/Tooltip/ActiveDot.spec.tsx +370 -0
  270. package/test/component/Tooltip/Tooltip.animation.spec.tsx +209 -0
  271. package/test/component/Tooltip/Tooltip.content.spec.tsx +128 -0
  272. package/test/component/Tooltip/Tooltip.formatter.spec.tsx +152 -0
  273. package/test/component/Tooltip/Tooltip.includeHidden.spec.tsx +79 -0
  274. package/test/component/Tooltip/Tooltip.multipleDataArrays.spec.tsx +165 -0
  275. package/test/component/Tooltip/Tooltip.offset.spec.tsx +113 -0
  276. package/test/component/Tooltip/Tooltip.state.spec.tsx +74 -0
  277. package/test/component/Tooltip/Tooltip.sync.spec.tsx +639 -0
  278. package/test/component/Tooltip/defaultIndex.spec.tsx +227 -0
  279. package/test/component/Tooltip/graphicalItem.formatter.spec.tsx +138 -0
  280. package/test/component/Tooltip/itemSorter.spec.tsx +2815 -0
  281. package/test/component/Tooltip/tooltipEventType.spec.tsx +344 -0
  282. package/test/component/Tooltip/tooltipMouseHoverSelectors.ts +41 -0
  283. package/test/component/Tooltip/tooltipTestHelpers.tsx +162 -0
  284. package/test/component/Tooltip.defaultIndex.spec.tsx +48 -0
  285. package/test/component/Tooltip.hover.spec.tsx +61 -0
  286. package/test/component/Tooltip.item.spec.tsx +54 -0
  287. package/test/component/Tooltip.keyboard.spec.tsx +51 -0
  288. package/test/component/Tooltip.payload.spec.tsx +1716 -0
  289. package/test/component/Tooltip.touch.spec.tsx +39 -0
  290. package/test/component/Tooltip.visibility.spec.tsx +1889 -0
  291. package/test/component/TooltipBoundingBox.spec.tsx +89 -0
  292. package/test/component/responsiveContainerUtils.spec.ts +205 -0
  293. package/test/container/ClipPath.spec.tsx +602 -0
  294. package/test/container/chartDimensions.spec.tsx +368 -0
  295. package/test/context/chartLayoutContext.spec.tsx +378 -0
  296. package/test/helper/ExpectAxisDomain.tsx +27 -0
  297. package/test/helper/assertNotNull.ts +6 -0
  298. package/test/helper/assertZIndexLayerOrder.ts +19 -0
  299. package/test/helper/createSelectorTestCase.tsx +176 -0
  300. package/test/helper/expectAnimatedPieAngles.ts +100 -0
  301. package/test/helper/expectAnimatedPiePaths.ts +78 -0
  302. package/test/helper/expectAreaCurve.ts +15 -0
  303. package/test/helper/expectAxisTicks.ts +48 -0
  304. package/test/helper/expectBars.ts +54 -0
  305. package/test/helper/expectFunctionReturning.ts +58 -0
  306. package/test/helper/expectLabel.ts +32 -0
  307. package/test/helper/expectLastCalledWith.ts +48 -0
  308. package/test/helper/expectLine.ts +20 -0
  309. package/test/helper/expectPieSectors.ts +80 -0
  310. package/test/helper/expectScale.ts +37 -0
  311. package/test/helper/expectScatterPoints.ts +52 -0
  312. package/test/helper/expectStackGroups.ts +144 -0
  313. package/test/helper/mockAxes.ts +22 -0
  314. package/test/helper/mockGetBoundingClientRect.ts +66 -0
  315. package/test/helper/mockHTMLElementProperty.ts +19 -0
  316. package/test/helper/mockTouchingElement.ts +27 -0
  317. package/test/helper/offsetHelpers.ts +19 -0
  318. package/test/helper/parameterizedTestCases.tsx +99 -0
  319. package/test/helper/produceState.ts +32 -0
  320. package/test/helper/selectorTestHelpers.tsx +63 -0
  321. package/test/helper/trim.spec.ts +35 -0
  322. package/test/helper/trim.ts +11 -0
  323. package/test/hooks/useActiveTooltipDataPoints.spec.tsx +358 -0
  324. package/test/hooks/useAxisDomain.spec.tsx +361 -0
  325. package/test/hooks/useAxisScale.spec.tsx +283 -0
  326. package/test/hooks/useAxisTicks.spec.tsx +130 -0
  327. package/test/hooks/useOffset.spec.tsx +248 -0
  328. package/test/hooks/useTooltipStateHooks.spec.tsx +109 -0
  329. package/test/polar/Pie/Pie-TwoLevelPieChart.spec.tsx +135 -0
  330. package/test/polar/Pie/Pie.spec.tsx +784 -0
  331. package/test/polar/Pie/Pie.typed.spec.tsx +78 -0
  332. package/test/polar/Pie.animation.spec.tsx +529 -0
  333. package/test/polar/PieWithLegend.animation.spec.tsx +142 -0
  334. package/test/polar/PolarAngleAxis/PolarAngleAxis.events.spec.tsx +76 -0
  335. package/test/polar/PolarAngleAxis/PolarAngleAxis.spec.tsx +2079 -0
  336. package/test/polar/PolarAngleAxis/PolarAngleAxis.typed.spec.tsx +102 -0
  337. package/test/polar/PolarAngleAxis.render.spec.tsx +79 -0
  338. package/test/polar/PolarGrid.render.spec.tsx +75 -0
  339. package/test/polar/PolarGrid.spec.tsx +918 -0
  340. package/test/polar/PolarLegendPerRow.render.spec.tsx +85 -0
  341. package/test/polar/PolarRadiusAxis.events.spec.tsx +65 -0
  342. package/test/polar/PolarRadiusAxis.render.spec.tsx +52 -0
  343. package/test/polar/PolarRadiusAxis.spec.tsx +991 -0
  344. package/test/polar/PolarRadiusAxis.typed.spec.tsx +84 -0
  345. package/test/polar/PolarTooltipLegend.render.spec.tsx +80 -0
  346. package/test/polar/Radar.animation.spec.tsx +570 -0
  347. package/test/polar/Radar.render.spec.tsx +71 -0
  348. package/test/polar/Radar.spec.tsx +265 -0
  349. package/test/polar/Radar.typed.spec.tsx +119 -0
  350. package/test/polar/RadialBar/RadialBar.spec.tsx +1521 -0
  351. package/test/polar/RadialBar/RadialBar.typed.spec.tsx +132 -0
  352. package/test/polar/RadialBar.animation.spec.tsx +375 -0
  353. package/test/polar/RadialBar.render.spec.tsx +66 -0
  354. package/test/polar/RadialBar.stacked.spec.tsx +57 -0
  355. package/test/setup.ts +84 -0
  356. package/test/shape/ActiveShape.spec.tsx +181 -0
  357. package/test/shape/Cross.spec.tsx +60 -0
  358. package/test/shape/Cross.typed.spec.tsx +26 -0
  359. package/test/shape/Curve.spec.tsx +368 -0
  360. package/test/shape/Curve.typed.spec.tsx +69 -0
  361. package/test/shape/Dot.spec.tsx +73 -0
  362. package/test/shape/Dot.typed.spec.tsx +30 -0
  363. package/test/shape/Polygon.spec.tsx +357 -0
  364. package/test/shape/Polygon.typed.spec.tsx +28 -0
  365. package/test/shape/Rectangle.animation.spec.tsx +451 -0
  366. package/test/shape/Rectangle.spec.tsx +68 -0
  367. package/test/shape/Rectangle.typed.spec.tsx +24 -0
  368. package/test/shape/Sector.spec.tsx +76 -0
  369. package/test/shape/Sector.typed.spec.tsx +24 -0
  370. package/test/shape/Symbols.spec.tsx +43 -0
  371. package/test/shape/Symbols.typed.spec.tsx +24 -0
  372. package/test/shape/Trapezoid.spec.tsx +50 -0
  373. package/test/shape/Trapezoid.typed.spec.tsx +24 -0
  374. package/test/shape/__snapshots__/Cross.spec.tsx.snap +62 -0
  375. package/test/shape/__snapshots__/Curve.spec.tsx.snap +460 -0
  376. package/test/shape/__snapshots__/Polygon.spec.tsx.snap +58 -0
  377. package/test/shape/__snapshots__/Rectangle.spec.tsx.snap +117 -0
  378. package/test/shape/__snapshots__/Sector.spec.tsx.snap +71 -0
  379. package/test/shape/__snapshots__/Trapezoid.spec.tsx.snap +64 -0
  380. package/test/state/chartDataSlice.spec.ts +53 -0
  381. package/test/state/createCollectionActions.spec.ts +87 -0
  382. package/test/state/createSelector.spec.ts +158 -0
  383. package/test/state/externalEventsMiddleware.spec.ts +178 -0
  384. package/test/state/graphicalItemsSlice.spec.ts +92 -0
  385. package/test/state/hooks.spec.tsx +68 -0
  386. package/test/state/legendSlice.spec.ts +44 -0
  387. package/test/state/mouseEventsMiddleware.spec.ts +75 -0
  388. package/test/state/optionsSlice.spec.ts +19 -0
  389. package/test/state/referenceElementsSlice.spec.ts +84 -0
  390. package/test/state/registerInStore.spec.tsx +101 -0
  391. package/test/state/selectors/areaSelectors.spec.tsx +77 -0
  392. package/test/state/selectors/axisSelectors.spec.tsx +1418 -0
  393. package/test/state/selectors/barStackSelectors.spec.tsx +752 -0
  394. package/test/state/selectors/brushSelectors.spec.tsx +30 -0
  395. package/test/state/selectors/cartesianAxisSlice.spec.ts +96 -0
  396. package/test/state/selectors/combineNiceTicks.spec.ts +207 -0
  397. package/test/state/selectors/combiners/combineActiveTooltipIndex.spec.ts +61 -0
  398. package/test/state/selectors/combiners/combineAllBarPositions.spec.ts +39 -0
  399. package/test/state/selectors/combiners/combineConfiguredScale.spec.ts +56 -0
  400. package/test/state/selectors/combiners/combineDisplayedStackedData.spec.ts +123 -0
  401. package/test/state/selectors/combiners/combineRealScaleType.spec.ts +80 -0
  402. package/test/state/selectors/containerSelectors.spec.tsx +168 -0
  403. package/test/state/selectors/dataSelectors.spec.tsx +136 -0
  404. package/test/state/selectors/legendSelectors.spec.tsx +113 -0
  405. package/test/state/selectors/lineSelectors.spec.tsx +60 -0
  406. package/test/state/selectors/pieSelectors.spec.tsx +72 -0
  407. package/test/state/selectors/radarSelectors.spec.tsx +496 -0
  408. package/test/state/selectors/rootPropsSelectors.spec.tsx +169 -0
  409. package/test/state/selectors/scatterSelectors.spec.tsx +47 -0
  410. package/test/state/selectors/selectActiveTooltipIndex.spec.tsx +234 -0
  411. package/test/state/selectors/selectAllAxes.spec.tsx +18 -0
  412. package/test/state/selectors/selectAxisDomain.spec.tsx +21 -0
  413. package/test/state/selectors/selectAxisDomainIncludingNiceTicks.spec.tsx +19 -0
  414. package/test/state/selectors/selectAxisRangeWithReverse.spec.tsx +22 -0
  415. package/test/state/selectors/selectAxisScale.spec.tsx +91 -0
  416. package/test/state/selectors/selectBarRectangles.stackOffset.spec.tsx +503 -0
  417. package/test/state/selectors/selectBaseAxis.spec.tsx +56 -0
  418. package/test/state/selectors/selectCartesianItemsSettings.spec.tsx +57 -0
  419. package/test/state/selectors/selectChartOffset.spec.tsx +26 -0
  420. package/test/state/selectors/selectDisplayedData.spec.tsx +282 -0
  421. package/test/state/selectors/selectIsTooltipActive.spec.tsx +231 -0
  422. package/test/state/selectors/selectNumericalDomain.spec.tsx +21 -0
  423. package/test/state/selectors/selectRealScaleType.spec.tsx +19 -0
  424. package/test/state/selectors/selectStackGroups.spec.tsx +322 -0
  425. package/test/state/selectors/selectXAxisPosition.spec.tsx +22 -0
  426. package/test/state/selectors/selectYAxisPosition.spec.tsx +22 -0
  427. package/test/state/selectors/selectorMemoization.spec.tsx +136 -0
  428. package/test/state/selectors/selectors.spec.tsx +1613 -0
  429. package/test/state/throttling.spec.ts +200 -0
  430. package/test/state/zIndexSlice.spec.ts +85 -0
  431. package/test/synchronisation/useChartSynchronisation.spec.tsx +225 -0
  432. package/test/util/BarUtils.spec.ts +39 -0
  433. package/test/util/CartesianUtils/CartesianUtils.spec.ts +261 -0
  434. package/test/util/CartesianUtils/rectWithPoints.spec.ts +48 -0
  435. package/test/util/ChartUtils/ChartUtils.spec.ts +491 -0
  436. package/test/util/ChartUtils/appendOffsetOfLegend.spec.ts +136 -0
  437. package/test/util/ChartUtils/appendOffsetOfLegend.spec.tsx +133 -0
  438. package/test/util/ChartUtils/getCateCoordinateOfLine.spec.ts +97 -0
  439. package/test/util/ChartUtils/getStackedData.spec.ts +416 -0
  440. package/test/util/ChartUtils/truncateByDomain.spec.ts +70 -0
  441. package/test/util/DataUtils.spec.ts +385 -0
  442. package/test/util/DomUtils.spec.tsx +117 -0
  443. package/test/util/FunnelUtils.spec.tsx +70 -0
  444. package/test/util/Global.spec.ts +11 -0
  445. package/test/util/LRUCache.spec.ts +81 -0
  446. package/test/util/LogUtils.spec.ts +45 -0
  447. package/test/util/PolarUtils.spec.ts +66 -0
  448. package/test/util/ReduceCssCalcPrototype.spec.ts +141 -0
  449. package/test/util/ShallowEqual.spec.ts +102 -0
  450. package/test/util/TickUtils.spec.ts +29 -0
  451. package/test/util/createChartHelpers.spec.tsx +210 -0
  452. package/test/util/cursor/getCursorPoints.spec.ts +136 -0
  453. package/test/util/cursor/getCursorRectangle.spec.ts +50 -0
  454. package/test/util/cursor/getRadialCursorPoints.spec.ts +36 -0
  455. package/test/util/errorValue.spec.ts +69 -0
  456. package/test/util/getEveryNth.spec.ts +39 -0
  457. package/test/util/getRadiusAndStrokeWidthFromDot.spec.ts +51 -0
  458. package/test/util/getRelativeCoordinate.spec.ts +250 -0
  459. package/test/util/getSliced.spec.ts +45 -0
  460. package/test/util/isDomainSpecifiedByUser.spec.ts +207 -0
  461. package/test/util/isWellBehavedNumber.spec.ts +54 -0
  462. package/test/util/payload/getUniqPayload.spec.ts +56 -0
  463. package/test/util/propsAreEqual.spec.ts +75 -0
  464. package/test/util/round.spec.ts +112 -0
  465. package/test/util/scale/arithmetic.spec.ts +61 -0
  466. package/test/util/scale/createCategoricalInverse.spec.ts +84 -0
  467. package/test/util/scale/getNiceTickValues.spec.ts +421 -0
  468. package/test/util/scale/getTickValuesFixedDomain.spec.ts +155 -0
  469. package/test/util/svgPropertiesAndEvents.spec.tsx +206 -0
  470. package/test/util/svgPropertiesNoEvents.spec.tsx +228 -0
  471. package/test/util/tooltip/translate.spec.ts +396 -0
  472. package/test/util/useAnimationId.spec.tsx +59 -0
  473. package/test/util/useElementOffset.spec.tsx +173 -0
  474. package/test/util/usePrefersReducedMotion.spec.ts +54 -0
  475. package/test/util/useUniqueId.spec.ts +99 -0
  476. package/test/utils/diagnostics-allowlist.ts +18 -0
  477. package/test/utils/diagnostics.ts +58 -0
  478. package/test/zIndex/AllZIndexPortals.spec.tsx +83 -0
  479. package/test/zIndex/DefaultZIndexes.spec.ts +80 -0
  480. package/test/zIndex/DynamicZIndex.spec.tsx +102 -0
  481. package/test/zIndex/ZIndexLayer.portalOwner.spec.tsx +125 -0
  482. package/test/zIndex/componentZIndex.spec.tsx +255 -0
  483. package/test/zIndex/getZIndexFromUnknown.spec.ts +51 -0
  484. package/test/zIndex/multiChartZIndexIsolation.spec.tsx +90 -0
  485. package/test/zIndex/zIndexSelectors.spec.ts +172 -0
  486. package/test-results/.last-run.json +4 -0
  487. package/tsconfig.json +11 -0
  488. package/src/util/DirectPortal.tsx +0 -107
@@ -0,0 +1,1521 @@
1
+ // Ported from recharts 3.8.1 test/polar/RadialBar/RadialBar.spec.tsx (commit
2
+ // 7a23854). Tier-B selector cases are golden-anchored to recharts; Tier-A render
3
+ // cases assert byte-identical sector `d` paths via an inlined expectRadialBars
4
+ // (the reference helper isn't in the ported test/helper set).
5
+ //
6
+ // `ringsData` and the inlined `expectRadialBars` live here because they are not
7
+ // part of the shared ported fixtures/helpers and this spec may only edit itself.
8
+ //
9
+ // The recharts "calls mouse handler events" / "calls touch handler events" cases
10
+ // ARE ported: the ported RadialBar forwards user-supplied
11
+ // onMouseEnter/onMouseLeave/onClick/onTouchMove/onTouchEnd to each sector's
12
+ // wrapping <Layer> g. mouseenter does NOT bubble, so (per the repo pattern) the
13
+ // ported cases fireEvent on that wrapping g (the parent of the sector path),
14
+ // not on the inner path; the handler-arg assertions are unchanged except for the
15
+ // extra `clockWise: false` field the Solid sector shape carries (see the selector
16
+ // cases above).
17
+ import { createEffect, createSignal, flush, Show } from "solid-js";
18
+ import type { Mock } from "vitest";
19
+ import type { RadialBarDataItem } from "../../../src/polar/RadialBar";
20
+ import { describe, expect, it, vi } from "vitest";
21
+ import {
22
+ DefaultZIndexes,
23
+ PolarAngleAxis,
24
+ PolarGrid,
25
+ PolarRadiusAxis,
26
+ RadialBar,
27
+ RadialBarChart,
28
+ Tooltip,
29
+ } from "../../../src";
30
+ import { assertZIndexLayerOrder } from "../../helper/assertZIndexLayerOrder";
31
+ import { fireEvent, render } from "@solidjs/testing-library";
32
+ import { useAppSelector } from "../../../src/state/hooks";
33
+ import { selectPolarItemsSettings } from "../../../src/state/selectors/polarSelectors";
34
+ import { PageData } from "../../_data";
35
+ import { createSelectorTestCase } from "../../helper/createSelectorTestCase";
36
+ import { expectLastCalledWithScale } from "../../helper/expectScale";
37
+ import {
38
+ selectPolarAxisScale,
39
+ selectPolarAxisTicks,
40
+ selectPolarGraphicalItemAxisTicks,
41
+ } from "../../../src/state/selectors/polarScaleSelectors";
42
+ import {
43
+ selectBandSizeOfPolarAxis,
44
+ selectPolarBarBandSize,
45
+ selectPolarBarPosition,
46
+ selectPolarBarSizeList,
47
+ selectRadialBarSectors,
48
+ } from "../../../src/state/selectors/radialBarSelectors";
49
+ import {
50
+ selectAngleAxis,
51
+ selectRadiusAxis,
52
+ selectRadiusAxisRangeWithReversed,
53
+ } from "../../../src/state/selectors/polarAxisSelectors";
54
+ import {
55
+ selectBarCategoryGap,
56
+ selectBarGap,
57
+ selectRootMaxBarSize,
58
+ } from "../../../src/state/selectors/rootPropsSelectors";
59
+ import { selectRealScaleType } from "../../../src/state/selectors/axisSelectors";
60
+ import type { RadialBarSettings } from "../../../src/state/types/RadialBarSettings";
61
+ import { expectLastCalledWith } from "../../helper/expectLastCalledWith";
62
+ import { trim } from "../../helper/trim";
63
+ import { assertNotNull } from "../../helper/assertNotNull";
64
+
65
+ // Inlined from recharts 3.8.1 test/helper/expectRadialBars.ts.
66
+ type ExpectRadialBar = { d: string };
67
+
68
+ function getRadialBarPaths(container: Element): ReadonlyArray<ExpectRadialBar> {
69
+ const bars = container.querySelectorAll(
70
+ ".recharts-radial-bar-sectors path.recharts-sector.recharts-radial-bar-sector",
71
+ );
72
+ return Array.from(bars).map((bar) => {
73
+ const trimmed = trim(bar.getAttribute("d"));
74
+ assertNotNull(trimmed);
75
+ return { d: trimmed };
76
+ });
77
+ }
78
+
79
+ function expectRadialBars(
80
+ container: Element,
81
+ expectedRadialBars: ReadonlyArray<ExpectRadialBar>,
82
+ ): void {
83
+ const actualBars = getRadialBarPaths(container);
84
+ expect(actualBars).toEqual(expectedRadialBars);
85
+ }
86
+
87
+ // Ported from recharts 3.8.1 test/_data.ts `ringsData` (not in the shared ported
88
+ // fixtures).
89
+ const ringsData = [
90
+ { name: "Elves", rings: 3, fill: "green" },
91
+ { name: "Dwarves", rings: 7, fill: "blue" },
92
+ { name: "Humans", rings: 9, fill: "red" },
93
+ { name: "Sauron", rings: 1, fill: "black" },
94
+ ];
95
+
96
+ describe("<RadialBar />", () => {
97
+ describe("with implicit axes", () => {
98
+ const radialBarSettings: RadialBarSettings = {
99
+ id: "radial-bar-uv",
100
+ dataKey: "pv",
101
+ minPointSize: 0,
102
+ stackId: undefined,
103
+ maxBarSize: undefined,
104
+ barSize: undefined,
105
+ type: "radialBar",
106
+ angleAxisId: 0,
107
+ radiusAxisId: 0,
108
+ data: undefined,
109
+ hide: false,
110
+ };
111
+
112
+ const renderTestCase = createSelectorTestCase((props) => (
113
+ <RadialBarChart width={500} height={500} data={PageData}>
114
+ <RadialBar isAnimationActive={false} dataKey="pv" />
115
+ {props.children}
116
+ </RadialBarChart>
117
+ ));
118
+
119
+ it("should select polar items", () => {
120
+ const { spy } = renderTestCase((state) => selectPolarItemsSettings(state, "angleAxis", 0));
121
+ expectLastCalledWith(spy, [
122
+ {
123
+ id: expect.stringMatching("recharts-radial-bar-"),
124
+ maxBarSize: undefined,
125
+ minPointSize: 0,
126
+ angleAxisId: 0,
127
+ barSize: undefined,
128
+ data: undefined,
129
+ dataKey: "pv",
130
+ hide: false,
131
+ radiusAxisId: 0,
132
+ stackId: undefined,
133
+ type: "radialBar",
134
+ },
135
+ ]);
136
+ });
137
+
138
+ it("should select angle axis settings", () => {
139
+ const { spy } = renderTestCase((state) => selectAngleAxis(state, 0));
140
+ expectLastCalledWith(spy, {
141
+ allowDataOverflow: false,
142
+ allowDecimals: false,
143
+ allowDuplicatedCategory: false,
144
+ dataKey: undefined,
145
+ domain: undefined,
146
+ id: 0,
147
+ includeHidden: false,
148
+ name: undefined,
149
+ reversed: false,
150
+ niceTicks: "auto",
151
+ scale: "auto",
152
+ tick: true,
153
+ tickCount: undefined,
154
+ ticks: undefined,
155
+ type: "number",
156
+ unit: undefined,
157
+ });
158
+ });
159
+
160
+ it("should select angle axis scale", () => {
161
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "angleAxis", 0));
162
+ expectLastCalledWithScale(spy, {
163
+ domain: [0, 9800],
164
+ range: [0, 360],
165
+ });
166
+ });
167
+
168
+ it("should select radius axis settings", () => {
169
+ const { spy } = renderTestCase((state) => selectRadiusAxis(state, 0));
170
+ expectLastCalledWith(spy, {
171
+ allowDataOverflow: false,
172
+ allowDecimals: false,
173
+ allowDuplicatedCategory: true,
174
+ dataKey: undefined,
175
+ domain: undefined,
176
+ id: 0,
177
+ includeHidden: false,
178
+ name: undefined,
179
+ reversed: false,
180
+ niceTicks: "auto",
181
+ scale: "auto",
182
+ tick: true,
183
+ tickCount: 5,
184
+ ticks: undefined,
185
+ type: "category",
186
+ unit: undefined,
187
+ });
188
+ });
189
+
190
+ it("should select radius axis scale", () => {
191
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "radiusAxis", 0));
192
+ expectLastCalledWithScale(spy, {
193
+ domain: [0, 1, 2, 3, 4, 5],
194
+ range: [0, 196],
195
+ });
196
+ });
197
+
198
+ it("should select radius axis ticks", () => {
199
+ const { spy } = renderTestCase((state) =>
200
+ selectPolarAxisTicks(state, "radiusAxis", 0, false),
201
+ );
202
+ expectLastCalledWith(spy, [
203
+ { coordinate: 16.333333333333332, index: 0, offset: 16.333333333333332, value: 0 },
204
+ { coordinate: 49, index: 1, offset: 16.333333333333332, value: 1 },
205
+ { coordinate: 81.66666666666666, index: 2, offset: 16.333333333333332, value: 2 },
206
+ { coordinate: 114.33333333333333, index: 3, offset: 16.333333333333332, value: 3 },
207
+ { coordinate: 147, index: 4, offset: 16.333333333333332, value: 4 },
208
+ { coordinate: 179.66666666666666, index: 5, offset: 16.333333333333332, value: 5 },
209
+ ]);
210
+ });
211
+
212
+ it("should select barBandSize", () => {
213
+ const { spy } = renderTestCase((state) => selectBandSizeOfPolarAxis(state, 0, 0));
214
+ expectLastCalledWith(spy, 32.666666666666664);
215
+ });
216
+
217
+ it("should select selectRootMaxBarSize", () => {
218
+ const { spy } = renderTestCase(selectRootMaxBarSize);
219
+ expectLastCalledWith(spy, undefined);
220
+ });
221
+
222
+ it("should select bar size list", () => {
223
+ const { spy } = renderTestCase((state) => selectPolarBarSizeList(state, 0, 0));
224
+ expectLastCalledWith(spy, [
225
+ {
226
+ barSize: undefined,
227
+ dataKeys: ["pv"],
228
+ stackId: undefined,
229
+ },
230
+ ]);
231
+ });
232
+
233
+ it("should select barGap", () => {
234
+ const { spy } = renderTestCase(selectBarGap);
235
+ expectLastCalledWith(spy, 4);
236
+ });
237
+
238
+ it("should select barCategoryGap", () => {
239
+ const { spy } = renderTestCase(selectBarCategoryGap);
240
+ expectLastCalledWith(spy, "10%");
241
+ });
242
+
243
+ it("should select bandSize", () => {
244
+ const { spy } = renderTestCase((state) =>
245
+ selectPolarBarBandSize(state, 0, 0, radialBarSettings),
246
+ );
247
+ expectLastCalledWith(spy, 32.666666666666664);
248
+ });
249
+
250
+ it("should select bar position and offset", () => {
251
+ const { spy } = renderTestCase((state) =>
252
+ selectPolarBarPosition(state, 0, 0, radialBarSettings),
253
+ );
254
+ expectLastCalledWith(spy, { offset: 3.266666666666666, size: 26 });
255
+ });
256
+
257
+ it("should select radial bar sectors", () => {
258
+ const { spy } = renderTestCase((state) =>
259
+ selectRadialBarSectors(state, 0, 0, radialBarSettings, undefined),
260
+ );
261
+ expectLastCalledWith(spy, [
262
+ {
263
+ amt: 2400,
264
+ background: {
265
+ cx: 250,
266
+ cy: 250,
267
+ endAngle: 360,
268
+ innerRadius: 3.266666666666666,
269
+ outerRadius: 29.266666666666666,
270
+ startAngle: 0,
271
+ },
272
+ clockWise: false,
273
+ cx: 250,
274
+ cy: 250,
275
+ endAngle: 88.16326530612244,
276
+ innerRadius: 3.266666666666666,
277
+ name: "Page A",
278
+ outerRadius: 29.266666666666666,
279
+ payload: { amt: 2400, name: "Page A", pv: 2400, uv: 400 },
280
+ pv: 2400,
281
+ startAngle: 0,
282
+ uv: 400,
283
+ value: 2400,
284
+ },
285
+ {
286
+ amt: 2400,
287
+ background: {
288
+ cx: 250,
289
+ cy: 250,
290
+ endAngle: 360,
291
+ innerRadius: 35.93333333333333,
292
+ outerRadius: 61.93333333333333,
293
+ startAngle: 0,
294
+ },
295
+ clockWise: false,
296
+ cx: 250,
297
+ cy: 250,
298
+ endAngle: 167.76734693877552,
299
+ innerRadius: 35.93333333333333,
300
+ name: "Page B",
301
+ outerRadius: 61.93333333333333,
302
+ payload: { amt: 2400, name: "Page B", pv: 4567, uv: 300 },
303
+ pv: 4567,
304
+ startAngle: 0,
305
+ uv: 300,
306
+ value: 4567,
307
+ },
308
+ {
309
+ amt: 2400,
310
+ background: {
311
+ cx: 250,
312
+ cy: 250,
313
+ endAngle: 360,
314
+ innerRadius: 68.6,
315
+ outerRadius: 94.6,
316
+ startAngle: 0,
317
+ },
318
+ clockWise: false,
319
+ cx: 250,
320
+ cy: 250,
321
+ endAngle: 51.35510204081632,
322
+ innerRadius: 68.6,
323
+ name: "Page C",
324
+ outerRadius: 94.6,
325
+ payload: { amt: 2400, name: "Page C", pv: 1398, uv: 300 },
326
+ pv: 1398,
327
+ startAngle: 0,
328
+ uv: 300,
329
+ value: 1398,
330
+ },
331
+ {
332
+ amt: 2400,
333
+ background: {
334
+ cx: 250,
335
+ cy: 250,
336
+ endAngle: 360,
337
+ innerRadius: 101.26666666666667,
338
+ outerRadius: 127.26666666666667,
339
+ startAngle: 0,
340
+ },
341
+ clockWise: false,
342
+ cx: 250,
343
+ cy: 250,
344
+ endAngle: 360,
345
+ innerRadius: 101.26666666666667,
346
+ name: "Page D",
347
+ outerRadius: 127.26666666666667,
348
+ payload: { amt: 2400, name: "Page D", pv: 9800, uv: 200 },
349
+ pv: 9800,
350
+ startAngle: 0,
351
+ uv: 200,
352
+ value: 9800,
353
+ },
354
+ {
355
+ amt: 2400,
356
+ background: {
357
+ cx: 250,
358
+ cy: 250,
359
+ endAngle: 360,
360
+ innerRadius: 133.93333333333334,
361
+ outerRadius: 159.93333333333334,
362
+ startAngle: 0,
363
+ },
364
+ clockWise: false,
365
+ cx: 250,
366
+ cy: 250,
367
+ endAngle: 143.5591836734694,
368
+ innerRadius: 133.93333333333334,
369
+ name: "Page E",
370
+ outerRadius: 159.93333333333334,
371
+ payload: { amt: 2400, name: "Page E", pv: 3908, uv: 278 },
372
+ pv: 3908,
373
+ startAngle: 0,
374
+ uv: 278,
375
+ value: 3908,
376
+ },
377
+ {
378
+ amt: 2400,
379
+ background: {
380
+ cx: 250,
381
+ cy: 250,
382
+ endAngle: 360,
383
+ innerRadius: 166.6,
384
+ outerRadius: 192.6,
385
+ startAngle: 0,
386
+ },
387
+ clockWise: false,
388
+ cx: 250,
389
+ cy: 250,
390
+ endAngle: 176.32653061224488,
391
+ innerRadius: 166.6,
392
+ name: "Page F",
393
+ outerRadius: 192.6,
394
+ payload: { amt: 2400, name: "Page F", pv: 4800, uv: 189 },
395
+ pv: 4800,
396
+ startAngle: 0,
397
+ uv: 189,
398
+ value: 4800,
399
+ },
400
+ ]);
401
+ });
402
+
403
+ it("should render sectors", () => {
404
+ const { container } = renderTestCase();
405
+
406
+ expectRadialBars(container, [
407
+ {
408
+ d: "M 279.2667,250 A 29.2667,29.2667,0, 0,0, 250.938,220.7484 L 250.1047,246.735 A 3.2667,3.2667,0, 0,1, 253.2667,250 Z",
409
+ },
410
+ {
411
+ d: "M 311.9333,250 A 61.9333,61.9333,0, 0,0, 189.4728,236.8775 L 214.8825,242.3864 A 35.9333,35.9333,0, 0,1, 285.9333,250 Z",
412
+ },
413
+ {
414
+ d: "M 344.6,250 A 94.6,94.6,0, 0,0, 309.0769,176.1144 L 292.8401,196.4212 A 68.6,68.6,0, 0,1, 318.6,250 Z",
415
+ },
416
+ {
417
+ d: "M 377.2667,250 A 127.2667,127.2667,0, 1,0, 377.2667,250.0022 L 351.2667,250.0018 A 101.2667,101.2667,0, 1,1, 351.2667,250 Z",
418
+ },
419
+ {
420
+ d: "M 409.9333,250 A 159.9333,159.9333,0, 0,0, 121.3383,155.0009 L 142.2545,170.4447 A 133.9333,133.9333,0, 0,1, 383.9333,250 Z",
421
+ },
422
+ {
423
+ d: "M 442.6,250 A 192.6,192.6,0, 0,0, 57.7957,237.6601 L 83.7423,239.3259 A 166.6,166.6,0, 0,1, 416.6,250 Z",
424
+ },
425
+ ]);
426
+ });
427
+ });
428
+
429
+ describe("with configured axes", () => {
430
+ const radialBarSettings: RadialBarSettings = {
431
+ id: "my-radial-bar",
432
+ dataKey: "pv",
433
+ minPointSize: 0,
434
+ stackId: undefined,
435
+ maxBarSize: undefined,
436
+ barSize: undefined,
437
+ type: "radialBar",
438
+ angleAxisId: "",
439
+ radiusAxisId: "",
440
+ data: [],
441
+ hide: false,
442
+ };
443
+
444
+ const renderTestCase = createSelectorTestCase((props) => (
445
+ <RadialBarChart width={500} height={500} data={PageData}>
446
+ <PolarAngleAxis dataKey="pv" type="number" axisLineType="circle" />
447
+ <PolarRadiusAxis dataKey="name" orientation="middle" type="category" angle={90} />
448
+ <RadialBar isAnimationActive={false} dataKey="pv" />
449
+ {props.children}
450
+ </RadialBarChart>
451
+ ));
452
+
453
+ it("should select polar items", () => {
454
+ const { spy } = renderTestCase((state) => selectPolarItemsSettings(state, "angleAxis", 0));
455
+ expectLastCalledWith(spy, [
456
+ {
457
+ id: expect.stringMatching("recharts-radial-bar-"),
458
+ angleAxisId: 0,
459
+ barSize: undefined,
460
+ data: undefined,
461
+ dataKey: "pv",
462
+ hide: false,
463
+ radiusAxisId: 0,
464
+ stackId: undefined,
465
+ type: "radialBar",
466
+ maxBarSize: undefined,
467
+ minPointSize: 0,
468
+ },
469
+ ]);
470
+ });
471
+
472
+ it("should select angle axis settings", () => {
473
+ const { spy } = renderTestCase((state) => selectAngleAxis(state, 0));
474
+ expectLastCalledWith(spy, {
475
+ allowDataOverflow: false,
476
+ allowDecimals: false,
477
+ allowDuplicatedCategory: false,
478
+ dataKey: "pv",
479
+ domain: undefined,
480
+ id: 0,
481
+ includeHidden: false,
482
+ name: undefined,
483
+ reversed: false,
484
+ niceTicks: "auto",
485
+ scale: "auto",
486
+ tick: true,
487
+ tickCount: undefined,
488
+ ticks: undefined,
489
+ type: "number",
490
+ unit: undefined,
491
+ });
492
+ });
493
+
494
+ it("should select angle axis scale", () => {
495
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "angleAxis", 0));
496
+ expectLastCalledWithScale(spy, {
497
+ domain: [0, 9800],
498
+ range: [0, 360],
499
+ });
500
+ });
501
+
502
+ it("should select radius axis settings", () => {
503
+ const { spy } = renderTestCase((state) => selectRadiusAxis(state, 0));
504
+ expectLastCalledWith(spy, {
505
+ allowDataOverflow: false,
506
+ allowDecimals: false,
507
+ allowDuplicatedCategory: true,
508
+ dataKey: "name",
509
+ domain: undefined,
510
+ id: 0,
511
+ includeHidden: false,
512
+ name: undefined,
513
+ reversed: false,
514
+ niceTicks: "auto",
515
+ scale: "auto",
516
+ tick: true,
517
+ tickCount: 5,
518
+ ticks: undefined,
519
+ type: "category",
520
+ unit: undefined,
521
+ });
522
+ });
523
+
524
+ it("should select radius axis realScaleType", () => {
525
+ const { spy } = renderTestCase((state) => selectRealScaleType(state, "radiusAxis", 0));
526
+ expectLastCalledWith(spy, "band");
527
+ });
528
+
529
+ it("should select radius axis scale", () => {
530
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "radiusAxis", 0));
531
+ expectLastCalledWithScale(spy, {
532
+ domain: ["Page A", "Page B", "Page C", "Page D", "Page E", "Page F"],
533
+ range: [0, 196],
534
+ bandwidth: 32.666666666666664,
535
+ });
536
+ });
537
+
538
+ it("should select radius axis range", () => {
539
+ const { spy } = renderTestCase((state) => selectRadiusAxisRangeWithReversed(state, 0));
540
+ expectLastCalledWith(spy, [0, 196]);
541
+ });
542
+
543
+ it("should select radius axis ticks", () => {
544
+ const { spy } = renderTestCase((state) =>
545
+ selectPolarAxisTicks(state, "radiusAxis", 0, false),
546
+ );
547
+ expectLastCalledWith(spy, [
548
+ { coordinate: 16.333333333333332, index: 0, offset: 16.333333333333332, value: "Page A" },
549
+ { coordinate: 49, index: 1, offset: 16.333333333333332, value: "Page B" },
550
+ { coordinate: 81.66666666666666, index: 2, offset: 16.333333333333332, value: "Page C" },
551
+ { coordinate: 114.33333333333333, index: 3, offset: 16.333333333333332, value: "Page D" },
552
+ { coordinate: 147, index: 4, offset: 16.333333333333332, value: "Page E" },
553
+ { coordinate: 179.66666666666666, index: 5, offset: 16.333333333333332, value: "Page F" },
554
+ ]);
555
+ });
556
+
557
+ it("should select bar size and offset", () => {
558
+ const { spy } = renderTestCase((state) =>
559
+ selectPolarBarPosition(state, 0, 0, radialBarSettings),
560
+ );
561
+ expectLastCalledWith(spy, { offset: 3.266666666666666, size: 26 });
562
+ });
563
+
564
+ it("should select bandSize", () => {
565
+ const { spy } = renderTestCase((state) =>
566
+ selectPolarBarBandSize(state, 0, 0, radialBarSettings),
567
+ );
568
+ expectLastCalledWith(spy, 32.666666666666664);
569
+ });
570
+
571
+ it("should select bar size list", () => {
572
+ const { spy } = renderTestCase((state) => selectPolarBarSizeList(state, 0, 0));
573
+ expectLastCalledWith(spy, [
574
+ {
575
+ barSize: undefined,
576
+ dataKeys: ["pv"],
577
+ stackId: undefined,
578
+ },
579
+ ]);
580
+ });
581
+
582
+ it("should select barGap", () => {
583
+ const { spy } = renderTestCase(selectBarGap);
584
+ expectLastCalledWith(spy, 4);
585
+ });
586
+
587
+ it("should select barCategoryGap", () => {
588
+ const { spy } = renderTestCase(selectBarCategoryGap);
589
+ expectLastCalledWith(spy, "10%");
590
+ });
591
+
592
+ it("should select radial bar sectors", () => {
593
+ const { spy } = renderTestCase((state) =>
594
+ selectRadialBarSectors(state, 0, 0, radialBarSettings, undefined),
595
+ );
596
+ expectLastCalledWith(spy, [
597
+ {
598
+ amt: 2400,
599
+ background: {
600
+ cx: 250,
601
+ cy: 250,
602
+ endAngle: 360,
603
+ innerRadius: 3.266666666666666,
604
+ outerRadius: 29.266666666666666,
605
+ startAngle: 0,
606
+ },
607
+ clockWise: false,
608
+ cx: 250,
609
+ cy: 250,
610
+ endAngle: 88.16326530612244,
611
+ innerRadius: 3.266666666666666,
612
+ name: "Page A",
613
+ outerRadius: 29.266666666666666,
614
+ payload: { amt: 2400, name: "Page A", pv: 2400, uv: 400 },
615
+ pv: 2400,
616
+ startAngle: 0,
617
+ uv: 400,
618
+ value: 2400,
619
+ },
620
+ {
621
+ amt: 2400,
622
+ background: {
623
+ cx: 250,
624
+ cy: 250,
625
+ endAngle: 360,
626
+ innerRadius: 35.93333333333333,
627
+ outerRadius: 61.93333333333333,
628
+ startAngle: 0,
629
+ },
630
+ clockWise: false,
631
+ cx: 250,
632
+ cy: 250,
633
+ endAngle: 167.76734693877552,
634
+ innerRadius: 35.93333333333333,
635
+ name: "Page B",
636
+ outerRadius: 61.93333333333333,
637
+ payload: { amt: 2400, name: "Page B", pv: 4567, uv: 300 },
638
+ pv: 4567,
639
+ startAngle: 0,
640
+ uv: 300,
641
+ value: 4567,
642
+ },
643
+ {
644
+ amt: 2400,
645
+ background: {
646
+ cx: 250,
647
+ cy: 250,
648
+ endAngle: 360,
649
+ innerRadius: 68.6,
650
+ outerRadius: 94.6,
651
+ startAngle: 0,
652
+ },
653
+ clockWise: false,
654
+ cx: 250,
655
+ cy: 250,
656
+ endAngle: 51.35510204081632,
657
+ innerRadius: 68.6,
658
+ name: "Page C",
659
+ outerRadius: 94.6,
660
+ payload: { amt: 2400, name: "Page C", pv: 1398, uv: 300 },
661
+ pv: 1398,
662
+ startAngle: 0,
663
+ uv: 300,
664
+ value: 1398,
665
+ },
666
+ {
667
+ amt: 2400,
668
+ background: {
669
+ cx: 250,
670
+ cy: 250,
671
+ endAngle: 360,
672
+ innerRadius: 101.26666666666667,
673
+ outerRadius: 127.26666666666667,
674
+ startAngle: 0,
675
+ },
676
+ clockWise: false,
677
+ cx: 250,
678
+ cy: 250,
679
+ endAngle: 360,
680
+ innerRadius: 101.26666666666667,
681
+ name: "Page D",
682
+ outerRadius: 127.26666666666667,
683
+ payload: { amt: 2400, name: "Page D", pv: 9800, uv: 200 },
684
+ pv: 9800,
685
+ startAngle: 0,
686
+ uv: 200,
687
+ value: 9800,
688
+ },
689
+ {
690
+ amt: 2400,
691
+ background: {
692
+ cx: 250,
693
+ cy: 250,
694
+ endAngle: 360,
695
+ innerRadius: 133.93333333333334,
696
+ outerRadius: 159.93333333333334,
697
+ startAngle: 0,
698
+ },
699
+ clockWise: false,
700
+ cx: 250,
701
+ cy: 250,
702
+ endAngle: 143.5591836734694,
703
+ innerRadius: 133.93333333333334,
704
+ name: "Page E",
705
+ outerRadius: 159.93333333333334,
706
+ payload: { amt: 2400, name: "Page E", pv: 3908, uv: 278 },
707
+ pv: 3908,
708
+ startAngle: 0,
709
+ uv: 278,
710
+ value: 3908,
711
+ },
712
+ {
713
+ amt: 2400,
714
+ background: {
715
+ cx: 250,
716
+ cy: 250,
717
+ endAngle: 360,
718
+ innerRadius: 166.6,
719
+ outerRadius: 192.6,
720
+ startAngle: 0,
721
+ },
722
+ clockWise: false,
723
+ cx: 250,
724
+ cy: 250,
725
+ endAngle: 176.32653061224488,
726
+ innerRadius: 166.6,
727
+ name: "Page F",
728
+ outerRadius: 192.6,
729
+ payload: { amt: 2400, name: "Page F", pv: 4800, uv: 189 },
730
+ pv: 4800,
731
+ startAngle: 0,
732
+ uv: 189,
733
+ value: 4800,
734
+ },
735
+ ]);
736
+ });
737
+
738
+ it("should render sectors", () => {
739
+ const { container } = renderTestCase();
740
+ expectRadialBars(container, [
741
+ {
742
+ d: "M 279.2667,250 A 29.2667,29.2667,0, 0,0, 250.938,220.7484 L 250.1047,246.735 A 3.2667,3.2667,0, 0,1, 253.2667,250 Z",
743
+ },
744
+ {
745
+ d: "M 311.9333,250 A 61.9333,61.9333,0, 0,0, 189.4728,236.8775 L 214.8825,242.3864 A 35.9333,35.9333,0, 0,1, 285.9333,250 Z",
746
+ },
747
+ {
748
+ d: "M 344.6,250 A 94.6,94.6,0, 0,0, 309.0769,176.1144 L 292.8401,196.4212 A 68.6,68.6,0, 0,1, 318.6,250 Z",
749
+ },
750
+ {
751
+ d: "M 377.2667,250 A 127.2667,127.2667,0, 1,0, 377.2667,250.0022 L 351.2667,250.0018 A 101.2667,101.2667,0, 1,1, 351.2667,250 Z",
752
+ },
753
+ {
754
+ d: "M 409.9333,250 A 159.9333,159.9333,0, 0,0, 121.3383,155.0009 L 142.2545,170.4447 A 133.9333,133.9333,0, 0,1, 383.9333,250 Z",
755
+ },
756
+ {
757
+ d: "M 442.6,250 A 192.6,192.6,0, 0,0, 57.7957,237.6601 L 83.7423,239.3259 A 166.6,166.6,0, 0,1, 416.6,250 Z",
758
+ },
759
+ ]);
760
+ });
761
+ });
762
+
763
+ describe("RingsWithTypes", () => {
764
+ const radialBarSettings: RadialBarSettings = {
765
+ id: "my-radial-bar",
766
+ dataKey: "rings",
767
+ minPointSize: 0,
768
+ stackId: undefined,
769
+ maxBarSize: undefined,
770
+ barSize: undefined,
771
+ type: "radialBar",
772
+ angleAxisId: "",
773
+ radiusAxisId: "",
774
+ data: [],
775
+ hide: false,
776
+ };
777
+
778
+ const renderTestCase = createSelectorTestCase((props) => (
779
+ <RadialBarChart width={500} height={500} data={ringsData}>
780
+ <RadialBar isAnimationActive={false} dataKey="rings" />
781
+ <PolarGrid gridType="circle" />
782
+ <PolarAngleAxis type="number" />
783
+ <PolarRadiusAxis type="category" stroke="black" />
784
+ {props.children}
785
+ </RadialBarChart>
786
+ ));
787
+
788
+ it("should select polar items", () => {
789
+ const { spy } = renderTestCase((state) => selectPolarItemsSettings(state, "angleAxis", 0));
790
+ expectLastCalledWith(spy, [
791
+ {
792
+ id: expect.stringMatching("recharts-radial-bar-"),
793
+ angleAxisId: 0,
794
+ barSize: undefined,
795
+ data: undefined,
796
+ dataKey: "rings",
797
+ hide: false,
798
+ radiusAxisId: 0,
799
+ stackId: undefined,
800
+ type: "radialBar",
801
+ maxBarSize: undefined,
802
+ minPointSize: 0,
803
+ },
804
+ ]);
805
+ });
806
+
807
+ it("should select angle axis settings", () => {
808
+ const { spy } = renderTestCase((state) => selectAngleAxis(state, 0));
809
+ expectLastCalledWith(spy, {
810
+ allowDataOverflow: false,
811
+ allowDecimals: false,
812
+ allowDuplicatedCategory: false,
813
+ dataKey: undefined,
814
+ domain: undefined,
815
+ id: 0,
816
+ includeHidden: false,
817
+ name: undefined,
818
+ reversed: false,
819
+ niceTicks: "auto",
820
+ scale: "auto",
821
+ tick: true,
822
+ tickCount: undefined,
823
+ ticks: undefined,
824
+ type: "number",
825
+ unit: undefined,
826
+ });
827
+ });
828
+
829
+ it("should select angle axis realScaleType", () => {
830
+ const { spy } = renderTestCase((state) => selectRealScaleType(state, "angleAxis", 0));
831
+ expectLastCalledWith(spy, "linear");
832
+ });
833
+
834
+ it("should select angle axis scale", () => {
835
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "angleAxis", 0));
836
+ expectLastCalledWithScale(spy, {
837
+ domain: [0, 9],
838
+ range: [0, 360],
839
+ });
840
+ });
841
+
842
+ it("should select radius axis settings", () => {
843
+ const { spy } = renderTestCase((state) => selectRadiusAxis(state, 0));
844
+ expectLastCalledWith(spy, {
845
+ allowDataOverflow: false,
846
+ allowDecimals: false,
847
+ allowDuplicatedCategory: true,
848
+ dataKey: undefined,
849
+ domain: undefined,
850
+ id: 0,
851
+ includeHidden: false,
852
+ name: undefined,
853
+ reversed: false,
854
+ niceTicks: "auto",
855
+ scale: "auto",
856
+ tick: true,
857
+ tickCount: 5,
858
+ ticks: undefined,
859
+ type: "category",
860
+ unit: undefined,
861
+ });
862
+ });
863
+
864
+ it("should select radius axis realScaleType", () => {
865
+ const { spy } = renderTestCase((state) => selectRealScaleType(state, "radiusAxis", 0));
866
+ expectLastCalledWith(spy, "band");
867
+ });
868
+
869
+ it("should select radius axis scale", () => {
870
+ const { spy } = renderTestCase((state) => selectPolarAxisScale(state, "radiusAxis", 0));
871
+ expectLastCalledWithScale(spy, {
872
+ domain: [0, 1, 2, 3],
873
+ range: [0, 196],
874
+ bandwidth: 49,
875
+ });
876
+ });
877
+
878
+ it("should select radius axis ticks for axis", () => {
879
+ const { spy } = renderTestCase((state) =>
880
+ selectPolarAxisTicks(state, "radiusAxis", 0, false),
881
+ );
882
+ expectLastCalledWith(spy, [
883
+ { coordinate: 24.5, index: 0, offset: 24.5, value: 0 },
884
+ { coordinate: 73.5, index: 1, offset: 24.5, value: 1 },
885
+ { coordinate: 122.5, index: 2, offset: 24.5, value: 2 },
886
+ { coordinate: 171.5, index: 3, offset: 24.5, value: 3 },
887
+ ]);
888
+ });
889
+
890
+ it("should select radius axis ticks for graphical item", () => {
891
+ const { spy } = renderTestCase((state) =>
892
+ selectPolarGraphicalItemAxisTicks(state, "radiusAxis", 0, false),
893
+ );
894
+ expectLastCalledWith(spy, [
895
+ { coordinate: 0, value: 0, index: 0, offset: 0 },
896
+ { coordinate: 49, value: 1, index: 1, offset: 0 },
897
+ { coordinate: 98, value: 2, index: 2, offset: 0 },
898
+ { coordinate: 147, value: 3, index: 3, offset: 0 },
899
+ ]);
900
+ });
901
+
902
+ it("should select radial bar sectors", () => {
903
+ const { spy } = renderTestCase((state) =>
904
+ selectRadialBarSectors(state, 0, 0, radialBarSettings, undefined),
905
+ );
906
+ expectLastCalledWith(spy, [
907
+ {
908
+ name: "Elves",
909
+ rings: 3,
910
+ fill: "green",
911
+ background: {
912
+ cx: 250,
913
+ cy: 250,
914
+ innerRadius: 4.9,
915
+ outerRadius: 43.9,
916
+ startAngle: 0,
917
+ endAngle: 360,
918
+ },
919
+ clockWise: false,
920
+ payload: { name: "Elves", rings: 3, fill: "green" },
921
+ value: 3,
922
+ cx: 250,
923
+ cy: 250,
924
+ innerRadius: 4.9,
925
+ outerRadius: 43.9,
926
+ startAngle: 0,
927
+ endAngle: 120,
928
+ },
929
+ {
930
+ name: "Dwarves",
931
+ rings: 7,
932
+ fill: "blue",
933
+ background: {
934
+ cx: 250,
935
+ cy: 250,
936
+ innerRadius: 53.9,
937
+ outerRadius: 92.9,
938
+ startAngle: 0,
939
+ endAngle: 360,
940
+ },
941
+ clockWise: false,
942
+ payload: { name: "Dwarves", rings: 7, fill: "blue" },
943
+ value: 7,
944
+ cx: 250,
945
+ cy: 250,
946
+ innerRadius: 53.9,
947
+ outerRadius: 92.9,
948
+ startAngle: 0,
949
+ endAngle: 280,
950
+ },
951
+ {
952
+ name: "Humans",
953
+ rings: 9,
954
+ fill: "red",
955
+ background: {
956
+ cx: 250,
957
+ cy: 250,
958
+ innerRadius: 102.9,
959
+ outerRadius: 141.9,
960
+ startAngle: 0,
961
+ endAngle: 360,
962
+ },
963
+ clockWise: false,
964
+ payload: { name: "Humans", rings: 9, fill: "red" },
965
+ value: 9,
966
+ cx: 250,
967
+ cy: 250,
968
+ innerRadius: 102.9,
969
+ outerRadius: 141.9,
970
+ startAngle: 0,
971
+ endAngle: 360,
972
+ },
973
+ {
974
+ name: "Sauron",
975
+ rings: 1,
976
+ fill: "black",
977
+ background: {
978
+ cx: 250,
979
+ cy: 250,
980
+ innerRadius: 151.9,
981
+ outerRadius: 190.9,
982
+ startAngle: 0,
983
+ endAngle: 360,
984
+ },
985
+ clockWise: false,
986
+ payload: { name: "Sauron", rings: 1, fill: "black" },
987
+ value: 1,
988
+ cx: 250,
989
+ cy: 250,
990
+ innerRadius: 151.9,
991
+ outerRadius: 190.9,
992
+ startAngle: 0,
993
+ endAngle: 40,
994
+ },
995
+ ]);
996
+ });
997
+
998
+ it("should render sectors", () => {
999
+ const { container } = renderTestCase();
1000
+ expectRadialBars(container, [
1001
+ {
1002
+ d: "M 293.9,250 A 43.9,43.9,0, 0,0, 228.05,211.9815 L 247.55,245.7565 A 4.9,4.9,0, 0,1, 254.9,250 Z",
1003
+ },
1004
+ {
1005
+ d: "M 342.9,250 A 92.9,92.9,0, 1,0, 266.1319,341.4886 L 259.3596,303.0811 A 53.9,53.9,0, 1,1, 303.9,250 Z",
1006
+ },
1007
+ {
1008
+ d: "M 391.9,250 A 141.9,141.9,0, 1,0, 391.9,250.0025 L 352.9,250.0018 A 102.9,102.9,0, 1,1, 352.9,250 Z",
1009
+ },
1010
+ {
1011
+ d: "M 440.9,250 A 190.9,190.9,0, 0,0, 396.2379,127.2918 L 366.3622,152.3606 A 151.9,151.9,0, 0,1, 401.9,250 Z",
1012
+ },
1013
+ ]);
1014
+ });
1015
+ });
1016
+
1017
+ it("Don't render any sector when data is empty", () => {
1018
+ const { container } = render(() => (
1019
+ <RadialBarChart width={500} height={500} data={[]}>
1020
+ <RadialBar dataKey="uv" />
1021
+ </RadialBarChart>
1022
+ ));
1023
+ flush();
1024
+
1025
+ expectRadialBars(container, []);
1026
+ });
1027
+
1028
+ it("Should render RadialBar in a custom component", () => {
1029
+ const CustomRadialBar = (props: { dataKey: string }) => {
1030
+ return <RadialBar dataKey={props.dataKey} />;
1031
+ };
1032
+
1033
+ const { container } = render(() => (
1034
+ <RadialBarChart width={500} height={500} data={[]}>
1035
+ <CustomRadialBar dataKey="uv" />
1036
+ </RadialBarChart>
1037
+ ));
1038
+ flush();
1039
+
1040
+ expectRadialBars(container, []);
1041
+ });
1042
+
1043
+ // Not in the recharts reference spec: covers the `strokeWidth` prop the
1044
+ // reference forwards to every sector via its svg-props spread
1045
+ // (RadialBarSectors baseProps).
1046
+ it("forwards the component-level strokeWidth to every sector path", () => {
1047
+ const { container } = render(() => (
1048
+ <RadialBarChart width={500} height={500} data={PageData}>
1049
+ <RadialBar isAnimationActive={false} dataKey="uv" stroke="#111" strokeWidth={4} />
1050
+ </RadialBarChart>
1051
+ ));
1052
+ flush();
1053
+
1054
+ const sectors = container.querySelectorAll(
1055
+ ".recharts-radial-bar-sectors path.recharts-radial-bar-sector",
1056
+ );
1057
+ expect(sectors).toHaveLength(PageData.length);
1058
+ sectors.forEach((sector) => {
1059
+ expect(sector.getAttribute("stroke-width")).toBe("4");
1060
+ expect(sector.getAttribute("stroke")).toBe("#111");
1061
+ });
1062
+ });
1063
+
1064
+ it("calls mouse handler events", () => {
1065
+ const onMouseEnter: Mock<(data: RadialBarDataItem, index: number, e: MouseEvent) => void> =
1066
+ vi.fn();
1067
+ const onMouseLeave: Mock<(data: RadialBarDataItem, index: number, e: MouseEvent) => void> =
1068
+ vi.fn();
1069
+ const onClick: Mock<(data: RadialBarDataItem, index: number, e: MouseEvent) => void> = vi.fn();
1070
+
1071
+ const { container } = render(() => (
1072
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1073
+ <RadialBar
1074
+ isAnimationActive={false}
1075
+ dataKey="amt"
1076
+ onMouseEnter={onMouseEnter}
1077
+ onMouseLeave={onMouseLeave}
1078
+ onClick={onClick}
1079
+ />
1080
+ </RadialBarChart>
1081
+ ));
1082
+ flush();
1083
+
1084
+ // Handlers sit on the sector path itself (matching recharts), so fire on
1085
+ // `.recharts-sector` — the same element the reference targets.
1086
+ const sector = container.querySelectorAll(".recharts-sector")[0];
1087
+ assertNotNull(sector);
1088
+
1089
+ const expectedData = {
1090
+ name: "Page A",
1091
+ uv: 400,
1092
+ pv: 2400,
1093
+ amt: 2400,
1094
+ background: {
1095
+ cx: 250,
1096
+ cy: 250,
1097
+ innerRadius: 3.266666666666666,
1098
+ outerRadius: 29.266666666666666,
1099
+ startAngle: 0,
1100
+ endAngle: 360,
1101
+ },
1102
+ clockWise: false,
1103
+ payload: {
1104
+ name: "Page A",
1105
+ uv: 400,
1106
+ pv: 2400,
1107
+ amt: 2400,
1108
+ },
1109
+ value: 2400,
1110
+ cx: 250,
1111
+ cy: 250,
1112
+ innerRadius: 3.266666666666666,
1113
+ outerRadius: 29.266666666666666,
1114
+ startAngle: 0,
1115
+ endAngle: 360,
1116
+ };
1117
+
1118
+ fireEvent.mouseEnter(sector);
1119
+ expect(onMouseEnter).toHaveBeenCalledTimes(1);
1120
+ expectLastCalledWith(onMouseEnter, expectedData, 0, expect.any(Object));
1121
+
1122
+ fireEvent.mouseLeave(sector);
1123
+ expect(onMouseLeave).toHaveBeenCalledTimes(1);
1124
+ expectLastCalledWith(onMouseLeave, expectedData, 0, expect.any(Object));
1125
+
1126
+ fireEvent.click(sector);
1127
+ expect(onClick).toHaveBeenCalledTimes(1);
1128
+ expectLastCalledWith(onClick, expectedData, 0, expect.any(Object));
1129
+ });
1130
+
1131
+ it("calls the remaining pointer handler events", () => {
1132
+ const onMouseDown = vi.fn();
1133
+ const onMouseUp = vi.fn();
1134
+ const onMouseMove = vi.fn();
1135
+ const onMouseOver = vi.fn();
1136
+ const onMouseOut = vi.fn();
1137
+ const onTouchStart = vi.fn();
1138
+
1139
+ const { container } = render(() => (
1140
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1141
+ <RadialBar
1142
+ isAnimationActive={false}
1143
+ dataKey="amt"
1144
+ onMouseDown={onMouseDown}
1145
+ onMouseUp={onMouseUp}
1146
+ onMouseMove={onMouseMove}
1147
+ onMouseOver={onMouseOver}
1148
+ onMouseOut={onMouseOut}
1149
+ onTouchStart={onTouchStart}
1150
+ />
1151
+ </RadialBarChart>
1152
+ ));
1153
+ flush();
1154
+
1155
+ const sector = container.querySelectorAll(".recharts-sector")[0];
1156
+ assertNotNull(sector);
1157
+
1158
+ fireEvent.mouseDown(sector);
1159
+ expect(onMouseDown).toHaveBeenCalledTimes(1);
1160
+ expectLastCalledWith(onMouseDown, expect.any(Object), 0, expect.any(Object));
1161
+
1162
+ fireEvent.mouseUp(sector);
1163
+ expect(onMouseUp).toHaveBeenCalledTimes(1);
1164
+
1165
+ fireEvent.mouseMove(sector);
1166
+ expect(onMouseMove).toHaveBeenCalledTimes(1);
1167
+
1168
+ fireEvent.mouseOver(sector);
1169
+ expect(onMouseOver).toHaveBeenCalledTimes(1);
1170
+
1171
+ fireEvent.mouseOut(sector);
1172
+ expect(onMouseOut).toHaveBeenCalledTimes(1);
1173
+
1174
+ fireEvent.touchStart(sector);
1175
+ expect(onTouchStart).toHaveBeenCalledTimes(1);
1176
+ });
1177
+
1178
+ it("calls touch handler events", () => {
1179
+ const onTouchMove = vi.fn();
1180
+ const onTouchEnd = vi.fn();
1181
+
1182
+ const { container } = render(() => (
1183
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1184
+ <RadialBar
1185
+ isAnimationActive={false}
1186
+ dataKey="amt"
1187
+ onTouchMove={onTouchMove}
1188
+ onTouchEnd={onTouchEnd}
1189
+ />
1190
+ </RadialBarChart>
1191
+ ));
1192
+ flush();
1193
+
1194
+ const sector = container.querySelectorAll(".recharts-sector")[0];
1195
+ assertNotNull(sector);
1196
+
1197
+ fireEvent.touchMove(sector, { touches: [{ clientX: 200, clientY: 200 }] });
1198
+ expect(onTouchMove).toHaveBeenCalledTimes(1);
1199
+ expectLastCalledWith(
1200
+ onTouchMove,
1201
+ {
1202
+ name: "Page A",
1203
+ uv: 400,
1204
+ pv: 2400,
1205
+ amt: 2400,
1206
+ background: {
1207
+ cx: 250,
1208
+ cy: 250,
1209
+ innerRadius: 3.266666666666666,
1210
+ outerRadius: 29.266666666666666,
1211
+ startAngle: 0,
1212
+ endAngle: 360,
1213
+ },
1214
+ clockWise: false,
1215
+ payload: {
1216
+ name: "Page A",
1217
+ uv: 400,
1218
+ pv: 2400,
1219
+ amt: 2400,
1220
+ },
1221
+ value: 2400,
1222
+ cx: 250,
1223
+ cy: 250,
1224
+ innerRadius: 3.266666666666666,
1225
+ outerRadius: 29.266666666666666,
1226
+ startAngle: 0,
1227
+ endAngle: 360,
1228
+ },
1229
+ 0,
1230
+ expect.any(Object),
1231
+ );
1232
+ });
1233
+
1234
+ it("renders the activeShape for the active sector", () => {
1235
+ // RadialBarChart is an AXIS-tooltip chart (defaultTooltipEventType="axis", like
1236
+ // recharts), so activeShape activates from the active AXIS index — set here via
1237
+ // Tooltip defaultIndex (or, in a browser, the polar axis pointer). Per-sector
1238
+ // item mouseEnter correctly does NOT drive an axis-tooltip chart's activeShape.
1239
+ const withActive = render(() => (
1240
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1241
+ <RadialBar
1242
+ isAnimationActive={false}
1243
+ dataKey="amt"
1244
+ activeShape={(p) => <path class="custom-active-radial" d={`M${p.cx},${p.cy}`} />}
1245
+ />
1246
+ <Tooltip defaultIndex={0} />
1247
+ </RadialBarChart>
1248
+ ));
1249
+ flush();
1250
+ expect(withActive.container.querySelector(".custom-active-radial")).not.toBeNull();
1251
+
1252
+ // Without an active index, the regular shape is used (no activeShape).
1253
+ const noActive = render(() => (
1254
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1255
+ <RadialBar
1256
+ isAnimationActive={false}
1257
+ dataKey="amt"
1258
+ activeShape={(p) => <path class="custom-active-radial" d={`M${p.cx},${p.cy}`} />}
1259
+ />
1260
+ </RadialBarChart>
1261
+ ));
1262
+ flush();
1263
+ expect(noActive.container.querySelector(".custom-active-radial")).toBeNull();
1264
+ });
1265
+
1266
+ // Object-form activeShape (recharts RadialBarChart.spec "activeShape set to be an
1267
+ // object"). The reference drives the active sector by pointer hover + asserts the
1268
+ // `.recharts-active-shape` WRAPPER class; that wrapper mechanism is covered
1269
+ // elsewhere and pointer hover needs a real getBoundingClientRect (0 in jsdom), so
1270
+ // here we drive the active index via Tooltip `defaultIndex` (RadialBarChart is an
1271
+ // axis-tooltip chart) and assert the OBJECT props merged onto the active sector's
1272
+ // shape (fill:"red") — wrapper-independent.
1273
+ it("merges object-form activeShape props onto the active sector", () => {
1274
+ const withActive = render(() => (
1275
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1276
+ <RadialBar isAnimationActive={false} dataKey="amt" activeShape={{ fill: "red" }} />
1277
+ <Tooltip defaultIndex={0} />
1278
+ </RadialBarChart>
1279
+ ));
1280
+ flush();
1281
+ // Exactly the active sector (index 0) picks up the merged fill.
1282
+ expect(
1283
+ withActive.container.querySelectorAll('.recharts-radial-bar-sector[fill="red"]'),
1284
+ ).toHaveLength(1);
1285
+
1286
+ // Without an active index no sector uses the activeShape fill.
1287
+ const noActive = render(() => (
1288
+ <RadialBarChart width={500} height={500} data={PageData} throttledEvents={[]}>
1289
+ <RadialBar isAnimationActive={false} dataKey="amt" activeShape={{ fill: "red" }} />
1290
+ </RadialBarChart>
1291
+ ));
1292
+ flush();
1293
+ expect(
1294
+ noActive.container.querySelectorAll('.recharts-radial-bar-sector[fill="red"]'),
1295
+ ).toHaveLength(0);
1296
+ });
1297
+
1298
+ describe("state integration", () => {
1299
+ it("should report its settings to Redux state, and remove it when removed from DOM", () => {
1300
+ const [showBar, setShowBar] = createSignal(true);
1301
+ const polarItemsSpy = vi.fn();
1302
+ const Comp = (): null => {
1303
+ const selected = useAppSelector((state) => selectPolarItemsSettings(state, "angleAxis", 0));
1304
+ createEffect(
1305
+ () => selected(),
1306
+ (value) => polarItemsSpy(value),
1307
+ );
1308
+ return null;
1309
+ };
1310
+ render(() => (
1311
+ <RadialBarChart width={100} height={100} data={PageData}>
1312
+ <Show when={showBar()}>
1313
+ <RadialBar dataKey="value" />
1314
+ </Show>
1315
+ <Comp />
1316
+ </RadialBarChart>
1317
+ ));
1318
+ flush();
1319
+ flush();
1320
+ flush();
1321
+
1322
+ const expectedPolarItemsSettings: RadialBarSettings = {
1323
+ id: expect.stringMatching("recharts-radial-bar-"),
1324
+ barSize: undefined,
1325
+ stackId: undefined,
1326
+ type: "radialBar",
1327
+ angleAxisId: 0,
1328
+ data: undefined,
1329
+ dataKey: "value",
1330
+ hide: false,
1331
+ radiusAxisId: 0,
1332
+ minPointSize: 0,
1333
+ maxBarSize: undefined,
1334
+ };
1335
+ expect(polarItemsSpy).toHaveBeenLastCalledWith([expectedPolarItemsSettings]);
1336
+
1337
+ setShowBar(false);
1338
+ flush();
1339
+ flush();
1340
+ flush();
1341
+
1342
+ expect(polarItemsSpy).toHaveBeenLastCalledWith([]);
1343
+ });
1344
+ });
1345
+ });
1346
+
1347
+ describe("RadialBar background zIndex", () => {
1348
+ const dataWithBackground = [
1349
+ { name: "A", uv: 400, pv: 2400, fill: "#8884d8" },
1350
+ { name: "B", uv: 300, pv: 4567, fill: "#83a6ed" },
1351
+ ];
1352
+
1353
+ it("should render background with default zIndex when background prop is true", () => {
1354
+ const { container } = render(() => (
1355
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1356
+ <RadialBar background isAnimationActive={false} dataKey="pv" />
1357
+ </RadialBarChart>
1358
+ ));
1359
+ flush();
1360
+
1361
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1362
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1363
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1364
+ assertNotNull(radialBarSectors[0]);
1365
+ assertNotNull(backgroundSectors[0]);
1366
+ assertZIndexLayerOrder({ front: radialBarSectors[0], back: backgroundSectors[0] });
1367
+ });
1368
+
1369
+ it("should render background with default zIndex when background prop is an object without zIndex", () => {
1370
+ const { container } = render(() => (
1371
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1372
+ <RadialBar background={{ fill: "#eee" }} isAnimationActive={false} dataKey="pv" />
1373
+ </RadialBarChart>
1374
+ ));
1375
+ flush();
1376
+
1377
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1378
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1379
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1380
+ assertNotNull(radialBarSectors[0]);
1381
+ assertNotNull(backgroundSectors[0]);
1382
+ assertZIndexLayerOrder({ front: radialBarSectors[0], back: backgroundSectors[0] });
1383
+ });
1384
+
1385
+ it("should render background with custom zIndex when background prop includes zIndex", () => {
1386
+ const customZIndex = DefaultZIndexes.bar + 1;
1387
+ const { container } = render(() => (
1388
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1389
+ <RadialBar
1390
+ background={{ fill: "#eee", zIndex: customZIndex }}
1391
+ isAnimationActive={false}
1392
+ dataKey="pv"
1393
+ />
1394
+ </RadialBarChart>
1395
+ ));
1396
+ flush();
1397
+
1398
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1399
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1400
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1401
+ assertNotNull(radialBarSectors[0]);
1402
+ assertNotNull(backgroundSectors[0]);
1403
+ assertZIndexLayerOrder({ back: radialBarSectors[0], front: backgroundSectors[0] });
1404
+ });
1405
+
1406
+ it("should handle background with zIndex as 0", () => {
1407
+ const { container } = render(() => (
1408
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1409
+ <RadialBar
1410
+ background={{ fill: "#eee", zIndex: 0 }}
1411
+ isAnimationActive={false}
1412
+ dataKey="pv"
1413
+ />
1414
+ </RadialBarChart>
1415
+ ));
1416
+ flush();
1417
+
1418
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1419
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1420
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1421
+ assertNotNull(radialBarSectors[0]);
1422
+ assertNotNull(backgroundSectors[0]);
1423
+ assertZIndexLayerOrder({ front: radialBarSectors[0], back: backgroundSectors[0] });
1424
+ });
1425
+
1426
+ it("should handle negative zIndex values in background prop", () => {
1427
+ const { container } = render(() => (
1428
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1429
+ <RadialBar
1430
+ background={{ fill: "#eee", zIndex: -150 }}
1431
+ isAnimationActive={false}
1432
+ dataKey="pv"
1433
+ />
1434
+ </RadialBarChart>
1435
+ ));
1436
+ flush();
1437
+
1438
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1439
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1440
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1441
+ assertNotNull(radialBarSectors[0]);
1442
+ assertNotNull(backgroundSectors[0]);
1443
+ assertZIndexLayerOrder({ front: radialBarSectors[0], back: backgroundSectors[0] });
1444
+ });
1445
+
1446
+ it("should ignore non-number zIndex values and use default", () => {
1447
+ const { container } = render(() => (
1448
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1449
+ <RadialBar
1450
+ // @ts-expect-error testing runtime behavior with an invalid (string) zIndex
1451
+ background={{ fill: "#eee", zIndex: "1200" }}
1452
+ isAnimationActive={false}
1453
+ dataKey="pv"
1454
+ />
1455
+ </RadialBarChart>
1456
+ ));
1457
+ flush();
1458
+
1459
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1460
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1461
+ const radialBarSectors = container.querySelectorAll(".recharts-radial-bar-sector");
1462
+ assertNotNull(radialBarSectors[0]);
1463
+ assertNotNull(backgroundSectors[0]);
1464
+ assertZIndexLayerOrder({ front: radialBarSectors[0], back: backgroundSectors[0] });
1465
+ });
1466
+
1467
+ it("should handle background prop when it is undefined", () => {
1468
+ const { container } = render(() => (
1469
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1470
+ <RadialBar background={undefined} isAnimationActive={false} dataKey="pv" />
1471
+ </RadialBarChart>
1472
+ ));
1473
+ flush();
1474
+
1475
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1476
+ expect(backgroundSectors).toHaveLength(0);
1477
+ });
1478
+
1479
+ it("should handle background prop when it is false", () => {
1480
+ const { container } = render(() => (
1481
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1482
+ <RadialBar background={false} isAnimationActive={false} dataKey="pv" />
1483
+ </RadialBarChart>
1484
+ ));
1485
+ flush();
1486
+
1487
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1488
+ expect(backgroundSectors).toHaveLength(0);
1489
+ });
1490
+
1491
+ it.each([null, false, undefined] as const)(
1492
+ "should not render any background when background=%s",
1493
+ (background) => {
1494
+ const { container } = render(() => (
1495
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1496
+ {/* @ts-expect-error testing runtime behavior */}
1497
+ <RadialBar background={background} isAnimationActive={false} dataKey="pv" />
1498
+ </RadialBarChart>
1499
+ ));
1500
+ flush();
1501
+
1502
+ const backgroundSectors = container.querySelectorAll(
1503
+ ".recharts-radial-bar-background-sector",
1504
+ );
1505
+ expect(backgroundSectors).toHaveLength(0);
1506
+ },
1507
+ );
1508
+
1509
+ it("should render backgrounds with non-object values - typescript says it will not but it does!", () => {
1510
+ const { container } = render(() => (
1511
+ <RadialBarChart width={500} height={500} data={dataWithBackground}>
1512
+ {/* @ts-expect-error testing runtime behavior */}
1513
+ <RadialBar background="invalid" isAnimationActive={false} dataKey="pv" />
1514
+ </RadialBarChart>
1515
+ ));
1516
+ flush();
1517
+
1518
+ const backgroundSectors = container.querySelectorAll(".recharts-radial-bar-background-sector");
1519
+ expect(backgroundSectors).toHaveLength(dataWithBackground.length);
1520
+ });
1521
+ });