@design-core/core 0.0.1 → 0.0.3

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 (254) hide show
  1. package/.eslintrc.json +14 -7
  2. package/.github/workflows/DesignCoreQA.yml +3 -1
  3. package/README.md +11 -4
  4. package/TODO.md +19 -0
  5. package/core/core/core.js +49 -42
  6. package/core/designCore.js +61 -2
  7. package/core/dimensions/alignedDimension.js +142 -0
  8. package/core/dimensions/angularDimension.js +550 -0
  9. package/core/dimensions/baseCircularDimension.js +244 -0
  10. package/core/dimensions/baseDimension.js +558 -0
  11. package/core/dimensions/baseLinearDimension.js +371 -0
  12. package/core/dimensions/diametricDimension.js +82 -0
  13. package/core/dimensions/dimension.js +298 -0
  14. package/core/dimensions/linearDimension.js +29 -0
  15. package/core/dimensions/radialDimension.js +78 -0
  16. package/core/dimensions/rotatedDimension.js +167 -0
  17. package/core/entities/arc.js +314 -60
  18. package/core/entities/arctext.js +642 -0
  19. package/core/entities/basePolyline.js +553 -94
  20. package/core/entities/circle.js +181 -54
  21. package/core/entities/entity.js +154 -74
  22. package/core/entities/hatch.js +807 -0
  23. package/core/entities/insert.js +200 -39
  24. package/core/entities/line.js +196 -134
  25. package/core/entities/lwpolyline.js +21 -44
  26. package/core/entities/point.js +194 -29
  27. package/core/entities/polyline.js +54 -7
  28. package/core/entities/rectangle.js +43 -13
  29. package/core/entities/solid.js +43 -6
  30. package/core/entities/text.js +324 -181
  31. package/core/lib/boundingBox.js +73 -13
  32. package/core/lib/canvas.js +256 -65
  33. package/core/lib/clipboard.js +198 -0
  34. package/core/lib/colour.js +144 -0
  35. package/core/lib/colours.js +367 -301
  36. package/core/lib/commandLine.js +16 -28
  37. package/core/lib/commandManager.js +115 -58
  38. package/core/lib/constants.js +23 -0
  39. package/core/lib/dxf/dxf.js +249 -34
  40. package/core/lib/dxf/dxfFile.js +23 -38
  41. package/core/lib/dxf/dxfIterator.js +17 -5
  42. package/core/lib/dxf/dxfRead.js +23 -7
  43. package/core/lib/dxf/dxfWrite.js +39 -129
  44. package/core/lib/dxf/handleManager.js +97 -0
  45. package/core/lib/dxf/sections/blocks.js +16 -2
  46. package/core/lib/dxf/sections/entities.js +17 -3
  47. package/core/lib/dxf/sections/header.js +10 -1
  48. package/core/lib/dxf/sections/objects.js +36 -0
  49. package/core/lib/dxf/sections/section.js +43 -5
  50. package/core/lib/dxf/sections/tables.js +17 -3
  51. package/core/lib/entityManager.js +178 -0
  52. package/core/lib/fileio.js +14 -4
  53. package/core/lib/headers.js +229 -0
  54. package/core/lib/input.js +46 -0
  55. package/core/lib/inputManager.js +199 -194
  56. package/core/lib/intersect.js +341 -468
  57. package/core/lib/logging.js +25 -1
  58. package/core/lib/matrix.js +6 -8
  59. package/core/lib/mouse.js +24 -79
  60. package/core/lib/patterns.js +690 -0
  61. package/core/lib/promptOptions.js +133 -0
  62. package/core/lib/scene.js +71 -174
  63. package/core/lib/selectionManager.js +74 -48
  64. package/core/lib/selectionWindow.js +24 -10
  65. package/core/lib/settings.js +18 -11
  66. package/core/lib/snapping.js +129 -21
  67. package/core/lib/stateManager.js +288 -0
  68. package/core/lib/strings.js +57 -5
  69. package/core/lib/utils.js +95 -11
  70. package/core/objects/dictionary.js +43 -0
  71. package/core/objects/dictionaryManager.js +80 -0
  72. package/core/properties/dimType.js +117 -0
  73. package/core/properties/flags.js +66 -0
  74. package/core/properties/property.js +26 -0
  75. package/core/properties/propertyManager.js +65 -19
  76. package/core/tables/appId.js +31 -0
  77. package/core/tables/appIdManager.js +44 -0
  78. package/core/tables/block.js +323 -0
  79. package/core/tables/blockManager.js +48 -0
  80. package/core/tables/blockRecord.js +29 -0
  81. package/core/tables/blockRecordManager.js +37 -0
  82. package/core/tables/dimStyle.js +627 -0
  83. package/core/tables/dimStyleManager.js +187 -0
  84. package/core/tables/endblk.js +28 -0
  85. package/core/tables/layer.js +219 -0
  86. package/core/tables/layerManager.js +47 -0
  87. package/core/tables/ltype.js +85 -0
  88. package/core/tables/ltypeManager.js +65 -0
  89. package/core/tables/style.js +145 -0
  90. package/core/tables/styleManager.js +55 -0
  91. package/core/tables/styleManagerBase.js +110 -0
  92. package/core/tables/tableManagerBase.js +354 -0
  93. package/core/tables/ucs.js +28 -0
  94. package/core/tables/ucsManager.js +44 -0
  95. package/core/tables/view.js +28 -0
  96. package/core/tables/viewManager.js +44 -0
  97. package/core/tables/vport.js +70 -0
  98. package/core/tables/vportManager.js +65 -0
  99. package/core/tools/chamfer.js +343 -0
  100. package/core/tools/chamferFilletBase.js +162 -0
  101. package/core/tools/copy.js +68 -40
  102. package/core/tools/copybase.js +65 -0
  103. package/core/tools/copyclip.js +59 -0
  104. package/core/tools/cornerEntity.js +138 -0
  105. package/core/tools/cutclip.js +72 -0
  106. package/core/tools/distance.js +37 -9
  107. package/core/tools/erase.js +43 -13
  108. package/core/tools/explode.js +117 -0
  109. package/core/tools/extend.js +71 -32
  110. package/core/tools/fillet.js +336 -0
  111. package/core/tools/identify.js +33 -6
  112. package/core/tools/matchProp.js +106 -0
  113. package/core/tools/mirror.js +141 -0
  114. package/core/tools/move.js +65 -32
  115. package/core/tools/offset.js +321 -0
  116. package/core/tools/pan.js +54 -0
  117. package/core/tools/pasteclip.js +93 -0
  118. package/core/tools/purge.js +90 -0
  119. package/core/tools/rotate.js +105 -70
  120. package/core/tools/scale.js +166 -0
  121. package/core/tools/tool.js +14 -4
  122. package/core/tools/trim.js +71 -32
  123. package/core/tools/zoom.js +152 -0
  124. package/package.json +3 -305
  125. package/test/dimensions/alignedDimension.test.js +211 -0
  126. package/test/dimensions/angularDimension.test.js +243 -0
  127. package/test/dimensions/baseDimension.test.js +239 -0
  128. package/test/dimensions/diametricDimension.test.js +203 -0
  129. package/test/dimensions/dimension.test.js +102 -0
  130. package/test/dimensions/radialDimension.test.js +203 -0
  131. package/test/dimensions/rotatedDimension.test.js +224 -0
  132. package/test/entities/arc.test.js +463 -41
  133. package/test/entities/arctext.test.js +329 -0
  134. package/test/entities/basePolyline.test.js +459 -10
  135. package/test/entities/circle.test.js +312 -7
  136. package/test/entities/entity.test.js +28 -9
  137. package/test/entities/hatch.test.js +606 -0
  138. package/test/entities/insert.test.js +90 -0
  139. package/test/entities/line.test.js +182 -6
  140. package/test/entities/point.test.js +375 -37
  141. package/test/entities/solid.test.js +156 -0
  142. package/test/entities/text.test.js +533 -7
  143. package/test/integration/exportIntegration.reference.dxf +1706 -0
  144. package/test/integration/exportIntegration.test.js +186 -0
  145. package/test/integration/importExportIntegration.test.js +126 -0
  146. package/test/integration/intersectionIntegration.test.js +880 -0
  147. package/test/integration/userInputIntegration.reference.dxf +1410 -0
  148. package/test/integration/userInputIntegration.test.js +269 -0
  149. package/test/lib/boundingBox.test.js +26 -2
  150. package/test/lib/canvas.test.js +613 -5
  151. package/test/lib/clipboard.test.js +70 -0
  152. package/test/lib/colour.test.js +114 -0
  153. package/test/lib/colours.test.js +63 -18
  154. package/test/lib/commandLine.test.js +159 -22
  155. package/test/lib/commandManager.test.js +4 -4
  156. package/test/lib/constants.test.js +9 -0
  157. package/test/lib/dxf/dxfFile.test.js +6 -2
  158. package/test/lib/dxf/dxfIterator.test.js +1 -1
  159. package/test/lib/dxf/dxfWrite.test.js +173 -0
  160. package/test/lib/dxf/handleManager.test.js +137 -0
  161. package/test/lib/dxf/sections/blocks.test.js +5 -5
  162. package/test/lib/dxf/sections/entities.test.js +4 -4
  163. package/test/lib/dxf/sections/header.test.js +18 -4
  164. package/test/lib/dxf/sections/objects.test.js +132 -0
  165. package/test/lib/dxf/sections/section.test.js +29 -29
  166. package/test/lib/dxf/sections/tables.test.js +3 -3
  167. package/test/lib/entityManager.test.js +163 -0
  168. package/test/lib/headers.test.js +233 -0
  169. package/test/lib/inputManager.test.js +1144 -5
  170. package/test/lib/intersect.test.js +454 -331
  171. package/test/lib/logging.test.js +1 -1
  172. package/test/lib/matrix.test.js +1 -1
  173. package/test/lib/mouse.test.js +327 -4
  174. package/test/lib/patterns.test.js +105 -0
  175. package/test/lib/promptOptions.test.js +179 -0
  176. package/test/lib/scene.test.js +16 -52
  177. package/test/lib/selectionManager.test.js +17 -5
  178. package/test/lib/settings.test.js +111 -5
  179. package/test/lib/snapping.test.js +142 -4
  180. package/test/lib/stateManager.test.js +155 -0
  181. package/test/lib/utils.test.js +81 -1
  182. package/test/objects/dictionary.test.js +81 -0
  183. package/test/objects/dictionaryManager.test.js +34 -0
  184. package/test/properties/dimType.test.js +62 -0
  185. package/test/properties/flags.test.js +164 -0
  186. package/test/properties/property.test.js +13 -0
  187. package/test/properties/propertyManager.test.js +10 -11
  188. package/test/tables/appId.test.js +46 -0
  189. package/test/tables/appIdManager.test.js +72 -0
  190. package/test/tables/block.test.js +157 -0
  191. package/test/tables/blockManager.test.js +52 -0
  192. package/test/tables/blockRecord.test.js +39 -0
  193. package/test/tables/blockRecordManager.test.js +60 -0
  194. package/test/tables/dimstyle.test.js +72 -0
  195. package/test/tables/endblk.test.js +30 -0
  196. package/test/tables/layer.test.js +95 -0
  197. package/test/tables/layerManager.test.js +172 -0
  198. package/test/{styles → tables}/ltype.test.js +7 -7
  199. package/test/{styles → tables}/ltypeManager.test.js +2 -2
  200. package/test/tables/style.test.js +44 -0
  201. package/test/tables/stylemanagerbase.test.js +220 -0
  202. package/test/tables/tableManagerBase.test.js +194 -0
  203. package/test/tables/ucs.test.js +37 -0
  204. package/test/tables/ucsManager.test.js +48 -0
  205. package/test/tables/view.test.js +37 -0
  206. package/test/tables/viewManager.test.js +48 -0
  207. package/test/tables/vport.test.js +117 -0
  208. package/test/tables/vportManager.test.js +54 -0
  209. package/test/test-helpers/test-helpers.js +66 -0
  210. package/test/tools/chamfer.test.js +970 -0
  211. package/test/tools/chamferFilletBase.test.js +446 -0
  212. package/test/tools/copy.test.js +22 -14
  213. package/test/tools/copybase.test.js +93 -0
  214. package/test/tools/copyclip.test.js +92 -0
  215. package/test/tools/cornerEntity.test.js +201 -0
  216. package/test/tools/cutclip.test.js +94 -0
  217. package/test/tools/distance.test.js +140 -18
  218. package/test/tools/erase.test.js +12 -12
  219. package/test/tools/explode.test.js +45 -0
  220. package/test/tools/extend.test.js +326 -44
  221. package/test/tools/fillet.test.js +831 -0
  222. package/test/tools/identify.test.js +115 -16
  223. package/test/tools/matchProp.test.js +84 -0
  224. package/test/tools/mirror.test.js +475 -0
  225. package/test/tools/move.test.js +75 -19
  226. package/test/tools/offset.test.js +748 -0
  227. package/test/tools/pan.test.js +72 -0
  228. package/test/tools/pasteclip.test.js +100 -0
  229. package/test/tools/purge.test.js +89 -0
  230. package/test/tools/rotate.test.js +89 -23
  231. package/test/tools/scale.test.js +529 -0
  232. package/test/tools/trim.test.js +419 -84
  233. package/test/tools/zoom.test.js +504 -0
  234. package/core/entities/alignedDimension.js +0 -279
  235. package/core/entities/angularDimension.js +0 -194
  236. package/core/entities/baseDimension.js +0 -227
  237. package/core/entities/block.js +0 -247
  238. package/core/entities/diametricDimension.js +0 -133
  239. package/core/entities/dimension.js +0 -202
  240. package/core/entities/radialDimension.js +0 -126
  241. package/core/styles/dimStyle.js +0 -719
  242. package/core/styles/dimStyleManager.js +0 -47
  243. package/core/styles/layer.js +0 -133
  244. package/core/styles/layerManager.js +0 -40
  245. package/core/styles/ltype.js +0 -86
  246. package/core/styles/ltypeManager.js +0 -50
  247. package/core/styles/style.js +0 -158
  248. package/core/styles/styleManager.js +0 -43
  249. package/core/styles/styleManagerBase.js +0 -299
  250. package/test/entities/block.test.js +0 -22
  251. package/test/styles/dimstyle.test.js +0 -19
  252. package/test/styles/layerManager.test.js +0 -150
  253. package/test/styles/style.test.js +0 -33
  254. package/test/styles/stylemanagerbase.test.js +0 -219
@@ -0,0 +1,72 @@
1
+ import { Pan } from '../../core/tools/pan.js';
2
+ import { DesignCore } from '../../core/designCore.js';
3
+ import { Core } from '../../core/core/core.js';
4
+ import { MouseDown, MouseUp } from '../../core/lib/input.js';
5
+
6
+ import { jest } from '@jest/globals';
7
+
8
+ // initialise core
9
+ new Core();
10
+
11
+ afterEach(() => {
12
+ jest.restoreAllMocks();
13
+ DesignCore.Scene.inputManager.activeCommand = undefined;
14
+ });
15
+
16
+ test('Pan.execute toggles panning on mouse down then off on mouse up (single cycle)', async () => {
17
+ const pan = new Pan();
18
+ DesignCore.Scene.inputManager.activeCommand = pan;
19
+
20
+ const panSpy = jest.spyOn(DesignCore.Canvas, 'pan').mockImplementation(() => {});
21
+
22
+ let resolveMouseDown; let resolveMouseUp;
23
+ const mouseDownPromise = new Promise((r) => (resolveMouseDown = r));
24
+ const mouseUpPromise = new Promise((r) => (resolveMouseUp = r));
25
+
26
+ jest.spyOn(DesignCore.Scene.inputManager, 'requestInput')
27
+ .mockImplementationOnce(() => mouseDownPromise)
28
+ .mockImplementationOnce(() => mouseUpPromise);
29
+
30
+ const execPromise = pan.execute();
31
+
32
+ // Verify first requestInput was called with the pan prompt
33
+ expect(DesignCore.Scene.inputManager.requestInput.mock.calls[0][0].promptMessage)
34
+ .toBe('');
35
+
36
+ resolveMouseDown(new MouseDown());
37
+ await Promise.resolve();
38
+ expect(pan.panning).toBe(true);
39
+
40
+ pan.preview();
41
+ expect(panSpy).toHaveBeenCalledTimes(1);
42
+
43
+ DesignCore.Scene.inputManager.activeCommand = undefined;
44
+ resolveMouseUp(new MouseUp());
45
+ await execPromise;
46
+ expect(pan.panning).toBe(false);
47
+ });
48
+
49
+
50
+ test('Test Pan.register', () => {
51
+ const command = Pan.register();
52
+ expect(command.command).toBe('Pan');
53
+ expect(command.shortcut).toBe('P');
54
+ expect(command.type).toBeUndefined();
55
+ });
56
+
57
+
58
+ test('Pan command should call DesignCore.Canvas.pan when panning is true', () => {
59
+ DesignCore.Canvas.pan = jest.fn();
60
+ const pan = new Pan();
61
+ pan.panning = true;
62
+ pan.preview();
63
+ expect(DesignCore.Canvas.pan).toHaveBeenCalled();
64
+ });
65
+
66
+ test('Pan command should not call DesignCore.Canvas.pan when panning is false', () => {
67
+ DesignCore.Canvas.pan = jest.fn();
68
+ const pan = new Pan();
69
+ pan.panning = false;
70
+ pan.preview();
71
+ expect(DesignCore.Canvas.pan).not.toHaveBeenCalled();
72
+ });
@@ -0,0 +1,100 @@
1
+ import { Core } from '../../core/core/core.js';
2
+ import { Point } from '../../core/entities/point.js';
3
+ import { Pasteclip } from '../../core/tools/pasteclip.js';
4
+ import { Copyclip } from '../../core/tools/copyclip.js';
5
+ import { DesignCore } from '../../core/designCore.js';
6
+ import { expect, jest } from '@jest/globals';
7
+
8
+ // Init core context
9
+ new Core();
10
+
11
+ describe('Pasteclip Tool', () => {
12
+ beforeEach(() => {
13
+ DesignCore.Scene.entities.clear();
14
+ DesignCore.Scene.selectionManager.reset();
15
+ DesignCore.Scene.tempEntities.clear();
16
+ DesignCore.Clipboard.Entities = []; // also resets basePoint
17
+ });
18
+
19
+ test('execute throws / resets when clipboard invalid', async () => {
20
+ const tool = new Pasteclip();
21
+ const resetSpy = jest.spyOn(DesignCore.Scene.inputManager, 'reset').mockImplementation(() => {});
22
+ const requestSpy = jest.spyOn(DesignCore.Scene.inputManager, 'requestInput').mockResolvedValue(new Point());
23
+ await tool.execute();
24
+ expect(resetSpy).toHaveBeenCalled();
25
+ expect(requestSpy).not.toHaveBeenCalled();
26
+ });
27
+
28
+ test('execute requests base point and then calls executeCommand when clipboard valid', async () => {
29
+ // Prepare clipboard via copyclip to ensure validity
30
+ const line = DesignCore.CommandManager.createNew('Line', { layer: '0', points: [new Point(10, 10), new Point(20, 20)] });
31
+ DesignCore.Scene.entities.add(line);
32
+ DesignCore.Scene.selectionManager.addToSelectionSet(0);
33
+ new Copyclip().action();
34
+ expect(DesignCore.Clipboard.isValid).toBe(true);
35
+
36
+ const tool = new Pasteclip();
37
+ const pt = new Point(100, 100);
38
+ const requestSpy = jest.spyOn(DesignCore.Scene.inputManager, 'requestInput').mockResolvedValue(pt);
39
+ const execSpy = jest.spyOn(DesignCore.Scene.inputManager, 'executeCommand').mockImplementation(() => {});
40
+ await tool.execute();
41
+ expect(requestSpy).toHaveBeenCalledTimes(1);
42
+ expect(execSpy).toHaveBeenCalledTimes(1);
43
+ expect(tool.points[0]).toBe(pt);
44
+ });
45
+
46
+ test('preview creates temp entities offset from mouse', () => {
47
+ // Setup clipboard
48
+ const line = DesignCore.CommandManager.createNew('Line', { layer: '0', points: [new Point(0, 0), new Point(10, 0)] });
49
+ DesignCore.Scene.entities.add(line);
50
+ DesignCore.Scene.selectionManager.addToSelectionSet(0);
51
+ new Copyclip().action();
52
+ const basePoint = DesignCore.Clipboard.BasePoint; // bottom-left of line
53
+
54
+ // Mock mouse pointOnScene to return offset target
55
+ const targetPoint = new Point(50, 50);
56
+ DesignCore.Mouse.pointOnScene = () => targetPoint;
57
+
58
+ const tool = new Pasteclip();
59
+ tool.preview();
60
+ expect(DesignCore.Scene.tempEntities.count()).toBeGreaterThan(0);
61
+ const tempLine = DesignCore.Scene.tempEntities.get(0);
62
+ const deltaX = targetPoint.x - basePoint.x;
63
+ const deltaY = targetPoint.y - basePoint.y;
64
+ expect(tempLine.points[0].x).toBe(line.points[0].x + deltaX);
65
+ expect(tempLine.points[0].y).toBe(line.points[0].y + deltaY);
66
+ });
67
+
68
+ test('action pastes entities with correct offset', () => {
69
+ const line = DesignCore.CommandManager.createNew('Circle', { layer: '0', points: [new Point(), new Point(5, 0)] });
70
+ DesignCore.Scene.entities.add(line);
71
+ DesignCore.Scene.selectionManager.addToSelectionSet(0);
72
+ new Copyclip().action();
73
+
74
+ const basePoint = DesignCore.Clipboard.BasePoint;
75
+ expect(basePoint.x).toBe(-5);
76
+ expect(basePoint.y).toBe(-5);
77
+
78
+ const entityCount = DesignCore.Scene.entities.count();
79
+ const tool = new Pasteclip();
80
+ const insertion = new Point(10, 10);
81
+ tool.points.push(insertion); // simulate execute collected base point
82
+ tool.action();
83
+
84
+ expect(DesignCore.Scene.entities.count()).toBe(entityCount + 1);
85
+
86
+
87
+ const newEntity = DesignCore.Scene.entities.get(-1);
88
+ expect(newEntity.points[0].x).toBe(15);
89
+ expect(newEntity.points[0].y).toBe(15);
90
+
91
+ // Ensure the in clipboard was not mutated
92
+ const pasted = DesignCore.Clipboard.Entities[0];
93
+ expect(pasted.points[0].x).toBe(0);
94
+ expect(pasted.points[0].y).toBe(0);
95
+
96
+ // Verify pasted entity has a unique handle
97
+ expect(newEntity.handle).toBeDefined();
98
+ expect(newEntity.handle).not.toBe(line.handle);
99
+ });
100
+ });
@@ -0,0 +1,89 @@
1
+ import { Core } from '../../core/core/core.js';
2
+ import { Point } from '../../core/entities/point.js';
3
+ import { Purge } from '../../core/tools/purge.js';
4
+ import { DesignCore } from '../../core/designCore.js';
5
+
6
+ new Core();
7
+ const purge = new Purge();
8
+ const layerManager = DesignCore.LayerManager;
9
+ const ltypeManager = DesignCore.LTypeManager;
10
+ const blockManager = DesignCore.Scene.blockManager;
11
+ const dimStyleManager = DesignCore.DimStyleManager;
12
+
13
+ // Runc this before each test
14
+ beforeEach(() => {
15
+ // insert needed for block?
16
+ blockManager.addItem({ name: 'blockWithoutItems' });
17
+ blockManager.addItem({ name: 'blockWithItems' });
18
+
19
+ layerManager.addItem({ 'name': 'layerWithoutItems' });
20
+ layerManager.addItem({ 'name': 'layerWithItems' });
21
+
22
+ ltypeManager.addItem({ 'name': 'ltypeWithoutItems' });
23
+ ltypeManager.addItem({ 'name': 'ltypeWithItems' });
24
+
25
+ dimStyleManager.addItem({ 'name': 'dimstyleWithItems' });
26
+
27
+ const point1 = new Point();
28
+ const point2 = new Point(0, 100);
29
+
30
+ const data = { points: [point1, point2], layer: 'layerWithItems', lineType: 'ltypeWithItems' };
31
+
32
+ DesignCore.Scene.addItem('Insert', { blockName: 'blockWithItems' });
33
+ DesignCore.Scene.addItem('Line', data);
34
+ DesignCore.Scene.addItem('Circle', data);
35
+ DesignCore.Scene.addItem('Text', data);
36
+ });
37
+
38
+ test('Test purge.action', () => {
39
+ expect(blockManager.itemCount()).toBe(4);
40
+ purge.option = 'Blocks';
41
+ purge.action();
42
+ expect(blockManager.itemCount()).toBe(3);
43
+ expect(blockManager.itemExists('blockWithoutItems')).toBe(false);
44
+ expect(blockManager.itemExists('blockWithItems')).toBe(true);
45
+
46
+ expect(dimStyleManager.itemCount()).toBe(4);
47
+ purge.option = 'Dimstyles';
48
+ purge.action();
49
+ expect(dimStyleManager.itemCount()).toBe(1);
50
+
51
+ expect(layerManager.itemCount()).toBe(4);
52
+ purge.option = 'Layers';
53
+ purge.action();
54
+ expect(layerManager.itemCount()).toBe(3);
55
+ expect(layerManager.itemExists('layerWithoutItems')).toBe(false);
56
+ expect(layerManager.itemExists('layerWithItems')).toBe(true);
57
+
58
+ expect(ltypeManager.itemCount()).toBe(5);
59
+ purge.option = 'LTypes';
60
+ purge.action();
61
+ expect(ltypeManager.itemCount()).toBe(4);
62
+ expect(ltypeManager.itemExists('ltypeWithOutItems')).toBe(false);
63
+ expect(ltypeManager.itemExists('ltypeWithItems')).toBe(true);
64
+ });
65
+
66
+ test('Test purge.action - All', () => {
67
+ expect(blockManager.itemCount()).toBe(4);
68
+ expect(layerManager.itemCount()).toBe(4);
69
+ expect(ltypeManager.itemCount()).toBe(5);
70
+
71
+ purge.option = 'All';
72
+ purge.action();
73
+
74
+ // Blocks
75
+ expect(blockManager.itemCount()).toBe(3);
76
+ expect(blockManager.itemExists('blockWithoutItems')).toBe(false);
77
+ expect(blockManager.itemExists('blockWithItems')).toBe(true);
78
+
79
+ // Layers
80
+ expect(layerManager.itemCount()).toBe(3);
81
+ expect(layerManager.itemExists('layerWithoutItems')).toBe(false);
82
+ expect(layerManager.itemExists('layerWithItems')).toBe(true);
83
+
84
+ // Ltypes
85
+ expect(ltypeManager.itemCount()).toBe(4);
86
+ expect(ltypeManager.itemExists('ltypeWithOutItems')).toBe(false);
87
+ expect(ltypeManager.itemExists('ltypeWithItems')).toBe(true);
88
+ });
89
+
@@ -1,20 +1,92 @@
1
- import {Core} from '../../core/core/core.js';
2
- import {Point} from '../../core/entities/point.js';
3
- import {Rotate} from '../../core/tools/rotate.js';
1
+ import { Core } from '../../core/core/core.js';
2
+ import { Point } from '../../core/entities/point.js';
3
+ import { Rotate } from '../../core/tools/rotate.js';
4
4
 
5
5
  const core = new Core();
6
6
 
7
+ const inputScenarios = [
8
+ {
9
+ desc: 'rotate by point',
10
+ inputs: [new Point(10, 0), new Point(30, 20)],
11
+ result: new Point(17.07106, 7.07106),
12
+
13
+ },
14
+ {
15
+ desc: 'rotate by angle',
16
+ inputs: [new Point(10, 0), 45],
17
+ result: new Point(17.07106, 7.07106),
18
+
19
+ },
20
+ {
21
+ desc: 'rotate by negative angle',
22
+ inputs: [new Point(10, 0), -45],
23
+ result: new Point(17.07106, -7.07106),
24
+
25
+ },
26
+ {
27
+ desc: 'rotate 90 by reference point',
28
+ inputs: [new Point(10, 0), 'r', new Point(), new Point(0, 20), new Point(-10, 0)],
29
+ result: new Point(10, 10),
30
+ },
31
+ ];
32
+
33
+ test.each(inputScenarios)('Rotate.execute handles $desc', async (scenario) => {
34
+ const { inputs, result } = scenario;
35
+ const origInputManager = core.scene.inputManager;
36
+ let callCount = 0;
37
+ core.scene.inputManager = {
38
+ requestInput: async () => {
39
+ if (callCount < inputs.length) {
40
+ const input = inputs[callCount];
41
+ callCount++;
42
+ return input;
43
+ }
44
+ },
45
+ };
46
+
47
+ // clear all scene entities
48
+ core.scene.clear();
49
+ // create line
50
+ const pointOne = new Point(10, 0);
51
+ const pointTwo = new Point(20, 0);
52
+ core.scene.addItem('Line', { points: [pointOne, pointTwo] });
53
+
54
+ // select line
55
+ core.scene.selectionManager.addToSelectionSet(0);
56
+
57
+ const rotate = new Rotate();
58
+ await rotate.execute();
59
+
60
+ expect(core.scene.tempEntities.count()).toBe(0); // no temp entities before preview
61
+ rotate.preview(); // to set up any preview state if needed
62
+ expect(core.scene.tempEntities.count()).toBe(1); // preview should create temp entity
63
+
64
+ rotate.action();
65
+
66
+ const line = core.scene.entities.get(0);
67
+
68
+ expect(line.points[0].x).toBe(pointOne.x);
69
+ expect(line.points[0].y).toBeCloseTo(pointOne.y);
70
+
71
+ expect(line.points[1].x).toBeCloseTo(result.x);
72
+ expect(line.points[1].y).toBeCloseTo(result.y);
73
+
74
+
75
+ // Restore original inputManager
76
+ core.scene.inputManager = origInputManager;
77
+ });
78
+
7
79
  test('Test Rotate.action', () => {
8
80
  // Add items to scene
9
- core.scene.addItem('Line', {points: [new Point(10, 0), new Point(20, 0)]});
10
- core.scene.addItem('Circle', {points: [new Point(10, 0), new Point(20, 0)]});
11
- core.scene.addItem('Polyline', {points: [new Point(10, 0), new Point(20, 0)]});
12
- core.scene.addItem('Arc', {points: [new Point(10, 0), new Point(10, 10), new Point(0, 10)]});
13
- core.scene.addItem('Rectangle', {points: [new Point(10, 0), new Point(0, 10)]});
14
- core.scene.addItem('Text', {points: [new Point(10, 0), new Point(0, 10)], height: 10, rotation: 0, string: 'text test'});
81
+ core.scene.addItem('Line', { points: [new Point(10, 0), new Point(20, 0)] });
82
+ core.scene.addItem('Circle', { points: [new Point(10, 0), new Point(20, 0)] });
83
+ core.scene.addItem('Polyline', { points: [new Point(10, 0), new Point(20, 0)] });
84
+ core.scene.addItem('Arc', { points: [new Point(10, 0), new Point(10, 10), new Point(0, 10)] });
85
+ core.scene.addItem('Rectangle', { points: [new Point(10, 0), new Point(0, 10)] });
86
+ core.scene.addItem('Text', { points: [new Point(10, 0), new Point(0, 10)], height: 10, rotation: 0, string: 'text test' });
15
87
 
16
88
  // Add items to selection set
17
- for (let i = 0; i < core.scene.items.length; i++) {
89
+ for (let i = 0; i < core.scene.entities.count(); i++) {
18
90
  core.scene.selectionManager.addToSelectionSet(i);
19
91
  }
20
92
 
@@ -27,18 +99,15 @@ test('Test Rotate.action', () => {
27
99
  // set base point
28
100
  rotate.points.push(new Point());
29
101
 
30
- // set rotation reference point
31
- rotate.points.push(new Point(10, 0));
32
-
33
102
  // set rotation destination point
34
103
  rotate.points.push(new Point(0, 10));
35
104
 
36
105
  // Perform rotate
37
106
  rotate.action();
38
107
 
39
- for (let i = 0; i < core.scene.items.length; i++) {
40
- expect(core.scene.items[i].points[0].x).toBeCloseTo(0);
41
- expect(core.scene.items[i].points[0].y).toBeCloseTo(10);
108
+ for (let i = 0; i < core.scene.entities.count(); i++) {
109
+ expect(core.scene.entities.get(i).points[0].x).toBeCloseTo(0);
110
+ expect(core.scene.entities.get(i).points[0].y).toBeCloseTo(10);
42
111
  }
43
112
 
44
113
  /**
@@ -51,17 +120,14 @@ test('Test Rotate.action', () => {
51
120
  // set base point
52
121
  rotate.points.push(new Point());
53
122
 
54
- // set rotation reference point
55
- rotate.points.push(new Point(0, 10));
56
-
57
123
  // set rotation destination point
58
- rotate.points.push(new Point(10, 0));
124
+ rotate.points.push(new Point(0, -10));
59
125
 
60
126
  // Perform rotate
61
127
  rotate.action();
62
128
 
63
- for (let i = 0; i < core.scene.items.length; i++) {
64
- expect(core.scene.items[i].points[0].x).toBeCloseTo(10);
65
- expect(core.scene.items[i].points[0].y).toBeCloseTo(0);
129
+ for (let i = 0; i < core.scene.entities.count(); i++) {
130
+ expect(core.scene.entities.get(i).points[0].x).toBeCloseTo(10);
131
+ expect(core.scene.entities.get(i).points[0].y).toBeCloseTo(0);
66
132
  }
67
133
  });