bpmn-js 0.20.6 → 0.22.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 (410) hide show
  1. package/.eslintrc +33 -33
  2. package/.npmignore +8 -8
  3. package/.travis.yml +19 -17
  4. package/.wiredeps +88 -88
  5. package/CONTRIBUTING.md +55 -55
  6. package/Gruntfile.js +129 -129
  7. package/LICENSE +22 -22
  8. package/README.md +113 -113
  9. package/assets/bpmn-font/css/bpmn-embedded.css +159 -159
  10. package/assets/bpmn-font/css/bpmn.css +161 -161
  11. package/assets/bpmn-font/font/bpmn.svg +116 -116
  12. package/docs/architecture/overview.svg +48 -48
  13. package/docs/project/COMMIT_MESSAGES.md +82 -82
  14. package/docs/project/SETUP.md +66 -66
  15. package/docs/project/setup-alternative.sh +41 -41
  16. package/docs/project/setup.bat +45 -45
  17. package/docs/project/setup.sh +40 -40
  18. package/docs/translations.json +97 -97
  19. package/lib/Modeler.js +208 -208
  20. package/lib/NavigatedViewer.js +27 -27
  21. package/lib/Viewer.js +503 -503
  22. package/lib/core/index.js +5 -5
  23. package/lib/draw/BpmnRenderer.js +1934 -1934
  24. package/lib/draw/PathMap.js +478 -478
  25. package/lib/draw/index.js +5 -5
  26. package/lib/features/auto-resize/BpmnAutoResize.js +34 -34
  27. package/lib/features/auto-resize/BpmnAutoResizeProvider.js +51 -51
  28. package/lib/features/auto-resize/index.js +5 -5
  29. package/lib/features/context-pad/ContextPadProvider.js +374 -374
  30. package/lib/features/context-pad/index.js +11 -11
  31. package/lib/features/copy-paste/BpmnCopyPaste.js +157 -154
  32. package/lib/features/copy-paste/index.js +7 -7
  33. package/lib/features/distribute-elements/BpmnDistributeElements.js +34 -34
  34. package/lib/features/distribute-elements/index.js +7 -7
  35. package/lib/features/editor-actions/BpmnEditorActions.js +130 -130
  36. package/lib/features/editor-actions/index.js +15 -15
  37. package/lib/features/global-connect/BpmnGlobalConnect.js +49 -49
  38. package/lib/features/global-connect/index.js +7 -7
  39. package/lib/features/keyboard/BpmnKeyBindings.js +72 -72
  40. package/lib/features/keyboard/index.js +7 -7
  41. package/lib/features/label-editing/LabelEditingPreview.js +122 -0
  42. package/lib/features/label-editing/LabelEditingProvider.js +292 -193
  43. package/lib/features/label-editing/LabelUtil.js +43 -43
  44. package/lib/features/label-editing/cmd/UpdateLabelHandler.js +116 -112
  45. package/lib/features/label-editing/index.js +14 -9
  46. package/lib/features/modeling/BpmnFactory.js +97 -97
  47. package/lib/features/modeling/BpmnLayouter.js +191 -191
  48. package/lib/features/modeling/BpmnUpdater.js +692 -688
  49. package/lib/features/modeling/ElementFactory.js +218 -218
  50. package/lib/features/modeling/Modeling.js +183 -183
  51. package/lib/features/modeling/behavior/AppendBehavior.js +42 -42
  52. package/lib/features/modeling/behavior/CopyPasteBehavior.js +69 -69
  53. package/lib/features/modeling/behavior/CreateBoundaryEventBehavior.js +51 -51
  54. package/lib/features/modeling/behavior/CreateDataObjectBehavior.js +37 -37
  55. package/lib/features/modeling/behavior/CreateParticipantBehavior.js +91 -91
  56. package/lib/features/modeling/behavior/DataInputAssociationBehavior.js +151 -151
  57. package/lib/features/modeling/behavior/DeleteLaneBehavior.js +107 -107
  58. package/lib/features/modeling/behavior/DropOnFlowBehavior.js +165 -131
  59. package/lib/features/modeling/behavior/ImportDockingFix.js +80 -80
  60. package/lib/features/modeling/behavior/LabelBehavior.js +222 -222
  61. package/lib/features/modeling/behavior/ModelingFeedback.js +50 -50
  62. package/lib/features/modeling/behavior/RemoveElementBehavior.js +73 -73
  63. package/lib/features/modeling/behavior/RemoveParticipantBehavior.js +50 -50
  64. package/lib/features/modeling/behavior/ReplaceConnectionBehavior.js +128 -128
  65. package/lib/features/modeling/behavior/ReplaceElementBehaviour.js +118 -116
  66. package/lib/features/modeling/behavior/ResizeLaneBehavior.js +59 -59
  67. package/lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js +138 -138
  68. package/lib/features/modeling/behavior/UnclaimIdBehavior.js +27 -27
  69. package/lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js +54 -54
  70. package/lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js +156 -156
  71. package/lib/features/modeling/behavior/index.js +44 -44
  72. package/lib/features/modeling/behavior/util/GeometricUtil.js +129 -129
  73. package/lib/features/modeling/behavior/util/LabelLayoutUtil.js +218 -218
  74. package/lib/features/modeling/behavior/util/LineAttachmentUtil.js +233 -233
  75. package/lib/features/modeling/behavior/util/LineIntersect.js +36 -36
  76. package/lib/features/modeling/cmd/AddLaneHandler.js +83 -83
  77. package/lib/features/modeling/cmd/IdClaimHandler.js +41 -41
  78. package/lib/features/modeling/cmd/ResizeLaneHandler.js +125 -125
  79. package/lib/features/modeling/cmd/SplitLaneHandler.js +82 -82
  80. package/lib/features/modeling/cmd/UpdateCanvasRootHandler.js +78 -78
  81. package/lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js +185 -185
  82. package/lib/features/modeling/cmd/UpdatePropertiesHandler.js +264 -264
  83. package/lib/features/modeling/index.js +23 -23
  84. package/lib/features/modeling/util/LaneUtil.js +157 -157
  85. package/lib/features/modeling/util/ModelingUtil.js +48 -48
  86. package/lib/features/ordering/BpmnOrderingProvider.js +147 -147
  87. package/lib/features/ordering/index.js +6 -6
  88. package/lib/features/palette/PaletteProvider.js +158 -158
  89. package/lib/features/palette/index.js +13 -13
  90. package/lib/features/popup-menu/ReplaceMenuProvider.js +479 -479
  91. package/lib/features/popup-menu/index.js +7 -7
  92. package/lib/features/popup-menu/util/TypeUtil.js +41 -41
  93. package/lib/features/replace/BpmnReplace.js +197 -197
  94. package/lib/features/replace/ReplaceOptions.js +787 -787
  95. package/lib/features/replace/index.js +7 -7
  96. package/lib/features/replace-preview/BpmnReplacePreview.js +113 -113
  97. package/lib/features/replace-preview/index.js +5 -5
  98. package/lib/features/rules/BpmnRules.js +807 -806
  99. package/lib/features/rules/index.js +7 -7
  100. package/lib/features/search/BpmnSearchProvider.js +128 -128
  101. package/lib/features/search/index.js +7 -7
  102. package/lib/features/snapping/BpmnSnapping.js +511 -495
  103. package/lib/features/snapping/BpmnSnappingUtil.js +159 -159
  104. package/lib/features/snapping/index.js +3 -3
  105. package/lib/import/BpmnImporter.js +302 -302
  106. package/lib/import/BpmnTreeWalker.js +445 -445
  107. package/lib/import/Importer.js +69 -69
  108. package/lib/import/Util.js +8 -8
  109. package/lib/import/index.js +5 -5
  110. package/lib/util/DiUtil.js +60 -60
  111. package/lib/util/LabelUtil.js +139 -139
  112. package/lib/util/ModelUtil.js +31 -31
  113. package/lib/util/PoweredByUtil.js +82 -82
  114. package/lib/util/model/ModelCloneHelper.js +201 -201
  115. package/lib/util/model/ModelCloneUtils.js +35 -35
  116. package/package.json +22 -22
  117. package/resources/initial.bpmn +12 -12
  118. package/resources/screencast.gif +0 -0
  119. package/tasks/banner.txt +11 -11
  120. package/tasks/bundle.js +162 -162
  121. package/test/TestHelper.js +17 -17
  122. package/test/config/karma.unit.js +46 -46
  123. package/test/config/translation-reporter.js +48 -48
  124. package/test/fixtures/bpmn/align-elements.bpmn +136 -136
  125. package/test/fixtures/bpmn/basic.bpmn +17 -17
  126. package/test/fixtures/bpmn/boundary-events.bpmn +59 -59
  127. package/test/fixtures/bpmn/collaboration/collaboration-empty-participant.bpmn +13 -13
  128. package/test/fixtures/bpmn/collaboration/collaboration-message-flows.bpmn +89 -89
  129. package/test/fixtures/bpmn/collaboration/collaboration-participant.bpmn +59 -59
  130. package/test/fixtures/bpmn/collaboration/process-empty.bpmn +6 -6
  131. package/test/fixtures/bpmn/collaboration/process.bpmn +47 -47
  132. package/test/fixtures/bpmn/collaboration-data-items.bpmn +81 -81
  133. package/test/fixtures/bpmn/collaboration-message-flows.bpmn +82 -82
  134. package/test/fixtures/bpmn/collaboration-sequence-flows.bpmn +83 -83
  135. package/test/fixtures/bpmn/collaboration.bpmn +50 -50
  136. package/test/fixtures/bpmn/complex.bpmn +2151 -2151
  137. package/test/fixtures/bpmn/conditions.bpmn +82 -82
  138. package/test/fixtures/bpmn/containers.bpmn +128 -128
  139. package/test/fixtures/bpmn/distribute-elements-filtering.bpmn +58 -58
  140. package/test/fixtures/bpmn/distribute-elements.bpmn +232 -232
  141. package/test/fixtures/bpmn/draw/activity-markers-combination.bpmn +141 -141
  142. package/test/fixtures/bpmn/draw/activity-markers-simple.bpmn +47 -47
  143. package/test/fixtures/bpmn/draw/activity-markers.bpmn +212 -212
  144. package/test/fixtures/bpmn/draw/associations.bpmn +55 -55
  145. package/test/fixtures/bpmn/draw/boundary-event-with-refnode.bpmn +81 -81
  146. package/test/fixtures/bpmn/draw/boundary-event-without-refnode.bpmn +81 -81
  147. package/test/fixtures/bpmn/draw/boundary-event-z-index.bpmn +82 -82
  148. package/test/fixtures/bpmn/draw/call-activity.bpmn +12 -12
  149. package/test/fixtures/bpmn/draw/colors.bpmn +411 -411
  150. package/test/fixtures/bpmn/draw/conditional-flow-default.bpmn +100 -100
  151. package/test/fixtures/bpmn/draw/conditional-flow-gateways.bpmn +72 -72
  152. package/test/fixtures/bpmn/draw/conditional-flow-typed-task.bpmn +33 -33
  153. package/test/fixtures/bpmn/draw/conditional-flow.bpmn +248 -248
  154. package/test/fixtures/bpmn/draw/data-objects.bpmn +265 -265
  155. package/test/fixtures/bpmn/draw/event-subprocesses-collapsed.bpmn +200 -200
  156. package/test/fixtures/bpmn/draw/event-subprocesses-expanded.bpmn +274 -274
  157. package/test/fixtures/bpmn/draw/events-interrupting.bpmn +370 -370
  158. package/test/fixtures/bpmn/draw/events.bpmn +374 -374
  159. package/test/fixtures/bpmn/draw/gateway-type-default.bpmn +45 -45
  160. package/test/fixtures/bpmn/draw/gateways.bpmn +61 -61
  161. package/test/fixtures/bpmn/draw/group.bpmn +24 -24
  162. package/test/fixtures/bpmn/draw/message-marker.bpmn +112 -112
  163. package/test/fixtures/bpmn/draw/pools-with-collection-marker.bpmn +104 -104
  164. package/test/fixtures/bpmn/draw/pools.bpmn +82 -82
  165. package/test/fixtures/bpmn/draw/task-types.bpmn +77 -77
  166. package/test/fixtures/bpmn/draw/text-annotation.bpmn +71 -71
  167. package/test/fixtures/bpmn/draw/xor.bpmn +45 -45
  168. package/test/fixtures/bpmn/empty-definitions.bpmn +4 -4
  169. package/test/fixtures/bpmn/error/categoryValue.bpmn +26 -26
  170. package/test/fixtures/bpmn/error/di-plane-no-bpmn-element.bpmn +9 -9
  171. package/test/fixtures/bpmn/error/duplicate-ids.bpmn +14 -14
  172. package/test/fixtures/bpmn/error/invalid-child.bpmn +6 -6
  173. package/test/fixtures/bpmn/error/missing-namespace.bpmn +12 -12
  174. package/test/fixtures/bpmn/event-sub-processes.bpmn +47 -47
  175. package/test/fixtures/bpmn/extension/camunda.bpmn +52 -52
  176. package/test/fixtures/bpmn/extension/custom-override.bpmn +53 -53
  177. package/test/fixtures/bpmn/extension/custom.bpmn +53 -53
  178. package/test/fixtures/bpmn/features/copy-paste/basic.bpmn +111 -111
  179. package/test/fixtures/bpmn/features/copy-paste/collaboration-multiple.bpmn +102 -102
  180. package/test/fixtures/bpmn/features/copy-paste/collaboration.bpmn +74 -74
  181. package/test/fixtures/bpmn/features/copy-paste/data-associations.bpmn +61 -61
  182. package/test/fixtures/bpmn/features/copy-paste/properties.bpmn +43 -43
  183. package/test/fixtures/bpmn/features/drop/drop.bpmn +41 -41
  184. package/test/fixtures/bpmn/features/drop/recursive-task.bpmn +37 -37
  185. package/test/fixtures/bpmn/features/label-editing/labels.bpmn +178 -248
  186. package/test/fixtures/bpmn/features/modeling/update-label.bpmn +24 -24
  187. package/test/fixtures/bpmn/features/replace/01_replace.bpmn +193 -193
  188. package/test/fixtures/bpmn/features/replace/association-gateways.bpmn +173 -173
  189. package/test/fixtures/bpmn/features/replace/cancel-events.bpmn +49 -49
  190. package/test/fixtures/bpmn/features/replace/clone-properties.bpmn +141 -141
  191. package/test/fixtures/bpmn/features/replace/connection.bpmn +42 -42
  192. package/test/fixtures/bpmn/features/rules/event-based-gateway-outgoing-edge.bpmn +72 -72
  193. package/test/fixtures/bpmn/features/rules/link-event.bpmn +35 -35
  194. package/test/fixtures/bpmn/features/rules/text-annotation-association.bpmn +30 -30
  195. package/test/fixtures/bpmn/flow-markers.bpmn +212 -212
  196. package/test/fixtures/bpmn/import/boundaryEvent.bpmn +33 -33
  197. package/test/fixtures/bpmn/import/collaboration.bpmn +50 -50
  198. package/test/fixtures/bpmn/import/collapsed/collaboration.bpmn +76 -76
  199. package/test/fixtures/bpmn/import/collapsed/process.bpmn +84 -84
  200. package/test/fixtures/bpmn/import/collapsed/processWithChildren.bpmn +273 -273
  201. package/test/fixtures/bpmn/import/default-attrs.bpmn +24 -24
  202. package/test/fixtures/bpmn/import/error/boundaryEvent-invalidAttachToRef.bpmn +30 -30
  203. package/test/fixtures/bpmn/import/error/boundaryEvent-missingAttachToRef.bpmn +33 -33
  204. package/test/fixtures/bpmn/import/error/dangling-process-message-flow.bpmn +81 -81
  205. package/test/fixtures/bpmn/import/error/invalid-flow-element.bpmn +35 -35
  206. package/test/fixtures/bpmn/import/error/multiple-dis.bpmn +23 -23
  207. package/test/fixtures/bpmn/import/labels/collaboration-message-flows.bpmn +41 -41
  208. package/test/fixtures/bpmn/import/labels/collaboration.bpmn +72 -72
  209. package/test/fixtures/bpmn/import/labels/embedded.bpmn +39 -39
  210. package/test/fixtures/bpmn/import/labels/external-no-di.bpmn +42 -42
  211. package/test/fixtures/bpmn/import/labels/external.bpmn +69 -69
  212. package/test/fixtures/bpmn/import/position/position-testcase.bpmn +57 -57
  213. package/test/fixtures/bpmn/import/process.bpmn +60 -60
  214. package/test/fixtures/bpmn/nested-subprocesses.bpmn +118 -118
  215. package/test/fixtures/bpmn/sequence-flows.bpmn +60 -60
  216. package/test/fixtures/bpmn/simple-cropping.bpmn +84 -84
  217. package/test/fixtures/bpmn/simple-resizable.bpmn +50 -50
  218. package/test/fixtures/bpmn/simple.bpmn +60 -60
  219. package/test/fixtures/json/model/camunda.json +1042 -1042
  220. package/test/fixtures/json/model/custom-override.json +39 -39
  221. package/test/fixtures/json/model/custom.json +39 -39
  222. package/test/helper/TranslationCollector.js +17 -17
  223. package/test/helper/index.js +249 -249
  224. package/test/integration/CustomElementsSpec.js +223 -223
  225. package/test/integration/ReimportSpec.js +89 -89
  226. package/test/integration/SimpleModelingSpec.js +29 -29
  227. package/test/integration/custom-elements/CustomElementFactory.js +77 -77
  228. package/test/integration/custom-elements/CustomRenderer.js +151 -151
  229. package/test/integration/custom-elements/CustomRules.js +148 -148
  230. package/test/integration/custom-elements/CustomUpdater.js +115 -115
  231. package/test/integration/custom-elements/index.js +7 -7
  232. package/test/integration/model/BpmnModdleSpec.js +65 -65
  233. package/test/matchers/JSONMatcher.js +19 -19
  234. package/test/spec/ModelerSpec.js +401 -401
  235. package/test/spec/NavigatedViewerSpec.js +58 -58
  236. package/test/spec/ViewerSpec.js +977 -977
  237. package/test/spec/draw/BpmnRendererSpec.js +311 -311
  238. package/test/spec/environment/MockingSpec.js +53 -53
  239. package/test/spec/features/align-elements/BpmnAlignElementsSpec.js +137 -137
  240. package/test/spec/features/auto-resize/AutoResize.lanes.bpmn +54 -54
  241. package/test/spec/features/auto-resize/AutoResize.multi-selection.bpmn +22 -22
  242. package/test/spec/features/auto-resize/AutoResize.nested-sub-processes.bpmn +47 -47
  243. package/test/spec/features/auto-resize/AutoResize.participant.bpmn +38 -38
  244. package/test/spec/features/auto-resize/AutoResize.space-tool.bpmn +38 -38
  245. package/test/spec/features/auto-resize/AutoResize.sub-processes.bpmn +37 -37
  246. package/test/spec/features/auto-resize/AutoResizeSpec.js +607 -607
  247. package/test/spec/features/context-pad/ContextPad.activation.bpmn +51 -51
  248. package/test/spec/features/context-pad/ContextPadProviderSpec.js +440 -440
  249. package/test/spec/features/copy-paste/BpmnCopyPasteSpec.js +763 -725
  250. package/test/spec/features/copy-paste/DescriptorTree.js +58 -58
  251. package/test/spec/features/distribute-elements/BpmnDistributeElementsSpec.js +113 -113
  252. package/test/spec/features/editor-actions/BpmnEditorActionsSpec.js +72 -72
  253. package/test/spec/features/global-connect/BpmnGlobalConnectSpec.js +61 -61
  254. package/test/spec/features/keyboard/BpmnKeyBindingsSpec.js +142 -142
  255. package/test/spec/features/label-editing/LabelEditingPreviewSpec.js +133 -0
  256. package/test/spec/features/label-editing/LabelEditingProviderSpec.js +636 -601
  257. package/test/spec/features/label-editing/TouchIntegrationSpec.js +40 -40
  258. package/test/spec/features/modeling/AppendShapeSpec.js +332 -332
  259. package/test/spec/features/modeling/BendpointsSpec.js +25 -25
  260. package/test/spec/features/modeling/BpmnFactorySpec.js +73 -73
  261. package/test/spec/features/modeling/BpmnUpdater.bpmn +99 -99
  262. package/test/spec/features/modeling/BpmnUpdaterSpec.js +79 -79
  263. package/test/spec/features/modeling/CreateConnectionSpec.js +171 -171
  264. package/test/spec/features/modeling/DeleteConnectionSpec.js +75 -75
  265. package/test/spec/features/modeling/DeleteParticipantSpec.js +97 -97
  266. package/test/spec/features/modeling/DeleteShapeSpec.js +75 -75
  267. package/test/spec/features/modeling/DropSpec.js +123 -123
  268. package/test/spec/features/modeling/IdClaim.bpmn +13 -13
  269. package/test/spec/features/modeling/IdClaimSpec.js +50 -50
  270. package/test/spec/features/modeling/LabelBoundsSpec.js +342 -340
  271. package/test/spec/features/modeling/LabelBoundsSpec.simple.bpmn +27 -27
  272. package/test/spec/features/modeling/LabelLayouting.initial.bpmn +37 -37
  273. package/test/spec/features/modeling/LabelLayouting.move.bpmn +99 -99
  274. package/test/spec/features/modeling/LabelLayouting.special.bpmn +76 -76
  275. package/test/spec/features/modeling/LabelLayoutingSpec.js +603 -603
  276. package/test/spec/features/modeling/MoveConnectionSpec.js +101 -101
  277. package/test/spec/features/modeling/MoveElements.flow-collaboration.bpmn +45 -45
  278. package/test/spec/features/modeling/MoveElementsSpec.js +70 -70
  279. package/test/spec/features/modeling/MoveRulesSpec.js +151 -151
  280. package/test/spec/features/modeling/MoveShapeSpec.js +353 -353
  281. package/test/spec/features/modeling/ResizeShapeSpec.js +73 -73
  282. package/test/spec/features/modeling/SpaceToolSpec.js +251 -251
  283. package/test/spec/features/modeling/UpdateAttachmentSpec.js +96 -96
  284. package/test/spec/features/modeling/UpdateLabelSpec.js +130 -130
  285. package/test/spec/features/modeling/UpdatePropertiesSpec.js +503 -503
  286. package/test/spec/features/modeling/append/TextAnnotationSpec.js +136 -136
  287. package/test/spec/features/modeling/behavior/CompensationAssociationBehavior.bpmn +26 -26
  288. package/test/spec/features/modeling/behavior/CompensationAssociationBehaviorSpec.js +43 -43
  289. package/test/spec/features/modeling/behavior/CreateBoundaryEventBehaviorSpec.js +58 -58
  290. package/test/spec/features/modeling/behavior/CreateParticipantBehaviorSpec.js +224 -224
  291. package/test/spec/features/modeling/behavior/DataInputAssociationBehavior.bpmn +33 -33
  292. package/test/spec/features/modeling/behavior/DataInputAssociationBehaviorSpec.js +146 -146
  293. package/test/spec/features/modeling/behavior/DataObjectBehavior.create-data-association.bpmn +21 -21
  294. package/test/spec/features/modeling/behavior/DataObjectBehavior.data-object-reference.bpmn +13 -13
  295. package/test/spec/features/modeling/behavior/DataObjectBehavior.remove-data-association.bpmn +41 -41
  296. package/test/spec/features/modeling/behavior/DataObjectBehaviorSpec.js +297 -297
  297. package/test/spec/features/modeling/behavior/DataStoreBehavior.bpmn +26 -26
  298. package/test/spec/features/modeling/behavior/DataStoreBehavior.connect.bpmn +57 -57
  299. package/test/spec/features/modeling/behavior/DataStoreBehaviorSpec.js +228 -228
  300. package/test/spec/features/modeling/behavior/DropOnFlowBehavior.bpmn +71 -67
  301. package/test/spec/features/modeling/behavior/DropOnFlowBehaviorSpec.js +591 -418
  302. package/test/spec/features/modeling/behavior/ImportDockingFix.bpmn +61 -61
  303. package/test/spec/features/modeling/behavior/ImportDockingFixSpec.js +37 -37
  304. package/test/spec/features/modeling/behavior/LabelBehaviorSpec.js +277 -277
  305. package/test/spec/features/modeling/behavior/ReconnectConnection.data-association.bpmn +41 -41
  306. package/test/spec/features/modeling/behavior/ReconnectConnectionSpec.js +120 -120
  307. package/test/spec/features/modeling/behavior/RemoveElementBehavior.bpmn +181 -181
  308. package/test/spec/features/modeling/behavior/RemoveElementBehavior.perpendicular.bpmn +159 -159
  309. package/test/spec/features/modeling/behavior/RemoveElementBehaviorSpec.js +251 -251
  310. package/test/spec/features/modeling/behavior/RemoveParticipantBehaviorSpec.js +125 -125
  311. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.association.bpmn +26 -26
  312. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.boundary-events.bpmn +40 -40
  313. package/test/spec/features/modeling/behavior/ReplaceConnectionBehavior.message-sequence-flow.bpmn +121 -121
  314. package/test/spec/features/modeling/behavior/ReplaceConnectionBehaviorSpec.js +439 -439
  315. package/test/spec/features/modeling/behavior/ReplaceElementBehaviourSpec.js +450 -450
  316. package/test/spec/features/modeling/behavior/ToggleElementCollapseBehaviourSpec.js +653 -653
  317. package/test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.bpmn +48 -48
  318. package/test/spec/features/modeling/behavior/UnsetDefaultFlowBehaviorSpec.js +77 -77
  319. package/test/spec/features/modeling/behavior/util/GeometricUtilSpec.js +127 -127
  320. package/test/spec/features/modeling/behavior/util/LabelLayoutUtilSpec.js +75 -75
  321. package/test/spec/features/modeling/behavior/util/LineAttachmentUtilSpec.js +294 -294
  322. package/test/spec/features/modeling/behavior/util/LineIntersectSpec.js +32 -32
  323. package/test/spec/features/modeling/lanes/AddLaneSpec.js +263 -263
  324. package/test/spec/features/modeling/lanes/DeleteLaneSpec.js +126 -126
  325. package/test/spec/features/modeling/lanes/ResizeLaneSpec.js +366 -366
  326. package/test/spec/features/modeling/lanes/SplitLaneSpec.js +216 -216
  327. package/test/spec/features/modeling/lanes/UpdateFlowNodeRefsSpec.js +271 -271
  328. package/test/spec/features/modeling/lanes/flowNodeRefs.bpmn +56 -56
  329. package/test/spec/features/modeling/lanes/lanes.bpmn +83 -83
  330. package/test/spec/features/modeling/lanes/participant-lane.bpmn +27 -27
  331. package/test/spec/features/modeling/lanes/participant-no-lane.bpmn +22 -22
  332. package/test/spec/features/modeling/layout/Helper.js +64 -64
  333. package/test/spec/features/modeling/layout/LayoutAssociationSpec.js +101 -101
  334. package/test/spec/features/modeling/layout/LayoutConnectionSpec.js +98 -98
  335. package/test/spec/features/modeling/layout/LayoutDataAssociationSpec.js +98 -98
  336. package/test/spec/features/modeling/layout/LayoutMessageFlowSpec.bpmn +119 -119
  337. package/test/spec/features/modeling/layout/LayoutMessageFlowSpec.js +313 -313
  338. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.boundaryEvents.bpmn +65 -65
  339. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.flowElements.bpmn +70 -70
  340. package/test/spec/features/modeling/layout/LayoutSequenceFlowSpec.js +323 -323
  341. package/test/spec/features/ordering/BpmnOrderingProviderSpec.js +231 -231
  342. package/test/spec/features/ordering/Helper.js +185 -185
  343. package/test/spec/features/ordering/ordering-start-event.bpmn +17 -17
  344. package/test/spec/features/ordering/ordering-subprocesses.bpmn +41 -41
  345. package/test/spec/features/ordering/ordering.bpmn +105 -105
  346. package/test/spec/features/palette/PaletteProviderSpec.js +33 -33
  347. package/test/spec/features/popup-menu/ReplaceMenuProvider.collapsedSubProcess.bpmn +13 -13
  348. package/test/spec/features/popup-menu/ReplaceMenuProvider.compensation-activity.bpmn +12 -12
  349. package/test/spec/features/popup-menu/ReplaceMenuProvider.conditionalFlows.bpmn +66 -66
  350. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlows.bpmn +126 -126
  351. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn +48 -48
  352. package/test/spec/features/popup-menu/ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn +48 -48
  353. package/test/spec/features/popup-menu/ReplaceMenuProviderSpec.js +1957 -1957
  354. package/test/spec/features/replace/BpmnReplace.collaboration.bpmn +70 -70
  355. package/test/spec/features/replace/BpmnReplace.compensation.bpmn +12 -12
  356. package/test/spec/features/replace/BpmnReplace.eventSubProcesses.bpmn +126 -126
  357. package/test/spec/features/replace/BpmnReplaceSpec.js +1302 -1302
  358. package/test/spec/features/replace/ReplaceRulesSpec.js +78 -78
  359. package/test/spec/features/replace/SubProcess-collapsed.bpmn +36 -36
  360. package/test/spec/features/replace-preview/BpmnReplacePreviewSpec.js +304 -304
  361. package/test/spec/features/rules/BpmnRules.boundaryEvent.bpmn +93 -93
  362. package/test/spec/features/rules/BpmnRules.collaboration-dataAssociation.bpmn +35 -35
  363. package/test/spec/features/rules/BpmnRules.collaboration-lanes.bpmn +79 -79
  364. package/test/spec/features/rules/BpmnRules.collaboration.bpmn +138 -138
  365. package/test/spec/features/rules/BpmnRules.compensation.bpmn +65 -65
  366. package/test/spec/features/rules/BpmnRules.dataAssociation.bpmn +33 -33
  367. package/test/spec/features/rules/BpmnRules.eventBasedGateway.bpmn +82 -82
  368. package/test/spec/features/rules/BpmnRules.messageFlow.bpmn +27 -27
  369. package/test/spec/features/rules/BpmnRules.multiSelectionPools.bpmn +37 -37
  370. package/test/spec/features/rules/BpmnRules.process.bpmn +91 -91
  371. package/test/spec/features/rules/BpmnRules.subProcess-dataAssociation.bpmn +44 -44
  372. package/test/spec/features/rules/BpmnRulesSpec.js +1468 -1424
  373. package/test/spec/features/rules/Helper.js +82 -82
  374. package/test/spec/features/search/BpmnSearchProviderSpec.js +158 -158
  375. package/test/spec/features/search/bpmn-search-collaboration.bpmn +106 -106
  376. package/test/spec/features/search/bpmn-search.bpmn +100 -100
  377. package/test/spec/features/snapping/BpmnSnapping.connect.bpmn +36 -36
  378. package/test/spec/features/snapping/BpmnSnapping.labels.bpmn +27 -27
  379. package/test/spec/features/snapping/BpmnSnapping.lanes-resize.bpmn +43 -43
  380. package/test/spec/features/snapping/BpmnSnapping.participant-resize.bpmn +50 -50
  381. package/test/spec/features/snapping/BpmnSnapping.sequenceFlow.bpmn +41 -0
  382. package/test/spec/features/snapping/BpmnSnapping.subProcess-resize.bpmn +21 -21
  383. package/test/spec/features/snapping/BpmnSnapping.textAnnotation-resize.bpmn +22 -22
  384. package/test/spec/features/snapping/BpmnSnappingSpec.js +824 -758
  385. package/test/spec/features/snapping/BpmnSnappingUtil.lanes-flowNodes.bpmn +82 -82
  386. package/test/spec/features/snapping/BpmnSnappingUtil.lanes.bpmn +35 -35
  387. package/test/spec/features/snapping/BpmnSnappingUtilSpec.js +285 -285
  388. package/test/spec/i18n/custom-translate/custom-translate.js +14 -14
  389. package/test/spec/i18n/custom-translate/index.js +2 -2
  390. package/test/spec/i18n/translateSpec.js +56 -56
  391. package/test/spec/import/ImporterSpec.js +428 -428
  392. package/test/spec/import/ModelWiringSpec.js +194 -194
  393. package/test/spec/import/elements/AssociationSpec.collaboration.bpmn +51 -51
  394. package/test/spec/import/elements/AssociationSpec.compensation.bpmn +28 -28
  395. package/test/spec/import/elements/AssociationSpec.data-association.bpmn +39 -39
  396. package/test/spec/import/elements/AssociationSpec.data-input-output.bpmn +40 -40
  397. package/test/spec/import/elements/AssociationSpec.events.bpmn +51 -51
  398. package/test/spec/import/elements/AssociationSpec.js +175 -175
  399. package/test/spec/import/elements/AssociationSpec.text-annotation.bpmn +37 -37
  400. package/test/spec/import/elements/CollapsedSpec.js +118 -118
  401. package/test/spec/import/elements/LabelSpec.js +85 -85
  402. package/test/spec/import/lane-flowNodes.bpmn +44 -44
  403. package/test/spec/import/lane-missing-flowNodeRef.bpmn +24 -24
  404. package/test/spec/util/ModelCloneHelperSpec.js +381 -381
  405. package/test/spec/util/ModelUtilSpec.js +65 -65
  406. package/test/spec/util/camunda-moddle.js +70 -70
  407. package/test/util/MockEvents.js +62 -62
  408. package/test/util/ModelingUtil.js +117 -117
  409. package/test/util/custom-rules/CustomRules.js +18 -18
  410. package/test/util/custom-rules/index.js +4 -4
@@ -1,1302 +1,1302 @@
1
- 'use strict';
2
-
3
- require('../../../TestHelper');
4
-
5
- /* global bootstrapModeler, inject */
6
-
7
- var modelingModule = require('../../../../lib/features/modeling'),
8
- replaceModule = require('../../../../lib/features/replace'),
9
- moveModule = require('diagram-js/lib/features/move'),
10
- coreModule = require('../../../../lib/core');
11
-
12
- var is = require('../../../../lib/util/ModelUtil').is,
13
- isExpanded = require('../../../../lib/util/DiUtil').isExpanded,
14
- isInterrupting = require('../../../../lib/util/DiUtil').isInterrupting,
15
- isEventSubProcess = require('../../../../lib/util/DiUtil').isEventSubProcess,
16
- hasErrorEventDefinition = require('../../../../lib/util/DiUtil').hasErrorEventDefinition;
17
-
18
-
19
- describe('features/replace - bpmn replace', function() {
20
-
21
- var testModules = [
22
- coreModule,
23
- modelingModule,
24
- replaceModule,
25
- moveModule
26
- ];
27
-
28
-
29
- describe('should replace', function() {
30
-
31
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
32
-
33
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
34
-
35
-
36
- it('task', inject(function(elementRegistry, bpmnReplace) {
37
-
38
- // given
39
- var task = elementRegistry.get('Task_1');
40
- var newElementData = {
41
- type: 'bpmn:UserTask'
42
- };
43
-
44
- // when
45
- var newElement = bpmnReplace.replaceElement(task, newElementData);
46
-
47
- // then
48
- var businessObject = newElement.businessObject;
49
-
50
- expect(newElement).to.exist;
51
- expect(is(businessObject, 'bpmn:UserTask')).to.be.true;
52
- }));
53
-
54
-
55
- it('gateway', inject(function(elementRegistry, bpmnReplace) {
56
-
57
- // given
58
- var gateway = elementRegistry.get('ExclusiveGateway_1');
59
- var newElementData = {
60
- type: 'bpmn:InclusiveGateway'
61
- };
62
-
63
- // when
64
- var newElement = bpmnReplace.replaceElement(gateway, newElementData);
65
-
66
-
67
- // then
68
- var businessObject = newElement.businessObject;
69
-
70
- expect(newElement).to.exist;
71
- expect(is(businessObject, 'bpmn:InclusiveGateway')).to.be.true;
72
- }));
73
-
74
-
75
- it('expanded sub process', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
76
-
77
- // given
78
- var subProcess = elementRegistry.get('SubProcess_1'),
79
- newElementData = {
80
- type: 'bpmn:Transaction',
81
- isExpanded: true
82
- };
83
-
84
- // when
85
- var newElement = bpmnReplace.replaceElement(subProcess, newElementData);
86
-
87
- // then
88
- expect(newElement).to.exist;
89
- expect(is(newElement.businessObject, 'bpmn:Transaction')).to.be.true;
90
-
91
- }));
92
-
93
-
94
- it('transaction', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
95
-
96
- // given
97
- var transaction = elementRegistry.get('Transaction_1'),
98
- newElementData = {
99
- type: 'bpmn:SubProcess',
100
- isExpanded: true
101
- };
102
-
103
- // when
104
- var newElement = bpmnReplace.replaceElement(transaction, newElementData);
105
-
106
- // then
107
- expect(newElement).to.exist;
108
- expect(is(newElement.businessObject, 'bpmn:SubProcess')).to.be.true;
109
-
110
- }));
111
-
112
-
113
- it('event sub process', inject(function(elementRegistry, bpmnReplace) {
114
-
115
- // given
116
- var transaction = elementRegistry.get('SubProcess_1'),
117
- newElementData = {
118
- type: 'bpmn:SubProcess',
119
- triggeredByEvent: true
120
- };
121
-
122
- // when
123
- var newElement = bpmnReplace.replaceElement(transaction, newElementData);
124
-
125
- // then
126
- expect(newElement).to.exist;
127
- expect(isEventSubProcess(newElement)).to.be.true;
128
-
129
- }));
130
-
131
-
132
- it('non interrupting boundary event by interrupting boundary event',
133
- inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
134
-
135
- // given
136
- var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),
137
- newElementData = {
138
- type: 'bpmn:BoundaryEvent',
139
- eventDefinitionType: 'bpmn:EscalationEventDefinition'
140
- };
141
-
142
- // when
143
- var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
144
-
145
- // then
146
- expect(newElement).to.exist;
147
- expect(is(newElement.businessObject, 'bpmn:BoundaryEvent')).to.be.true;
148
- expect(newElement.businessObject.eventDefinitions[0].$type).to.equal('bpmn:EscalationEventDefinition');
149
- expect(newElement.businessObject.cancelActivity).to.be.true;
150
- })
151
- );
152
-
153
-
154
- it('interrupting boundary event by non interrupting boundary event',
155
- inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
156
-
157
- // given
158
- var boundaryEvent = elementRegistry.get('BoundaryEvent_2'),
159
- newElementData = {
160
- type: 'bpmn:BoundaryEvent',
161
- eventDefinitionType: 'bpmn:SignalEventDefinition',
162
- cancelActivity: false
163
- };
164
-
165
- // when
166
- var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
167
-
168
- // then
169
- expect(newElement).to.exist;
170
- expect(is(newElement, 'bpmn:BoundaryEvent')).to.be.true;
171
- expect(newElement.businessObject.eventDefinitions[0].$type).to.equal('bpmn:SignalEventDefinition');
172
- expect(newElement.businessObject.cancelActivity).to.be.false;
173
- })
174
- );
175
-
176
-
177
- it('boundary event and update host',
178
- inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
179
-
180
- // given
181
- var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),
182
- host = elementRegistry.get('Task_1'),
183
- newElementData = {
184
- type: 'bpmn:BoundaryEvent',
185
- eventDefinitionType: 'bpmn:ErrorEventDefinition'
186
- };
187
-
188
- // when
189
- var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
190
-
191
- // then
192
- expect(newElement.host).to.exist;
193
- expect(newElement.host).to.eql(host);
194
- })
195
- );
196
-
197
- });
198
-
199
-
200
- describe('should replace in collaboration', function() {
201
-
202
- var diagramXML = require('./BpmnReplace.collaboration.bpmn');
203
-
204
- beforeEach(bootstrapModeler(diagramXML, {
205
- modules: testModules
206
- }));
207
-
208
-
209
- it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {
210
-
211
- // given
212
- var shape = elementRegistry.get('Participant_1');
213
-
214
- // when
215
- var newShape = bpmnReplace.replaceElement(shape, { type: 'bpmn:Participant', isExpanded: false });
216
-
217
- // then
218
- expect(isExpanded(newShape)).to.be.false; // collapsed
219
- expect(newShape.children).to.be.empty;
220
- }));
221
-
222
-
223
- it('collapsed with expanded pool', inject(function(elementRegistry, bpmnReplace) {
224
-
225
- // given
226
- var shape = elementRegistry.get('Participant_2');
227
-
228
- // when
229
- var newShape = bpmnReplace.replaceElement(shape, { type: 'bpmn:Participant', isExpanded: true });
230
-
231
- // then
232
- expect(isExpanded(newShape)).to.be.true; // expanded
233
- expect(newShape.children).to.be.empty;
234
- }));
235
-
236
- });
237
-
238
-
239
- describe('position and size', function() {
240
-
241
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
242
-
243
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
244
-
245
-
246
- it('should keep position', inject(function(elementRegistry, bpmnReplace) {
247
-
248
- // given
249
- var task = elementRegistry.get('Task_1');
250
- var newElementData = {
251
- type: 'bpmn:UserTask'
252
- };
253
-
254
- // when
255
- var newElement = bpmnReplace.replaceElement(task, newElementData);
256
-
257
- // then
258
- expect(newElement.x).to.equal(task.x);
259
- expect(newElement.y).to.equal(task.y);
260
- }));
261
-
262
-
263
- it('should keep label position', inject(function(elementRegistry, bpmnReplace, modeling) {
264
-
265
- // given
266
- var startEvent = elementRegistry.get('StartEvent_1');
267
- var label = elementRegistry.get('StartEvent_1_label');
268
-
269
- var newElementData = {
270
- type: 'bpmn:EndEvent'
271
- };
272
-
273
- // when
274
- var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
275
-
276
- // then
277
- expect(newElement.label.x).to.equal(label.x);
278
- expect(newElement.label.y).to.equal(label.y);
279
- }));
280
-
281
- });
282
-
283
-
284
- describe('selection', function() {
285
-
286
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
287
-
288
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
289
-
290
-
291
- it('should select after replace',
292
- inject(function(elementRegistry, selection, bpmnReplace) {
293
-
294
- // given
295
- var task = elementRegistry.get('Task_1');
296
- var newElementData = {
297
- type: 'bpmn:UserTask'
298
- };
299
-
300
- // when
301
- var newElement = bpmnReplace.replaceElement(task, newElementData);
302
-
303
- // then
304
- expect(selection.get()).to.include(newElement);
305
- })
306
- );
307
-
308
- });
309
-
310
-
311
- describe('label', function() {
312
-
313
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
314
-
315
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
316
-
317
- it('should keep interior labels',
318
- inject(function(elementRegistry, bpmnReplace) {
319
-
320
- // given
321
- var task = elementRegistry.get('Task_1');
322
-
323
- var newElementData = {
324
- type: 'bpmn:UserTask'
325
- };
326
-
327
- // when
328
- var newElement = bpmnReplace.replaceElement(task, newElementData);
329
-
330
- // then
331
- expect(newElement.businessObject.name).to.equal('Task Caption');
332
- })
333
- );
334
-
335
-
336
- it('should keep exterior labels',
337
- inject(function(elementRegistry, bpmnReplace) {
338
-
339
- // given
340
- var startEvent = elementRegistry.get('StartEvent_1');
341
-
342
- var newElementData = {
343
- type: 'bpmn:EndEvent'
344
- };
345
-
346
- // when
347
- var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
348
-
349
- // then
350
- expect(newElement.label.hidden).to.equal(false);
351
- expect(newElement.label.labelTarget).to.equal(newElement);
352
- expect(newElement.businessObject.name).to.equal('KEEP ME');
353
- })
354
- );
355
-
356
- });
357
-
358
-
359
- describe('undo support', function() {
360
-
361
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
362
-
363
- beforeEach(bootstrapModeler(diagramXML, {
364
- modules: testModules
365
- }));
366
-
367
-
368
- it('should undo', inject(function(elementRegistry, bpmnReplace, commandStack) {
369
-
370
- // given
371
- var task = elementRegistry.get('Task_1');
372
- var newElementData = {
373
- type: 'bpmn:UserTask'
374
- };
375
-
376
- bpmnReplace.replaceElement(task, newElementData);
377
-
378
- // when
379
- commandStack.undo();
380
-
381
- // then
382
- var target = elementRegistry.get('Task_1'),
383
- businessObject = target.businessObject;
384
-
385
- expect(target).to.exist;
386
- expect(is(businessObject, 'bpmn:Task')).to.be.true;
387
- }));
388
-
389
-
390
- it('should redo', inject(function(elementRegistry, bpmnReplace, commandStack) {
391
-
392
- // given
393
- var task = elementRegistry.get('Task_1');
394
- var newElementData = {
395
- type: 'bpmn:UserTask'
396
- };
397
- var newElementData2 = {
398
- type: 'bpmn:ServiceTask'
399
- };
400
-
401
- var usertask = bpmnReplace.replaceElement(task, newElementData);
402
- var servicetask = bpmnReplace.replaceElement(usertask, newElementData2);
403
-
404
- commandStack.undo();
405
- commandStack.undo();
406
-
407
- // when
408
- commandStack.redo();
409
- commandStack.redo();
410
-
411
- // then
412
- var businessObject = servicetask.businessObject;
413
-
414
- expect(servicetask).to.exist;
415
- expect(is(businessObject, 'bpmn:ServiceTask')).to.be.true;
416
- }));
417
-
418
- });
419
-
420
-
421
- describe('connection handling', function() {
422
-
423
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
424
-
425
- beforeEach(bootstrapModeler(diagramXML, {
426
- modules: testModules
427
- }));
428
-
429
-
430
- it('should reconnect valid', inject(function(elementRegistry, bpmnReplace) {
431
-
432
- // given
433
- var task = elementRegistry.get('Task_1');
434
- var newElementData = {
435
- type: 'bpmn:UserTask'
436
- };
437
-
438
- // when
439
- var newElement = bpmnReplace.replaceElement(task, newElementData);
440
-
441
- // then
442
- var incoming = newElement.incoming[0],
443
- outgoing = newElement.outgoing[0],
444
- source = incoming.source,
445
- target = outgoing.target;
446
-
447
- expect(incoming).to.exist;
448
- expect(outgoing).to.exist;
449
- expect(source).to.eql(elementRegistry.get('StartEvent_1'));
450
- expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
451
- }));
452
-
453
-
454
- it('should remove invalid (incoming)', inject(function(elementRegistry, bpmnReplace) {
455
-
456
- // given
457
- var task = elementRegistry.get('StartEvent_1');
458
- var newElementData = {
459
- type: 'bpmn:EndEvent'
460
- };
461
-
462
- // when
463
- var newElement = bpmnReplace.replaceElement(task, newElementData);
464
-
465
- // then
466
- expect(newElement.incoming).to.be.empty;
467
- }));
468
-
469
-
470
- it('should remove invalid (outgoing)', inject(function(elementRegistry, bpmnReplace) {
471
-
472
- // given
473
- var task = elementRegistry.get('EndEvent_1');
474
- var newElementData = {
475
- type: 'bpmn:StartEvent'
476
- };
477
-
478
- // when
479
- var newElement = bpmnReplace.replaceElement(task, newElementData);
480
-
481
- // then
482
- expect(newElement.outgoing).to.be.empty;
483
- }));
484
-
485
-
486
- describe('undo support', function() {
487
-
488
- it('should reconnect valid', inject(function(elementRegistry, bpmnReplace, commandStack) {
489
-
490
- // given
491
- var task = elementRegistry.get('Task_1');
492
- var newElementData = {
493
- type: 'bpmn:UserTask'
494
- };
495
-
496
- bpmnReplace.replaceElement(task, newElementData);
497
-
498
- // when
499
- commandStack.undo();
500
-
501
- // then
502
- var newTask = elementRegistry.get('Task_1');
503
- var incoming = newTask.incoming[0],
504
- outgoing = newTask.outgoing[0],
505
- source = incoming.source,
506
- target = outgoing.target;
507
-
508
- expect(incoming).to.exist;
509
- expect(outgoing).to.exist;
510
- expect(source).to.eql(elementRegistry.get('StartEvent_1'));
511
- expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
512
- }));
513
-
514
-
515
- it('should remove invalid (invalid)',
516
- inject(function(elementRegistry, bpmnReplace, commandStack) {
517
-
518
- // given
519
- var startEvent = elementRegistry.get('StartEvent_1');
520
- var newElementData = {
521
- type: 'bpmn:EndEvent'
522
- };
523
-
524
- bpmnReplace.replaceElement(startEvent, newElementData);
525
-
526
- // when
527
- commandStack.undo();
528
-
529
- // then
530
- var newEvent = elementRegistry.get('StartEvent_1');
531
- var incoming = newEvent.incoming[0],
532
- outgoing = newEvent.outgoing[0],
533
- target = outgoing.target;
534
-
535
-
536
- expect(incoming).not.to.exist;
537
- expect(outgoing).to.exist;
538
- expect(target).to.eql(elementRegistry.get('Task_1'));
539
- })
540
- );
541
-
542
-
543
- it('should remove invalid outgoing connections',
544
- inject(function(elementRegistry, bpmnReplace, commandStack) {
545
-
546
- // given
547
- var endEvent = elementRegistry.get('EndEvent_1');
548
- var newElementData = {
549
- type: 'bpmn:StartEvent'
550
- };
551
-
552
- bpmnReplace.replaceElement(endEvent, newElementData);
553
-
554
- // when
555
- commandStack.undo();
556
-
557
- // then
558
- var newEvent = elementRegistry.get('EndEvent_1');
559
- var incoming = newEvent.incoming[0],
560
- outgoing = newEvent.outgoing[0],
561
- source = incoming.source;
562
-
563
- expect(incoming).to.exist;
564
- expect(outgoing).not.to.exist;
565
- expect(source).to.eql(elementRegistry.get('Transaction_1'));
566
- })
567
- );
568
-
569
- });
570
-
571
-
572
- describe('redo support', function() {
573
-
574
- it('should reconnect valid connections',
575
- inject(function(elementRegistry, bpmnReplace, commandStack) {
576
-
577
- // given
578
- var task = elementRegistry.get('Task_1');
579
- var newElementData = {
580
- type: 'bpmn:UserTask'
581
- };
582
- var newElement = bpmnReplace.replaceElement(task, newElementData);
583
-
584
- // when
585
- commandStack.undo();
586
- commandStack.redo();
587
-
588
- // then
589
- var incoming = newElement.incoming[0],
590
- outgoing = newElement.outgoing[0],
591
- source = incoming.source,
592
- target = outgoing.target;
593
-
594
-
595
- expect(incoming).to.exist;
596
- expect(outgoing).to.exist;
597
- expect(source).to.eql(elementRegistry.get('StartEvent_1'));
598
- expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
599
- })
600
- );
601
-
602
-
603
- it('should remove invalid incoming connections',
604
- inject(function(elementRegistry, bpmnReplace, commandStack) {
605
-
606
- // given
607
- var startEvent = elementRegistry.get('StartEvent_1');
608
- var newElementData = {
609
- type: 'bpmn:EndEvent'
610
- };
611
- var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
612
-
613
- // when
614
- commandStack.undo();
615
- commandStack.redo();
616
-
617
- // then
618
- var incoming = newElement.incoming[0],
619
- outgoing = newElement.outgoing[0];
620
-
621
-
622
- expect(incoming).not.to.exist;
623
- expect(outgoing).not.to.exist;
624
- })
625
- );
626
-
627
-
628
- it('should remove invalid outgoing connections',
629
- inject(function(elementRegistry, bpmnReplace, commandStack) {
630
-
631
- // given
632
- var endEvent = elementRegistry.get('EndEvent_1');
633
- var newElementData = {
634
- type: 'bpmn:StartEvent'
635
- };
636
- var newElement = bpmnReplace.replaceElement(endEvent, newElementData);
637
-
638
- // when
639
- commandStack.undo();
640
- commandStack.redo();
641
-
642
- // then
643
- var incoming = newElement.incoming[0],
644
- outgoing = newElement.outgoing[0];
645
-
646
-
647
- expect(incoming).not.to.exist;
648
- expect(outgoing).not.to.exist;
649
- })
650
- );
651
-
652
- });
653
-
654
- });
655
-
656
-
657
- describe('children handling', function() {
658
-
659
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
660
-
661
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
662
-
663
-
664
- it('should update bpmn containment properly', inject(function(elementRegistry, modeling, bpmnReplace) {
665
-
666
- // given
667
- var subProcessShape = elementRegistry.get('SubProcess_1');
668
- var startEventShape = elementRegistry.get('StartEvent_2');
669
- var taskShape = elementRegistry.get('Task_2');
670
- var sequenceFlowConnection = elementRegistry.get('SequenceFlow_4');
671
-
672
- var transactionShapeData = {
673
- type: 'bpmn:Transaction'
674
- };
675
-
676
- // when
677
- var transactionShape = bpmnReplace.replaceElement(subProcessShape, transactionShapeData);
678
-
679
- // then
680
- var subProcess = subProcessShape.businessObject,
681
- transaction = transactionShape.businessObject;
682
-
683
- var transactionChildren = transaction.get('flowElements');
684
- var subProcessChildren = subProcess.get('flowElements');
685
-
686
- expect(transactionChildren).to.include(startEventShape.businessObject);
687
- expect(transactionChildren).to.include(taskShape.businessObject);
688
- expect(transactionChildren).to.include(sequenceFlowConnection.businessObject);
689
-
690
- expect(subProcessChildren).not.to.include(startEventShape.businessObject);
691
- expect(subProcessChildren).not.to.include(taskShape.businessObject);
692
- expect(subProcessChildren).not.to.include(sequenceFlowConnection.businessObject);
693
- }));
694
-
695
- });
696
-
697
-
698
- describe('sub processes', function() {
699
-
700
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
701
-
702
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
703
-
704
-
705
- it('should allow morphing expanded into expanded ad hoc',
706
- inject(function(bpmnReplace, elementRegistry) {
707
-
708
- // given
709
- var element = elementRegistry.get('SubProcess_1');
710
- var newElementData = {
711
- type: 'bpmn:AdHocSubProcess'
712
- };
713
-
714
- // when
715
- var newElement = bpmnReplace.replaceElement(element, newElementData);
716
-
717
- // then
718
- expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
719
- expect(isExpanded(newElement)).to.be.true;
720
- })
721
- );
722
-
723
-
724
- it('should allow morphing expanded ad hoc into expanded',
725
- inject(function(bpmnReplace, elementRegistry) {
726
-
727
- // given
728
- var element = elementRegistry.get('AdHocSubProcessExpanded');
729
- var newElementData = {
730
- type: 'bpmn:SubProcess'
731
- };
732
-
733
- // when
734
- var newElement = bpmnReplace.replaceElement(element, newElementData);
735
-
736
- // then
737
- expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
738
- expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;
739
- expect(isExpanded(newElement)).to.be.true;
740
- })
741
- );
742
-
743
-
744
- it('should allow morphing collapsed into collapsed ad hoc',
745
- inject(function(bpmnReplace, elementRegistry) {
746
-
747
- // given
748
- var element = elementRegistry.get('SubProcessCollapsed');
749
- var newElementData = {
750
- type: 'bpmn:AdHocSubProcess'
751
- };
752
-
753
- // when
754
- var newElement = bpmnReplace.replaceElement(element, newElementData);
755
-
756
- // then
757
- expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
758
- expect(isExpanded(newElement)).not.to.be.true;
759
- })
760
- );
761
-
762
-
763
- it('should allow morphing collapsed ad hoc into collapsed',
764
- inject(function(bpmnReplace, elementRegistry) {
765
-
766
- // given
767
- var element = elementRegistry.get('AdHocSubProcessCollapsed');
768
- var newElementData = {
769
- type: 'bpmn:SubProcess'
770
- };
771
-
772
- // when
773
- var newElement = bpmnReplace.replaceElement(element, newElementData);
774
-
775
- // then
776
- expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
777
- expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;
778
- expect(isExpanded(newElement)).not.to.be.true;
779
- })
780
- );
781
-
782
-
783
- it('should keep size when morphing ad hoc',
784
- inject(function(bpmnReplace, elementRegistry, modeling) {
785
-
786
- // given
787
- var element = elementRegistry.get('SubProcess_1');
788
- var newElementData = {
789
- type: 'bpmn:AdHocSubProcess'
790
- };
791
-
792
- var width = element.width,
793
- height = element.height;
794
-
795
- modeling.resizeShape(element, {
796
- x: element.x,
797
- y: element.y,
798
- width: width + 20,
799
- height: height + 20
800
- });
801
-
802
- // when
803
- var newElement = bpmnReplace.replaceElement(element, newElementData);
804
-
805
- // then
806
- expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
807
- expect(isExpanded(newElement)).to.be.true;
808
-
809
- expect(newElement.width).to.equal(width + 20);
810
- expect(newElement.height).to.equal(height + 20);
811
- })
812
- );
813
-
814
- });
815
-
816
-
817
- describe('morph task with boundaryEvent', function() {
818
-
819
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
820
-
821
- beforeEach(bootstrapModeler(diagramXML, {
822
- modules: testModules
823
- }));
824
-
825
-
826
- it('to expanded sub process', inject(function(bpmnReplace, elementRegistry) {
827
-
828
- // given
829
- var element = elementRegistry.get('Task_1');
830
- var newElementData = {
831
- type: 'bpmn:SubProcess',
832
- isExpanded: true
833
- };
834
-
835
- // when
836
- var newElement = bpmnReplace.replaceElement(element, newElementData);
837
-
838
- // then
839
- expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
840
- expect(isExpanded(newElement)).to.be.true;
841
-
842
- // and keep boundaryEvent
843
- expect(newElement.attachers.length).to.be.equal(2);
844
- }));
845
-
846
-
847
- it('to collapsed sub process', inject(function(bpmnReplace, elementRegistry) {
848
-
849
- // given
850
- var element = elementRegistry.get('Task_1');
851
- var newElementData = {
852
- type: 'bpmn:SubProcess',
853
- isExpanded: false
854
- };
855
-
856
- // when
857
- var newElement = bpmnReplace.replaceElement(element, newElementData);
858
-
859
- // then
860
- expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
861
- expect(isExpanded(newElement)).to.be.false;
862
-
863
- // and keep boundaryEvent
864
- expect(newElement.attachers.length).to.eql(2);
865
- }));
866
-
867
- });
868
-
869
-
870
- describe('compensation activity', function() {
871
-
872
- var diagramXML = require('./BpmnReplace.compensation.bpmn');
873
-
874
- beforeEach(bootstrapModeler(diagramXML, {
875
- modules: testModules
876
- }));
877
-
878
-
879
- it('should keep isForCompensation attr', inject(function(elementRegistry, bpmnReplace) {
880
-
881
- // given
882
- var task = elementRegistry.get('Task_1');
883
- var newElementData = {
884
- type: 'bpmn:ServiceTask'
885
- };
886
-
887
- // when
888
- var newElement = bpmnReplace.replaceElement(task, newElementData);
889
-
890
- // then
891
- expect(newElement.businessObject.isForCompensation).to.be.true;
892
- }));
893
-
894
- });
895
-
896
-
897
- describe('event sub processes', function() {
898
-
899
- var diagramXML = require('./BpmnReplace.eventSubProcesses.bpmn');
900
-
901
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
902
-
903
-
904
- it('should remove connections',
905
- inject(function(elementRegistry, bpmnReplace) {
906
-
907
- // given
908
- var transaction = elementRegistry.get('SubProcess_1');
909
- var newElementData = {
910
- type: 'bpmn:SubProcess',
911
- triggeredByEvent: true
912
- };
913
-
914
- // when
915
- var newElement = bpmnReplace.replaceElement(transaction, newElementData);
916
-
917
- // then
918
- var incoming = newElement.incoming[0],
919
- outgoing = newElement.outgoing[0];
920
-
921
- expect(incoming).not.to.exist;
922
- expect(outgoing).not.to.exist;
923
- })
924
- );
925
-
926
-
927
- it('should replace non-interrupting start event after moving it outside event sub process',
928
- inject(function(bpmnReplace, elementRegistry, modeling) {
929
-
930
- // given
931
- var startEvent = elementRegistry.get('StartEvent_2'),
932
- root = elementRegistry.get('Process_1');
933
-
934
- // when
935
- modeling.moveElements([startEvent], { x: 0, y: 200 }, root);
936
-
937
- var startEventAfter = elementRegistry.filter(function(element) {
938
- return is(element, 'bpmn:StartEvent') && element.parent === root;
939
- })[0];
940
-
941
- // then
942
- expect(isInterrupting(startEventAfter)).to.be.true;
943
- expect(startEventAfter.parent).to.equal(root);
944
-
945
- })
946
- );
947
-
948
-
949
- it('should replace non-interrupting start event after moving it to a regular sub process',
950
- inject(function(bpmnReplace, elementRegistry, modeling) {
951
-
952
- // given
953
- var startEvent = elementRegistry.get('StartEvent_2'),
954
- subProcess = elementRegistry.get('SubProcess_1');
955
-
956
- // when
957
- modeling.moveElements([startEvent], { x: 260, y: 60 }, subProcess);
958
-
959
- var startEventAfter = elementRegistry.filter(function(element) {
960
- return is(element, 'bpmn:StartEvent') && element.parent === subProcess;
961
- })[0];
962
-
963
- // then
964
- expect(isInterrupting(startEventAfter)).to.be.true;
965
- expect(startEventAfter.parent).to.equal(subProcess);
966
-
967
- })
968
- );
969
-
970
-
971
- it('should not replace non-interrupting start event after moving it to another event sub process',
972
- inject(function(bpmnReplace, elementRegistry, modeling) {
973
-
974
- // given
975
- var startEvent = elementRegistry.get('StartEvent_2'),
976
- subProcess = elementRegistry.get('SubProcess_1');
977
-
978
- var eventSubProcess = bpmnReplace.replaceElement(subProcess, {
979
- type: 'bpmn:SubProcess',
980
- triggeredByEvent: true,
981
- isExpanded: true
982
- });
983
-
984
- // when
985
- modeling.moveElements([startEvent], { x: 260, y: 60 }, eventSubProcess);
986
-
987
- var startEventAfter = elementRegistry.filter(function(element) {
988
- return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';
989
- })[1];
990
-
991
- // then
992
- expect(startEvent.id).to.equal(startEventAfter.id);
993
- expect(startEventAfter.parent).to.equal(eventSubProcess);
994
-
995
- })
996
- );
997
-
998
-
999
- it('should not replace interrupting start event after moving it outside event sub process',
1000
- inject(function(bpmnReplace, elementRegistry, modeling) {
1001
-
1002
- // given
1003
- var startEvent = elementRegistry.get('StartEvent_2'),
1004
- root = elementRegistry.get('Process_1');
1005
-
1006
- var interruptingStartEvent = bpmnReplace.replaceElement(startEvent, { type: 'bpmn:StartEvent' });
1007
-
1008
- // when
1009
- modeling.moveElements([interruptingStartEvent], { x: 0, y: 200 }, root);
1010
-
1011
- var startEventAfter = elementRegistry.filter(function(element) {
1012
- return is(element, 'bpmn:StartEvent')
1013
- && element.type !== 'label'
1014
- && element.parent === root;
1015
- })[0];
1016
-
1017
- // then
1018
- expect(startEventAfter).to.equal(interruptingStartEvent);
1019
- expect(startEventAfter.parent).to.equal(root);
1020
-
1021
- })
1022
- );
1023
-
1024
-
1025
- it('should replace non-interrupting start event when replacing parent event sub process',
1026
- inject(function(elementRegistry, bpmnReplace) {
1027
-
1028
- // given
1029
- var eventSubProcess = elementRegistry.get('SubProcess_2');
1030
-
1031
- // when
1032
- var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });
1033
-
1034
- // then
1035
- var replacedStartEvent = elementRegistry.filter(function(element) {
1036
- return (element.parent === subProcess && element.type !== 'label');
1037
- })[0];
1038
-
1039
- expect(isInterrupting(replacedStartEvent)).to.be.true;
1040
- expect(replacedStartEvent.parent).to.equal(subProcess);
1041
- })
1042
- );
1043
-
1044
-
1045
- it('should not replace non-interrupting start event when moving parent event sub process',
1046
- inject(function(elementRegistry, bpmnReplace, modeling) {
1047
-
1048
- // given
1049
- var eventSubProcess = elementRegistry.get('SubProcess_2'),
1050
- startEvent = elementRegistry.get('StartEvent_2');
1051
-
1052
- // when
1053
- modeling.moveElements([eventSubProcess], { x: 20, y: 30 });
1054
-
1055
- // start event after moving parent
1056
- var startEventAfter = elementRegistry.filter(function(element) {
1057
- return (element.parent === eventSubProcess && element.type !== 'label');
1058
- })[0];
1059
-
1060
- // then
1061
- expect(startEventAfter).to.equal(startEvent);
1062
- expect(startEventAfter.parent).to.eql(eventSubProcess);
1063
- })
1064
- );
1065
-
1066
- it('should replace error start event after moving it outside event sub process',
1067
- inject(function(elementRegistry, bpmnReplace, modeling) {
1068
-
1069
- // given
1070
- var startEvent = elementRegistry.get('StartEvent_3'),
1071
- root = elementRegistry.get('Process_1');
1072
-
1073
- // when
1074
- modeling.moveElements([startEvent], { x: 0, y: 200 }, root);
1075
-
1076
- var startEventAfter = elementRegistry.filter(function(element) {
1077
- return is(element, 'bpmn:StartEvent') && element.parent === root;
1078
- })[0];
1079
-
1080
- // then
1081
- expect(hasErrorEventDefinition(startEventAfter)).to.be.false;
1082
- expect(startEventAfter.parent).to.equal(root);
1083
- })
1084
- );
1085
-
1086
- it('should replace error start event after moving it to a regular sub process',
1087
- inject(function(bpmnReplace, elementRegistry, modeling) {
1088
-
1089
- // given
1090
- var startEvent = elementRegistry.get('StartEvent_3'),
1091
- subProcess = elementRegistry.get('SubProcess_1');
1092
-
1093
- // when
1094
- modeling.moveElements([startEvent], { x: 260, y: 60 }, subProcess);
1095
-
1096
- var startEventAfter = elementRegistry.filter(function(element) {
1097
- return is(element, 'bpmn:StartEvent') && element.parent === subProcess;
1098
- })[0];
1099
-
1100
- // then
1101
- expect(hasErrorEventDefinition(startEventAfter)).to.be.false;
1102
- expect(startEventAfter.parent).to.equal(subProcess);
1103
-
1104
- })
1105
- );
1106
-
1107
- it('should not replace error start event after moving it to another event sub process',
1108
- inject(function(bpmnReplace, elementRegistry, modeling) {
1109
-
1110
- // given
1111
- var startEvent = elementRegistry.get('StartEvent_3'),
1112
- subProcess = elementRegistry.get('SubProcess_1');
1113
-
1114
- var eventSubProcess = bpmnReplace.replaceElement(subProcess, {
1115
- type: 'bpmn:SubProcess',
1116
- triggeredByEvent: true,
1117
- isExpanded: true
1118
- });
1119
-
1120
- // when
1121
- modeling.moveElements([startEvent], { x: 260, y: 60 }, eventSubProcess);
1122
-
1123
- var startEventAfter = elementRegistry.filter(function(element) {
1124
- return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';
1125
- })[1];
1126
-
1127
- // then
1128
- expect(hasErrorEventDefinition(startEventAfter)).to.be.true;
1129
- expect(startEventAfter.parent).to.equal(eventSubProcess);
1130
-
1131
- })
1132
- );
1133
-
1134
- it('should replace error start event when replacing parent event sub process',
1135
- inject(function(elementRegistry, bpmnReplace) {
1136
-
1137
- // given
1138
- var eventSubProcess = elementRegistry.get('SubProcess_3');
1139
-
1140
- // when
1141
- var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });
1142
-
1143
- // then
1144
- var replacedStartEvent = elementRegistry.filter(function(element) {
1145
- return (element.parent === subProcess && element.type !== 'label');
1146
- })[0];
1147
-
1148
- expect(hasErrorEventDefinition(replacedStartEvent)).to.be.false;
1149
- expect(replacedStartEvent.parent).to.equal(subProcess);
1150
- })
1151
- );
1152
-
1153
-
1154
- it('should not replace error start event when moving parent event sub process',
1155
- inject(function(elementRegistry, bpmnReplace, modeling) {
1156
-
1157
- // given
1158
- var eventSubProcess = elementRegistry.get('SubProcess_3'),
1159
- startEvent = elementRegistry.get('StartEvent_3');
1160
-
1161
- // when
1162
- modeling.moveElements([eventSubProcess], { x: 20, y: 30 });
1163
-
1164
- // start event after moving parent
1165
- var startEventAfter = elementRegistry.filter(function(element) {
1166
- return (element.parent === eventSubProcess && element.type !== 'label');
1167
- })[0];
1168
-
1169
- // then
1170
- expect(startEventAfter).to.equal(startEvent);
1171
- expect(startEventAfter.parent).to.eql(eventSubProcess);
1172
- })
1173
- );
1174
-
1175
- });
1176
-
1177
-
1178
- describe('events', function() {
1179
-
1180
- var diagramXML = require('../../../fixtures/bpmn/basic.bpmn');
1181
-
1182
- beforeEach(bootstrapModeler(diagramXML, {
1183
- modules: testModules
1184
- }));
1185
-
1186
-
1187
- it('should properly set parent of event definitions', inject(function(elementRegistry, modeling, bpmnReplace) {
1188
-
1189
- var startEvent = elementRegistry.get('StartEvent_1');
1190
-
1191
- var messageEvent = bpmnReplace.replaceElement(startEvent, {
1192
- type: 'bpmn:StartEvent',
1193
- eventDefinitionType: 'bpmn:MessageEventDefinition'
1194
- });
1195
-
1196
- var parent = messageEvent.businessObject.eventDefinitions[0].$parent;
1197
-
1198
- expect(parent).to.exist;
1199
- expect(parent).to.equal(messageEvent.businessObject);
1200
- }));
1201
-
1202
- });
1203
-
1204
-
1205
- describe('properties', function() {
1206
- var clonePropertiesXML = require('../../../fixtures/bpmn/features/replace/clone-properties.bpmn');
1207
-
1208
- var camundaPackage = require('../../../fixtures/json/model/camunda');
1209
-
1210
- beforeEach(bootstrapModeler(clonePropertiesXML, {
1211
- modules: testModules,
1212
- moddleExtensions: {
1213
- camunda: camundaPackage
1214
- }
1215
- }));
1216
-
1217
- it('should copy properties', inject(function(elementRegistry, bpmnReplace) {
1218
- // given
1219
- var task = elementRegistry.get('Task_1');
1220
- var newElementData = {
1221
- type: 'bpmn:ServiceTask'
1222
- };
1223
-
1224
- // when
1225
- var newElement = bpmnReplace.replaceElement(task, newElementData);
1226
-
1227
- // then
1228
- var businessObject = newElement.businessObject;
1229
-
1230
- expect(businessObject.asyncBefore).to.be.true;
1231
- expect(businessObject.jobPriority).to.equal('100');
1232
- expect(businessObject.documentation[0].text).to.equal('hello world');
1233
-
1234
- var extensionElements = businessObject.extensionElements.values;
1235
-
1236
- expect(extensionElements).to.have.length(4);
1237
-
1238
- expect(is(extensionElements[0], 'camunda:InputOutput')).to.be.true;
1239
-
1240
- expect(is(extensionElements[0].inputParameters[0], 'camunda:InputParameter')).to.be.true;
1241
-
1242
- expect(extensionElements[0].inputParameters[0].name).to.equal('Input_1');
1243
- expect(extensionElements[0].inputParameters[0].value).to.equal('foo');
1244
-
1245
- expect(is(extensionElements[0].outputParameters[0], 'camunda:OutputParameter')).to.be.true;
1246
-
1247
- expect(extensionElements[0].outputParameters[0].name).to.equal('Output_1');
1248
- expect(extensionElements[0].outputParameters[0].value).to.equal('bar');
1249
-
1250
- expect(is(extensionElements[1], 'camunda:Properties')).to.be.true;
1251
-
1252
- expect(is(extensionElements[1].values[0], 'camunda:Property')).to.be.true;
1253
-
1254
- expect(extensionElements[1].values[0].name).to.equal('bar');
1255
- expect(extensionElements[1].values[0].value).to.equal('foo');
1256
-
1257
- expect(is(extensionElements[2], 'camunda:ExecutionListener')).to.be.true;
1258
-
1259
- expect(extensionElements[2].class).to.equal('reallyClassy');
1260
- expect(extensionElements[2].event).to.equal('start');
1261
-
1262
- expect(is(extensionElements[3], 'camunda:FailedJobRetryTimeCycle')).to.be.true;
1263
-
1264
- expect(extensionElements[3].body).to.equal('10');
1265
- }));
1266
-
1267
- });
1268
-
1269
-
1270
- describe('colors', function() {
1271
-
1272
- var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
1273
-
1274
- beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
1275
-
1276
- it('should maintain colors', inject(function(elementRegistry, bpmnReplace, modeling) {
1277
-
1278
- // given
1279
- var task = elementRegistry.get('Task_1');
1280
- var newElementData = {
1281
- type: 'bpmn:UserTask'
1282
- },
1283
- fill = '#BBDEFB',
1284
- stroke = '#1E88E5';
1285
-
1286
- modeling.setColor(task, { fill: fill, stroke: stroke });
1287
-
1288
- // when
1289
- var newElement = bpmnReplace.replaceElement(task, newElementData);
1290
-
1291
- // then
1292
- var businessObject = newElement.businessObject;
1293
-
1294
- expect(businessObject.di.fill).to.equal(fill);
1295
- expect(businessObject.di.stroke).to.equal(stroke);
1296
-
1297
- expect(newElement.colors).to.not.exist;
1298
- }));
1299
-
1300
- });
1301
-
1302
- });
1
+ 'use strict';
2
+
3
+ require('../../../TestHelper');
4
+
5
+ /* global bootstrapModeler, inject */
6
+
7
+ var modelingModule = require('../../../../lib/features/modeling'),
8
+ replaceModule = require('../../../../lib/features/replace'),
9
+ moveModule = require('diagram-js/lib/features/move'),
10
+ coreModule = require('../../../../lib/core');
11
+
12
+ var is = require('../../../../lib/util/ModelUtil').is,
13
+ isExpanded = require('../../../../lib/util/DiUtil').isExpanded,
14
+ isInterrupting = require('../../../../lib/util/DiUtil').isInterrupting,
15
+ isEventSubProcess = require('../../../../lib/util/DiUtil').isEventSubProcess,
16
+ hasErrorEventDefinition = require('../../../../lib/util/DiUtil').hasErrorEventDefinition;
17
+
18
+
19
+ describe('features/replace - bpmn replace', function() {
20
+
21
+ var testModules = [
22
+ coreModule,
23
+ modelingModule,
24
+ replaceModule,
25
+ moveModule
26
+ ];
27
+
28
+
29
+ describe('should replace', function() {
30
+
31
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
32
+
33
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
34
+
35
+
36
+ it('task', inject(function(elementRegistry, bpmnReplace) {
37
+
38
+ // given
39
+ var task = elementRegistry.get('Task_1');
40
+ var newElementData = {
41
+ type: 'bpmn:UserTask'
42
+ };
43
+
44
+ // when
45
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
46
+
47
+ // then
48
+ var businessObject = newElement.businessObject;
49
+
50
+ expect(newElement).to.exist;
51
+ expect(is(businessObject, 'bpmn:UserTask')).to.be.true;
52
+ }));
53
+
54
+
55
+ it('gateway', inject(function(elementRegistry, bpmnReplace) {
56
+
57
+ // given
58
+ var gateway = elementRegistry.get('ExclusiveGateway_1');
59
+ var newElementData = {
60
+ type: 'bpmn:InclusiveGateway'
61
+ };
62
+
63
+ // when
64
+ var newElement = bpmnReplace.replaceElement(gateway, newElementData);
65
+
66
+
67
+ // then
68
+ var businessObject = newElement.businessObject;
69
+
70
+ expect(newElement).to.exist;
71
+ expect(is(businessObject, 'bpmn:InclusiveGateway')).to.be.true;
72
+ }));
73
+
74
+
75
+ it('expanded sub process', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
76
+
77
+ // given
78
+ var subProcess = elementRegistry.get('SubProcess_1'),
79
+ newElementData = {
80
+ type: 'bpmn:Transaction',
81
+ isExpanded: true
82
+ };
83
+
84
+ // when
85
+ var newElement = bpmnReplace.replaceElement(subProcess, newElementData);
86
+
87
+ // then
88
+ expect(newElement).to.exist;
89
+ expect(is(newElement.businessObject, 'bpmn:Transaction')).to.be.true;
90
+
91
+ }));
92
+
93
+
94
+ it('transaction', inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
95
+
96
+ // given
97
+ var transaction = elementRegistry.get('Transaction_1'),
98
+ newElementData = {
99
+ type: 'bpmn:SubProcess',
100
+ isExpanded: true
101
+ };
102
+
103
+ // when
104
+ var newElement = bpmnReplace.replaceElement(transaction, newElementData);
105
+
106
+ // then
107
+ expect(newElement).to.exist;
108
+ expect(is(newElement.businessObject, 'bpmn:SubProcess')).to.be.true;
109
+
110
+ }));
111
+
112
+
113
+ it('event sub process', inject(function(elementRegistry, bpmnReplace) {
114
+
115
+ // given
116
+ var transaction = elementRegistry.get('SubProcess_1'),
117
+ newElementData = {
118
+ type: 'bpmn:SubProcess',
119
+ triggeredByEvent: true
120
+ };
121
+
122
+ // when
123
+ var newElement = bpmnReplace.replaceElement(transaction, newElementData);
124
+
125
+ // then
126
+ expect(newElement).to.exist;
127
+ expect(isEventSubProcess(newElement)).to.be.true;
128
+
129
+ }));
130
+
131
+
132
+ it('non interrupting boundary event by interrupting boundary event',
133
+ inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
134
+
135
+ // given
136
+ var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),
137
+ newElementData = {
138
+ type: 'bpmn:BoundaryEvent',
139
+ eventDefinitionType: 'bpmn:EscalationEventDefinition'
140
+ };
141
+
142
+ // when
143
+ var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
144
+
145
+ // then
146
+ expect(newElement).to.exist;
147
+ expect(is(newElement.businessObject, 'bpmn:BoundaryEvent')).to.be.true;
148
+ expect(newElement.businessObject.eventDefinitions[0].$type).to.equal('bpmn:EscalationEventDefinition');
149
+ expect(newElement.businessObject.cancelActivity).to.be.true;
150
+ })
151
+ );
152
+
153
+
154
+ it('interrupting boundary event by non interrupting boundary event',
155
+ inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
156
+
157
+ // given
158
+ var boundaryEvent = elementRegistry.get('BoundaryEvent_2'),
159
+ newElementData = {
160
+ type: 'bpmn:BoundaryEvent',
161
+ eventDefinitionType: 'bpmn:SignalEventDefinition',
162
+ cancelActivity: false
163
+ };
164
+
165
+ // when
166
+ var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
167
+
168
+ // then
169
+ expect(newElement).to.exist;
170
+ expect(is(newElement, 'bpmn:BoundaryEvent')).to.be.true;
171
+ expect(newElement.businessObject.eventDefinitions[0].$type).to.equal('bpmn:SignalEventDefinition');
172
+ expect(newElement.businessObject.cancelActivity).to.be.false;
173
+ })
174
+ );
175
+
176
+
177
+ it('boundary event and update host',
178
+ inject(function(elementRegistry, modeling, bpmnReplace, canvas) {
179
+
180
+ // given
181
+ var boundaryEvent = elementRegistry.get('BoundaryEvent_1'),
182
+ host = elementRegistry.get('Task_1'),
183
+ newElementData = {
184
+ type: 'bpmn:BoundaryEvent',
185
+ eventDefinitionType: 'bpmn:ErrorEventDefinition'
186
+ };
187
+
188
+ // when
189
+ var newElement = bpmnReplace.replaceElement(boundaryEvent, newElementData);
190
+
191
+ // then
192
+ expect(newElement.host).to.exist;
193
+ expect(newElement.host).to.eql(host);
194
+ })
195
+ );
196
+
197
+ });
198
+
199
+
200
+ describe('should replace in collaboration', function() {
201
+
202
+ var diagramXML = require('./BpmnReplace.collaboration.bpmn');
203
+
204
+ beforeEach(bootstrapModeler(diagramXML, {
205
+ modules: testModules
206
+ }));
207
+
208
+
209
+ it('expanded with collapsed pool', inject(function(elementRegistry, bpmnReplace) {
210
+
211
+ // given
212
+ var shape = elementRegistry.get('Participant_1');
213
+
214
+ // when
215
+ var newShape = bpmnReplace.replaceElement(shape, { type: 'bpmn:Participant', isExpanded: false });
216
+
217
+ // then
218
+ expect(isExpanded(newShape)).to.be.false; // collapsed
219
+ expect(newShape.children).to.be.empty;
220
+ }));
221
+
222
+
223
+ it('collapsed with expanded pool', inject(function(elementRegistry, bpmnReplace) {
224
+
225
+ // given
226
+ var shape = elementRegistry.get('Participant_2');
227
+
228
+ // when
229
+ var newShape = bpmnReplace.replaceElement(shape, { type: 'bpmn:Participant', isExpanded: true });
230
+
231
+ // then
232
+ expect(isExpanded(newShape)).to.be.true; // expanded
233
+ expect(newShape.children).to.be.empty;
234
+ }));
235
+
236
+ });
237
+
238
+
239
+ describe('position and size', function() {
240
+
241
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
242
+
243
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
244
+
245
+
246
+ it('should keep position', inject(function(elementRegistry, bpmnReplace) {
247
+
248
+ // given
249
+ var task = elementRegistry.get('Task_1');
250
+ var newElementData = {
251
+ type: 'bpmn:UserTask'
252
+ };
253
+
254
+ // when
255
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
256
+
257
+ // then
258
+ expect(newElement.x).to.equal(task.x);
259
+ expect(newElement.y).to.equal(task.y);
260
+ }));
261
+
262
+
263
+ it('should keep label position', inject(function(elementRegistry, bpmnReplace, modeling) {
264
+
265
+ // given
266
+ var startEvent = elementRegistry.get('StartEvent_1');
267
+ var label = elementRegistry.get('StartEvent_1_label');
268
+
269
+ var newElementData = {
270
+ type: 'bpmn:EndEvent'
271
+ };
272
+
273
+ // when
274
+ var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
275
+
276
+ // then
277
+ expect(newElement.label.x).to.equal(label.x);
278
+ expect(newElement.label.y).to.equal(label.y);
279
+ }));
280
+
281
+ });
282
+
283
+
284
+ describe('selection', function() {
285
+
286
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
287
+
288
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
289
+
290
+
291
+ it('should select after replace',
292
+ inject(function(elementRegistry, selection, bpmnReplace) {
293
+
294
+ // given
295
+ var task = elementRegistry.get('Task_1');
296
+ var newElementData = {
297
+ type: 'bpmn:UserTask'
298
+ };
299
+
300
+ // when
301
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
302
+
303
+ // then
304
+ expect(selection.get()).to.include(newElement);
305
+ })
306
+ );
307
+
308
+ });
309
+
310
+
311
+ describe('label', function() {
312
+
313
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
314
+
315
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
316
+
317
+ it('should keep interior labels',
318
+ inject(function(elementRegistry, bpmnReplace) {
319
+
320
+ // given
321
+ var task = elementRegistry.get('Task_1');
322
+
323
+ var newElementData = {
324
+ type: 'bpmn:UserTask'
325
+ };
326
+
327
+ // when
328
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
329
+
330
+ // then
331
+ expect(newElement.businessObject.name).to.equal('Task Caption');
332
+ })
333
+ );
334
+
335
+
336
+ it('should keep exterior labels',
337
+ inject(function(elementRegistry, bpmnReplace) {
338
+
339
+ // given
340
+ var startEvent = elementRegistry.get('StartEvent_1');
341
+
342
+ var newElementData = {
343
+ type: 'bpmn:EndEvent'
344
+ };
345
+
346
+ // when
347
+ var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
348
+
349
+ // then
350
+ expect(newElement.label.hidden).to.equal(false);
351
+ expect(newElement.label.labelTarget).to.equal(newElement);
352
+ expect(newElement.businessObject.name).to.equal('KEEP ME');
353
+ })
354
+ );
355
+
356
+ });
357
+
358
+
359
+ describe('undo support', function() {
360
+
361
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
362
+
363
+ beforeEach(bootstrapModeler(diagramXML, {
364
+ modules: testModules
365
+ }));
366
+
367
+
368
+ it('should undo', inject(function(elementRegistry, bpmnReplace, commandStack) {
369
+
370
+ // given
371
+ var task = elementRegistry.get('Task_1');
372
+ var newElementData = {
373
+ type: 'bpmn:UserTask'
374
+ };
375
+
376
+ bpmnReplace.replaceElement(task, newElementData);
377
+
378
+ // when
379
+ commandStack.undo();
380
+
381
+ // then
382
+ var target = elementRegistry.get('Task_1'),
383
+ businessObject = target.businessObject;
384
+
385
+ expect(target).to.exist;
386
+ expect(is(businessObject, 'bpmn:Task')).to.be.true;
387
+ }));
388
+
389
+
390
+ it('should redo', inject(function(elementRegistry, bpmnReplace, commandStack) {
391
+
392
+ // given
393
+ var task = elementRegistry.get('Task_1');
394
+ var newElementData = {
395
+ type: 'bpmn:UserTask'
396
+ };
397
+ var newElementData2 = {
398
+ type: 'bpmn:ServiceTask'
399
+ };
400
+
401
+ var usertask = bpmnReplace.replaceElement(task, newElementData);
402
+ var servicetask = bpmnReplace.replaceElement(usertask, newElementData2);
403
+
404
+ commandStack.undo();
405
+ commandStack.undo();
406
+
407
+ // when
408
+ commandStack.redo();
409
+ commandStack.redo();
410
+
411
+ // then
412
+ var businessObject = servicetask.businessObject;
413
+
414
+ expect(servicetask).to.exist;
415
+ expect(is(businessObject, 'bpmn:ServiceTask')).to.be.true;
416
+ }));
417
+
418
+ });
419
+
420
+
421
+ describe('connection handling', function() {
422
+
423
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
424
+
425
+ beforeEach(bootstrapModeler(diagramXML, {
426
+ modules: testModules
427
+ }));
428
+
429
+
430
+ it('should reconnect valid', inject(function(elementRegistry, bpmnReplace) {
431
+
432
+ // given
433
+ var task = elementRegistry.get('Task_1');
434
+ var newElementData = {
435
+ type: 'bpmn:UserTask'
436
+ };
437
+
438
+ // when
439
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
440
+
441
+ // then
442
+ var incoming = newElement.incoming[0],
443
+ outgoing = newElement.outgoing[0],
444
+ source = incoming.source,
445
+ target = outgoing.target;
446
+
447
+ expect(incoming).to.exist;
448
+ expect(outgoing).to.exist;
449
+ expect(source).to.eql(elementRegistry.get('StartEvent_1'));
450
+ expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
451
+ }));
452
+
453
+
454
+ it('should remove invalid (incoming)', inject(function(elementRegistry, bpmnReplace) {
455
+
456
+ // given
457
+ var task = elementRegistry.get('StartEvent_1');
458
+ var newElementData = {
459
+ type: 'bpmn:EndEvent'
460
+ };
461
+
462
+ // when
463
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
464
+
465
+ // then
466
+ expect(newElement.incoming).to.be.empty;
467
+ }));
468
+
469
+
470
+ it('should remove invalid (outgoing)', inject(function(elementRegistry, bpmnReplace) {
471
+
472
+ // given
473
+ var task = elementRegistry.get('EndEvent_1');
474
+ var newElementData = {
475
+ type: 'bpmn:StartEvent'
476
+ };
477
+
478
+ // when
479
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
480
+
481
+ // then
482
+ expect(newElement.outgoing).to.be.empty;
483
+ }));
484
+
485
+
486
+ describe('undo support', function() {
487
+
488
+ it('should reconnect valid', inject(function(elementRegistry, bpmnReplace, commandStack) {
489
+
490
+ // given
491
+ var task = elementRegistry.get('Task_1');
492
+ var newElementData = {
493
+ type: 'bpmn:UserTask'
494
+ };
495
+
496
+ bpmnReplace.replaceElement(task, newElementData);
497
+
498
+ // when
499
+ commandStack.undo();
500
+
501
+ // then
502
+ var newTask = elementRegistry.get('Task_1');
503
+ var incoming = newTask.incoming[0],
504
+ outgoing = newTask.outgoing[0],
505
+ source = incoming.source,
506
+ target = outgoing.target;
507
+
508
+ expect(incoming).to.exist;
509
+ expect(outgoing).to.exist;
510
+ expect(source).to.eql(elementRegistry.get('StartEvent_1'));
511
+ expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
512
+ }));
513
+
514
+
515
+ it('should remove invalid (invalid)',
516
+ inject(function(elementRegistry, bpmnReplace, commandStack) {
517
+
518
+ // given
519
+ var startEvent = elementRegistry.get('StartEvent_1');
520
+ var newElementData = {
521
+ type: 'bpmn:EndEvent'
522
+ };
523
+
524
+ bpmnReplace.replaceElement(startEvent, newElementData);
525
+
526
+ // when
527
+ commandStack.undo();
528
+
529
+ // then
530
+ var newEvent = elementRegistry.get('StartEvent_1');
531
+ var incoming = newEvent.incoming[0],
532
+ outgoing = newEvent.outgoing[0],
533
+ target = outgoing.target;
534
+
535
+
536
+ expect(incoming).not.to.exist;
537
+ expect(outgoing).to.exist;
538
+ expect(target).to.eql(elementRegistry.get('Task_1'));
539
+ })
540
+ );
541
+
542
+
543
+ it('should remove invalid outgoing connections',
544
+ inject(function(elementRegistry, bpmnReplace, commandStack) {
545
+
546
+ // given
547
+ var endEvent = elementRegistry.get('EndEvent_1');
548
+ var newElementData = {
549
+ type: 'bpmn:StartEvent'
550
+ };
551
+
552
+ bpmnReplace.replaceElement(endEvent, newElementData);
553
+
554
+ // when
555
+ commandStack.undo();
556
+
557
+ // then
558
+ var newEvent = elementRegistry.get('EndEvent_1');
559
+ var incoming = newEvent.incoming[0],
560
+ outgoing = newEvent.outgoing[0],
561
+ source = incoming.source;
562
+
563
+ expect(incoming).to.exist;
564
+ expect(outgoing).not.to.exist;
565
+ expect(source).to.eql(elementRegistry.get('Transaction_1'));
566
+ })
567
+ );
568
+
569
+ });
570
+
571
+
572
+ describe('redo support', function() {
573
+
574
+ it('should reconnect valid connections',
575
+ inject(function(elementRegistry, bpmnReplace, commandStack) {
576
+
577
+ // given
578
+ var task = elementRegistry.get('Task_1');
579
+ var newElementData = {
580
+ type: 'bpmn:UserTask'
581
+ };
582
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
583
+
584
+ // when
585
+ commandStack.undo();
586
+ commandStack.redo();
587
+
588
+ // then
589
+ var incoming = newElement.incoming[0],
590
+ outgoing = newElement.outgoing[0],
591
+ source = incoming.source,
592
+ target = outgoing.target;
593
+
594
+
595
+ expect(incoming).to.exist;
596
+ expect(outgoing).to.exist;
597
+ expect(source).to.eql(elementRegistry.get('StartEvent_1'));
598
+ expect(target).to.eql(elementRegistry.get('ExclusiveGateway_1'));
599
+ })
600
+ );
601
+
602
+
603
+ it('should remove invalid incoming connections',
604
+ inject(function(elementRegistry, bpmnReplace, commandStack) {
605
+
606
+ // given
607
+ var startEvent = elementRegistry.get('StartEvent_1');
608
+ var newElementData = {
609
+ type: 'bpmn:EndEvent'
610
+ };
611
+ var newElement = bpmnReplace.replaceElement(startEvent, newElementData);
612
+
613
+ // when
614
+ commandStack.undo();
615
+ commandStack.redo();
616
+
617
+ // then
618
+ var incoming = newElement.incoming[0],
619
+ outgoing = newElement.outgoing[0];
620
+
621
+
622
+ expect(incoming).not.to.exist;
623
+ expect(outgoing).not.to.exist;
624
+ })
625
+ );
626
+
627
+
628
+ it('should remove invalid outgoing connections',
629
+ inject(function(elementRegistry, bpmnReplace, commandStack) {
630
+
631
+ // given
632
+ var endEvent = elementRegistry.get('EndEvent_1');
633
+ var newElementData = {
634
+ type: 'bpmn:StartEvent'
635
+ };
636
+ var newElement = bpmnReplace.replaceElement(endEvent, newElementData);
637
+
638
+ // when
639
+ commandStack.undo();
640
+ commandStack.redo();
641
+
642
+ // then
643
+ var incoming = newElement.incoming[0],
644
+ outgoing = newElement.outgoing[0];
645
+
646
+
647
+ expect(incoming).not.to.exist;
648
+ expect(outgoing).not.to.exist;
649
+ })
650
+ );
651
+
652
+ });
653
+
654
+ });
655
+
656
+
657
+ describe('children handling', function() {
658
+
659
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
660
+
661
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
662
+
663
+
664
+ it('should update bpmn containment properly', inject(function(elementRegistry, modeling, bpmnReplace) {
665
+
666
+ // given
667
+ var subProcessShape = elementRegistry.get('SubProcess_1');
668
+ var startEventShape = elementRegistry.get('StartEvent_2');
669
+ var taskShape = elementRegistry.get('Task_2');
670
+ var sequenceFlowConnection = elementRegistry.get('SequenceFlow_4');
671
+
672
+ var transactionShapeData = {
673
+ type: 'bpmn:Transaction'
674
+ };
675
+
676
+ // when
677
+ var transactionShape = bpmnReplace.replaceElement(subProcessShape, transactionShapeData);
678
+
679
+ // then
680
+ var subProcess = subProcessShape.businessObject,
681
+ transaction = transactionShape.businessObject;
682
+
683
+ var transactionChildren = transaction.get('flowElements');
684
+ var subProcessChildren = subProcess.get('flowElements');
685
+
686
+ expect(transactionChildren).to.include(startEventShape.businessObject);
687
+ expect(transactionChildren).to.include(taskShape.businessObject);
688
+ expect(transactionChildren).to.include(sequenceFlowConnection.businessObject);
689
+
690
+ expect(subProcessChildren).not.to.include(startEventShape.businessObject);
691
+ expect(subProcessChildren).not.to.include(taskShape.businessObject);
692
+ expect(subProcessChildren).not.to.include(sequenceFlowConnection.businessObject);
693
+ }));
694
+
695
+ });
696
+
697
+
698
+ describe('sub processes', function() {
699
+
700
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
701
+
702
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
703
+
704
+
705
+ it('should allow morphing expanded into expanded ad hoc',
706
+ inject(function(bpmnReplace, elementRegistry) {
707
+
708
+ // given
709
+ var element = elementRegistry.get('SubProcess_1');
710
+ var newElementData = {
711
+ type: 'bpmn:AdHocSubProcess'
712
+ };
713
+
714
+ // when
715
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
716
+
717
+ // then
718
+ expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
719
+ expect(isExpanded(newElement)).to.be.true;
720
+ })
721
+ );
722
+
723
+
724
+ it('should allow morphing expanded ad hoc into expanded',
725
+ inject(function(bpmnReplace, elementRegistry) {
726
+
727
+ // given
728
+ var element = elementRegistry.get('AdHocSubProcessExpanded');
729
+ var newElementData = {
730
+ type: 'bpmn:SubProcess'
731
+ };
732
+
733
+ // when
734
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
735
+
736
+ // then
737
+ expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
738
+ expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;
739
+ expect(isExpanded(newElement)).to.be.true;
740
+ })
741
+ );
742
+
743
+
744
+ it('should allow morphing collapsed into collapsed ad hoc',
745
+ inject(function(bpmnReplace, elementRegistry) {
746
+
747
+ // given
748
+ var element = elementRegistry.get('SubProcessCollapsed');
749
+ var newElementData = {
750
+ type: 'bpmn:AdHocSubProcess'
751
+ };
752
+
753
+ // when
754
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
755
+
756
+ // then
757
+ expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
758
+ expect(isExpanded(newElement)).not.to.be.true;
759
+ })
760
+ );
761
+
762
+
763
+ it('should allow morphing collapsed ad hoc into collapsed',
764
+ inject(function(bpmnReplace, elementRegistry) {
765
+
766
+ // given
767
+ var element = elementRegistry.get('AdHocSubProcessCollapsed');
768
+ var newElementData = {
769
+ type: 'bpmn:SubProcess'
770
+ };
771
+
772
+ // when
773
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
774
+
775
+ // then
776
+ expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
777
+ expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.false;
778
+ expect(isExpanded(newElement)).not.to.be.true;
779
+ })
780
+ );
781
+
782
+
783
+ it('should keep size when morphing ad hoc',
784
+ inject(function(bpmnReplace, elementRegistry, modeling) {
785
+
786
+ // given
787
+ var element = elementRegistry.get('SubProcess_1');
788
+ var newElementData = {
789
+ type: 'bpmn:AdHocSubProcess'
790
+ };
791
+
792
+ var width = element.width,
793
+ height = element.height;
794
+
795
+ modeling.resizeShape(element, {
796
+ x: element.x,
797
+ y: element.y,
798
+ width: width + 20,
799
+ height: height + 20
800
+ });
801
+
802
+ // when
803
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
804
+
805
+ // then
806
+ expect(is(newElement, 'bpmn:AdHocSubProcess')).to.be.true;
807
+ expect(isExpanded(newElement)).to.be.true;
808
+
809
+ expect(newElement.width).to.equal(width + 20);
810
+ expect(newElement.height).to.equal(height + 20);
811
+ })
812
+ );
813
+
814
+ });
815
+
816
+
817
+ describe('morph task with boundaryEvent', function() {
818
+
819
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
820
+
821
+ beforeEach(bootstrapModeler(diagramXML, {
822
+ modules: testModules
823
+ }));
824
+
825
+
826
+ it('to expanded sub process', inject(function(bpmnReplace, elementRegistry) {
827
+
828
+ // given
829
+ var element = elementRegistry.get('Task_1');
830
+ var newElementData = {
831
+ type: 'bpmn:SubProcess',
832
+ isExpanded: true
833
+ };
834
+
835
+ // when
836
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
837
+
838
+ // then
839
+ expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
840
+ expect(isExpanded(newElement)).to.be.true;
841
+
842
+ // and keep boundaryEvent
843
+ expect(newElement.attachers.length).to.be.equal(2);
844
+ }));
845
+
846
+
847
+ it('to collapsed sub process', inject(function(bpmnReplace, elementRegistry) {
848
+
849
+ // given
850
+ var element = elementRegistry.get('Task_1');
851
+ var newElementData = {
852
+ type: 'bpmn:SubProcess',
853
+ isExpanded: false
854
+ };
855
+
856
+ // when
857
+ var newElement = bpmnReplace.replaceElement(element, newElementData);
858
+
859
+ // then
860
+ expect(is(newElement, 'bpmn:SubProcess')).to.be.true;
861
+ expect(isExpanded(newElement)).to.be.false;
862
+
863
+ // and keep boundaryEvent
864
+ expect(newElement.attachers.length).to.eql(2);
865
+ }));
866
+
867
+ });
868
+
869
+
870
+ describe('compensation activity', function() {
871
+
872
+ var diagramXML = require('./BpmnReplace.compensation.bpmn');
873
+
874
+ beforeEach(bootstrapModeler(diagramXML, {
875
+ modules: testModules
876
+ }));
877
+
878
+
879
+ it('should keep isForCompensation attr', inject(function(elementRegistry, bpmnReplace) {
880
+
881
+ // given
882
+ var task = elementRegistry.get('Task_1');
883
+ var newElementData = {
884
+ type: 'bpmn:ServiceTask'
885
+ };
886
+
887
+ // when
888
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
889
+
890
+ // then
891
+ expect(newElement.businessObject.isForCompensation).to.be.true;
892
+ }));
893
+
894
+ });
895
+
896
+
897
+ describe('event sub processes', function() {
898
+
899
+ var diagramXML = require('./BpmnReplace.eventSubProcesses.bpmn');
900
+
901
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
902
+
903
+
904
+ it('should remove connections',
905
+ inject(function(elementRegistry, bpmnReplace) {
906
+
907
+ // given
908
+ var transaction = elementRegistry.get('SubProcess_1');
909
+ var newElementData = {
910
+ type: 'bpmn:SubProcess',
911
+ triggeredByEvent: true
912
+ };
913
+
914
+ // when
915
+ var newElement = bpmnReplace.replaceElement(transaction, newElementData);
916
+
917
+ // then
918
+ var incoming = newElement.incoming[0],
919
+ outgoing = newElement.outgoing[0];
920
+
921
+ expect(incoming).not.to.exist;
922
+ expect(outgoing).not.to.exist;
923
+ })
924
+ );
925
+
926
+
927
+ it('should replace non-interrupting start event after moving it outside event sub process',
928
+ inject(function(bpmnReplace, elementRegistry, modeling) {
929
+
930
+ // given
931
+ var startEvent = elementRegistry.get('StartEvent_2'),
932
+ root = elementRegistry.get('Process_1');
933
+
934
+ // when
935
+ modeling.moveElements([startEvent], { x: 0, y: 200 }, root);
936
+
937
+ var startEventAfter = elementRegistry.filter(function(element) {
938
+ return is(element, 'bpmn:StartEvent') && element.parent === root;
939
+ })[0];
940
+
941
+ // then
942
+ expect(isInterrupting(startEventAfter)).to.be.true;
943
+ expect(startEventAfter.parent).to.equal(root);
944
+
945
+ })
946
+ );
947
+
948
+
949
+ it('should replace non-interrupting start event after moving it to a regular sub process',
950
+ inject(function(bpmnReplace, elementRegistry, modeling) {
951
+
952
+ // given
953
+ var startEvent = elementRegistry.get('StartEvent_2'),
954
+ subProcess = elementRegistry.get('SubProcess_1');
955
+
956
+ // when
957
+ modeling.moveElements([startEvent], { x: 260, y: 60 }, subProcess);
958
+
959
+ var startEventAfter = elementRegistry.filter(function(element) {
960
+ return is(element, 'bpmn:StartEvent') && element.parent === subProcess;
961
+ })[0];
962
+
963
+ // then
964
+ expect(isInterrupting(startEventAfter)).to.be.true;
965
+ expect(startEventAfter.parent).to.equal(subProcess);
966
+
967
+ })
968
+ );
969
+
970
+
971
+ it('should not replace non-interrupting start event after moving it to another event sub process',
972
+ inject(function(bpmnReplace, elementRegistry, modeling) {
973
+
974
+ // given
975
+ var startEvent = elementRegistry.get('StartEvent_2'),
976
+ subProcess = elementRegistry.get('SubProcess_1');
977
+
978
+ var eventSubProcess = bpmnReplace.replaceElement(subProcess, {
979
+ type: 'bpmn:SubProcess',
980
+ triggeredByEvent: true,
981
+ isExpanded: true
982
+ });
983
+
984
+ // when
985
+ modeling.moveElements([startEvent], { x: 260, y: 60 }, eventSubProcess);
986
+
987
+ var startEventAfter = elementRegistry.filter(function(element) {
988
+ return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';
989
+ })[1];
990
+
991
+ // then
992
+ expect(startEvent.id).to.equal(startEventAfter.id);
993
+ expect(startEventAfter.parent).to.equal(eventSubProcess);
994
+
995
+ })
996
+ );
997
+
998
+
999
+ it('should not replace interrupting start event after moving it outside event sub process',
1000
+ inject(function(bpmnReplace, elementRegistry, modeling) {
1001
+
1002
+ // given
1003
+ var startEvent = elementRegistry.get('StartEvent_2'),
1004
+ root = elementRegistry.get('Process_1');
1005
+
1006
+ var interruptingStartEvent = bpmnReplace.replaceElement(startEvent, { type: 'bpmn:StartEvent' });
1007
+
1008
+ // when
1009
+ modeling.moveElements([interruptingStartEvent], { x: 0, y: 200 }, root);
1010
+
1011
+ var startEventAfter = elementRegistry.filter(function(element) {
1012
+ return is(element, 'bpmn:StartEvent')
1013
+ && element.type !== 'label'
1014
+ && element.parent === root;
1015
+ })[0];
1016
+
1017
+ // then
1018
+ expect(startEventAfter).to.equal(interruptingStartEvent);
1019
+ expect(startEventAfter.parent).to.equal(root);
1020
+
1021
+ })
1022
+ );
1023
+
1024
+
1025
+ it('should replace non-interrupting start event when replacing parent event sub process',
1026
+ inject(function(elementRegistry, bpmnReplace) {
1027
+
1028
+ // given
1029
+ var eventSubProcess = elementRegistry.get('SubProcess_2');
1030
+
1031
+ // when
1032
+ var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });
1033
+
1034
+ // then
1035
+ var replacedStartEvent = elementRegistry.filter(function(element) {
1036
+ return (element.parent === subProcess && element.type !== 'label');
1037
+ })[0];
1038
+
1039
+ expect(isInterrupting(replacedStartEvent)).to.be.true;
1040
+ expect(replacedStartEvent.parent).to.equal(subProcess);
1041
+ })
1042
+ );
1043
+
1044
+
1045
+ it('should not replace non-interrupting start event when moving parent event sub process',
1046
+ inject(function(elementRegistry, bpmnReplace, modeling) {
1047
+
1048
+ // given
1049
+ var eventSubProcess = elementRegistry.get('SubProcess_2'),
1050
+ startEvent = elementRegistry.get('StartEvent_2');
1051
+
1052
+ // when
1053
+ modeling.moveElements([eventSubProcess], { x: 20, y: 30 });
1054
+
1055
+ // start event after moving parent
1056
+ var startEventAfter = elementRegistry.filter(function(element) {
1057
+ return (element.parent === eventSubProcess && element.type !== 'label');
1058
+ })[0];
1059
+
1060
+ // then
1061
+ expect(startEventAfter).to.equal(startEvent);
1062
+ expect(startEventAfter.parent).to.eql(eventSubProcess);
1063
+ })
1064
+ );
1065
+
1066
+ it('should replace error start event after moving it outside event sub process',
1067
+ inject(function(elementRegistry, bpmnReplace, modeling) {
1068
+
1069
+ // given
1070
+ var startEvent = elementRegistry.get('StartEvent_3'),
1071
+ root = elementRegistry.get('Process_1');
1072
+
1073
+ // when
1074
+ modeling.moveElements([startEvent], { x: 0, y: 200 }, root);
1075
+
1076
+ var startEventAfter = elementRegistry.filter(function(element) {
1077
+ return is(element, 'bpmn:StartEvent') && element.parent === root;
1078
+ })[0];
1079
+
1080
+ // then
1081
+ expect(hasErrorEventDefinition(startEventAfter)).to.be.false;
1082
+ expect(startEventAfter.parent).to.equal(root);
1083
+ })
1084
+ );
1085
+
1086
+ it('should replace error start event after moving it to a regular sub process',
1087
+ inject(function(bpmnReplace, elementRegistry, modeling) {
1088
+
1089
+ // given
1090
+ var startEvent = elementRegistry.get('StartEvent_3'),
1091
+ subProcess = elementRegistry.get('SubProcess_1');
1092
+
1093
+ // when
1094
+ modeling.moveElements([startEvent], { x: 260, y: 60 }, subProcess);
1095
+
1096
+ var startEventAfter = elementRegistry.filter(function(element) {
1097
+ return is(element, 'bpmn:StartEvent') && element.parent === subProcess;
1098
+ })[0];
1099
+
1100
+ // then
1101
+ expect(hasErrorEventDefinition(startEventAfter)).to.be.false;
1102
+ expect(startEventAfter.parent).to.equal(subProcess);
1103
+
1104
+ })
1105
+ );
1106
+
1107
+ it('should not replace error start event after moving it to another event sub process',
1108
+ inject(function(bpmnReplace, elementRegistry, modeling) {
1109
+
1110
+ // given
1111
+ var startEvent = elementRegistry.get('StartEvent_3'),
1112
+ subProcess = elementRegistry.get('SubProcess_1');
1113
+
1114
+ var eventSubProcess = bpmnReplace.replaceElement(subProcess, {
1115
+ type: 'bpmn:SubProcess',
1116
+ triggeredByEvent: true,
1117
+ isExpanded: true
1118
+ });
1119
+
1120
+ // when
1121
+ modeling.moveElements([startEvent], { x: 260, y: 60 }, eventSubProcess);
1122
+
1123
+ var startEventAfter = elementRegistry.filter(function(element) {
1124
+ return is(element, 'bpmn:StartEvent') && element.parent === eventSubProcess && element.type !== 'label';
1125
+ })[1];
1126
+
1127
+ // then
1128
+ expect(hasErrorEventDefinition(startEventAfter)).to.be.true;
1129
+ expect(startEventAfter.parent).to.equal(eventSubProcess);
1130
+
1131
+ })
1132
+ );
1133
+
1134
+ it('should replace error start event when replacing parent event sub process',
1135
+ inject(function(elementRegistry, bpmnReplace) {
1136
+
1137
+ // given
1138
+ var eventSubProcess = elementRegistry.get('SubProcess_3');
1139
+
1140
+ // when
1141
+ var subProcess = bpmnReplace.replaceElement(eventSubProcess, { type: 'bpmn:SubProcess' });
1142
+
1143
+ // then
1144
+ var replacedStartEvent = elementRegistry.filter(function(element) {
1145
+ return (element.parent === subProcess && element.type !== 'label');
1146
+ })[0];
1147
+
1148
+ expect(hasErrorEventDefinition(replacedStartEvent)).to.be.false;
1149
+ expect(replacedStartEvent.parent).to.equal(subProcess);
1150
+ })
1151
+ );
1152
+
1153
+
1154
+ it('should not replace error start event when moving parent event sub process',
1155
+ inject(function(elementRegistry, bpmnReplace, modeling) {
1156
+
1157
+ // given
1158
+ var eventSubProcess = elementRegistry.get('SubProcess_3'),
1159
+ startEvent = elementRegistry.get('StartEvent_3');
1160
+
1161
+ // when
1162
+ modeling.moveElements([eventSubProcess], { x: 20, y: 30 });
1163
+
1164
+ // start event after moving parent
1165
+ var startEventAfter = elementRegistry.filter(function(element) {
1166
+ return (element.parent === eventSubProcess && element.type !== 'label');
1167
+ })[0];
1168
+
1169
+ // then
1170
+ expect(startEventAfter).to.equal(startEvent);
1171
+ expect(startEventAfter.parent).to.eql(eventSubProcess);
1172
+ })
1173
+ );
1174
+
1175
+ });
1176
+
1177
+
1178
+ describe('events', function() {
1179
+
1180
+ var diagramXML = require('../../../fixtures/bpmn/basic.bpmn');
1181
+
1182
+ beforeEach(bootstrapModeler(diagramXML, {
1183
+ modules: testModules
1184
+ }));
1185
+
1186
+
1187
+ it('should properly set parent of event definitions', inject(function(elementRegistry, modeling, bpmnReplace) {
1188
+
1189
+ var startEvent = elementRegistry.get('StartEvent_1');
1190
+
1191
+ var messageEvent = bpmnReplace.replaceElement(startEvent, {
1192
+ type: 'bpmn:StartEvent',
1193
+ eventDefinitionType: 'bpmn:MessageEventDefinition'
1194
+ });
1195
+
1196
+ var parent = messageEvent.businessObject.eventDefinitions[0].$parent;
1197
+
1198
+ expect(parent).to.exist;
1199
+ expect(parent).to.equal(messageEvent.businessObject);
1200
+ }));
1201
+
1202
+ });
1203
+
1204
+
1205
+ describe('properties', function() {
1206
+ var clonePropertiesXML = require('../../../fixtures/bpmn/features/replace/clone-properties.bpmn');
1207
+
1208
+ var camundaPackage = require('../../../fixtures/json/model/camunda');
1209
+
1210
+ beforeEach(bootstrapModeler(clonePropertiesXML, {
1211
+ modules: testModules,
1212
+ moddleExtensions: {
1213
+ camunda: camundaPackage
1214
+ }
1215
+ }));
1216
+
1217
+ it('should copy properties', inject(function(elementRegistry, bpmnReplace) {
1218
+ // given
1219
+ var task = elementRegistry.get('Task_1');
1220
+ var newElementData = {
1221
+ type: 'bpmn:ServiceTask'
1222
+ };
1223
+
1224
+ // when
1225
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
1226
+
1227
+ // then
1228
+ var businessObject = newElement.businessObject;
1229
+
1230
+ expect(businessObject.asyncBefore).to.be.true;
1231
+ expect(businessObject.jobPriority).to.equal('100');
1232
+ expect(businessObject.documentation[0].text).to.equal('hello world');
1233
+
1234
+ var extensionElements = businessObject.extensionElements.values;
1235
+
1236
+ expect(extensionElements).to.have.length(4);
1237
+
1238
+ expect(is(extensionElements[0], 'camunda:InputOutput')).to.be.true;
1239
+
1240
+ expect(is(extensionElements[0].inputParameters[0], 'camunda:InputParameter')).to.be.true;
1241
+
1242
+ expect(extensionElements[0].inputParameters[0].name).to.equal('Input_1');
1243
+ expect(extensionElements[0].inputParameters[0].value).to.equal('foo');
1244
+
1245
+ expect(is(extensionElements[0].outputParameters[0], 'camunda:OutputParameter')).to.be.true;
1246
+
1247
+ expect(extensionElements[0].outputParameters[0].name).to.equal('Output_1');
1248
+ expect(extensionElements[0].outputParameters[0].value).to.equal('bar');
1249
+
1250
+ expect(is(extensionElements[1], 'camunda:Properties')).to.be.true;
1251
+
1252
+ expect(is(extensionElements[1].values[0], 'camunda:Property')).to.be.true;
1253
+
1254
+ expect(extensionElements[1].values[0].name).to.equal('bar');
1255
+ expect(extensionElements[1].values[0].value).to.equal('foo');
1256
+
1257
+ expect(is(extensionElements[2], 'camunda:ExecutionListener')).to.be.true;
1258
+
1259
+ expect(extensionElements[2].class).to.equal('reallyClassy');
1260
+ expect(extensionElements[2].event).to.equal('start');
1261
+
1262
+ expect(is(extensionElements[3], 'camunda:FailedJobRetryTimeCycle')).to.be.true;
1263
+
1264
+ expect(extensionElements[3].body).to.equal('10');
1265
+ }));
1266
+
1267
+ });
1268
+
1269
+
1270
+ describe('colors', function() {
1271
+
1272
+ var diagramXML = require('../../../fixtures/bpmn/features/replace/01_replace.bpmn');
1273
+
1274
+ beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));
1275
+
1276
+ it('should maintain colors', inject(function(elementRegistry, bpmnReplace, modeling) {
1277
+
1278
+ // given
1279
+ var task = elementRegistry.get('Task_1');
1280
+ var newElementData = {
1281
+ type: 'bpmn:UserTask'
1282
+ },
1283
+ fill = '#BBDEFB',
1284
+ stroke = '#1E88E5';
1285
+
1286
+ modeling.setColor(task, { fill: fill, stroke: stroke });
1287
+
1288
+ // when
1289
+ var newElement = bpmnReplace.replaceElement(task, newElementData);
1290
+
1291
+ // then
1292
+ var businessObject = newElement.businessObject;
1293
+
1294
+ expect(businessObject.di.fill).to.equal(fill);
1295
+ expect(businessObject.di.stroke).to.equal(stroke);
1296
+
1297
+ expect(newElement.colors).to.not.exist;
1298
+ }));
1299
+
1300
+ });
1301
+
1302
+ });