@pie-lib/graphing-solution-set 4.1.0-beta.8 → 5.0.0-next.20261002094057

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 (262) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +20 -0
  2. package/dist/autosize-input.d.ts +10 -0
  3. package/dist/autosize-input.js +66 -0
  4. package/dist/axis/arrow.d.ts +13 -0
  5. package/dist/axis/arrow.js +34 -0
  6. package/dist/axis/axes.d.ts +132 -0
  7. package/dist/axis/axes.js +214 -0
  8. package/dist/axis/index.d.ts +10 -0
  9. package/dist/bg.d.ts +51 -0
  10. package/dist/bg.js +44 -0
  11. package/dist/container/actions.d.ts +15 -0
  12. package/dist/container/actions.js +7 -0
  13. package/dist/container/index.d.ts +58 -0
  14. package/dist/container/index.js +48 -0
  15. package/dist/container/marks.d.ts +10 -0
  16. package/dist/container/marks.js +11 -0
  17. package/dist/container/middleware.d.ts +10 -0
  18. package/dist/container/middleware.js +4 -0
  19. package/dist/container/reducer.d.ts +14 -0
  20. package/dist/container/reducer.js +7 -0
  21. package/dist/coordinates-label.d.ts +50 -0
  22. package/dist/coordinates-label.js +46 -0
  23. package/dist/graph-with-controls.d.ts +85 -0
  24. package/dist/graph-with-controls.js +155 -0
  25. package/dist/graph.d.ts +119 -0
  26. package/dist/graph.js +221 -0
  27. package/dist/grid-setup.d.ts +27 -0
  28. package/dist/grid-setup.js +307 -0
  29. package/dist/grid.d.ts +43 -0
  30. package/dist/grid.js +59 -0
  31. package/dist/index.d.ts +14 -0
  32. package/dist/index.js +6 -0
  33. package/dist/labels.d.ts +73 -0
  34. package/dist/labels.js +134 -0
  35. package/dist/mark-label.d.ts +50 -0
  36. package/dist/mark-label.js +84 -0
  37. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/axis/Axis.js +67 -0
  38. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/axis/AxisRenderer.js +66 -0
  39. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/axis/Ticks.js +39 -0
  40. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/constants/orientation.js +9 -0
  41. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/utils/createPoint.js +14 -0
  42. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/utils/getAxisRangePaddingConfig.js +13 -0
  43. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/utils/getLabelTransform.js +16 -0
  44. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/utils/getTickFormatter.js +8 -0
  45. package/dist/node_modules/.bun/@visx_axis@4.0.0_d84c32d47042070f/node_modules/@visx/axis/esm/utils/getTickPosition.js +14 -0
  46. package/dist/node_modules/.bun/@visx_grid@4.0.0_d84c32d47042070f/node_modules/@visx/grid/esm/grids/Grid.js +43 -0
  47. package/dist/node_modules/.bun/@visx_grid@4.0.0_d84c32d47042070f/node_modules/@visx/grid/esm/grids/GridColumns.js +46 -0
  48. package/dist/node_modules/.bun/@visx_grid@4.0.0_d84c32d47042070f/node_modules/@visx/grid/esm/grids/GridRows.js +46 -0
  49. package/dist/node_modules/.bun/@visx_grid@4.0.0_d84c32d47042070f/node_modules/@visx/grid/esm/utils/getScaleBandwidth.js +6 -0
  50. package/dist/node_modules/.bun/@visx_group@4.0.0_d84c32d47042070f/node_modules/@visx/group/esm/Group.js +17 -0
  51. package/dist/node_modules/.bun/@visx_point@4.0.0/node_modules/@visx/point/esm/Point.js +20 -0
  52. package/dist/node_modules/.bun/@visx_scale@4.0.0/node_modules/@visx/scale/esm/utils/coerceNumber.js +10 -0
  53. package/dist/node_modules/.bun/@visx_scale@4.0.0/node_modules/@visx/scale/esm/utils/getTicks.js +7 -0
  54. package/dist/node_modules/.bun/@visx_scale@4.0.0/node_modules/@visx/scale/esm/utils/toString.js +6 -0
  55. package/dist/node_modules/.bun/@visx_shape@4.0.0_d84c32d47042070f/node_modules/@visx/shape/esm/shapes/Line.js +27 -0
  56. package/dist/node_modules/.bun/@visx_text@4.0.0_d84c32d47042070f/node_modules/@visx/text/esm/Text.js +27 -0
  57. package/dist/node_modules/.bun/@visx_text@4.0.0_d84c32d47042070f/node_modules/@visx/text/esm/hooks/useText.js +68 -0
  58. package/dist/node_modules/.bun/@visx_text@4.0.0_d84c32d47042070f/node_modules/@visx/text/esm/util/getStringWidth.js +19 -0
  59. package/dist/node_modules/.bun/@visx_text@4.0.0_d84c32d47042070f/node_modules/@visx/text/esm/util/memoize.js +13 -0
  60. package/dist/node_modules/.bun/balanced-match@0.4.2/node_modules/balanced-match/index.js +32 -0
  61. package/dist/node_modules/.bun/balanced-match@1.0.2/node_modules/balanced-match/index.js +33 -0
  62. package/dist/node_modules/.bun/classnames@2.5.1/node_modules/classnames/index.js +32 -0
  63. package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +16 -0
  64. package/dist/node_modules/.bun/invariant@2.2.4/node_modules/invariant/browser.js +28 -0
  65. package/dist/node_modules/.bun/math-expression-evaluator@1.4.0/node_modules/math-expression-evaluator/src/formula_evaluator.js +37 -0
  66. package/dist/node_modules/.bun/math-expression-evaluator@1.4.0/node_modules/math-expression-evaluator/src/lexer.js +509 -0
  67. package/dist/node_modules/.bun/math-expression-evaluator@1.4.0/node_modules/math-expression-evaluator/src/math_function.js +108 -0
  68. package/dist/node_modules/.bun/math-expression-evaluator@1.4.0/node_modules/math-expression-evaluator/src/postfix.js +31 -0
  69. package/dist/node_modules/.bun/math-expression-evaluator@1.4.0/node_modules/math-expression-evaluator/src/postfix_evaluator.js +45 -0
  70. package/dist/node_modules/.bun/reduce-css-calc@1.3.0/node_modules/reduce-css-calc/index.js +49 -0
  71. package/dist/node_modules/.bun/reduce-function-call@1.0.3/node_modules/reduce-function-call/index.js +34 -0
  72. package/dist/node_modules/.bun/redux-undo@1.1.0/node_modules/redux-undo/dist/redux-undo.js +185 -0
  73. package/dist/node_modules/.bun/redux@5.0.1/node_modules/redux/dist/redux.js +198 -0
  74. package/dist/tool-menu.d.ts +21 -0
  75. package/dist/tool-menu.js +188 -0
  76. package/dist/tools/index.d.ts +17 -0
  77. package/dist/tools/index.js +12 -0
  78. package/dist/tools/line/component.d.ts +113 -0
  79. package/dist/tools/line/component.js +58 -0
  80. package/dist/tools/line/index.d.ts +13 -0
  81. package/dist/tools/line/index.js +6 -0
  82. package/dist/tools/polygon/component.d.ts +117 -0
  83. package/dist/tools/polygon/component.js +194 -0
  84. package/dist/tools/polygon/index.d.ts +19 -0
  85. package/dist/tools/polygon/index.js +55 -0
  86. package/dist/tools/polygon/polygon.d.ts +122 -0
  87. package/dist/tools/polygon/polygon.js +62 -0
  88. package/dist/tools/shared/arrow-head.d.ts +43 -0
  89. package/dist/tools/shared/arrow-head.js +37 -0
  90. package/dist/tools/shared/line/index.d.ts +240 -0
  91. package/dist/tools/shared/line/index.js +320 -0
  92. package/dist/tools/shared/point/arrow-point.d.ts +57 -0
  93. package/dist/tools/shared/point/arrow-point.js +47 -0
  94. package/dist/tools/shared/point/arrow.d.ts +46 -0
  95. package/dist/tools/shared/point/arrow.js +36 -0
  96. package/dist/tools/shared/point/base-point.d.ts +50 -0
  97. package/dist/tools/shared/point/base-point.js +88 -0
  98. package/dist/tools/shared/point/index.d.ts +217 -0
  99. package/dist/tools/shared/point/index.js +51 -0
  100. package/dist/tools/shared/styles.d.ts +24 -0
  101. package/dist/tools/shared/styles.js +17 -0
  102. package/dist/tools/shared/types.d.ts +15 -0
  103. package/dist/tools/shared/types.js +10 -0
  104. package/dist/undo-redo.d.ts +20 -0
  105. package/dist/undo-redo.js +33 -0
  106. package/dist/use-debounce.d.ts +9 -0
  107. package/dist/use-debounce.js +13 -0
  108. package/dist/utils.d.ts +58 -0
  109. package/dist/utils.js +72 -0
  110. package/package.json +52 -42
  111. package/CHANGELOG.json +0 -1
  112. package/CHANGELOG.md +0 -449
  113. package/lib/axis/arrow.js +0 -79
  114. package/lib/axis/arrow.js.map +0 -1
  115. package/lib/axis/axes.js +0 -327
  116. package/lib/axis/axes.js.map +0 -1
  117. package/lib/axis/index.js +0 -21
  118. package/lib/axis/index.js.map +0 -1
  119. package/lib/bg.js +0 -114
  120. package/lib/bg.js.map +0 -1
  121. package/lib/container/actions.js +0 -18
  122. package/lib/container/actions.js.map +0 -1
  123. package/lib/container/index.js +0 -129
  124. package/lib/container/index.js.map +0 -1
  125. package/lib/container/marks.js +0 -22
  126. package/lib/container/marks.js.map +0 -1
  127. package/lib/container/middleware.js +0 -19
  128. package/lib/container/middleware.js.map +0 -1
  129. package/lib/container/reducer.js +0 -18
  130. package/lib/container/reducer.js.map +0 -1
  131. package/lib/coordinates-label.js +0 -77
  132. package/lib/coordinates-label.js.map +0 -1
  133. package/lib/graph-with-controls.js +0 -297
  134. package/lib/graph-with-controls.js.map +0 -1
  135. package/lib/graph.js +0 -353
  136. package/lib/graph.js.map +0 -1
  137. package/lib/grid-setup.js +0 -414
  138. package/lib/grid-setup.js.map +0 -1
  139. package/lib/grid.js +0 -131
  140. package/lib/grid.js.map +0 -1
  141. package/lib/index.js +0 -40
  142. package/lib/index.js.map +0 -1
  143. package/lib/labels.js +0 -199
  144. package/lib/labels.js.map +0 -1
  145. package/lib/mark-label.js +0 -159
  146. package/lib/mark-label.js.map +0 -1
  147. package/lib/toggle-bar.js +0 -248
  148. package/lib/toggle-bar.js.map +0 -1
  149. package/lib/tool-menu.js +0 -218
  150. package/lib/tool-menu.js.map +0 -1
  151. package/lib/tools/index.js +0 -24
  152. package/lib/tools/index.js.map +0 -1
  153. package/lib/tools/line/component.js +0 -92
  154. package/lib/tools/line/component.js.map +0 -1
  155. package/lib/tools/line/index.js +0 -11
  156. package/lib/tools/line/index.js.map +0 -1
  157. package/lib/tools/polygon/component.js +0 -358
  158. package/lib/tools/polygon/component.js.map +0 -1
  159. package/lib/tools/polygon/index.js +0 -89
  160. package/lib/tools/polygon/index.js.map +0 -1
  161. package/lib/tools/polygon/line.js +0 -114
  162. package/lib/tools/polygon/line.js.map +0 -1
  163. package/lib/tools/polygon/polygon.js +0 -128
  164. package/lib/tools/polygon/polygon.js.map +0 -1
  165. package/lib/tools/shared/arrow-head.js +0 -62
  166. package/lib/tools/shared/arrow-head.js.map +0 -1
  167. package/lib/tools/shared/line/index.js +0 -539
  168. package/lib/tools/shared/line/index.js.map +0 -1
  169. package/lib/tools/shared/line/line-path.js +0 -121
  170. package/lib/tools/shared/line/line-path.js.map +0 -1
  171. package/lib/tools/shared/line/with-root-edge.js +0 -121
  172. package/lib/tools/shared/line/with-root-edge.js.map +0 -1
  173. package/lib/tools/shared/point/arrow-point.js +0 -86
  174. package/lib/tools/shared/point/arrow-point.js.map +0 -1
  175. package/lib/tools/shared/point/arrow.js +0 -70
  176. package/lib/tools/shared/point/arrow.js.map +0 -1
  177. package/lib/tools/shared/point/base-point.js +0 -137
  178. package/lib/tools/shared/point/base-point.js.map +0 -1
  179. package/lib/tools/shared/point/index.js +0 -80
  180. package/lib/tools/shared/point/index.js.map +0 -1
  181. package/lib/tools/shared/styles.js +0 -26
  182. package/lib/tools/shared/styles.js.map +0 -1
  183. package/lib/tools/shared/types.js +0 -15
  184. package/lib/tools/shared/types.js.map +0 -1
  185. package/lib/undo-redo.js +0 -67
  186. package/lib/undo-redo.js.map +0 -1
  187. package/lib/use-debounce.js +0 -25
  188. package/lib/use-debounce.js.map +0 -1
  189. package/lib/utils.js +0 -235
  190. package/lib/utils.js.map +0 -1
  191. package/src/__tests__/bg.test.jsx +0 -250
  192. package/src/__tests__/coordinates-label.test.jsx +0 -243
  193. package/src/__tests__/graph-with-controls.test.jsx +0 -184
  194. package/src/__tests__/graph.test.jsx +0 -93
  195. package/src/__tests__/grid-setup.test.jsx +0 -645
  196. package/src/__tests__/grid.test.jsx +0 -23
  197. package/src/__tests__/labels.test.jsx +0 -41
  198. package/src/__tests__/mark-label.test.jsx +0 -66
  199. package/src/__tests__/toggle-bar.test.jsx +0 -106
  200. package/src/__tests__/tool-menu.test.jsx +0 -453
  201. package/src/__tests__/undo-redo.test.jsx +0 -26
  202. package/src/__tests__/use-debounce.test.js +0 -21
  203. package/src/__tests__/utils.js +0 -41
  204. package/src/__tests__/utils.test.js +0 -105
  205. package/src/axis/__tests__/arrow.test.jsx +0 -43
  206. package/src/axis/__tests__/axes.test.jsx +0 -182
  207. package/src/axis/arrow.jsx +0 -57
  208. package/src/axis/axes.jsx +0 -284
  209. package/src/axis/index.js +0 -3
  210. package/src/bg.jsx +0 -96
  211. package/src/container/__tests__/actions.test.js +0 -105
  212. package/src/container/__tests__/index.test.jsx +0 -227
  213. package/src/container/__tests__/marks.test.js +0 -172
  214. package/src/container/__tests__/middleware.test.js +0 -235
  215. package/src/container/__tests__/reducer.test.js +0 -324
  216. package/src/container/actions.js +0 -8
  217. package/src/container/index.jsx +0 -93
  218. package/src/container/marks.js +0 -14
  219. package/src/container/middleware.js +0 -7
  220. package/src/container/reducer.js +0 -5
  221. package/src/coordinates-label.jsx +0 -62
  222. package/src/graph-with-controls.jsx +0 -242
  223. package/src/graph.jsx +0 -333
  224. package/src/grid-setup.jsx +0 -432
  225. package/src/grid.jsx +0 -133
  226. package/src/index.js +0 -7
  227. package/src/labels.jsx +0 -173
  228. package/src/mark-label.jsx +0 -125
  229. package/src/toggle-bar.jsx +0 -221
  230. package/src/tool-menu.jsx +0 -235
  231. package/src/tools/index.js +0 -8
  232. package/src/tools/line/__tests__/component.test.jsx +0 -37
  233. package/src/tools/line/component.jsx +0 -77
  234. package/src/tools/line/index.js +0 -4
  235. package/src/tools/polygon/__tests__/component.test.jsx +0 -487
  236. package/src/tools/polygon/__tests__/index.test.js +0 -65
  237. package/src/tools/polygon/__tests__/line.test.jsx +0 -23
  238. package/src/tools/polygon/__tests__/polygon.test.jsx +0 -44
  239. package/src/tools/polygon/component.jsx +0 -324
  240. package/src/tools/polygon/index.js +0 -52
  241. package/src/tools/polygon/line.jsx +0 -80
  242. package/src/tools/polygon/polygon.jsx +0 -93
  243. package/src/tools/shared/__tests__/arrow-head.test.jsx +0 -33
  244. package/src/tools/shared/arrow-head.jsx +0 -46
  245. package/src/tools/shared/line/__tests__/index.test.jsx +0 -553
  246. package/src/tools/shared/line/__tests__/line-path.test.jsx +0 -56
  247. package/src/tools/shared/line/__tests__/with-root-edge.test.jsx +0 -488
  248. package/src/tools/shared/line/index.jsx +0 -471
  249. package/src/tools/shared/line/line-path.jsx +0 -85
  250. package/src/tools/shared/line/with-root-edge.jsx +0 -97
  251. package/src/tools/shared/point/__tests__/arrow-point.test.jsx +0 -91
  252. package/src/tools/shared/point/__tests__/arrow.test.jsx +0 -469
  253. package/src/tools/shared/point/__tests__/base-point.test.jsx +0 -87
  254. package/src/tools/shared/point/arrow-point.jsx +0 -60
  255. package/src/tools/shared/point/arrow.jsx +0 -40
  256. package/src/tools/shared/point/base-point.jsx +0 -113
  257. package/src/tools/shared/point/index.jsx +0 -58
  258. package/src/tools/shared/styles.js +0 -20
  259. package/src/tools/shared/types.js +0 -8
  260. package/src/undo-redo.jsx +0 -37
  261. package/src/use-debounce.js +0 -13
  262. package/src/utils.js +0 -230
@@ -1,91 +0,0 @@
1
- import { render } from '@pie-lib/test-utils';
2
- import React from 'react';
3
- import { ArrowPoint } from '../index';
4
- import { graphProps } from '../../../../__tests__/utils';
5
- import { bounds } from '../../../../utils';
6
- import { gridDraggable, utils } from '@pie-lib/plot';
7
-
8
- const { xy } = utils;
9
- jest.mock('../../../../utils', () => {
10
- const { point, getAngleDeg, arrowDimensions } = jest.requireActual('../../../../utils');
11
- return {
12
- bounds: jest.fn(),
13
- point,
14
- getAngleDeg,
15
- arrowDimensions,
16
- };
17
- });
18
-
19
- jest.mock('@pie-lib/plot', () => {
20
- const { types, utils } = jest.requireActual('@pie-lib/plot');
21
- return {
22
- gridDraggable: jest.fn((opts) => (Comp) => Comp),
23
- types,
24
- utils,
25
- };
26
- });
27
-
28
- describe('ArrowPoint', () => {
29
- let onChange = jest.fn();
30
-
31
- const renderComponent = (extras) => {
32
- const defaults = {
33
- classes: {},
34
- className: 'className',
35
- onChange,
36
- graphProps: graphProps(),
37
- from: xy(0, 0),
38
- to: xy(1, 1),
39
- x: 0,
40
- y: 0,
41
- };
42
- const props = { ...defaults, ...extras };
43
- return render(<ArrowPoint {...props} />);
44
- };
45
-
46
- describe('rendering', () => {
47
- it('renders without crashing', () => {
48
- const { container } = renderComponent();
49
- expect(container.firstChild).toBeInTheDocument();
50
- });
51
- });
52
- describe('gridDraggable options', () => {
53
- let opts;
54
- let domain;
55
- let range;
56
- beforeEach(() => {
57
- domain = {
58
- min: 0,
59
- max: 1,
60
- step: 1,
61
- };
62
- range = {
63
- min: 0,
64
- max: 1,
65
- step: 1,
66
- };
67
- renderComponent();
68
- opts = gridDraggable.mock.calls[gridDraggable.mock.calls.length - 1][0];
69
- });
70
-
71
- describe('bounds', () => {
72
- it('calls utils.bounds with area', () => {
73
- const result = opts.bounds({ x: 0, y: 0 }, { domain, range });
74
- expect(bounds).toHaveBeenCalledWith({ left: 0, top: 0, bottom: 0, right: 0 }, domain, range);
75
- });
76
- });
77
- describe('anchorPoint', () => {
78
- it('returns x/y', () => {
79
- const result = opts.anchorPoint({ x: 0, y: 0 });
80
- expect(result).toEqual({ x: 0, y: 0 });
81
- });
82
- });
83
-
84
- describe('fromDelta', () => {
85
- it('returns a new point from the x/y + delta', () => {
86
- const result = opts.fromDelta({ x: -1, y: 0 }, { x: 1, y: 3 });
87
- expect(result).toEqual({ x: 0, y: 3 });
88
- });
89
- });
90
- });
91
- });
@@ -1,469 +0,0 @@
1
- import { render } from '@pie-lib/test-utils';
2
- import React from 'react';
3
- import Arrow from '../arrow';
4
- import { graphProps } from '../../../../__tests__/utils';
5
- import { thinnerShapesNeeded } from '../../../../utils';
6
-
7
- jest.mock('../../../../utils', () => ({
8
- ...jest.requireActual('../../../../utils'),
9
- thinnerShapesNeeded: jest.fn(() => false),
10
- }));
11
-
12
- describe('Arrow', () => {
13
- let onChange = jest.fn();
14
-
15
- const renderComponent = (extras) => {
16
- const defaults = {
17
- classes: {},
18
- className: 'arrow-class',
19
- onChange,
20
- graphProps: graphProps(),
21
- x: 5,
22
- y: 10,
23
- angle: 45,
24
- };
25
- const props = { ...defaults, ...extras };
26
- return render(<Arrow {...props} />);
27
- };
28
-
29
- beforeEach(() => {
30
- onChange = jest.fn();
31
- thinnerShapesNeeded.mockReturnValue(false);
32
- });
33
-
34
- describe('rendering', () => {
35
- it('renders without crashing', () => {
36
- const { container } = renderComponent();
37
- expect(container.firstChild).toBeInTheDocument();
38
- });
39
-
40
- it('renders a g element with correct class names', () => {
41
- const { container } = renderComponent({
42
- classes: { point: 'point-class' },
43
- className: 'custom-class',
44
- });
45
- const gElement = container.querySelector('g');
46
- expect(gElement).toBeInTheDocument();
47
- expect(gElement).toHaveClass('point-class');
48
- expect(gElement).toHaveClass('custom-class');
49
- });
50
-
51
- it('renders ArrowHead component', () => {
52
- const { container } = renderComponent();
53
- const polygon = container.querySelector('polygon');
54
- expect(polygon).toBeInTheDocument();
55
- });
56
-
57
- it('applies disabled class when disabled is true', () => {
58
- const { container } = renderComponent({
59
- classes: { point: 'point-class', disabled: 'disabled-class' },
60
- disabled: true,
61
- });
62
- const gElement = container.querySelector('g');
63
- expect(gElement).toHaveClass('disabled-class');
64
- });
65
-
66
- it('does not apply disabled class when disabled is false', () => {
67
- const { container } = renderComponent({
68
- classes: { point: 'point-class', disabled: 'disabled-class' },
69
- disabled: false,
70
- });
71
- const gElement = container.querySelector('g');
72
- expect(gElement).not.toHaveClass('disabled-class');
73
- });
74
-
75
- it('applies correctness class when provided', () => {
76
- const { container } = renderComponent({
77
- classes: { point: 'point-class', correct: 'correct-class' },
78
- correctness: 'correct',
79
- });
80
- const gElement = container.querySelector('g');
81
- expect(gElement).toHaveClass('correct-class');
82
- });
83
-
84
- it('applies incorrect correctness class', () => {
85
- const { container } = renderComponent({
86
- classes: { point: 'point-class', incorrect: 'incorrect-class' },
87
- correctness: 'incorrect',
88
- });
89
- const gElement = container.querySelector('g');
90
- expect(gElement).toHaveClass('incorrect-class');
91
- });
92
- });
93
-
94
- describe('size calculation', () => {
95
- it('uses size 14 when thinnerShapesNeeded returns false', () => {
96
- thinnerShapesNeeded.mockReturnValue(false);
97
- const { container } = renderComponent({ x: 0, y: 0 });
98
- const polygon = container.querySelector('polygon');
99
-
100
- // Expected points: "0,0 -14,-7 -14,7"
101
- expect(polygon).toHaveAttribute('points');
102
- const points = polygon.getAttribute('points');
103
- expect(points).toContain('-14');
104
- });
105
-
106
- it('uses size 12 when thinnerShapesNeeded returns true', () => {
107
- thinnerShapesNeeded.mockReturnValue(true);
108
- const { container } = renderComponent({ x: 0, y: 0 });
109
- const polygon = container.querySelector('polygon');
110
-
111
- // Expected points: "0,0 -12,-6 -12,6"
112
- expect(polygon).toHaveAttribute('points');
113
- const points = polygon.getAttribute('points');
114
- expect(points).toContain('-12');
115
- });
116
-
117
- it('calls thinnerShapesNeeded with graphProps', () => {
118
- const gp = graphProps();
119
- renderComponent({ graphProps: gp });
120
- expect(thinnerShapesNeeded).toHaveBeenCalledWith(gp);
121
- });
122
- });
123
-
124
- describe('coordinate scaling', () => {
125
- it('scales x and y coordinates using graphProps.scale', () => {
126
- const mockScale = {
127
- x: jest.fn((n) => n * 10),
128
- y: jest.fn((n) => n * 20),
129
- };
130
- const gp = {
131
- ...graphProps(),
132
- scale: mockScale,
133
- };
134
-
135
- renderComponent({ x: 5, y: 10, graphProps: gp });
136
-
137
- expect(mockScale.x).toHaveBeenCalledWith(5);
138
- expect(mockScale.y).toHaveBeenCalledWith(10);
139
- });
140
-
141
- it('renders arrow with scaled coordinates', () => {
142
- const mockScale = {
143
- x: jest.fn((n) => n * 2),
144
- y: jest.fn((n) => n * 3),
145
- };
146
- const gp = {
147
- ...graphProps(),
148
- scale: mockScale,
149
- };
150
-
151
- const { container } = renderComponent({ x: 5, y: 10, graphProps: gp, angle: 0 });
152
- const polygon = container.querySelector('polygon');
153
-
154
- // scaledX = 5 * 2 = 10, scaledY = 10 * 3 = 30
155
- // Expected points: "10,30 -4,23 -4,37" (with size 14)
156
- const points = polygon.getAttribute('points');
157
- expect(points).toContain('10');
158
- expect(points).toContain('30');
159
- });
160
- });
161
-
162
- describe('angle rotation', () => {
163
- it('applies rotation transform with negative angle', () => {
164
- const { container } = renderComponent({ x: 5, y: 10, angle: 45 });
165
- const polygon = container.querySelector('polygon');
166
- const transform = polygon.getAttribute('transform');
167
-
168
- // Angle should be negated: rotate(-45, 5, 10)
169
- expect(transform).toContain('rotate(-45');
170
- expect(transform).toContain('5');
171
- expect(transform).toContain('10');
172
- });
173
-
174
- it('handles zero angle', () => {
175
- const { container } = renderComponent({ x: 3, y: 7, angle: 0 });
176
- const polygon = container.querySelector('polygon');
177
- const transform = polygon.getAttribute('transform');
178
-
179
- // will convert -0 to 0
180
- expect(transform).toMatch(/rotate\((-)?0/);
181
- expect(transform).toContain('3');
182
- expect(transform).toContain('7');
183
- });
184
-
185
- it('handles negative angle', () => {
186
- const { container } = renderComponent({ x: 2, y: 4, angle: -30 });
187
- const polygon = container.querySelector('polygon');
188
- const transform = polygon.getAttribute('transform');
189
-
190
- // -(-30) = 30
191
- expect(transform).toContain('rotate(30');
192
- expect(transform).toContain('2');
193
- expect(transform).toContain('4');
194
- });
195
-
196
- it('handles 360 degree angle', () => {
197
- const { container } = renderComponent({ x: 1, y: 1, angle: 360 });
198
- const polygon = container.querySelector('polygon');
199
- const transform = polygon.getAttribute('transform');
200
-
201
- expect(transform).toContain('rotate(-360');
202
- });
203
- });
204
-
205
- describe('arrow points calculation', () => {
206
- it('calculates correct points for arrow head', () => {
207
- thinnerShapesNeeded.mockReturnValue(false);
208
- const { container } = renderComponent({ x: 0, y: 0, angle: 0 });
209
- const polygon = container.querySelector('polygon');
210
-
211
- // size = 14
212
- // points = "0,0 -14,-7 -14, 7" (note the space after comma in the template literal)
213
- const points = polygon.getAttribute('points');
214
- expect(points).toContain('0,0');
215
- expect(points).toContain('-14,-7');
216
- expect(points).toMatch(/-14,\s*7/);
217
- });
218
-
219
- it('calculates points with scaled coordinates', () => {
220
- thinnerShapesNeeded.mockReturnValue(false);
221
- const mockScale = {
222
- x: jest.fn((n) => n),
223
- y: jest.fn((n) => n),
224
- };
225
- const gp = {
226
- ...graphProps(),
227
- scale: mockScale,
228
- };
229
-
230
- const { container } = renderComponent({ x: 10, y: 20, graphProps: gp });
231
- const polygon = container.querySelector('polygon');
232
-
233
- // scaledX = 10, scaledY = 20, size = 14
234
- // points = "10,20 -4,13 -4, 27" (note the space after comma in the template literal)
235
- const points = polygon.getAttribute('points');
236
- expect(points).toContain('10,20');
237
- expect(points).toContain('-4,13');
238
- expect(points).toMatch(/-4,\s*27/);
239
- });
240
- });
241
-
242
- describe('props handling', () => {
243
- it('passes through additional props to g element', () => {
244
- const { container } = renderComponent({
245
- 'data-test': 'arrow-test',
246
- role: 'graphics-symbol',
247
- });
248
- const gElement = container.querySelector('g');
249
- expect(gElement).toHaveAttribute('data-test', 'arrow-test');
250
- expect(gElement).toHaveAttribute('role', 'graphics-symbol');
251
- });
252
-
253
- it('excludes filtered props from g element', () => {
254
- const { container } = renderComponent({
255
- x: 5,
256
- y: 10,
257
- angle: 45,
258
- disabled: false,
259
- correctness: 'correct',
260
- graphProps: graphProps(),
261
- });
262
- const gElement = container.querySelector('g');
263
-
264
- // These props should not be passed to the g element
265
- expect(gElement).not.toHaveAttribute('x');
266
- expect(gElement).not.toHaveAttribute('y');
267
- expect(gElement).not.toHaveAttribute('angle');
268
- expect(gElement).not.toHaveAttribute('disabled');
269
- expect(gElement).not.toHaveAttribute('correctness');
270
- expect(gElement).not.toHaveAttribute('graphProps');
271
- });
272
- });
273
-
274
- describe('edge cases', () => {
275
- it('handles zero coordinates', () => {
276
- const { container } = renderComponent({ x: 0, y: 0, angle: 0 });
277
- const polygon = container.querySelector('polygon');
278
- expect(polygon).toBeInTheDocument();
279
- expect(polygon.getAttribute('points')).toBeTruthy();
280
- expect(polygon.getAttribute('transform')).toBeTruthy();
281
- });
282
-
283
- it('handles negative coordinates', () => {
284
- const { container } = renderComponent({ x: -5, y: -10, angle: 0 });
285
- const polygon = container.querySelector('polygon');
286
- expect(polygon).toBeInTheDocument();
287
- expect(polygon.getAttribute('points')).toBeTruthy();
288
- expect(polygon.getAttribute('transform')).toBeTruthy();
289
- });
290
-
291
- it('handles large coordinates', () => {
292
- const { container } = renderComponent({ x: 1000, y: 2000, angle: 0 });
293
- const polygon = container.querySelector('polygon');
294
- expect(polygon).toBeInTheDocument();
295
- });
296
-
297
- it('handles fractional coordinates', () => {
298
- const { container } = renderComponent({ x: 3.5, y: 7.25, angle: 22.5 });
299
- const polygon = container.querySelector('polygon');
300
- expect(polygon).toBeInTheDocument();
301
- expect(polygon.getAttribute('transform')).toContain('rotate(-22.5');
302
- });
303
-
304
- it('renders with empty classes prop', () => {
305
- const { container } = render(<Arrow x={5} y={10} angle={45} graphProps={graphProps()} classes={{}} />);
306
- const gElement = container.querySelector('g');
307
- expect(gElement).toBeInTheDocument();
308
- });
309
-
310
- it('renders without className prop', () => {
311
- const { container } = render(<Arrow x={5} y={10} angle={45} graphProps={graphProps()} classes={{}} />);
312
- const gElement = container.querySelector('g');
313
- expect(gElement).toBeInTheDocument();
314
- });
315
- });
316
-
317
- describe('graphProps integration', () => {
318
- it('works with different domain and range values', () => {
319
- const gp = graphProps(-10, 10, -20, 20);
320
- const { container } = renderComponent({ graphProps: gp });
321
- expect(container.querySelector('polygon')).toBeInTheDocument();
322
- expect(thinnerShapesNeeded).toHaveBeenCalledWith(gp);
323
- });
324
-
325
- it('works with custom size in graphProps', () => {
326
- const gp = {
327
- ...graphProps(),
328
- size: {
329
- width: 800,
330
- height: 600,
331
- },
332
- };
333
- const { container } = renderComponent({ graphProps: gp });
334
- expect(container.querySelector('polygon')).toBeInTheDocument();
335
- });
336
-
337
- it('handles graphProps with small step values', () => {
338
- const gp = {
339
- ...graphProps(),
340
- domain: { min: 0, max: 10, step: 0.1 },
341
- range: { min: 0, max: 10, step: 0.1 },
342
- };
343
- thinnerShapesNeeded.mockReturnValue(true);
344
- const { container } = renderComponent({ graphProps: gp });
345
- const polygon = container.querySelector('polygon');
346
-
347
- // Should use size 12 for thinner shapes
348
- expect(polygon).toBeInTheDocument();
349
- expect(thinnerShapesNeeded).toHaveBeenCalledWith(gp);
350
- });
351
- });
352
-
353
- describe('multiple correctness states', () => {
354
- it('handles partial correctness', () => {
355
- const { container } = renderComponent({
356
- classes: { point: 'point-class', partial: 'partial-class' },
357
- correctness: 'partial',
358
- });
359
- const gElement = container.querySelector('g');
360
- expect(gElement).toHaveClass('partial-class');
361
- });
362
-
363
- it('handles undefined correctness', () => {
364
- const { container } = renderComponent({
365
- classes: { point: 'point-class' },
366
- correctness: undefined,
367
- });
368
- const gElement = container.querySelector('g');
369
- expect(gElement).toHaveClass('point-class');
370
- });
371
-
372
- it('handles null correctness', () => {
373
- const { container } = renderComponent({
374
- classes: { point: 'point-class' },
375
- correctness: null,
376
- });
377
- const gElement = container.querySelector('g');
378
- expect(gElement).toHaveClass('point-class');
379
- });
380
- });
381
-
382
- describe('combined states', () => {
383
- it('handles disabled and correct states together', () => {
384
- const { container } = renderComponent({
385
- classes: {
386
- point: 'point-class',
387
- disabled: 'disabled-class',
388
- correct: 'correct-class',
389
- },
390
- disabled: true,
391
- correctness: 'correct',
392
- });
393
- const gElement = container.querySelector('g');
394
- expect(gElement).toHaveClass('point-class');
395
- expect(gElement).toHaveClass('disabled-class');
396
- expect(gElement).toHaveClass('correct-class');
397
- });
398
-
399
- it('handles disabled and incorrect states together', () => {
400
- const { container } = renderComponent({
401
- classes: {
402
- point: 'point-class',
403
- disabled: 'disabled-class',
404
- incorrect: 'incorrect-class',
405
- },
406
- disabled: true,
407
- correctness: 'incorrect',
408
- });
409
- const gElement = container.querySelector('g');
410
- expect(gElement).toHaveClass('point-class');
411
- expect(gElement).toHaveClass('disabled-class');
412
- expect(gElement).toHaveClass('incorrect-class');
413
- });
414
- });
415
-
416
- describe('re-rendering', () => {
417
- it('updates when x coordinate changes', () => {
418
- const { container, rerender } = renderComponent({ x: 5, y: 10, angle: 0 });
419
- let polygon = container.querySelector('polygon');
420
- const initialPoints = polygon.getAttribute('points');
421
-
422
- rerender(<Arrow x={15} y={10} angle={0} graphProps={graphProps()} classes={{}} className="arrow-class" />);
423
-
424
- polygon = container.querySelector('polygon');
425
- const newPoints = polygon.getAttribute('points');
426
- expect(newPoints).not.toBe(initialPoints);
427
- });
428
-
429
- it('updates when y coordinate changes', () => {
430
- const { container, rerender } = renderComponent({ x: 5, y: 10, angle: 0 });
431
- let polygon = container.querySelector('polygon');
432
- const initialPoints = polygon.getAttribute('points');
433
-
434
- rerender(<Arrow x={5} y={20} angle={0} graphProps={graphProps()} classes={{}} className="arrow-class" />);
435
-
436
- polygon = container.querySelector('polygon');
437
- const newPoints = polygon.getAttribute('points');
438
- expect(newPoints).not.toBe(initialPoints);
439
- });
440
-
441
- it('updates when angle changes', () => {
442
- const { container, rerender } = renderComponent({ x: 5, y: 10, angle: 0 });
443
- let polygon = container.querySelector('polygon');
444
- const initialTransform = polygon.getAttribute('transform');
445
-
446
- rerender(<Arrow x={5} y={10} angle={90} graphProps={graphProps()} classes={{}} className="arrow-class" />);
447
-
448
- polygon = container.querySelector('polygon');
449
- const newTransform = polygon.getAttribute('transform');
450
- expect(newTransform).not.toBe(initialTransform);
451
- expect(newTransform).toContain('rotate(-90');
452
- });
453
-
454
- it('updates when thinnerShapesNeeded result changes', () => {
455
- thinnerShapesNeeded.mockReturnValue(false);
456
- const { container, rerender } = renderComponent({ x: 0, y: 0, angle: 0 });
457
- let polygon = container.querySelector('polygon');
458
- const initialPoints = polygon.getAttribute('points');
459
-
460
- thinnerShapesNeeded.mockReturnValue(true);
461
- rerender(<Arrow x={0} y={0} angle={0} graphProps={graphProps()} classes={{}} className="arrow-class" />);
462
-
463
- polygon = container.querySelector('polygon');
464
- const newPoints = polygon.getAttribute('points');
465
- // Points should change due to size change (14 vs 12)
466
- expect(newPoints).not.toBe(initialPoints);
467
- });
468
- });
469
- });
@@ -1,87 +0,0 @@
1
- import { render } from '@pie-lib/test-utils';
2
- import React from 'react';
3
- import { BasePoint } from '../index';
4
- import { gridDraggable } from '@pie-lib/plot';
5
- import { graphProps } from '../../../../__tests__/utils';
6
- import { bounds } from '../../../../utils';
7
-
8
- jest.mock('../../../../utils', () => {
9
- const { point, thinnerShapesNeeded } = jest.requireActual('../../../../utils');
10
- return {
11
- bounds: jest.fn(),
12
- point,
13
- thinnerShapesNeeded,
14
- };
15
- });
16
-
17
- jest.mock('@pie-lib/plot', () => {
18
- const { types, utils } = jest.requireActual('@pie-lib/plot');
19
- return {
20
- gridDraggable: jest.fn((opts) => (Comp) => Comp),
21
- types,
22
- utils,
23
- };
24
- });
25
-
26
- describe('BasePoint', () => {
27
- let onChange = jest.fn();
28
-
29
- const renderComponent = (extras) => {
30
- const defaults = {
31
- classes: {},
32
- className: 'className',
33
- onChange,
34
- graphProps: graphProps(),
35
- x: 0,
36
- y: 0,
37
- };
38
- const props = { ...defaults, ...extras };
39
- return render(<BasePoint {...props} />);
40
- };
41
-
42
- describe('rendering', () => {
43
- it('renders without crashing', () => {
44
- const { container } = renderComponent();
45
- expect(container.firstChild).toBeInTheDocument();
46
- });
47
- });
48
- describe('gridDraggable options', () => {
49
- let opts;
50
- let domain;
51
- let range;
52
- beforeEach(() => {
53
- domain = {
54
- min: 0,
55
- max: 1,
56
- step: 1,
57
- };
58
- range = {
59
- min: 0,
60
- max: 1,
61
- step: 1,
62
- };
63
- renderComponent();
64
- opts = gridDraggable.mock.calls[gridDraggable.mock.calls.length - 1][0];
65
- });
66
-
67
- describe('bounds', () => {
68
- it('calls utils.bounds with area', () => {
69
- const result = opts.bounds({ x: 0, y: 0 }, { domain, range });
70
- expect(bounds).toHaveBeenCalledWith({ left: 0, top: 0, bottom: 0, right: 0 }, domain, range);
71
- });
72
- });
73
- describe('anchorPoint', () => {
74
- it('returns x/y', () => {
75
- const result = opts.anchorPoint({ x: 0, y: 0 });
76
- expect(result).toEqual({ x: 0, y: 0 });
77
- });
78
- });
79
-
80
- describe('fromDelta', () => {
81
- it('returns a new point from the x/y + delta', () => {
82
- const result = opts.fromDelta({ x: -1, y: 0 }, { x: 1, y: 3 });
83
- expect(result).toEqual({ x: 0, y: 3 });
84
- });
85
- });
86
- });
87
- });