@vived/app 6.7.1 → 6.8.0

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 (204) hide show
  1. package/README.md +145 -1
  2. package/dist/cjs/BaseApp/UC/RenderCanvasUC.js.map +1 -1
  3. package/dist/cjs/BaseApp/UC/RenderCanvasUC.test.js.map +1 -1
  4. package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.js.map +1 -1
  5. package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.test.js.map +1 -1
  6. package/dist/cjs/EventSystem/Entities/EventEntity.js.map +1 -1
  7. package/dist/cjs/EventSystem/Entities/EventEntity.test.js +4 -1
  8. package/dist/cjs/EventSystem/Entities/EventEntity.test.js.map +1 -1
  9. package/dist/cjs/EventSystem/Entities/index.js.map +1 -1
  10. package/dist/cjs/EventSystem/EventSystem.integration.test.js.map +1 -1
  11. package/dist/cjs/EventSystem/Factories/EventSystemFeatureFactory.js.map +1 -1
  12. package/dist/cjs/EventSystem/Factories/EventSystemFeatureFactory.test.js.map +1 -1
  13. package/dist/cjs/EventSystem/Factories/index.js.map +1 -1
  14. package/dist/cjs/EventSystem/Mocks/MockEventEntity.js.map +1 -1
  15. package/dist/cjs/EventSystem/Mocks/index.js.map +1 -1
  16. package/dist/cjs/EventSystem/index.js.map +1 -1
  17. package/dist/cjs/EventSystem/types.js.map +1 -1
  18. package/dist/cjs/LabelDrop/Factories/LabelDropFeatureFactory.js.map +1 -1
  19. package/dist/cjs/LabelDrop/UseCases/SubmitLabelDropResultUC.js.map +1 -1
  20. package/dist/cjs/LabelDrop/UseCases/SubmitLabelDropResultUC.test.js.map +1 -1
  21. package/dist/cjs/LabelDrop/UseCases/index.js.map +1 -1
  22. package/dist/cjs/Procedure/Adapters/index.js.map +1 -1
  23. package/dist/cjs/Procedure/Adapters/procedureAdapter.js.map +1 -1
  24. package/dist/cjs/Procedure/Adapters/procedureAdapter.test.js.map +1 -1
  25. package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.js.map +1 -1
  26. package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.test.js.map +1 -1
  27. package/dist/cjs/Procedure/Adapters/procedureHintAdapter.js.map +1 -1
  28. package/dist/cjs/Procedure/Adapters/procedureHintAdapter.test.js.map +1 -1
  29. package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.js.map +1 -1
  30. package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.test.js.map +1 -1
  31. package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.js.map +1 -1
  32. package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.test.js +3 -1
  33. package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.test.js.map +1 -1
  34. package/dist/cjs/Procedure/Entities/HintRegistry.js.map +1 -1
  35. package/dist/cjs/Procedure/Entities/HintRegistry.test.js.map +1 -1
  36. package/dist/cjs/Procedure/Entities/ProcedureEntity.js.map +1 -1
  37. package/dist/cjs/Procedure/Entities/ProcedureEntity.test.js +1 -12
  38. package/dist/cjs/Procedure/Entities/ProcedureEntity.test.js.map +1 -1
  39. package/dist/cjs/Procedure/Entities/index.js.map +1 -1
  40. package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
  41. package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.test.js +3 -1
  42. package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.test.js.map +1 -1
  43. package/dist/cjs/Procedure/Factories/index.js.map +1 -1
  44. package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
  45. package/dist/cjs/Procedure/Mocks/MockProcedurePM.js.map +1 -1
  46. package/dist/cjs/Procedure/Mocks/index.js.map +1 -1
  47. package/dist/cjs/Procedure/PM/ProcedurePM.js.map +1 -1
  48. package/dist/cjs/Procedure/PM/ProcedurePM.test.js +1 -1
  49. package/dist/cjs/Procedure/PM/ProcedurePM.test.js.map +1 -1
  50. package/dist/cjs/Procedure/PM/index.js.map +1 -1
  51. package/dist/cjs/Procedure/ProcedureEventSystem.integration.test.js.map +1 -1
  52. package/dist/cjs/Procedure/UCs/AddProcedureEventUC.js.map +1 -1
  53. package/dist/cjs/Procedure/UCs/AddProcedureEventUC.test.js +1 -4
  54. package/dist/cjs/Procedure/UCs/AddProcedureEventUC.test.js.map +1 -1
  55. package/dist/cjs/Procedure/UCs/MoveProcedureEventDownUC.js.map +1 -1
  56. package/dist/cjs/Procedure/UCs/MoveProcedureEventDownUC.test.js.map +1 -1
  57. package/dist/cjs/Procedure/UCs/MoveProcedureEventUpUC.js.map +1 -1
  58. package/dist/cjs/Procedure/UCs/MoveProcedureEventUpUC.test.js.map +1 -1
  59. package/dist/cjs/Procedure/UCs/RecordProcedureEventUC.js.map +1 -1
  60. package/dist/cjs/Procedure/UCs/RecordProcedureEventUC.test.js.map +1 -1
  61. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -1
  62. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js +22 -4
  63. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -1
  64. package/dist/cjs/Procedure/UCs/RemoveProcedureEventUC.js.map +1 -1
  65. package/dist/cjs/Procedure/UCs/RemoveProcedureEventUC.test.js.map +1 -1
  66. package/dist/cjs/Procedure/UCs/ResetProcedureProgressUC.js.map +1 -1
  67. package/dist/cjs/Procedure/UCs/ResetProcedureProgressUC.test.js.map +1 -1
  68. package/dist/cjs/Procedure/UCs/SerializeProcedure.js.map +1 -1
  69. package/dist/cjs/Procedure/UCs/SerializeProcedure.test.js +6 -1
  70. package/dist/cjs/Procedure/UCs/SerializeProcedure.test.js.map +1 -1
  71. package/dist/cjs/Procedure/UCs/SetProcedureIsQuizUC.js.map +1 -1
  72. package/dist/cjs/Procedure/UCs/SetProcedureIsQuizUC.test.js.map +1 -1
  73. package/dist/cjs/Procedure/UCs/SetProcedureOrderMattersUC.js.map +1 -1
  74. package/dist/cjs/Procedure/UCs/SetProcedureOrderMattersUC.test.js.map +1 -1
  75. package/dist/cjs/Procedure/UCs/SetProcedureShowHintsUC.js.map +1 -1
  76. package/dist/cjs/Procedure/UCs/SetProcedureShowHintsUC.test.js.map +1 -1
  77. package/dist/cjs/Procedure/UCs/SubmitProcedureQuizUC.js.map +1 -1
  78. package/dist/cjs/Procedure/UCs/SubmitProcedureQuizUC.test.js.map +1 -1
  79. package/dist/cjs/Procedure/UCs/UpdateProcedureEventsUCHook.js.map +1 -1
  80. package/dist/cjs/Procedure/UCs/UpdateProcedureEventsUCHook.test.js.map +1 -1
  81. package/dist/cjs/Procedure/UCs/index.js.map +1 -1
  82. package/dist/cjs/Procedure/index.js.map +1 -1
  83. package/dist/cjs/Procedure/types.js.map +1 -1
  84. package/dist/cjs/RequestHandler/UC/SetThemeColorUC.test.js +9 -0
  85. package/dist/cjs/RequestHandler/UC/SetThemeColorUC.test.js.map +1 -1
  86. package/dist/cjs/ThemeColors/Entities/ThemeColors.js +24 -0
  87. package/dist/cjs/ThemeColors/Entities/ThemeColors.js.map +1 -1
  88. package/dist/cjs/ThemeColors/Entities/ThemeColors.test.js +20 -0
  89. package/dist/cjs/ThemeColors/Entities/ThemeColors.test.js.map +1 -1
  90. package/dist/cjs/TouchController/UC/UpdateTouchInoutBound.test.js.map +1 -1
  91. package/dist/cjs/TouchController/UC/UpdateTouchInputBound.js.map +1 -1
  92. package/dist/cjs/index.js.map +1 -1
  93. package/dist/esm/BaseApp/UC/RenderCanvasUC.js.map +1 -1
  94. package/dist/esm/BaseApp/UC/RenderCanvasUC.test.js.map +1 -1
  95. package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.js.map +1 -1
  96. package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.test.js.map +1 -1
  97. package/dist/esm/EventSystem/Entities/EventEntity.js.map +1 -1
  98. package/dist/esm/EventSystem/Entities/EventEntity.test.js +4 -1
  99. package/dist/esm/EventSystem/Entities/EventEntity.test.js.map +1 -1
  100. package/dist/esm/EventSystem/Entities/index.js.map +1 -1
  101. package/dist/esm/EventSystem/EventSystem.integration.test.js.map +1 -1
  102. package/dist/esm/EventSystem/Factories/EventSystemFeatureFactory.js.map +1 -1
  103. package/dist/esm/EventSystem/Factories/EventSystemFeatureFactory.test.js.map +1 -1
  104. package/dist/esm/EventSystem/Factories/index.js.map +1 -1
  105. package/dist/esm/EventSystem/Mocks/MockEventEntity.js.map +1 -1
  106. package/dist/esm/EventSystem/Mocks/index.js.map +1 -1
  107. package/dist/esm/EventSystem/index.js.map +1 -1
  108. package/dist/esm/EventSystem/types.js.map +1 -1
  109. package/dist/esm/LabelDrop/Factories/LabelDropFeatureFactory.js.map +1 -1
  110. package/dist/esm/LabelDrop/UseCases/SubmitLabelDropResultUC.js.map +1 -1
  111. package/dist/esm/LabelDrop/UseCases/SubmitLabelDropResultUC.test.js.map +1 -1
  112. package/dist/esm/LabelDrop/UseCases/index.js.map +1 -1
  113. package/dist/esm/Procedure/Adapters/index.js.map +1 -1
  114. package/dist/esm/Procedure/Adapters/procedureAdapter.js.map +1 -1
  115. package/dist/esm/Procedure/Adapters/procedureAdapter.test.js.map +1 -1
  116. package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.js.map +1 -1
  117. package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.test.js.map +1 -1
  118. package/dist/esm/Procedure/Adapters/procedureHintAdapter.js.map +1 -1
  119. package/dist/esm/Procedure/Adapters/procedureHintAdapter.test.js.map +1 -1
  120. package/dist/esm/Procedure/Adapters/procedureProgressAdapter.js.map +1 -1
  121. package/dist/esm/Procedure/Adapters/procedureProgressAdapter.test.js.map +1 -1
  122. package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.js.map +1 -1
  123. package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.test.js +3 -1
  124. package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.test.js.map +1 -1
  125. package/dist/esm/Procedure/Entities/HintRegistry.js.map +1 -1
  126. package/dist/esm/Procedure/Entities/HintRegistry.test.js.map +1 -1
  127. package/dist/esm/Procedure/Entities/ProcedureEntity.js.map +1 -1
  128. package/dist/esm/Procedure/Entities/ProcedureEntity.test.js +1 -12
  129. package/dist/esm/Procedure/Entities/ProcedureEntity.test.js.map +1 -1
  130. package/dist/esm/Procedure/Entities/index.js.map +1 -1
  131. package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
  132. package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.test.js +5 -3
  133. package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.test.js.map +1 -1
  134. package/dist/esm/Procedure/Factories/index.js.map +1 -1
  135. package/dist/esm/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
  136. package/dist/esm/Procedure/Mocks/MockProcedurePM.js.map +1 -1
  137. package/dist/esm/Procedure/Mocks/index.js.map +1 -1
  138. package/dist/esm/Procedure/PM/ProcedurePM.js.map +1 -1
  139. package/dist/esm/Procedure/PM/ProcedurePM.test.js +2 -2
  140. package/dist/esm/Procedure/PM/ProcedurePM.test.js.map +1 -1
  141. package/dist/esm/Procedure/PM/index.js.map +1 -1
  142. package/dist/esm/Procedure/ProcedureEventSystem.integration.test.js +2 -2
  143. package/dist/esm/Procedure/ProcedureEventSystem.integration.test.js.map +1 -1
  144. package/dist/esm/Procedure/UCs/AddProcedureEventUC.js.map +1 -1
  145. package/dist/esm/Procedure/UCs/AddProcedureEventUC.test.js +3 -6
  146. package/dist/esm/Procedure/UCs/AddProcedureEventUC.test.js.map +1 -1
  147. package/dist/esm/Procedure/UCs/MoveProcedureEventDownUC.js.map +1 -1
  148. package/dist/esm/Procedure/UCs/MoveProcedureEventDownUC.test.js +2 -2
  149. package/dist/esm/Procedure/UCs/MoveProcedureEventDownUC.test.js.map +1 -1
  150. package/dist/esm/Procedure/UCs/MoveProcedureEventUpUC.js.map +1 -1
  151. package/dist/esm/Procedure/UCs/MoveProcedureEventUpUC.test.js +2 -2
  152. package/dist/esm/Procedure/UCs/MoveProcedureEventUpUC.test.js.map +1 -1
  153. package/dist/esm/Procedure/UCs/RecordProcedureEventUC.js.map +1 -1
  154. package/dist/esm/Procedure/UCs/RecordProcedureEventUC.test.js +2 -2
  155. package/dist/esm/Procedure/UCs/RecordProcedureEventUC.test.js.map +1 -1
  156. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -1
  157. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js +22 -4
  158. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -1
  159. package/dist/esm/Procedure/UCs/RemoveProcedureEventUC.js.map +1 -1
  160. package/dist/esm/Procedure/UCs/RemoveProcedureEventUC.test.js +2 -2
  161. package/dist/esm/Procedure/UCs/RemoveProcedureEventUC.test.js.map +1 -1
  162. package/dist/esm/Procedure/UCs/ResetProcedureProgressUC.js.map +1 -1
  163. package/dist/esm/Procedure/UCs/ResetProcedureProgressUC.test.js +2 -2
  164. package/dist/esm/Procedure/UCs/ResetProcedureProgressUC.test.js.map +1 -1
  165. package/dist/esm/Procedure/UCs/SerializeProcedure.js.map +1 -1
  166. package/dist/esm/Procedure/UCs/SerializeProcedure.test.js +8 -3
  167. package/dist/esm/Procedure/UCs/SerializeProcedure.test.js.map +1 -1
  168. package/dist/esm/Procedure/UCs/SetProcedureIsQuizUC.js.map +1 -1
  169. package/dist/esm/Procedure/UCs/SetProcedureIsQuizUC.test.js +1 -1
  170. package/dist/esm/Procedure/UCs/SetProcedureIsQuizUC.test.js.map +1 -1
  171. package/dist/esm/Procedure/UCs/SetProcedureOrderMattersUC.js.map +1 -1
  172. package/dist/esm/Procedure/UCs/SetProcedureOrderMattersUC.test.js +1 -1
  173. package/dist/esm/Procedure/UCs/SetProcedureOrderMattersUC.test.js.map +1 -1
  174. package/dist/esm/Procedure/UCs/SetProcedureShowHintsUC.js.map +1 -1
  175. package/dist/esm/Procedure/UCs/SetProcedureShowHintsUC.test.js +1 -1
  176. package/dist/esm/Procedure/UCs/SetProcedureShowHintsUC.test.js.map +1 -1
  177. package/dist/esm/Procedure/UCs/SubmitProcedureQuizUC.js.map +1 -1
  178. package/dist/esm/Procedure/UCs/SubmitProcedureQuizUC.test.js +2 -2
  179. package/dist/esm/Procedure/UCs/SubmitProcedureQuizUC.test.js.map +1 -1
  180. package/dist/esm/Procedure/UCs/UpdateProcedureEventsUCHook.js.map +1 -1
  181. package/dist/esm/Procedure/UCs/UpdateProcedureEventsUCHook.test.js +1 -1
  182. package/dist/esm/Procedure/UCs/UpdateProcedureEventsUCHook.test.js.map +1 -1
  183. package/dist/esm/Procedure/UCs/index.js.map +1 -1
  184. package/dist/esm/Procedure/index.js.map +1 -1
  185. package/dist/esm/Procedure/types.js.map +1 -1
  186. package/dist/esm/RequestHandler/UC/SetThemeColorUC.test.js +9 -0
  187. package/dist/esm/RequestHandler/UC/SetThemeColorUC.test.js.map +1 -1
  188. package/dist/esm/ThemeColors/Entities/ThemeColors.js +24 -0
  189. package/dist/esm/ThemeColors/Entities/ThemeColors.js.map +1 -1
  190. package/dist/esm/ThemeColors/Entities/ThemeColors.test.js +20 -0
  191. package/dist/esm/ThemeColors/Entities/ThemeColors.test.js.map +1 -1
  192. package/dist/esm/TouchController/UC/UpdateTouchInoutBound.test.js.map +1 -1
  193. package/dist/esm/TouchController/UC/UpdateTouchInputBound.js.map +1 -1
  194. package/dist/esm/index.js.map +1 -1
  195. package/dist/types/Procedure/Entities/ProcedureEntity.d.ts.map +1 -1
  196. package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts.map +1 -1
  197. package/dist/types/Procedure/UCs/AddProcedureEventUC.d.ts.map +1 -1
  198. package/dist/types/Procedure/UCs/RecordProcedureSessionUC.d.ts.map +1 -1
  199. package/dist/types/Procedure/UCs/SetProcedureIsQuizUC.d.ts.map +1 -1
  200. package/dist/types/Procedure/UCs/SubmitProcedureQuizUC.d.ts.map +1 -1
  201. package/dist/types/Procedure/types.d.ts.map +1 -1
  202. package/dist/types/ThemeColors/Entities/ThemeColors.d.ts +12 -0
  203. package/dist/types/ThemeColors/Entities/ThemeColors.d.ts.map +1 -1
  204. package/package.json +1 -1
@@ -245,18 +245,7 @@ describe("ProcedureEntity", () => {
245
245
  });
246
246
  });
247
247
  describe("calculateScore (order matters, 10 steps)", () => {
248
- const steps = [
249
- "s1",
250
- "s2",
251
- "s3",
252
- "s4",
253
- "s5",
254
- "s6",
255
- "s7",
256
- "s8",
257
- "s9",
258
- "s10",
259
- ];
248
+ const steps = ["s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10"];
260
249
  const record = (...ids) => ids.forEach((id) => procedureEntity.recordUserEvent(id));
261
250
  const correctFlags = () => procedureEntity.calculateScore().comparison.map((c) => c.correct);
262
251
  beforeEach(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedureEntity.test.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/ProcedureEntity.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"./ProcedureEntity\";\r\n\r\ndescribe(\"ProcedureEntity\", () => {\r\n\tlet appObjects: AppObjectRepo;\r\n\tlet procedureEntity: ProcedureEntity;\r\n\r\n\tbeforeEach(() => {\r\n\t\tappObjects = makeAppObjectRepo();\r\n\t\tconst appObject = appObjects.getOrCreate(\"TestProcedure\");\r\n\t\tprocedureEntity = makeProcedureEntity(appObject);\r\n\t});\r\n\r\n\tit(\"implements Challenge interface correctly\", () => {\r\n\t\texpect(procedureEntity.challengeID).toBe(\"PROCEDURE\");\r\n\t\texpect(procedureEntity.name).toBe(\"Procedure\");\r\n\t\texpect(typeof procedureEntity.consumerHelpText).toBe(\"string\");\r\n\t\texpect(typeof procedureEntity.authorHelpText).toBe(\"string\");\r\n\t\texpect(typeof procedureEntity.reset).toBe(\"function\");\r\n\t});\r\n\r\n\tit(\"has dynamic helpHeading based on quiz mode\", () => {\r\n\t\texpect(procedureEntity.helpHeading).toBe(\"Procedure Training\");\r\n\t\tprocedureEntity.setIsQuiz(true);\r\n\t\texpect(procedureEntity.helpHeading).toBe(\"Procedure Challenge\");\r\n\t\tprocedureEntity.setIsQuiz(false);\r\n\t\texpect(procedureEntity.helpHeading).toBe(\"Procedure Training\");\r\n\t});\r\n\r\n\tit(\"has dynamic consumerHelpText based on quiz mode\", () => {\r\n\t\texpect(procedureEntity.consumerHelpText).toBe(\r\n\t\t\t\"Follow the steps in order to complete the training procedure.\",\r\n\t\t);\r\n\t\tprocedureEntity.setIsQuiz(true);\r\n\t\texpect(procedureEntity.consumerHelpText).toBe(\r\n\t\t\t\"Complete the procedure challenge on your own and get scored after submitting.\",\r\n\t\t);\r\n\t\tprocedureEntity.setIsQuiz(false);\r\n\t\texpect(procedureEntity.consumerHelpText).toBe(\r\n\t\t\t\"Follow the steps in order to complete the training procedure.\",\r\n\t\t);\r\n\t});\r\n\r\n\tit(\"has correct singleton registration\", () => {\r\n\t\tconst retrieved = ProcedureEntity.get(appObjects);\r\n\t\texpect(retrieved).toBe(procedureEntity);\r\n\t});\r\n\r\n\tit(\"starts with empty event list\", () => {\r\n\t\texpect(procedureEntity.eventIds).toEqual([]);\r\n\t});\r\n\r\n\tit(\"can add events to procedure\", () => {\r\n\t\tprocedureEntity.addEventId(\"test_event_1\");\r\n\t\tprocedureEntity.addEventId(\"test_event_2\");\r\n\t\texpect(procedureEntity.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\r\n\t});\r\n\r\n\tit(\"prevents duplicate events\", () => {\r\n\t\tprocedureEntity.addEventId(\"test_event\");\r\n\t\tprocedureEntity.addEventId(\"test_event\");\r\n\t\texpect(procedureEntity.eventIds).toEqual([\"test_event\"]);\r\n\t\texpect(procedureEntity.validationMessage).toContain(\"already in the procedure\");\r\n\t});\r\n\r\n\tit(\"can remove events from procedure\", () => {\r\n\t\tprocedureEntity.addEventId(\"test_event_1\");\r\n\t\tprocedureEntity.addEventId(\"test_event_2\");\r\n\t\tprocedureEntity.removeEventId(\"test_event_1\");\r\n\t\texpect(procedureEntity.eventIds).toEqual([\"test_event_2\"]);\r\n\t});\r\n\r\n\tit(\"handles removing non-existent events\", () => {\r\n\t\tprocedureEntity.removeEventId(\"non_existent\");\r\n\t\texpect(procedureEntity.validationMessage).toContain(\"not in the procedure\");\r\n\t});\r\n\r\n\tit(\"can clear all events\", () => {\r\n\t\tprocedureEntity.addEventId(\"test_event_1\");\r\n\t\tprocedureEntity.addEventId(\"test_event_2\");\r\n\t\tprocedureEntity.clearEventIds();\r\n\t\texpect(procedureEntity.eventIds).toEqual([]);\r\n\t});\r\n\r\n\tit(\"starts with empty user event log\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\t\texpect(procedureEntity.currentStepIndex).toBe(0);\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t});\r\n\r\n\tit(\"records user events for ordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.setOrderMatters(true);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event_1\"]);\r\n\t\texpect(procedureEntity.currentStepIndex).toBe(1);\r\n\t\tprocedureEntity.recordUserEvent(\"event_2\");\r\n\t\texpect(procedureEntity.currentStepIndex).toBe(2);\r\n\t});\r\n\r\n\tit(\"validates order in ordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.setOrderMatters(true);\r\n\t\tprocedureEntity.recordUserEvent(\"event_2\");\r\n\t\texpect(procedureEntity.validationMessage).toContain(\r\n\t\t\t\"Expected 'event_1', but got 'event_2'\",\r\n\t\t);\r\n\t\texpect(procedureEntity.currentStepIndex).toBe(0);\r\n\t});\r\n\r\n\tit(\"ignores order in unordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\tprocedureEntity.recordUserEvent(\"event_3\");\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event_3\", \"event_1\"]);\r\n\t});\r\n\r\n\tit(\"ignores events not in procedure\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.recordUserEvent(\"unknown_event\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\t});\r\n\r\n\tit(\"detects completion in ordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.setOrderMatters(true);\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t\tprocedureEntity.recordUserEvent(\"event_2\");\r\n\t\texpect(procedureEntity.isComplete).toBe(true);\r\n\t});\r\n\r\n\tit(\"detects completion in unordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t\tprocedureEntity.recordUserEvent(\"event_2\");\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.isComplete).toBe(true);\r\n\t});\r\n\r\n\tit(\"returns false for empty procedures\", () => {\r\n\t\tprocedureEntity.clearEventIds();\r\n\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t});\r\n\r\n\tit(\"calculates progress for ordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.addEventId(\"event_4\");\r\n\t\tprocedureEntity.setOrderMatters(true);\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(0);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(25);\r\n\t\tprocedureEntity.recordUserEvent(\"event_2\");\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(50);\r\n\t\tprocedureEntity.recordUserEvent(\"event_3\");\r\n\t\tprocedureEntity.recordUserEvent(\"event_4\");\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(100);\r\n\t});\r\n\r\n\tit(\"calculates progress for unordered procedures\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.addEventId(\"event_4\");\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(0);\r\n\t\tprocedureEntity.recordUserEvent(\"event_3\");\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(25);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.getProgressPercentage()).toBe(50);\r\n\t});\r\n\r\n\tit(\"provides next expected event for ordered procedures with hints enabled\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.setOrderMatters(true);\r\n\t\tprocedureEntity.setShowHints(true);\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"event_2\");\r\n\t});\r\n\r\n\tit(\"provides next unemitted event for unordered procedures with hints enabled\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.addEventId(\"event_3\");\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\tprocedureEntity.setShowHints(true);\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\r\n\t\tprocedureEntity.recordUserEvent(\"event_3\");\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"event_2\");\r\n\t});\r\n\r\n\tit(\"returns null when hints are disabled\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.setShowHints(false);\r\n\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(null);\r\n\t});\r\n\r\n\tit(\"can toggle order matters setting\", () => {\r\n\t\texpect(procedureEntity.orderMatters).toBe(true);\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\texpect(procedureEntity.orderMatters).toBe(false);\r\n\t});\r\n\r\n\tit(\"can toggle hints setting\", () => {\r\n\t\texpect(procedureEntity.showHints).toBe(true);\r\n\t\tprocedureEntity.setShowHints(false);\r\n\t\texpect(procedureEntity.showHints).toBe(false);\r\n\t});\r\n\r\n\tit(\"can toggle quiz mode\", () => {\r\n\t\texpect(procedureEntity.isQuiz).toBe(false);\r\n\t\tprocedureEntity.setIsQuiz(true);\r\n\t\texpect(procedureEntity.isQuiz).toBe(true);\r\n\t});\r\n\r\n\tit(\"resets user progress while preserving configuration\", () => {\r\n\t\tprocedureEntity.addEventId(\"event_1\");\r\n\t\tprocedureEntity.addEventId(\"event_2\");\r\n\t\tprocedureEntity.setOrderMatters(false);\r\n\t\tprocedureEntity.setShowHints(false);\r\n\t\tprocedureEntity.setIsQuiz(true);\r\n\t\tprocedureEntity.recordUserEvent(\"event_1\");\r\n\t\texpect(procedureEntity.userEventLog.length).toBe(1);\r\n\t\tprocedureEntity.reset();\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\t\texpect(procedureEntity.currentStepIndex).toBe(0);\r\n\t\texpect(procedureEntity.validationMessage).toBe(null);\r\n\t\texpect(procedureEntity.eventIds).toEqual([\"event_1\", \"event_2\"]);\r\n\t\texpect(procedureEntity.orderMatters).toBe(false);\r\n\t\texpect(procedureEntity.showHints).toBe(false);\r\n\t\texpect(procedureEntity.isQuiz).toBe(true);\r\n\t});\r\n\r\n\tdescribe(\"recordUserEvent revisits (order matters)\", () => {\r\n\t\tbeforeEach(() => {\r\n\t\t\tprocedureEntity.addEventId(\"s1\");\r\n\t\t\tprocedureEntity.addEventId(\"s2\");\r\n\t\t\tprocedureEntity.addEventId(\"s3\");\r\n\t\t\tprocedureEntity.setOrderMatters(true);\r\n\t\t});\r\n\r\n\t\tit(\"does not log a re-emission of an already-completed step\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(\"s1\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"s2\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"s1\");\r\n\t\t\texpect(procedureEntity.userEventLog).toEqual([\"s1\", \"s2\"]);\r\n\t\t\texpect(procedureEntity.currentStepIndex).toBe(2);\r\n\t\t});\r\n\r\n\t\tit(\"does not set a validation message for a benign revisit\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(\"s1\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"s1\");\r\n\t\t\texpect(procedureEntity.validationMessage).toBeNull();\r\n\t\t});\r\n\r\n\t\tit(\"still logs and flags an early emission of a later step\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(\"s1\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"s3\");\r\n\t\t\texpect(procedureEntity.userEventLog).toEqual([\"s1\", \"s3\"]);\r\n\t\t\texpect(procedureEntity.validationMessage).toBe(\r\n\t\t\t\t\"Expected 's2', but got 's3'\",\r\n\t\t\t);\r\n\t\t\texpect(procedureEntity.currentStepIndex).toBe(1);\r\n\t\t});\r\n\t});\r\n\r\n\tdescribe(\"calculateScore (order matters, 10 steps)\", () => {\r\n\t\tconst steps = [\r\n\t\t\t\"s1\",\r\n\t\t\t\"s2\",\r\n\t\t\t\"s3\",\r\n\t\t\t\"s4\",\r\n\t\t\t\"s5\",\r\n\t\t\t\"s6\",\r\n\t\t\t\"s7\",\r\n\t\t\t\"s8\",\r\n\t\t\t\"s9\",\r\n\t\t\t\"s10\",\r\n\t\t];\r\n\r\n\t\tconst record = (...ids: string[]) =>\r\n\t\t\tids.forEach((id) => procedureEntity.recordUserEvent(id));\r\n\r\n\t\tconst correctFlags = () =>\r\n\t\t\tprocedureEntity.calculateScore().comparison.map((c) => c.correct);\r\n\r\n\t\tbeforeEach(() => {\r\n\t\t\tsteps.forEach((s) => procedureEntity.addEventId(s));\r\n\t\t\tprocedureEntity.setOrderMatters(true);\r\n\t\t});\r\n\r\n\t\tit(\"scores a perfect run 100% with every step correct\", () => {\r\n\t\t\trecord(...steps);\r\n\t\t\tconst score = procedureEntity.calculateScore();\r\n\t\t\texpect(score.percentage).toBe(100);\r\n\t\t\texpect(score.comparison.map((c) => c.eventId)).toEqual(steps);\r\n\t\t\texpect(correctFlags()).toEqual(new Array(10).fill(true));\r\n\t\t});\r\n\r\n\t\tit(\"does not penalize one extra authored event emitted early\", () => {\r\n\t\t\trecord(\"s1\", \"s7\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\r\n\t\t\texpect(procedureEntity.calculateScore().percentage).toBe(100);\r\n\t\t\texpect(correctFlags()).toEqual(new Array(10).fill(true));\r\n\t\t});\r\n\r\n\t\tit(\"scores a skipped step 90% and marks only that step incorrect\", () => {\r\n\t\t\trecord(\"s1\", \"s2\", \"s3\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\r\n\t\t\texpect(procedureEntity.calculateScore().percentage).toBe(90);\r\n\t\t\texpect(correctFlags()).toEqual([\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t]);\r\n\t\t});\r\n\r\n\t\tit(\"scores swapped steps 90%, keeping the earlier expected step (deterministic tie-break)\", () => {\r\n\t\t\trecord(\"s1\", \"s2\", \"s3\", \"s5\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\r\n\t\t\tfor (let run = 0; run < 3; run++) {\r\n\t\t\t\tconst score = procedureEntity.calculateScore();\r\n\t\t\t\texpect(score.percentage).toBe(90);\r\n\t\t\t\texpect(score.comparison[3].correct).toBe(true);\r\n\t\t\t\texpect(score.comparison[4].correct).toBe(false);\r\n\t\t\t\texpect(score.comparison.filter((c) => c.correct).length).toBe(9);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tit(\"scores a repeated first step 100% with no duplicate in the log\", () => {\r\n\t\t\trecord(\"s1\", \"s1\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\r\n\t\t\texpect(procedureEntity.userEventLog).toEqual(steps);\r\n\t\t\texpect(procedureEntity.validationMessage).toBeNull();\r\n\t\t\texpect(procedureEntity.calculateScore().percentage).toBe(100);\r\n\t\t\texpect(correctFlags()).toEqual(new Array(10).fill(true));\r\n\t\t});\r\n\r\n\t\tit(\"scores a fully reversed run 10%\", () => {\r\n\t\t\trecord(...[...steps].reverse());\r\n\t\t\tconst score = procedureEntity.calculateScore();\r\n\t\t\texpect(score.percentage).toBe(10);\r\n\t\t\texpect(score.comparison[0].correct).toBe(true);\r\n\t\t\texpect(score.comparison.filter((c) => c.correct).length).toBe(1);\r\n\t\t});\r\n\r\n\t\tit(\"scores an empty log 0% with every step incorrect\", () => {\r\n\t\t\tconst score = procedureEntity.calculateScore();\r\n\t\t\texpect(score.percentage).toBe(0);\r\n\t\t\texpect(correctFlags()).toEqual(new Array(10).fill(false));\r\n\t\t\tscore.comparison.forEach((c) => {\r\n\t\t\t\texpect(c.expected).toBe(true);\r\n\t\t\t\texpect(c.actual).toBe(false);\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tit(\"keeps the comparison shape { eventId, expected, actual, correct }\", () => {\r\n\t\t\trecord(\"s1\", \"s2\", \"s3\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\r\n\t\t\tconst skipped = procedureEntity.calculateScore().comparison[4];\r\n\t\t\texpect(skipped).toEqual({\r\n\t\t\t\teventId: \"s5\",\r\n\t\t\t\texpected: true,\r\n\t\t\t\tactual: false,\r\n\t\t\t\tcorrect: false,\r\n\t\t\t});\r\n\t\t});\r\n\t});\r\n\r\n\tdescribe(\"calculateScore edge cases\", () => {\r\n\t\tit(\"returns { percentage: 0, comparison: [] } for an empty procedure\", () => {\r\n\t\t\tprocedureEntity.setOrderMatters(true);\r\n\t\t\texpect(procedureEntity.calculateScore()).toEqual({\r\n\t\t\t\tpercentage: 0,\r\n\t\t\t\tcomparison: [],\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tit(\"keeps set-based scoring when order does not matter\", () => {\r\n\t\t\tprocedureEntity.addEventId(\"a\");\r\n\t\t\tprocedureEntity.addEventId(\"b\");\r\n\t\t\tprocedureEntity.addEventId(\"c\");\r\n\t\t\tprocedureEntity.setOrderMatters(false);\r\n\t\t\tprocedureEntity.recordUserEvent(\"c\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"a\");\r\n\t\t\tconst score = procedureEntity.calculateScore();\r\n\t\t\texpect(score.percentage).toBe(67);\r\n\t\t\texpect(score.comparison.map((c) => c.correct)).toEqual([\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\ttrue,\r\n\t\t\t]);\r\n\t\t});\r\n\t});\r\n\r\n\tdescribe(\"event category lookup (#53)\", () => {\r\n\t\tit(\"treats every step as assessed when no lookup is injected\", () => {\r\n\t\t\texpect(procedureEntity.getEventCategory(\"navigate-to-overhead\")).toBe(\r\n\t\t\t\t\"assessed\",\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\tit(\"resolves a step's category through the injected lookup at call time\", () => {\r\n\t\t\tprocedureEntity.setEventCategoryLookup((eventId) =>\r\n\t\t\t\teventId === \"navigate-to-overhead\" ? \"instructional\" : \"assessed\",\r\n\t\t\t);\r\n\r\n\t\t\texpect(procedureEntity.getEventCategory(\"navigate-to-overhead\")).toBe(\r\n\t\t\t\t\"instructional\",\r\n\t\t\t);\r\n\t\t\texpect(procedureEntity.getEventCategory(\"lever\")).toBe(\"assessed\");\r\n\t\t});\r\n\r\n\t\tit(\"notifies observers when the lookup is injected so presenters rebuild\", () => {\r\n\t\t\tconst observer = jest.fn();\r\n\t\t\tprocedureEntity.addChangeObserver(observer);\r\n\r\n\t\t\tprocedureEntity.setEventCategoryLookup(() => \"assessed\");\r\n\r\n\t\t\texpect(observer).toHaveBeenCalledTimes(1);\r\n\t\t});\r\n\t});\r\n\r\n\tdescribe(\"quiz mode with instructional steps (#53)\", () => {\r\n\t\tconst NAV = \"navigate-to-overhead\";\r\n\r\n\t\tbeforeEach(() => {\r\n\t\t\tprocedureEntity.setEventCategoryLookup((eventId) =>\r\n\t\t\t\teventId === NAV ? \"instructional\" : \"assessed\",\r\n\t\t\t);\r\n\t\t\tprocedureEntity.addEventId(NAV);\r\n\t\t\tprocedureEntity.addEventId(\"lever\");\r\n\t\t\tprocedureEntity.addEventId(\"valve\");\r\n\t\t\tprocedureEntity.setIsQuiz(true);\r\n\t\t});\r\n\r\n\t\tit(\"scores only the assessed subsequence\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(\"lever\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"valve\");\r\n\r\n\t\t\texpect(procedureEntity.calculateScore()).toEqual({\r\n\t\t\t\tpercentage: 100,\r\n\t\t\t\tcomparison: [\r\n\t\t\t\t\t{ eventId: \"lever\", expected: true, actual: true, correct: true },\r\n\t\t\t\t\t{ eventId: \"valve\", expected: true, actual: true, correct: true },\r\n\t\t\t\t],\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tit(\"logs an instructional emission without advancing or flagging the attempt\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\r\n\t\t\texpect(procedureEntity.userEventLog).toEqual([NAV]);\r\n\t\t\texpect(procedureEntity.currentStepIndex).toBe(0);\r\n\t\t\texpect(procedureEntity.validationMessage).toBeNull();\r\n\t\t\texpect(procedureEntity.getNextExpectedEvent()).toBe(\"lever\");\r\n\t\t});\r\n\r\n\t\tit(\"does not misalign later assessed steps around an instructional emission\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(\"lever\");\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\t\t\tprocedureEntity.recordUserEvent(\"valve\");\r\n\r\n\t\t\texpect(procedureEntity.isComplete).toBe(true);\r\n\t\t\texpect(procedureEntity.getProgressPercentage()).toBe(100);\r\n\t\t\texpect(procedureEntity.calculateScore().percentage).toBe(100);\r\n\t\t});\r\n\r\n\t\tit(\"treats a quiz made only of instructional steps like an empty procedure\", () => {\r\n\t\t\tprocedureEntity.removeEventId(\"lever\");\r\n\t\t\tprocedureEntity.removeEventId(\"valve\");\r\n\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\r\n\t\t\texpect(procedureEntity.isComplete).toBe(false);\r\n\t\t\texpect(procedureEntity.getProgressPercentage()).toBe(0);\r\n\t\t\texpect(procedureEntity.getNextExpectedEvent()).toBeNull();\r\n\t\t\texpect(procedureEntity.calculateScore()).toEqual({\r\n\t\t\t\tpercentage: 0,\r\n\t\t\t\tcomparison: [],\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tit(\"ignores categories entirely in training mode\", () => {\r\n\t\t\tprocedureEntity.setIsQuiz(false);\r\n\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\t\t\texpect(procedureEntity.currentStepIndex).toBe(1);\r\n\t\t\texpect(procedureEntity.getProgressPercentage()).toBe(33);\r\n\r\n\t\t\tprocedureEntity.recordUserEvent(\"lever\");\r\n\t\t\tprocedureEntity.recordUserEvent(\"valve\");\r\n\t\t\texpect(procedureEntity.isComplete).toBe(true);\r\n\t\t\texpect(procedureEntity.calculateScore().comparison).toHaveLength(3);\r\n\t\t});\r\n\r\n\t\tit(\"logs a repeated instructional emission only once, however often the student revisits\", () => {\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\t\t\tprocedureEntity.recordUserEvent(\"lever\");\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\t\t\tprocedureEntity.recordUserEvent(NAV);\r\n\r\n\t\t\texpect(procedureEntity.userEventLog).toEqual([NAV, \"lever\"]);\r\n\t\t\t// The bounded log never changes the assessed score.\r\n\t\t\texpect(procedureEntity.calculateScore().percentage).toBe(50);\r\n\t\t});\r\n\r\n\t\tit(\"flags a quiz whose steps are all instructional as needing an assessed step\", () => {\r\n\t\t\tprocedureEntity.removeEventId(\"lever\");\r\n\t\t\tprocedureEntity.removeEventId(\"valve\");\r\n\r\n\t\t\texpect(procedureEntity.getAuthoringValidationMessage()).toBe(\r\n\t\t\t\t\"A quiz needs at least one assessed step\",\r\n\t\t\t);\r\n\t\t\texpect(procedureEntity.validateProgress()).toBe(\r\n\t\t\t\t\"A quiz needs at least one assessed step\",\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\tit(\"does not flag a quiz that has assessed steps, nor an all-instructional training procedure\", () => {\r\n\t\t\t// The mixed quiz has assessed steps → no authoring message.\r\n\t\t\texpect(procedureEntity.getAuthoringValidationMessage()).toBeNull();\r\n\r\n\t\t\t// All-instructional, but training mode is never a quiz problem.\r\n\t\t\tprocedureEntity.removeEventId(\"lever\");\r\n\t\t\tprocedureEntity.removeEventId(\"valve\");\r\n\t\t\tprocedureEntity.setIsQuiz(false);\r\n\t\t\texpect(procedureEntity.getAuthoringValidationMessage()).toBeNull();\r\n\t\t});\r\n\t});\r\n});\r\n"]}
1
+ {"version":3,"file":"ProcedureEntity.test.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/ProcedureEntity.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\nimport { ProcedureEntity, makeProcedureEntity } from \"./ProcedureEntity\";\n\ndescribe(\"ProcedureEntity\", () => {\n let appObjects: AppObjectRepo;\n let procedureEntity: ProcedureEntity;\n\n beforeEach(() => {\n appObjects = makeAppObjectRepo();\n const appObject = appObjects.getOrCreate(\"TestProcedure\");\n procedureEntity = makeProcedureEntity(appObject);\n });\n\n it(\"implements Challenge interface correctly\", () => {\n expect(procedureEntity.challengeID).toBe(\"PROCEDURE\");\n expect(procedureEntity.name).toBe(\"Procedure\");\n expect(typeof procedureEntity.consumerHelpText).toBe(\"string\");\n expect(typeof procedureEntity.authorHelpText).toBe(\"string\");\n expect(typeof procedureEntity.reset).toBe(\"function\");\n });\n\n it(\"has dynamic helpHeading based on quiz mode\", () => {\n expect(procedureEntity.helpHeading).toBe(\"Procedure Training\");\n procedureEntity.setIsQuiz(true);\n expect(procedureEntity.helpHeading).toBe(\"Procedure Challenge\");\n procedureEntity.setIsQuiz(false);\n expect(procedureEntity.helpHeading).toBe(\"Procedure Training\");\n });\n\n it(\"has dynamic consumerHelpText based on quiz mode\", () => {\n expect(procedureEntity.consumerHelpText).toBe(\n \"Follow the steps in order to complete the training procedure.\",\n );\n procedureEntity.setIsQuiz(true);\n expect(procedureEntity.consumerHelpText).toBe(\n \"Complete the procedure challenge on your own and get scored after submitting.\",\n );\n procedureEntity.setIsQuiz(false);\n expect(procedureEntity.consumerHelpText).toBe(\n \"Follow the steps in order to complete the training procedure.\",\n );\n });\n\n it(\"has correct singleton registration\", () => {\n const retrieved = ProcedureEntity.get(appObjects);\n expect(retrieved).toBe(procedureEntity);\n });\n\n it(\"starts with empty event list\", () => {\n expect(procedureEntity.eventIds).toEqual([]);\n });\n\n it(\"can add events to procedure\", () => {\n procedureEntity.addEventId(\"test_event_1\");\n procedureEntity.addEventId(\"test_event_2\");\n expect(procedureEntity.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\n });\n\n it(\"prevents duplicate events\", () => {\n procedureEntity.addEventId(\"test_event\");\n procedureEntity.addEventId(\"test_event\");\n expect(procedureEntity.eventIds).toEqual([\"test_event\"]);\n expect(procedureEntity.validationMessage).toContain(\n \"already in the procedure\",\n );\n });\n\n it(\"can remove events from procedure\", () => {\n procedureEntity.addEventId(\"test_event_1\");\n procedureEntity.addEventId(\"test_event_2\");\n procedureEntity.removeEventId(\"test_event_1\");\n expect(procedureEntity.eventIds).toEqual([\"test_event_2\"]);\n });\n\n it(\"handles removing non-existent events\", () => {\n procedureEntity.removeEventId(\"non_existent\");\n expect(procedureEntity.validationMessage).toContain(\"not in the procedure\");\n });\n\n it(\"can clear all events\", () => {\n procedureEntity.addEventId(\"test_event_1\");\n procedureEntity.addEventId(\"test_event_2\");\n procedureEntity.clearEventIds();\n expect(procedureEntity.eventIds).toEqual([]);\n });\n\n it(\"starts with empty user event log\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n expect(procedureEntity.userEventLog).toEqual([]);\n expect(procedureEntity.currentStepIndex).toBe(0);\n expect(procedureEntity.isComplete).toBe(false);\n });\n\n it(\"records user events for ordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.setOrderMatters(true);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.userEventLog).toEqual([\"event_1\"]);\n expect(procedureEntity.currentStepIndex).toBe(1);\n procedureEntity.recordUserEvent(\"event_2\");\n expect(procedureEntity.currentStepIndex).toBe(2);\n });\n\n it(\"validates order in ordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.setOrderMatters(true);\n procedureEntity.recordUserEvent(\"event_2\");\n expect(procedureEntity.validationMessage).toContain(\n \"Expected 'event_1', but got 'event_2'\",\n );\n expect(procedureEntity.currentStepIndex).toBe(0);\n });\n\n it(\"ignores order in unordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.setOrderMatters(false);\n procedureEntity.recordUserEvent(\"event_3\");\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.userEventLog).toEqual([\"event_3\", \"event_1\"]);\n });\n\n it(\"ignores events not in procedure\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.recordUserEvent(\"unknown_event\");\n expect(procedureEntity.userEventLog).toEqual([]);\n });\n\n it(\"detects completion in ordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.setOrderMatters(true);\n expect(procedureEntity.isComplete).toBe(false);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.isComplete).toBe(false);\n procedureEntity.recordUserEvent(\"event_2\");\n expect(procedureEntity.isComplete).toBe(true);\n });\n\n it(\"detects completion in unordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.setOrderMatters(false);\n expect(procedureEntity.isComplete).toBe(false);\n procedureEntity.recordUserEvent(\"event_2\");\n expect(procedureEntity.isComplete).toBe(false);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.isComplete).toBe(true);\n });\n\n it(\"returns false for empty procedures\", () => {\n procedureEntity.clearEventIds();\n expect(procedureEntity.isComplete).toBe(false);\n });\n\n it(\"calculates progress for ordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.addEventId(\"event_4\");\n procedureEntity.setOrderMatters(true);\n expect(procedureEntity.getProgressPercentage()).toBe(0);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.getProgressPercentage()).toBe(25);\n procedureEntity.recordUserEvent(\"event_2\");\n expect(procedureEntity.getProgressPercentage()).toBe(50);\n procedureEntity.recordUserEvent(\"event_3\");\n procedureEntity.recordUserEvent(\"event_4\");\n expect(procedureEntity.getProgressPercentage()).toBe(100);\n });\n\n it(\"calculates progress for unordered procedures\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.addEventId(\"event_4\");\n procedureEntity.setOrderMatters(false);\n expect(procedureEntity.getProgressPercentage()).toBe(0);\n procedureEntity.recordUserEvent(\"event_3\");\n expect(procedureEntity.getProgressPercentage()).toBe(25);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.getProgressPercentage()).toBe(50);\n });\n\n it(\"provides next expected event for ordered procedures with hints enabled\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.setOrderMatters(true);\n procedureEntity.setShowHints(true);\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"event_2\");\n });\n\n it(\"provides next unemitted event for unordered procedures with hints enabled\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.addEventId(\"event_3\");\n procedureEntity.setOrderMatters(false);\n procedureEntity.setShowHints(true);\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\n procedureEntity.recordUserEvent(\"event_3\");\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"event_1\");\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"event_2\");\n });\n\n it(\"returns null when hints are disabled\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.setShowHints(false);\n expect(procedureEntity.getNextExpectedEvent()).toBe(null);\n });\n\n it(\"can toggle order matters setting\", () => {\n expect(procedureEntity.orderMatters).toBe(true);\n procedureEntity.setOrderMatters(false);\n expect(procedureEntity.orderMatters).toBe(false);\n });\n\n it(\"can toggle hints setting\", () => {\n expect(procedureEntity.showHints).toBe(true);\n procedureEntity.setShowHints(false);\n expect(procedureEntity.showHints).toBe(false);\n });\n\n it(\"can toggle quiz mode\", () => {\n expect(procedureEntity.isQuiz).toBe(false);\n procedureEntity.setIsQuiz(true);\n expect(procedureEntity.isQuiz).toBe(true);\n });\n\n it(\"resets user progress while preserving configuration\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n procedureEntity.setOrderMatters(false);\n procedureEntity.setShowHints(false);\n procedureEntity.setIsQuiz(true);\n procedureEntity.recordUserEvent(\"event_1\");\n expect(procedureEntity.userEventLog.length).toBe(1);\n procedureEntity.reset();\n expect(procedureEntity.userEventLog).toEqual([]);\n expect(procedureEntity.currentStepIndex).toBe(0);\n expect(procedureEntity.validationMessage).toBe(null);\n expect(procedureEntity.eventIds).toEqual([\"event_1\", \"event_2\"]);\n expect(procedureEntity.orderMatters).toBe(false);\n expect(procedureEntity.showHints).toBe(false);\n expect(procedureEntity.isQuiz).toBe(true);\n });\n\n describe(\"recordUserEvent revisits (order matters)\", () => {\n beforeEach(() => {\n procedureEntity.addEventId(\"s1\");\n procedureEntity.addEventId(\"s2\");\n procedureEntity.addEventId(\"s3\");\n procedureEntity.setOrderMatters(true);\n });\n\n it(\"does not log a re-emission of an already-completed step\", () => {\n procedureEntity.recordUserEvent(\"s1\");\n procedureEntity.recordUserEvent(\"s2\");\n procedureEntity.recordUserEvent(\"s1\");\n expect(procedureEntity.userEventLog).toEqual([\"s1\", \"s2\"]);\n expect(procedureEntity.currentStepIndex).toBe(2);\n });\n\n it(\"does not set a validation message for a benign revisit\", () => {\n procedureEntity.recordUserEvent(\"s1\");\n procedureEntity.recordUserEvent(\"s1\");\n expect(procedureEntity.validationMessage).toBeNull();\n });\n\n it(\"still logs and flags an early emission of a later step\", () => {\n procedureEntity.recordUserEvent(\"s1\");\n procedureEntity.recordUserEvent(\"s3\");\n expect(procedureEntity.userEventLog).toEqual([\"s1\", \"s3\"]);\n expect(procedureEntity.validationMessage).toBe(\n \"Expected 's2', but got 's3'\",\n );\n expect(procedureEntity.currentStepIndex).toBe(1);\n });\n });\n\n describe(\"calculateScore (order matters, 10 steps)\", () => {\n const steps = [\"s1\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\"];\n\n const record = (...ids: string[]) =>\n ids.forEach((id) => procedureEntity.recordUserEvent(id));\n\n const correctFlags = () =>\n procedureEntity.calculateScore().comparison.map((c) => c.correct);\n\n beforeEach(() => {\n steps.forEach((s) => procedureEntity.addEventId(s));\n procedureEntity.setOrderMatters(true);\n });\n\n it(\"scores a perfect run 100% with every step correct\", () => {\n record(...steps);\n const score = procedureEntity.calculateScore();\n expect(score.percentage).toBe(100);\n expect(score.comparison.map((c) => c.eventId)).toEqual(steps);\n expect(correctFlags()).toEqual(new Array(10).fill(true));\n });\n\n it(\"does not penalize one extra authored event emitted early\", () => {\n record(\"s1\", \"s7\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\n expect(procedureEntity.calculateScore().percentage).toBe(100);\n expect(correctFlags()).toEqual(new Array(10).fill(true));\n });\n\n it(\"scores a skipped step 90% and marks only that step incorrect\", () => {\n record(\"s1\", \"s2\", \"s3\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\n expect(procedureEntity.calculateScore().percentage).toBe(90);\n expect(correctFlags()).toEqual([\n true,\n true,\n true,\n true,\n false,\n true,\n true,\n true,\n true,\n true,\n ]);\n });\n\n it(\"scores swapped steps 90%, keeping the earlier expected step (deterministic tie-break)\", () => {\n record(\"s1\", \"s2\", \"s3\", \"s5\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\n for (let run = 0; run < 3; run++) {\n const score = procedureEntity.calculateScore();\n expect(score.percentage).toBe(90);\n expect(score.comparison[3].correct).toBe(true);\n expect(score.comparison[4].correct).toBe(false);\n expect(score.comparison.filter((c) => c.correct).length).toBe(9);\n }\n });\n\n it(\"scores a repeated first step 100% with no duplicate in the log\", () => {\n record(\"s1\", \"s1\", \"s2\", \"s3\", \"s4\", \"s5\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\n expect(procedureEntity.userEventLog).toEqual(steps);\n expect(procedureEntity.validationMessage).toBeNull();\n expect(procedureEntity.calculateScore().percentage).toBe(100);\n expect(correctFlags()).toEqual(new Array(10).fill(true));\n });\n\n it(\"scores a fully reversed run 10%\", () => {\n record(...[...steps].reverse());\n const score = procedureEntity.calculateScore();\n expect(score.percentage).toBe(10);\n expect(score.comparison[0].correct).toBe(true);\n expect(score.comparison.filter((c) => c.correct).length).toBe(1);\n });\n\n it(\"scores an empty log 0% with every step incorrect\", () => {\n const score = procedureEntity.calculateScore();\n expect(score.percentage).toBe(0);\n expect(correctFlags()).toEqual(new Array(10).fill(false));\n score.comparison.forEach((c) => {\n expect(c.expected).toBe(true);\n expect(c.actual).toBe(false);\n });\n });\n\n it(\"keeps the comparison shape { eventId, expected, actual, correct }\", () => {\n record(\"s1\", \"s2\", \"s3\", \"s4\", \"s6\", \"s7\", \"s8\", \"s9\", \"s10\");\n const skipped = procedureEntity.calculateScore().comparison[4];\n expect(skipped).toEqual({\n eventId: \"s5\",\n expected: true,\n actual: false,\n correct: false,\n });\n });\n });\n\n describe(\"calculateScore edge cases\", () => {\n it(\"returns { percentage: 0, comparison: [] } for an empty procedure\", () => {\n procedureEntity.setOrderMatters(true);\n expect(procedureEntity.calculateScore()).toEqual({\n percentage: 0,\n comparison: [],\n });\n });\n\n it(\"keeps set-based scoring when order does not matter\", () => {\n procedureEntity.addEventId(\"a\");\n procedureEntity.addEventId(\"b\");\n procedureEntity.addEventId(\"c\");\n procedureEntity.setOrderMatters(false);\n procedureEntity.recordUserEvent(\"c\");\n procedureEntity.recordUserEvent(\"a\");\n const score = procedureEntity.calculateScore();\n expect(score.percentage).toBe(67);\n expect(score.comparison.map((c) => c.correct)).toEqual([\n true,\n false,\n true,\n ]);\n });\n });\n\n describe(\"event category lookup (#53)\", () => {\n it(\"treats every step as assessed when no lookup is injected\", () => {\n expect(procedureEntity.getEventCategory(\"navigate-to-overhead\")).toBe(\n \"assessed\",\n );\n });\n\n it(\"resolves a step's category through the injected lookup at call time\", () => {\n procedureEntity.setEventCategoryLookup((eventId) =>\n eventId === \"navigate-to-overhead\" ? \"instructional\" : \"assessed\",\n );\n\n expect(procedureEntity.getEventCategory(\"navigate-to-overhead\")).toBe(\n \"instructional\",\n );\n expect(procedureEntity.getEventCategory(\"lever\")).toBe(\"assessed\");\n });\n\n it(\"notifies observers when the lookup is injected so presenters rebuild\", () => {\n const observer = jest.fn();\n procedureEntity.addChangeObserver(observer);\n\n procedureEntity.setEventCategoryLookup(() => \"assessed\");\n\n expect(observer).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"quiz mode with instructional steps (#53)\", () => {\n const NAV = \"navigate-to-overhead\";\n\n beforeEach(() => {\n procedureEntity.setEventCategoryLookup((eventId) =>\n eventId === NAV ? \"instructional\" : \"assessed\",\n );\n procedureEntity.addEventId(NAV);\n procedureEntity.addEventId(\"lever\");\n procedureEntity.addEventId(\"valve\");\n procedureEntity.setIsQuiz(true);\n });\n\n it(\"scores only the assessed subsequence\", () => {\n procedureEntity.recordUserEvent(\"lever\");\n procedureEntity.recordUserEvent(\"valve\");\n\n expect(procedureEntity.calculateScore()).toEqual({\n percentage: 100,\n comparison: [\n { eventId: \"lever\", expected: true, actual: true, correct: true },\n { eventId: \"valve\", expected: true, actual: true, correct: true },\n ],\n });\n });\n\n it(\"logs an instructional emission without advancing or flagging the attempt\", () => {\n procedureEntity.recordUserEvent(NAV);\n\n expect(procedureEntity.userEventLog).toEqual([NAV]);\n expect(procedureEntity.currentStepIndex).toBe(0);\n expect(procedureEntity.validationMessage).toBeNull();\n expect(procedureEntity.getNextExpectedEvent()).toBe(\"lever\");\n });\n\n it(\"does not misalign later assessed steps around an instructional emission\", () => {\n procedureEntity.recordUserEvent(\"lever\");\n procedureEntity.recordUserEvent(NAV);\n procedureEntity.recordUserEvent(\"valve\");\n\n expect(procedureEntity.isComplete).toBe(true);\n expect(procedureEntity.getProgressPercentage()).toBe(100);\n expect(procedureEntity.calculateScore().percentage).toBe(100);\n });\n\n it(\"treats a quiz made only of instructional steps like an empty procedure\", () => {\n procedureEntity.removeEventId(\"lever\");\n procedureEntity.removeEventId(\"valve\");\n\n procedureEntity.recordUserEvent(NAV);\n\n expect(procedureEntity.isComplete).toBe(false);\n expect(procedureEntity.getProgressPercentage()).toBe(0);\n expect(procedureEntity.getNextExpectedEvent()).toBeNull();\n expect(procedureEntity.calculateScore()).toEqual({\n percentage: 0,\n comparison: [],\n });\n });\n\n it(\"ignores categories entirely in training mode\", () => {\n procedureEntity.setIsQuiz(false);\n\n procedureEntity.recordUserEvent(NAV);\n expect(procedureEntity.currentStepIndex).toBe(1);\n expect(procedureEntity.getProgressPercentage()).toBe(33);\n\n procedureEntity.recordUserEvent(\"lever\");\n procedureEntity.recordUserEvent(\"valve\");\n expect(procedureEntity.isComplete).toBe(true);\n expect(procedureEntity.calculateScore().comparison).toHaveLength(3);\n });\n\n it(\"logs a repeated instructional emission only once, however often the student revisits\", () => {\n procedureEntity.recordUserEvent(NAV);\n procedureEntity.recordUserEvent(\"lever\");\n procedureEntity.recordUserEvent(NAV);\n procedureEntity.recordUserEvent(NAV);\n\n expect(procedureEntity.userEventLog).toEqual([NAV, \"lever\"]);\n // The bounded log never changes the assessed score.\n expect(procedureEntity.calculateScore().percentage).toBe(50);\n });\n\n it(\"flags a quiz whose steps are all instructional as needing an assessed step\", () => {\n procedureEntity.removeEventId(\"lever\");\n procedureEntity.removeEventId(\"valve\");\n\n expect(procedureEntity.getAuthoringValidationMessage()).toBe(\n \"A quiz needs at least one assessed step\",\n );\n expect(procedureEntity.validateProgress()).toBe(\n \"A quiz needs at least one assessed step\",\n );\n });\n\n it(\"does not flag a quiz that has assessed steps, nor an all-instructional training procedure\", () => {\n // The mixed quiz has assessed steps → no authoring message.\n expect(procedureEntity.getAuthoringValidationMessage()).toBeNull();\n\n // All-instructional, but training mode is never a quiz problem.\n procedureEntity.removeEventId(\"lever\");\n procedureEntity.removeEventId(\"valve\");\n procedureEntity.setIsQuiz(false);\n expect(procedureEntity.getAuthoringValidationMessage()).toBeNull();\n });\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC","sourcesContent":["export * from \"./ProcedureEntity\";\r\nexport * from \"./HintRegistry\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC","sourcesContent":["export * from \"./ProcedureEntity\";\nexport * from \"./HintRegistry\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedureFeatureFactory.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { DomainFactory, AppObjectRepo } from \"@vived/core\";\r\nimport { ChallengeEntity } from \"../../Challenge\";\r\nimport { EventEntity } from \"../../EventSystem/Entities/EventEntity\";\r\nimport {\r\n makeProcedureEntity,\r\n ProcedureEntity,\r\n} from \"../Entities/ProcedureEntity\";\r\nimport { makeHintRegistry } from \"../Entities/HintRegistry\";\r\nimport { makeAddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\r\nimport { makeRecordProcedureEventUC } from \"../UCs/RecordProcedureEventUC\";\r\nimport { makeResetProcedureProgressUC } from \"../UCs/ResetProcedureProgressUC\";\r\nimport { makeSerializeProcedure } from \"../UCs/SerializeProcedure\";\r\nimport { makeRemoveProcedureEventUC } from \"../UCs/RemoveProcedureEventUC\";\r\nimport { makeMoveProcedureEventUpUC } from \"../UCs/MoveProcedureEventUpUC\";\r\nimport { makeMoveProcedureEventDownUC } from \"../UCs/MoveProcedureEventDownUC\";\r\nimport { makeSetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\r\nimport { makeSetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\r\nimport { makeSetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\r\nimport { makeSubmitProcedureQuizUC } from \"../UCs/SubmitProcedureQuizUC\";\r\nimport { makeUpdateProcedureEventsUCHook } from \"../UCs/UpdateProcedureEventsUCHook\";\r\nimport { makeRecordProcedureSessionUC } from \"../UCs/RecordProcedureSessionUC\";\r\nimport { makeProcedurePM, ProcedurePM } from \"../PM/ProcedurePM\";\r\n\r\nexport class ProcedureFeatureFactory extends DomainFactory {\r\n factoryName = \"ProcedureFeatureFactory\";\r\n\r\n setupEntities(): void {\r\n makeProcedureEntity(this.appObject);\r\n makeHintRegistry(this.appObject);\r\n }\r\n\r\n setupUCs(): void {\r\n makeAddProcedureEventUC(this.appObject);\r\n makeRecordProcedureEventUC(this.appObject);\r\n makeResetProcedureProgressUC(this.appObject);\r\n makeSerializeProcedure(this.appObject);\r\n makeRemoveProcedureEventUC(this.appObject);\r\n makeMoveProcedureEventUpUC(this.appObject);\r\n makeMoveProcedureEventDownUC(this.appObject);\r\n makeSetProcedureOrderMattersUC(this.appObject);\r\n makeSetProcedureShowHintsUC(this.appObject);\r\n makeSetProcedureIsQuizUC(this.appObject);\r\n makeSubmitProcedureQuizUC(this.appObject);\r\n makeUpdateProcedureEventsUCHook(this.appObject);\r\n makeRecordProcedureSessionUC(this.appObject);\r\n }\r\n\r\n setupPMs(): void {\r\n makeProcedurePM(this.appObject);\r\n }\r\n\r\n finalSetup(): void {\r\n this.wireEventCategoryLookup();\r\n this.registerProcedureChallenge();\r\n }\r\n\r\n /**\r\n * Classification is derived at evaluation time from the EventSystem Registry\r\n * (#53): hand the entity a lookup rather than copying categories into it, so\r\n * events registered later (and slides authored earlier) are classified too.\r\n */\r\n private wireEventCategoryLookup(): void {\r\n const procedureEntity = this.getProcedureEntity();\r\n if (!procedureEntity) {\r\n this.warn(\"ProcedureEntity not found - cannot wire event categories\");\r\n return;\r\n }\r\n\r\n const eventEntity = EventEntity.get(this.appObjects);\r\n if (!eventEntity) {\r\n this.warn(\r\n \"EventEntity not found - every procedure step will be treated as assessed\",\r\n );\r\n return;\r\n }\r\n\r\n procedureEntity.setEventCategoryLookup((eventId) =>\r\n eventEntity.getEventCategory(eventId),\r\n );\r\n }\r\n\r\n private registerProcedureChallenge(): void {\r\n const challengeEntity = ChallengeEntity.get(this.appObjects);\r\n const procedureEntity = this.getProcedureEntity();\r\n\r\n if (!challengeEntity) {\r\n this.warn(\r\n \"ChallengeEntity not found - Procedure challenge will not be available in selection\",\r\n );\r\n return;\r\n }\r\n\r\n if (!procedureEntity) {\r\n this.warn(\"ProcedureEntity not found - cannot register challenge\");\r\n return;\r\n }\r\n\r\n try {\r\n challengeEntity.registerChallenge(procedureEntity);\r\n } catch (error) {\r\n this.warn(`Failed to register Procedure challenge: ${error}`);\r\n }\r\n }\r\n\r\n getProcedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n getProcedurePM(): ProcedurePM | undefined {\r\n return ProcedurePM.get(this.appObjects);\r\n }\r\n}\r\n\r\nexport const ProcedureFeatureComponents = {\r\n procedureEntityType: ProcedureEntity.type,\r\n procedurePMType: ProcedurePM.type,\r\n};\r\n\r\nexport function makeProcedureFeatureFactory(\r\n appObjects: AppObjectRepo,\r\n): ProcedureFeatureFactory {\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n return new ProcedureFeatureFactory(appObject);\r\n}\r\n"]}
1
+ {"version":3,"file":"ProcedureFeatureFactory.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { DomainFactory, AppObjectRepo } from \"@vived/core\";\nimport { ChallengeEntity } from \"../../Challenge\";\nimport { EventEntity } from \"../../EventSystem/Entities/EventEntity\";\nimport {\n makeProcedureEntity,\n ProcedureEntity,\n} from \"../Entities/ProcedureEntity\";\nimport { makeHintRegistry } from \"../Entities/HintRegistry\";\nimport { makeAddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\nimport { makeRecordProcedureEventUC } from \"../UCs/RecordProcedureEventUC\";\nimport { makeResetProcedureProgressUC } from \"../UCs/ResetProcedureProgressUC\";\nimport { makeSerializeProcedure } from \"../UCs/SerializeProcedure\";\nimport { makeRemoveProcedureEventUC } from \"../UCs/RemoveProcedureEventUC\";\nimport { makeMoveProcedureEventUpUC } from \"../UCs/MoveProcedureEventUpUC\";\nimport { makeMoveProcedureEventDownUC } from \"../UCs/MoveProcedureEventDownUC\";\nimport { makeSetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\nimport { makeSetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\nimport { makeSetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\nimport { makeSubmitProcedureQuizUC } from \"../UCs/SubmitProcedureQuizUC\";\nimport { makeUpdateProcedureEventsUCHook } from \"../UCs/UpdateProcedureEventsUCHook\";\nimport { makeRecordProcedureSessionUC } from \"../UCs/RecordProcedureSessionUC\";\nimport { makeProcedurePM, ProcedurePM } from \"../PM/ProcedurePM\";\n\nexport class ProcedureFeatureFactory extends DomainFactory {\n factoryName = \"ProcedureFeatureFactory\";\n\n setupEntities(): void {\n makeProcedureEntity(this.appObject);\n makeHintRegistry(this.appObject);\n }\n\n setupUCs(): void {\n makeAddProcedureEventUC(this.appObject);\n makeRecordProcedureEventUC(this.appObject);\n makeResetProcedureProgressUC(this.appObject);\n makeSerializeProcedure(this.appObject);\n makeRemoveProcedureEventUC(this.appObject);\n makeMoveProcedureEventUpUC(this.appObject);\n makeMoveProcedureEventDownUC(this.appObject);\n makeSetProcedureOrderMattersUC(this.appObject);\n makeSetProcedureShowHintsUC(this.appObject);\n makeSetProcedureIsQuizUC(this.appObject);\n makeSubmitProcedureQuizUC(this.appObject);\n makeUpdateProcedureEventsUCHook(this.appObject);\n makeRecordProcedureSessionUC(this.appObject);\n }\n\n setupPMs(): void {\n makeProcedurePM(this.appObject);\n }\n\n finalSetup(): void {\n this.wireEventCategoryLookup();\n this.registerProcedureChallenge();\n }\n\n /**\n * Classification is derived at evaluation time from the EventSystem Registry\n * (#53): hand the entity a lookup rather than copying categories into it, so\n * events registered later (and slides authored earlier) are classified too.\n */\n private wireEventCategoryLookup(): void {\n const procedureEntity = this.getProcedureEntity();\n if (!procedureEntity) {\n this.warn(\"ProcedureEntity not found - cannot wire event categories\");\n return;\n }\n\n const eventEntity = EventEntity.get(this.appObjects);\n if (!eventEntity) {\n this.warn(\n \"EventEntity not found - every procedure step will be treated as assessed\",\n );\n return;\n }\n\n procedureEntity.setEventCategoryLookup((eventId) =>\n eventEntity.getEventCategory(eventId),\n );\n }\n\n private registerProcedureChallenge(): void {\n const challengeEntity = ChallengeEntity.get(this.appObjects);\n const procedureEntity = this.getProcedureEntity();\n\n if (!challengeEntity) {\n this.warn(\n \"ChallengeEntity not found - Procedure challenge will not be available in selection\",\n );\n return;\n }\n\n if (!procedureEntity) {\n this.warn(\"ProcedureEntity not found - cannot register challenge\");\n return;\n }\n\n try {\n challengeEntity.registerChallenge(procedureEntity);\n } catch (error) {\n this.warn(`Failed to register Procedure challenge: ${error}`);\n }\n }\n\n getProcedureEntity(): ProcedureEntity | undefined {\n return ProcedureEntity.get(this.appObjects);\n }\n\n getProcedurePM(): ProcedurePM | undefined {\n return ProcedurePM.get(this.appObjects);\n }\n}\n\nexport const ProcedureFeatureComponents = {\n procedureEntityType: ProcedureEntity.type,\n procedurePMType: ProcedurePM.type,\n};\n\nexport function makeProcedureFeatureFactory(\n appObjects: AppObjectRepo,\n): ProcedureFeatureFactory {\n const appObject = appObjects.getOrCreate(\"Procedure\");\n return new ProcedureFeatureFactory(appObject);\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { makeAppObjectRepo, DomainFactoryRepo } from "@vived/core";
1
+ import { makeAppObjectRepo, DomainFactoryRepo, } from "@vived/core";
2
2
  import { ChallengeEntity } from "../../Challenge";
3
- import { EventEntity, makeEventEntity } from "../../EventSystem/Entities/EventEntity";
3
+ import { EventEntity, makeEventEntity, } from "../../EventSystem/Entities/EventEntity";
4
4
  import { makeProcedureFeatureFactory, ProcedureFeatureFactory, } from "./ProcedureFeatureFactory";
5
5
  import { ProcedureEntity } from "../Entities/ProcedureEntity";
6
6
  import { AddProcedureEventUC } from "../UCs/AddProcedureEventUC";
@@ -26,7 +26,9 @@ describe("ProcedureFeatureFactory", () => {
26
26
  let factory;
27
27
  beforeEach(() => {
28
28
  jest.clearAllMocks();
29
- jest.mocked(ChallengeEntity.get).mockReturnValue(mockChallengeEntityInstance);
29
+ jest
30
+ .mocked(ChallengeEntity.get)
31
+ .mockReturnValue(mockChallengeEntityInstance);
30
32
  appObjects = makeAppObjectRepo();
31
33
  // Create a real EventEntity singleton so PM and UCs can find it
32
34
  const eventAppObject = appObjects.getOrCreate("EventSystem");
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedureFeatureFactory.test.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo, DomainFactoryRepo } from \"@vived/core\";\r\nimport { ChallengeEntity } from \"../../Challenge\";\r\nimport { EventEntity, makeEventEntity } from \"../../EventSystem/Entities/EventEntity\";\r\nimport {\r\n makeProcedureFeatureFactory,\r\n ProcedureFeatureFactory,\r\n} from \"./ProcedureFeatureFactory\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { AddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\r\nimport { SerializeProcedure } from \"../UCs/SerializeProcedure\";\r\nimport { SetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\r\nimport { SetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\r\nimport { SetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\r\n\r\njest.mock(\"../../Challenge\", () => ({\r\n ChallengeEntity: {\r\n get: jest.fn(),\r\n },\r\n}));\r\n\r\nconst mockRegisterChallenge = jest.fn();\r\nconst mockChallengeEntityInstance = {\r\n registerChallenge: mockRegisterChallenge,\r\n addChangeObserver: jest.fn(),\r\n removeChangeObserver: jest.fn(),\r\n selectedChallenge: null,\r\n};\r\n\r\ndescribe(\"ProcedureFeatureFactory\", () => {\r\n let appObjects: AppObjectRepo;\r\n let domainFactoryRepo: DomainFactoryRepo;\r\n let factory: ProcedureFeatureFactory;\r\n\r\n beforeEach(() => {\r\n jest.clearAllMocks();\r\n\r\n jest.mocked(ChallengeEntity.get).mockReturnValue(\r\n mockChallengeEntityInstance as any,\r\n );\r\n\r\n appObjects = makeAppObjectRepo();\r\n\r\n // Create a real EventEntity singleton so PM and UCs can find it\r\n const eventAppObject = appObjects.getOrCreate(\"EventSystem\");\r\n const eventEntity = makeEventEntity(eventAppObject);\r\n appObjects.registerSingleton(eventEntity);\r\n\r\n domainFactoryRepo = new DomainFactoryRepo(\r\n appObjects.getOrCreate(\"DomainFactory\"),\r\n );\r\n factory = makeProcedureFeatureFactory(appObjects);\r\n\r\n domainFactoryRepo.setupDomain();\r\n });\r\n\r\n it(\"creates factory with correct name\", () => {\r\n expect(factory.factoryName).toBe(\"ProcedureFeatureFactory\");\r\n });\r\n\r\n it(\"uses correct AppObject name\", () => {\r\n const procedureAppObject = appObjects.getOrCreate(\"Procedure\");\r\n expect(procedureAppObject).toBeDefined();\r\n });\r\n\r\n it(\"creates ProcedureEntity singleton\", () => {\r\n expect(factory.getProcedureEntity()).toBeDefined();\r\n expect(factory.getProcedureEntity()?.challengeID).toBe(\"PROCEDURE\");\r\n });\r\n\r\n it(\"registers ProcedureEntity as singleton\", () => {\r\n const entity = ProcedureEntity.get(appObjects);\r\n expect(entity).toBeDefined();\r\n expect(entity).toBe(factory.getProcedureEntity());\r\n });\r\n\r\n it(\"creates all required Use Cases\", () => {\r\n const addEventUC = AddProcedureEventUC.get(appObjects);\r\n expect(addEventUC).toBeDefined();\r\n\r\n const serializeUC = SerializeProcedure.get(appObjects);\r\n expect(serializeUC).toBeDefined();\r\n\r\n const setOrderMattersUC = SetProcedureOrderMattersUC.get(appObjects);\r\n expect(setOrderMattersUC).toBeDefined();\r\n\r\n const setShowHintsUC = SetProcedureShowHintsUC.get(appObjects);\r\n expect(setShowHintsUC).toBeDefined();\r\n\r\n const setIsQuizUC = SetProcedureIsQuizUC.get(appObjects);\r\n expect(setIsQuizUC).toBeDefined();\r\n });\r\n\r\n it(\"Use Cases can find their entity\", () => {\r\n const addEventUC = AddProcedureEventUC.get(appObjects);\r\n const entity = factory.getProcedureEntity();\r\n\r\n addEventUC!.addEvent(\"test_event\");\r\n expect(entity!.eventIds).toContain(\"test_event\");\r\n });\r\n\r\n it(\"configuration Use Cases can modify entity properties\", () => {\r\n const entity = factory.getProcedureEntity()!;\r\n const setOrderMattersUC = SetProcedureOrderMattersUC.get(appObjects)!;\r\n const setShowHintsUC = SetProcedureShowHintsUC.get(appObjects)!;\r\n const setIsQuizUC = SetProcedureIsQuizUC.get(appObjects)!;\r\n\r\n expect(entity.orderMatters).toBe(true);\r\n expect(entity.showHints).toBe(true);\r\n expect(entity.isQuiz).toBe(false);\r\n\r\n setOrderMattersUC.setOrderMatters(false);\r\n expect(entity.orderMatters).toBe(false);\r\n\r\n setShowHintsUC.setShowHints(false);\r\n expect(entity.showHints).toBe(false);\r\n\r\n setIsQuizUC.setIsQuiz(true);\r\n expect(entity.isQuiz).toBe(true);\r\n });\r\n\r\n it(\"creates ProcedurePM singleton\", () => {\r\n expect(factory.getProcedurePM()).toBeDefined();\r\n });\r\n\r\n it(\"PM can access entity state\", () => {\r\n const pm = factory.getProcedurePM();\r\n const entity = factory.getProcedureEntity();\r\n\r\n entity!.addEventId(\"test_event\");\r\n\r\n const vm = pm!.lastVM;\r\n expect(vm!.eventIds).toContain(\"test_event\");\r\n });\r\n\r\n it(\"registers procedure challenge with ChallengeEntity\", () => {\r\n expect(mockRegisterChallenge).toHaveBeenCalledWith(\r\n factory.getProcedureEntity(),\r\n );\r\n });\r\n\r\n it(\"injects the EventEntity category lookup into the entity (#53)\", () => {\r\n const eventEntity = EventEntity.get(appObjects)!;\r\n const entity = factory.getProcedureEntity()!;\r\n\r\n // Registered after setup: the lookup is evaluated at call time, not cached.\r\n eventEntity.register(\"navigate-to-overhead\", \"Go to overhead\", {\r\n category: \"instructional\",\r\n });\r\n eventEntity.register(\"lever\", \"Pull lever\");\r\n\r\n expect(entity.getEventCategory(\"navigate-to-overhead\")).toBe(\r\n \"instructional\",\r\n );\r\n expect(entity.getEventCategory(\"lever\")).toBe(\"assessed\");\r\n expect(entity.getEventCategory(\"never-registered\")).toBe(\"assessed\");\r\n });\r\n\r\n it(\"warns and falls back to an assessed lookup when EventEntity is absent (#53)\", () => {\r\n const submitWarningSpy = jest.fn();\r\n const newAppObjects = makeAppObjectRepo();\r\n newAppObjects.submitWarning = submitWarningSpy;\r\n\r\n // No EventEntity registered on this repo: the category lookup cannot wire.\r\n const newDomainFactoryRepo = new DomainFactoryRepo(\r\n newAppObjects.getOrCreate(\"DomainFactory\"),\r\n );\r\n const newFactory = makeProcedureFeatureFactory(newAppObjects);\r\n newDomainFactoryRepo.setupDomain();\r\n\r\n expect(submitWarningSpy).toHaveBeenCalledWith(\r\n expect.stringContaining(\"Procedure\"),\r\n expect.stringContaining(\"EventEntity not found\"),\r\n );\r\n\r\n // The entity keeps its default lookup, so every step is treated as assessed.\r\n const entity = newFactory.getProcedureEntity()!;\r\n expect(entity.getEventCategory(\"anything\")).toBe(\"assessed\");\r\n });\r\n\r\n it(\"handles missing ChallengeEntity gracefully\", () => {\r\n jest.mocked(ChallengeEntity.get).mockReturnValueOnce(undefined);\r\n\r\n const submitWarningSpy = jest.fn();\r\n const newAppObjects = makeAppObjectRepo();\r\n newAppObjects.submitWarning = submitWarningSpy;\r\n\r\n const newDomainFactoryRepo = new DomainFactoryRepo(\r\n newAppObjects.getOrCreate(\"DomainFactory\"),\r\n );\r\n makeProcedureFeatureFactory(newAppObjects);\r\n newDomainFactoryRepo.setupDomain();\r\n\r\n expect(submitWarningSpy).toHaveBeenCalledWith(\r\n expect.stringContaining(\"Procedure\"),\r\n expect.stringContaining(\"ChallengeEntity not found\"),\r\n );\r\n });\r\n\r\n it(\"all components can communicate\", () => {\r\n const entity = factory.getProcedureEntity()!;\r\n const pm = factory.getProcedurePM()!;\r\n const addEventUC = AddProcedureEventUC.get(appObjects)!;\r\n\r\n addEventUC.addEvent(\"integration_test_event\");\r\n\r\n expect(entity.eventIds).toContain(\"integration_test_event\");\r\n\r\n const vm = pm.lastVM!;\r\n expect(vm.eventIds).toContain(\"integration_test_event\");\r\n });\r\n\r\n it(\"provides access to created components\", () => {\r\n expect(factory.getProcedureEntity()).toBeInstanceOf(Object);\r\n expect(factory.getProcedurePM()).toBeInstanceOf(Object);\r\n });\r\n\r\n it(\"returns undefined for components when not properly initialized\", () => {\r\n const isolatedAppObjects = makeAppObjectRepo();\r\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\r\n const isolatedFactory = new ProcedureFeatureFactory(isolatedAppObject);\r\n\r\n expect(isolatedFactory.getProcedureEntity()).toBeUndefined();\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ProcedureFeatureFactory.test.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,WAAW,EACX,eAAe,GAChB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,eAAe,EAAE;QACf,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;KACf;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,qBAAqB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACxC,MAAM,2BAA2B,GAAG;IAClC,iBAAiB,EAAE,qBAAqB;IACxC,iBAAiB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC5B,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE;IAC/B,iBAAiB,EAAE,IAAI;CACxB,CAAC;AAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,IAAI,UAAyB,CAAC;IAC9B,IAAI,iBAAoC,CAAC;IACzC,IAAI,OAAgC,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI;aACD,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;aAC3B,eAAe,CAAC,2BAAkC,CAAC,CAAC;QAEvD,UAAU,GAAG,iBAAiB,EAAE,CAAC;QAEjC,gEAAgE;QAChE,MAAM,cAAc,GAAG,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QACpD,UAAU,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAE1C,iBAAiB,GAAG,IAAI,iBAAiB,CACvC,UAAU,CAAC,WAAW,CAAC,eAAe,CAAC,CACxC,CAAC;QACF,OAAO,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;QAElD,iBAAiB,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,kBAAkB,GAAG,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAC/D,MAAM,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjC,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QAElC,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;QAExC,MAAM,cAAc,GAAG,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QAErC,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAE5C,UAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAG,CAAC;QAC7C,MAAM,iBAAiB,GAAG,0BAA0B,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACtE,MAAM,cAAc,GAAG,uBAAuB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QAChE,MAAM,WAAW,GAAG,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAElC,iBAAiB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAExC,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAE5C,MAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEjC,MAAM,EAAE,GAAG,EAAG,CAAC,MAAM,CAAC;QACtB,MAAM,CAAC,EAAG,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAChD,OAAO,CAAC,kBAAkB,EAAE,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACjD,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAG,CAAC;QAE7C,4EAA4E;QAC5E,WAAW,CAAC,QAAQ,CAAC,sBAAsB,EAAE,gBAAgB,EAAE;YAC7D,QAAQ,EAAE,eAAe;SAC1B,CAAC,CAAC;QACH,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAE5C,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAC1D,eAAe,CAChB,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,aAAa,CAAC,aAAa,GAAG,gBAAgB,CAAC;QAE/C,2EAA2E;QAC3E,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,CAChD,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,CAC3C,CAAC;QACF,MAAM,UAAU,GAAG,2BAA2B,CAAC,aAAa,CAAC,CAAC;QAC9D,oBAAoB,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,CACjD,CAAC;QAEF,6EAA6E;QAC7E,MAAM,MAAM,GAAG,UAAU,CAAC,kBAAkB,EAAG,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAEhE,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,iBAAiB,EAAE,CAAC;QAC1C,aAAa,CAAC,aAAa,GAAG,gBAAgB,CAAC;QAE/C,MAAM,oBAAoB,GAAG,IAAI,iBAAiB,CAChD,aAAa,CAAC,WAAW,CAAC,eAAe,CAAC,CAC3C,CAAC;QACF,2BAA2B,CAAC,aAAa,CAAC,CAAC;QAC3C,oBAAoB,CAAC,WAAW,EAAE,CAAC;QAEnC,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC3C,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,EACpC,MAAM,CAAC,gBAAgB,CAAC,2BAA2B,CAAC,CACrD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAG,CAAC;QAC7C,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,EAAG,CAAC;QACrC,MAAM,UAAU,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QAExD,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;QAE9C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAE5D,MAAM,EAAE,GAAG,EAAE,CAAC,MAAO,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,kBAAkB,GAAG,iBAAiB,EAAE,CAAC;QAC/C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,eAAe,GAAG,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;QAEvE,MAAM,CAAC,eAAe,CAAC,kBAAkB,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import {\n AppObjectRepo,\n makeAppObjectRepo,\n DomainFactoryRepo,\n} from \"@vived/core\";\nimport { ChallengeEntity } from \"../../Challenge\";\nimport {\n EventEntity,\n makeEventEntity,\n} from \"../../EventSystem/Entities/EventEntity\";\nimport {\n makeProcedureFeatureFactory,\n ProcedureFeatureFactory,\n} from \"./ProcedureFeatureFactory\";\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\nimport { AddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\nimport { SerializeProcedure } from \"../UCs/SerializeProcedure\";\nimport { SetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\nimport { SetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\nimport { SetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\n\njest.mock(\"../../Challenge\", () => ({\n ChallengeEntity: {\n get: jest.fn(),\n },\n}));\n\nconst mockRegisterChallenge = jest.fn();\nconst mockChallengeEntityInstance = {\n registerChallenge: mockRegisterChallenge,\n addChangeObserver: jest.fn(),\n removeChangeObserver: jest.fn(),\n selectedChallenge: null,\n};\n\ndescribe(\"ProcedureFeatureFactory\", () => {\n let appObjects: AppObjectRepo;\n let domainFactoryRepo: DomainFactoryRepo;\n let factory: ProcedureFeatureFactory;\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n jest\n .mocked(ChallengeEntity.get)\n .mockReturnValue(mockChallengeEntityInstance as any);\n\n appObjects = makeAppObjectRepo();\n\n // Create a real EventEntity singleton so PM and UCs can find it\n const eventAppObject = appObjects.getOrCreate(\"EventSystem\");\n const eventEntity = makeEventEntity(eventAppObject);\n appObjects.registerSingleton(eventEntity);\n\n domainFactoryRepo = new DomainFactoryRepo(\n appObjects.getOrCreate(\"DomainFactory\"),\n );\n factory = makeProcedureFeatureFactory(appObjects);\n\n domainFactoryRepo.setupDomain();\n });\n\n it(\"creates factory with correct name\", () => {\n expect(factory.factoryName).toBe(\"ProcedureFeatureFactory\");\n });\n\n it(\"uses correct AppObject name\", () => {\n const procedureAppObject = appObjects.getOrCreate(\"Procedure\");\n expect(procedureAppObject).toBeDefined();\n });\n\n it(\"creates ProcedureEntity singleton\", () => {\n expect(factory.getProcedureEntity()).toBeDefined();\n expect(factory.getProcedureEntity()?.challengeID).toBe(\"PROCEDURE\");\n });\n\n it(\"registers ProcedureEntity as singleton\", () => {\n const entity = ProcedureEntity.get(appObjects);\n expect(entity).toBeDefined();\n expect(entity).toBe(factory.getProcedureEntity());\n });\n\n it(\"creates all required Use Cases\", () => {\n const addEventUC = AddProcedureEventUC.get(appObjects);\n expect(addEventUC).toBeDefined();\n\n const serializeUC = SerializeProcedure.get(appObjects);\n expect(serializeUC).toBeDefined();\n\n const setOrderMattersUC = SetProcedureOrderMattersUC.get(appObjects);\n expect(setOrderMattersUC).toBeDefined();\n\n const setShowHintsUC = SetProcedureShowHintsUC.get(appObjects);\n expect(setShowHintsUC).toBeDefined();\n\n const setIsQuizUC = SetProcedureIsQuizUC.get(appObjects);\n expect(setIsQuizUC).toBeDefined();\n });\n\n it(\"Use Cases can find their entity\", () => {\n const addEventUC = AddProcedureEventUC.get(appObjects);\n const entity = factory.getProcedureEntity();\n\n addEventUC!.addEvent(\"test_event\");\n expect(entity!.eventIds).toContain(\"test_event\");\n });\n\n it(\"configuration Use Cases can modify entity properties\", () => {\n const entity = factory.getProcedureEntity()!;\n const setOrderMattersUC = SetProcedureOrderMattersUC.get(appObjects)!;\n const setShowHintsUC = SetProcedureShowHintsUC.get(appObjects)!;\n const setIsQuizUC = SetProcedureIsQuizUC.get(appObjects)!;\n\n expect(entity.orderMatters).toBe(true);\n expect(entity.showHints).toBe(true);\n expect(entity.isQuiz).toBe(false);\n\n setOrderMattersUC.setOrderMatters(false);\n expect(entity.orderMatters).toBe(false);\n\n setShowHintsUC.setShowHints(false);\n expect(entity.showHints).toBe(false);\n\n setIsQuizUC.setIsQuiz(true);\n expect(entity.isQuiz).toBe(true);\n });\n\n it(\"creates ProcedurePM singleton\", () => {\n expect(factory.getProcedurePM()).toBeDefined();\n });\n\n it(\"PM can access entity state\", () => {\n const pm = factory.getProcedurePM();\n const entity = factory.getProcedureEntity();\n\n entity!.addEventId(\"test_event\");\n\n const vm = pm!.lastVM;\n expect(vm!.eventIds).toContain(\"test_event\");\n });\n\n it(\"registers procedure challenge with ChallengeEntity\", () => {\n expect(mockRegisterChallenge).toHaveBeenCalledWith(\n factory.getProcedureEntity(),\n );\n });\n\n it(\"injects the EventEntity category lookup into the entity (#53)\", () => {\n const eventEntity = EventEntity.get(appObjects)!;\n const entity = factory.getProcedureEntity()!;\n\n // Registered after setup: the lookup is evaluated at call time, not cached.\n eventEntity.register(\"navigate-to-overhead\", \"Go to overhead\", {\n category: \"instructional\",\n });\n eventEntity.register(\"lever\", \"Pull lever\");\n\n expect(entity.getEventCategory(\"navigate-to-overhead\")).toBe(\n \"instructional\",\n );\n expect(entity.getEventCategory(\"lever\")).toBe(\"assessed\");\n expect(entity.getEventCategory(\"never-registered\")).toBe(\"assessed\");\n });\n\n it(\"warns and falls back to an assessed lookup when EventEntity is absent (#53)\", () => {\n const submitWarningSpy = jest.fn();\n const newAppObjects = makeAppObjectRepo();\n newAppObjects.submitWarning = submitWarningSpy;\n\n // No EventEntity registered on this repo: the category lookup cannot wire.\n const newDomainFactoryRepo = new DomainFactoryRepo(\n newAppObjects.getOrCreate(\"DomainFactory\"),\n );\n const newFactory = makeProcedureFeatureFactory(newAppObjects);\n newDomainFactoryRepo.setupDomain();\n\n expect(submitWarningSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Procedure\"),\n expect.stringContaining(\"EventEntity not found\"),\n );\n\n // The entity keeps its default lookup, so every step is treated as assessed.\n const entity = newFactory.getProcedureEntity()!;\n expect(entity.getEventCategory(\"anything\")).toBe(\"assessed\");\n });\n\n it(\"handles missing ChallengeEntity gracefully\", () => {\n jest.mocked(ChallengeEntity.get).mockReturnValueOnce(undefined);\n\n const submitWarningSpy = jest.fn();\n const newAppObjects = makeAppObjectRepo();\n newAppObjects.submitWarning = submitWarningSpy;\n\n const newDomainFactoryRepo = new DomainFactoryRepo(\n newAppObjects.getOrCreate(\"DomainFactory\"),\n );\n makeProcedureFeatureFactory(newAppObjects);\n newDomainFactoryRepo.setupDomain();\n\n expect(submitWarningSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Procedure\"),\n expect.stringContaining(\"ChallengeEntity not found\"),\n );\n });\n\n it(\"all components can communicate\", () => {\n const entity = factory.getProcedureEntity()!;\n const pm = factory.getProcedurePM()!;\n const addEventUC = AddProcedureEventUC.get(appObjects)!;\n\n addEventUC.addEvent(\"integration_test_event\");\n\n expect(entity.eventIds).toContain(\"integration_test_event\");\n\n const vm = pm.lastVM!;\n expect(vm.eventIds).toContain(\"integration_test_event\");\n });\n\n it(\"provides access to created components\", () => {\n expect(factory.getProcedureEntity()).toBeInstanceOf(Object);\n expect(factory.getProcedurePM()).toBeInstanceOf(Object);\n });\n\n it(\"returns undefined for components when not properly initialized\", () => {\n const isolatedAppObjects = makeAppObjectRepo();\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\n const isolatedFactory = new ProcedureFeatureFactory(isolatedAppObject);\n\n expect(isolatedFactory.getProcedureEntity()).toBeUndefined();\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC","sourcesContent":["export * from \"./ProcedureFeatureFactory\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC","sourcesContent":["export * from \"./ProcedureFeatureFactory\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MockProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedureEntity.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,OAAO,mBAAoB,SAAQ,eAAe;IAgBtD,IAAI,WAAW;QACb,OAAO,qBAAqB,CAAC;IAC/B,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IACD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAqCD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;QA3FjC,cAAS,GAAa,EAAE,CAAC;QACzB,kBAAa,GAAG,IAAI,CAAC;QACrB,eAAU,GAAG,IAAI,CAAC;QAClB,YAAO,GAAG,KAAK,CAAC;QAChB,iBAAY,GAAG,KAAK,CAAC;QACrB,kBAAa,GAAa,EAAE,CAAC;QAC7B,sBAAiB,GAAG,CAAC,CAAC;QACtB,gBAAW,GAAG,KAAK,CAAC;QACpB,uBAAkB,GAAkB,IAAI,CAAC;QACzC,WAAM,GAGH,IAAI,CAAC;QACR,iBAAY,GAAG,KAAK,CAAC;QA0C7B,eAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,EAAU,EAAE,EAAE;YAClC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,kBAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1B,kBAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YAC3B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,oBAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,qBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACvC,yBAAoB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC3C,UAAK,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE;YACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,gBAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACxB,kBAAa,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1B,kCAA6B,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACpD,oBAAe,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;YACvC,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,iBAAY,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;YACpC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,cAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;YACjC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QACH,mBAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAU,EAAE,EAAE;YACtC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,2BAAsB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACnC,qBAAgB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAkB,EAAE,CAAC,UAAU,CAAC,CAAC;QAC5D,0BAAqB,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,mBAAc,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACpE,WAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAInB,CAAC;CACF;AAED,MAAM,UAAU,uBAAuB,CAAC,UAAyB;IAC/D,OAAO,IAAI,mBAAmB,CAC5B,UAAU,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAC9C,CAAC;AACJ,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { EventCategory } from \"../../EventSystem/types\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\n\r\nexport class MockProcedureEntity extends ProcedureEntity {\r\n private _eventIds: string[] = [];\r\n private _orderMatters = true;\r\n private _showHints = true;\r\n private _isQuiz = false;\r\n private _isRecording = false;\r\n private _userEventLog: string[] = [];\r\n private _currentStepIndex = 0;\r\n private _isComplete = false;\r\n private _validationMessage: string | null = null;\r\n private _score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null = null;\r\n private _isSubmitted = false;\r\n\r\n get helpHeading(): string {\r\n return \"Procedure Challenge\";\r\n }\r\n get consumerHelpText(): string {\r\n return \"\";\r\n }\r\n get eventIds() {\r\n return this._eventIds;\r\n }\r\n get orderMatters() {\r\n return this._orderMatters;\r\n }\r\n get showHints() {\r\n return this._showHints;\r\n }\r\n get isQuiz() {\r\n return this._isQuiz;\r\n }\r\n get isRecording() {\r\n return this._isRecording;\r\n }\r\n get userEventLog() {\r\n return this._userEventLog;\r\n }\r\n get currentStepIndex() {\r\n return this._currentStepIndex;\r\n }\r\n get isComplete() {\r\n return this._isComplete;\r\n }\r\n get validationMessage() {\r\n return this._validationMessage;\r\n }\r\n get score() {\r\n return this._score;\r\n }\r\n get isSubmitted() {\r\n return this._isSubmitted;\r\n }\r\n\r\n addEventId = jest.fn((id: string) => {\r\n this._eventIds.push(id);\r\n });\r\n removeEventId = jest.fn();\r\n clearEventIds = jest.fn(() => {\r\n this._eventIds = [];\r\n });\r\n recordUserEvent = jest.fn();\r\n validateProgress = jest.fn(() => null);\r\n getNextExpectedEvent = jest.fn(() => null);\r\n reset = jest.fn(() => {\r\n this._userEventLog = [];\r\n this._currentStepIndex = 0;\r\n });\r\n moveEventUp = jest.fn();\r\n moveEventDown = jest.fn();\r\n getAuthoringValidationMessage = jest.fn(() => null);\r\n setOrderMatters = jest.fn((v: boolean) => {\r\n this._orderMatters = v;\r\n });\r\n setShowHints = jest.fn((v: boolean) => {\r\n this._showHints = v;\r\n });\r\n setIsQuiz = jest.fn((v: boolean) => {\r\n this._isQuiz = v;\r\n });\r\n setIsRecording = jest.fn((v: boolean) => {\r\n this._isRecording = v;\r\n });\r\n setEventCategoryLookup = jest.fn();\r\n getEventCategory = jest.fn((): EventCategory => \"assessed\");\r\n getProgressPercentage = jest.fn(() => 0);\r\n calculateScore = jest.fn(() => ({ percentage: 0, comparison: [] }));\r\n submit = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedureEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockProcedureEntity(appObjects: AppObjectRepo) {\r\n return new MockProcedureEntity(\r\n appObjects.getOrCreate(\"MockProcedureEntity\"),\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"MockProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedureEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\nimport { EventCategory } from \"../../EventSystem/types\";\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\n\nexport class MockProcedureEntity extends ProcedureEntity {\n private _eventIds: string[] = [];\n private _orderMatters = true;\n private _showHints = true;\n private _isQuiz = false;\n private _isRecording = false;\n private _userEventLog: string[] = [];\n private _currentStepIndex = 0;\n private _isComplete = false;\n private _validationMessage: string | null = null;\n private _score: {\n percentage: number;\n comparison: {\n eventId: string;\n expected: boolean;\n actual: boolean;\n correct: boolean;\n }[];\n } | null = null;\n private _isSubmitted = false;\n\n get helpHeading(): string {\n return \"Procedure Challenge\";\n }\n get consumerHelpText(): string {\n return \"\";\n }\n get eventIds() {\n return this._eventIds;\n }\n get orderMatters() {\n return this._orderMatters;\n }\n get showHints() {\n return this._showHints;\n }\n get isQuiz() {\n return this._isQuiz;\n }\n get isRecording() {\n return this._isRecording;\n }\n get userEventLog() {\n return this._userEventLog;\n }\n get currentStepIndex() {\n return this._currentStepIndex;\n }\n get isComplete() {\n return this._isComplete;\n }\n get validationMessage() {\n return this._validationMessage;\n }\n get score() {\n return this._score;\n }\n get isSubmitted() {\n return this._isSubmitted;\n }\n\n addEventId = jest.fn((id: string) => {\n this._eventIds.push(id);\n });\n removeEventId = jest.fn();\n clearEventIds = jest.fn(() => {\n this._eventIds = [];\n });\n recordUserEvent = jest.fn();\n validateProgress = jest.fn(() => null);\n getNextExpectedEvent = jest.fn(() => null);\n reset = jest.fn(() => {\n this._userEventLog = [];\n this._currentStepIndex = 0;\n });\n moveEventUp = jest.fn();\n moveEventDown = jest.fn();\n getAuthoringValidationMessage = jest.fn(() => null);\n setOrderMatters = jest.fn((v: boolean) => {\n this._orderMatters = v;\n });\n setShowHints = jest.fn((v: boolean) => {\n this._showHints = v;\n });\n setIsQuiz = jest.fn((v: boolean) => {\n this._isQuiz = v;\n });\n setIsRecording = jest.fn((v: boolean) => {\n this._isRecording = v;\n });\n setEventCategoryLookup = jest.fn();\n getEventCategory = jest.fn((): EventCategory => \"assessed\");\n getProgressPercentage = jest.fn(() => 0);\n calculateScore = jest.fn(() => ({ percentage: 0, comparison: [] }));\n submit = jest.fn();\n\n constructor(appObject: AppObject) {\n super(appObject, ProcedureEntity.type);\n }\n}\n\nexport function makeMockProcedureEntity(appObjects: AppObjectRepo) {\n return new MockProcedureEntity(appObjects.getOrCreate(\"MockProcedureEntity\"));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MockProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedurePM.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAG9C,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAHrC,gBAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAInC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAyB;IAC3D,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { ProcedurePM } from \"../PM/ProcedurePM\";\r\n\r\nexport class MockProcedurePM extends ProcedurePM {\r\n vmsAreEqual = jest.fn(() => false);\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedurePM.type);\r\n }\r\n}\r\n\r\nexport function makeMockProcedurePM(appObjects: AppObjectRepo) {\r\n return new MockProcedurePM(appObjects.getOrCreate(\"MockProcedurePM\"));\r\n}\r\n"]}
1
+ {"version":3,"file":"MockProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedurePM.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAG9C,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QAHrC,gBAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAInC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAyB;IAC3D,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC;AACxE,CAAC","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\nimport { ProcedurePM } from \"../PM/ProcedurePM\";\n\nexport class MockProcedurePM extends ProcedurePM {\n vmsAreEqual = jest.fn(() => false);\n\n constructor(appObject: AppObject) {\n super(appObject, ProcedurePM.type);\n }\n}\n\nexport function makeMockProcedurePM(appObjects: AppObjectRepo) {\n return new MockProcedurePM(appObjects.getOrCreate(\"MockProcedurePM\"));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from \"./MockProcedureEntity\";\r\nexport * from \"./MockProcedurePM\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC","sourcesContent":["export * from \"./MockProcedureEntity\";\nexport * from \"./MockProcedurePM\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n getSingletonComponent,\r\n} from \"@vived/core\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { EventCategory, EventEntity } from \"../../EventSystem\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\nexport abstract class ProcedurePM extends AppObjectPM<ProcedureVM> {\r\n static readonly type = \"ProcedurePM\";\r\n\r\n static get = (appObjects: AppObjectRepo): ProcedurePM | undefined =>\r\n getSingletonComponent(ProcedurePM.type, appObjects);\r\n}\r\n\r\nexport function makeProcedurePM(appObject: AppObject): ProcedurePM {\r\n return new ProcedurePMImp(appObject);\r\n}\r\n\r\nclass ProcedurePMImp extends ProcedurePM {\r\n private get procedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n private get eventEntity(): EventEntity | undefined {\r\n return EventEntity.get(this.appObjects);\r\n }\r\n\r\n vmsAreEqual(a: ProcedureVM, b: ProcedureVM): boolean {\r\n return (\r\n JSON.stringify(a.eventIds) === JSON.stringify(b.eventIds) &&\r\n a.orderMatters === b.orderMatters &&\r\n a.showHints === b.showHints &&\r\n a.isQuiz === b.isQuiz &&\r\n a.isRecording === b.isRecording &&\r\n JSON.stringify(a.userEventLog) === JSON.stringify(b.userEventLog) &&\r\n a.currentStepIndex === b.currentStepIndex &&\r\n a.isComplete === b.isComplete &&\r\n a.validationMessage === b.validationMessage &&\r\n a.nextExpectedEvent === b.nextExpectedEvent &&\r\n a.progressPercentage === b.progressPercentage &&\r\n JSON.stringify(a.availableEvents) === JSON.stringify(b.availableEvents) &&\r\n JSON.stringify(a.score) === JSON.stringify(b.score) &&\r\n a.isSubmitted === b.isSubmitted &&\r\n JSON.stringify(a.stepCategories) === JSON.stringify(b.stepCategories)\r\n );\r\n }\r\n\r\n onEntityChange = (): void => {\r\n const procedureEntity = this.procedureEntity;\r\n if (!procedureEntity) {\r\n this.doUpdateView(this.getDefaultVM());\r\n return;\r\n }\r\n\r\n const eventEntity = this.eventEntity;\r\n const availableEvents = eventEntity\r\n ? eventEntity.getRegisteredEvents()\r\n : [];\r\n\r\n // Resolved through the entity's injected lookup at VM-build time, so a\r\n // registration that lands after authoring is reflected on the next change.\r\n // Null-prototype map: event ids are arbitrary developer-chosen strings, and\r\n // a plain object would drop the id \"__proto__\" (its setter swallows the\r\n // assignment) — Object.create(null) makes every accepted id representable.\r\n const stepCategories: Record<string, EventCategory> = Object.create(null);\r\n for (const eventId of procedureEntity.eventIds) {\r\n stepCategories[eventId] = procedureEntity.getEventCategory(eventId);\r\n }\r\n\r\n const viewModel: ProcedureVM = {\r\n eventIds: procedureEntity.eventIds,\r\n orderMatters: procedureEntity.orderMatters,\r\n showHints: procedureEntity.showHints,\r\n isQuiz: procedureEntity.isQuiz,\r\n isRecording: procedureEntity.isRecording,\r\n userEventLog: procedureEntity.userEventLog,\r\n currentStepIndex: procedureEntity.currentStepIndex,\r\n isComplete: procedureEntity.isComplete,\r\n validationMessage: procedureEntity.validationMessage,\r\n nextExpectedEvent: procedureEntity.getNextExpectedEvent(),\r\n progressPercentage: procedureEntity.getProgressPercentage(),\r\n availableEvents,\r\n authoringValidationMessage:\r\n procedureEntity.getAuthoringValidationMessage(),\r\n score: procedureEntity.score,\r\n isSubmitted: procedureEntity.isSubmitted,\r\n stepCategories,\r\n };\r\n\r\n this.doUpdateView(viewModel);\r\n };\r\n\r\n private getDefaultVM(): ProcedureVM {\r\n return {\r\n eventIds: [],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: null,\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage:\r\n \"At least one event must be added to the procedure\",\r\n score: null,\r\n isSubmitted: false,\r\n stepCategories: {},\r\n };\r\n }\r\n\r\n dispose = (): void => {\r\n super.dispose();\r\n this.procedureEntity?.removeChangeObserver(this.onEntityChange);\r\n this.eventEntity?.removeChangeObserver(this.onEntityChange);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedurePM.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n\r\n this.procedureEntity?.addChangeObserver(this.onEntityChange);\r\n this.eventEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AppObject,\n AppObjectPM,\n AppObjectRepo,\n getSingletonComponent,\n} from \"@vived/core\";\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\nimport { EventCategory, EventEntity } from \"../../EventSystem\";\nimport { ProcedureVM } from \"../types\";\n\nexport abstract class ProcedurePM extends AppObjectPM<ProcedureVM> {\n static readonly type = \"ProcedurePM\";\n\n static get = (appObjects: AppObjectRepo): ProcedurePM | undefined =>\n getSingletonComponent(ProcedurePM.type, appObjects);\n}\n\nexport function makeProcedurePM(appObject: AppObject): ProcedurePM {\n return new ProcedurePMImp(appObject);\n}\n\nclass ProcedurePMImp extends ProcedurePM {\n private get procedureEntity(): ProcedureEntity | undefined {\n return ProcedureEntity.get(this.appObjects);\n }\n\n private get eventEntity(): EventEntity | undefined {\n return EventEntity.get(this.appObjects);\n }\n\n vmsAreEqual(a: ProcedureVM, b: ProcedureVM): boolean {\n return (\n JSON.stringify(a.eventIds) === JSON.stringify(b.eventIds) &&\n a.orderMatters === b.orderMatters &&\n a.showHints === b.showHints &&\n a.isQuiz === b.isQuiz &&\n a.isRecording === b.isRecording &&\n JSON.stringify(a.userEventLog) === JSON.stringify(b.userEventLog) &&\n a.currentStepIndex === b.currentStepIndex &&\n a.isComplete === b.isComplete &&\n a.validationMessage === b.validationMessage &&\n a.nextExpectedEvent === b.nextExpectedEvent &&\n a.progressPercentage === b.progressPercentage &&\n JSON.stringify(a.availableEvents) === JSON.stringify(b.availableEvents) &&\n JSON.stringify(a.score) === JSON.stringify(b.score) &&\n a.isSubmitted === b.isSubmitted &&\n JSON.stringify(a.stepCategories) === JSON.stringify(b.stepCategories)\n );\n }\n\n onEntityChange = (): void => {\n const procedureEntity = this.procedureEntity;\n if (!procedureEntity) {\n this.doUpdateView(this.getDefaultVM());\n return;\n }\n\n const eventEntity = this.eventEntity;\n const availableEvents = eventEntity\n ? eventEntity.getRegisteredEvents()\n : [];\n\n // Resolved through the entity's injected lookup at VM-build time, so a\n // registration that lands after authoring is reflected on the next change.\n // Null-prototype map: event ids are arbitrary developer-chosen strings, and\n // a plain object would drop the id \"__proto__\" (its setter swallows the\n // assignment) — Object.create(null) makes every accepted id representable.\n const stepCategories: Record<string, EventCategory> = Object.create(null);\n for (const eventId of procedureEntity.eventIds) {\n stepCategories[eventId] = procedureEntity.getEventCategory(eventId);\n }\n\n const viewModel: ProcedureVM = {\n eventIds: procedureEntity.eventIds,\n orderMatters: procedureEntity.orderMatters,\n showHints: procedureEntity.showHints,\n isQuiz: procedureEntity.isQuiz,\n isRecording: procedureEntity.isRecording,\n userEventLog: procedureEntity.userEventLog,\n currentStepIndex: procedureEntity.currentStepIndex,\n isComplete: procedureEntity.isComplete,\n validationMessage: procedureEntity.validationMessage,\n nextExpectedEvent: procedureEntity.getNextExpectedEvent(),\n progressPercentage: procedureEntity.getProgressPercentage(),\n availableEvents,\n authoringValidationMessage:\n procedureEntity.getAuthoringValidationMessage(),\n score: procedureEntity.score,\n isSubmitted: procedureEntity.isSubmitted,\n stepCategories,\n };\n\n this.doUpdateView(viewModel);\n };\n\n private getDefaultVM(): ProcedureVM {\n return {\n eventIds: [],\n orderMatters: true,\n showHints: true,\n isQuiz: false,\n isRecording: false,\n userEventLog: [],\n currentStepIndex: 0,\n isComplete: false,\n validationMessage: null,\n nextExpectedEvent: null,\n progressPercentage: 0,\n availableEvents: [],\n authoringValidationMessage:\n \"At least one event must be added to the procedure\",\n score: null,\n isSubmitted: false,\n stepCategories: {},\n };\n }\n\n dispose = (): void => {\n super.dispose();\n this.procedureEntity?.removeChangeObserver(this.onEntityChange);\n this.eventEntity?.removeChangeObserver(this.onEntityChange);\n };\n\n constructor(appObject: AppObject) {\n super(appObject, ProcedurePM.type);\n\n this.appObjects.registerSingleton(this);\n\n this.procedureEntity?.addChangeObserver(this.onEntityChange);\n this.eventEntity?.addChangeObserver(this.onEntityChange);\n\n this.onEntityChange();\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { makeAppObjectRepo } from "@vived/core";
2
- import { makeProcedureEntity } from "../Entities/ProcedureEntity";
2
+ import { makeProcedureEntity, } from "../Entities/ProcedureEntity";
3
3
  import { ProcedurePM, makeProcedurePM } from "./ProcedurePM";
4
4
  describe("ProcedurePM", () => {
5
5
  let appObjects;
@@ -123,7 +123,7 @@ describe("ProcedurePM", () => {
123
123
  lever: "assessed",
124
124
  });
125
125
  });
126
- it("represents an event id of \"__proto__\" as its own category entry (#53)", () => {
126
+ it('represents an event id of "__proto__" as its own category entry (#53)', () => {
127
127
  const protoKey = "__proto__";
128
128
  procedureEntity.setEventCategoryLookup((eventId) => eventId === protoKey ? "instructional" : "assessed");
129
129
  procedureEntity.addEventId(protoKey);
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedurePM.test.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAmB,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG7D,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,UAAyB,CAAC;IAC9B,IAAI,eAAgC,CAAC;IACrC,IAAI,WAAwB,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,iBAAiB,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QAEtD,eAAe,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACjD,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;QAE9B,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,EAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,EAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,EAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,EAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,EAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,CAAC,EAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,EAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,EAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,EAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,EAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,EAAG,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxC,MAAM,CAAC,EAAG,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3C,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC3C,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEhC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;QAE9B,MAAM,CAAC,EAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,EAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,EAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAEtC,eAAe,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;QAC9B,MAAM,CAAC,EAAG,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,EAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,GAAG,GAAgB;YACvB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,SAAS;YAC5B,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;YACnB,0BAA0B,EAAE,IAAI;YAChC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;SACxC,CAAC;QAEF,MAAM,GAAG,GAAgB,EAAE,GAAG,GAAG,EAAE,CAAC;QAEpC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,GAAG,GAAgB;YACvB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,SAAS;YAC5B,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;YACnB,0BAA0B,EAAE,IAAI;YAChC,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,KAAK;YAClB,cAAc,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;SACxC,CAAC;QAEF,MAAM,GAAG,GAAgB;YACvB,GAAG,GAAG;YACN,YAAY,EAAE,KAAK;SACpB,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,GAAG,GAAgB;YACvB,GAAG,WAAW,CAAC,MAAO;YACtB,QAAQ,EAAE,CAAC,SAAS,CAAC;YACrB,cAAc,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;SACxC,CAAC;QACF,MAAM,GAAG,GAAgB;YACvB,GAAG,GAAG;YACN,cAAc,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE;SAC7C,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,eAAe,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CACjD,OAAO,KAAK,sBAAsB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAClE,CAAC;QACF,eAAe,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC;QACnD,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEpC,MAAM,CAAC,WAAW,CAAC,MAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;YACjD,sBAAsB,EAAE,eAAe;YACvC,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC7B,eAAe,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,EAAE,CACjD,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CACpD,CAAC;QACF,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAEpC,MAAM,EAAE,GAAG,WAAW,CAAC,MAAO,CAAC;QAC/B,kFAAkF;QAClF,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,kBAAkB,GAAG,iBAAiB,EAAE,CAAC;QAC/C,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC;QAEtD,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;QAE7B,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,CAAC,EAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,EAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,EAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,EAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEL,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,MAAM,GAAuB,IAAI,CAAC;QAEtC,MAAM,QAAQ,GAAG,CAAC,EAAe,EAAE,EAAE;YACnC,iBAAiB,EAAE,CAAC;YACpB,MAAM,GAAG,EAAE,CAAC;QACd,CAAC,CAAC;QAEF,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE9B,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,YAAY,GAAG,iBAAiB,CAAC;QAEvC,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAExC,MAAM,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QACxD,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAEhD,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { ProcedurePM, makeProcedurePM } from \"./ProcedurePM\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\ndescribe(\"ProcedurePM\", () => {\r\n let appObjects: AppObjectRepo;\r\n let procedureEntity: ProcedureEntity;\r\n let procedurePM: ProcedurePM;\r\n\r\n beforeEach(() => {\r\n appObjects = makeAppObjectRepo();\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n\r\n procedureEntity = makeProcedureEntity(appObject);\r\n procedurePM = makeProcedurePM(appObject);\r\n });\r\n\r\n it(\"can be retrieved via static get method\", () => {\r\n const retrieved = ProcedurePM.get(appObjects);\r\n expect(retrieved).toBe(procedurePM);\r\n });\r\n\r\n it(\"registers itself as singleton\", () => {\r\n expect(ProcedurePM.get(appObjects)).toBe(procedurePM);\r\n });\r\n\r\n it(\"generates correct initial view model\", () => {\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n expect(vm!.userEventLog).toEqual([]);\r\n expect(vm!.currentStepIndex).toBe(0);\r\n expect(vm!.isComplete).toBe(false);\r\n expect(vm!.validationMessage).toBe(null);\r\n expect(vm!.nextExpectedEvent).toBe(null);\r\n expect(vm!.progressPercentage).toBe(0);\r\n expect(vm!.availableEvents).toEqual([]);\r\n expect(vm!.stepCategories).toEqual({});\r\n });\r\n\r\n it(\"reflects entity state changes in view model\", () => {\r\n procedureEntity.addEventId(\"test_event_1\");\r\n procedureEntity.addEventId(\"test_event_2\");\r\n procedureEntity.setOrderMatters(false);\r\n procedureEntity.setShowHints(false);\r\n procedureEntity.setIsQuiz(true);\r\n\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm!.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\r\n expect(vm!.orderMatters).toBe(false);\r\n expect(vm!.showHints).toBe(false);\r\n expect(vm!.isQuiz).toBe(true);\r\n });\r\n\r\n it(\"updates view model when user progress changes\", () => {\r\n procedureEntity.addEventId(\"event_1\");\r\n procedureEntity.addEventId(\"event_2\");\r\n\r\n procedureEntity.recordUserEvent(\"event_1\");\r\n\r\n const vm = procedurePM.lastVM;\r\n expect(vm!.userEventLog).toEqual([\"event_1\"]);\r\n expect(vm!.currentStepIndex).toBe(1);\r\n expect(vm!.progressPercentage).toBe(50);\r\n });\r\n\r\n it(\"correctly identifies equal view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n stepCategories: { event_1: \"assessed\" },\r\n };\r\n\r\n const vm2: ProcedureVM = { ...vm1 };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(true);\r\n });\r\n\r\n it(\"correctly identifies different view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n stepCategories: { event_1: \"assessed\" },\r\n };\r\n\r\n const vm2: ProcedureVM = {\r\n ...vm1,\r\n orderMatters: false,\r\n };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\r\n });\r\n\r\n it(\"treats a changed step category as a different view model (#53)\", () => {\r\n const vm1: ProcedureVM = {\r\n ...procedurePM.lastVM!,\r\n eventIds: [\"event_1\"],\r\n stepCategories: { event_1: \"assessed\" },\r\n };\r\n const vm2: ProcedureVM = {\r\n ...vm1,\r\n stepCategories: { event_1: \"instructional\" },\r\n };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\r\n });\r\n\r\n it(\"maps each authored step to its category through the entity's lookup (#53)\", () => {\r\n procedureEntity.setEventCategoryLookup((eventId) =>\r\n eventId === \"navigate-to-overhead\" ? \"instructional\" : \"assessed\",\r\n );\r\n procedureEntity.addEventId(\"navigate-to-overhead\");\r\n procedureEntity.addEventId(\"lever\");\r\n\r\n expect(procedurePM.lastVM!.stepCategories).toEqual({\r\n \"navigate-to-overhead\": \"instructional\",\r\n lever: \"assessed\",\r\n });\r\n });\r\n\r\n it(\"represents an event id of \\\"__proto__\\\" as its own category entry (#53)\", () => {\r\n const protoKey = \"__proto__\";\r\n procedureEntity.setEventCategoryLookup((eventId) =>\r\n eventId === protoKey ? \"instructional\" : \"assessed\",\r\n );\r\n procedureEntity.addEventId(protoKey);\r\n procedureEntity.addEventId(\"lever\");\r\n\r\n const vm = procedurePM.lastVM!;\r\n // A plain-object dictionary would drop this key; the null-prototype map keeps it.\r\n expect(vm.stepCategories[protoKey]).toBe(\"instructional\");\r\n expect(vm.stepCategories.lever).toBe(\"assessed\");\r\n });\r\n\r\n it(\"provides default view model when entity is missing\", () => {\r\n const isolatedAppObjects = makeAppObjectRepo();\r\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\r\n const isolatedPM = makeProcedurePM(isolatedAppObject);\r\n\r\n const vm = isolatedPM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n });\r\n\r\n it(\"notifies subscribers when entity changes\", () => {\r\n let notificationCount = 0;\r\n let lastVM: ProcedureVM | null = null;\r\n\r\n const mockView = (vm: ProcedureVM) => {\r\n notificationCount++;\r\n lastVM = vm;\r\n };\r\n\r\n procedurePM.addView(mockView);\r\n\r\n expect(notificationCount).toBeGreaterThan(0);\r\n const initialCount = notificationCount;\r\n\r\n procedureEntity.addEventId(\"new_event\");\r\n\r\n expect(notificationCount).toBeGreaterThan(initialCount);\r\n expect(lastVM!.eventIds).toContain(\"new_event\");\r\n\r\n procedurePM.removeView(mockView);\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ProcedurePM.test.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\nimport {\n ProcedureEntity,\n makeProcedureEntity,\n} from \"../Entities/ProcedureEntity\";\nimport { ProcedurePM, makeProcedurePM } from \"./ProcedurePM\";\nimport { ProcedureVM } from \"../types\";\n\ndescribe(\"ProcedurePM\", () => {\n let appObjects: AppObjectRepo;\n let procedureEntity: ProcedureEntity;\n let procedurePM: ProcedurePM;\n\n beforeEach(() => {\n appObjects = makeAppObjectRepo();\n const appObject = appObjects.getOrCreate(\"Procedure\");\n\n procedureEntity = makeProcedureEntity(appObject);\n procedurePM = makeProcedurePM(appObject);\n });\n\n it(\"can be retrieved via static get method\", () => {\n const retrieved = ProcedurePM.get(appObjects);\n expect(retrieved).toBe(procedurePM);\n });\n\n it(\"registers itself as singleton\", () => {\n expect(ProcedurePM.get(appObjects)).toBe(procedurePM);\n });\n\n it(\"generates correct initial view model\", () => {\n const vm = procedurePM.lastVM;\n\n expect(vm).toBeDefined();\n expect(vm!.eventIds).toEqual([]);\n expect(vm!.orderMatters).toBe(true);\n expect(vm!.showHints).toBe(true);\n expect(vm!.isQuiz).toBe(false);\n expect(vm!.userEventLog).toEqual([]);\n expect(vm!.currentStepIndex).toBe(0);\n expect(vm!.isComplete).toBe(false);\n expect(vm!.validationMessage).toBe(null);\n expect(vm!.nextExpectedEvent).toBe(null);\n expect(vm!.progressPercentage).toBe(0);\n expect(vm!.availableEvents).toEqual([]);\n expect(vm!.stepCategories).toEqual({});\n });\n\n it(\"reflects entity state changes in view model\", () => {\n procedureEntity.addEventId(\"test_event_1\");\n procedureEntity.addEventId(\"test_event_2\");\n procedureEntity.setOrderMatters(false);\n procedureEntity.setShowHints(false);\n procedureEntity.setIsQuiz(true);\n\n const vm = procedurePM.lastVM;\n\n expect(vm!.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\n expect(vm!.orderMatters).toBe(false);\n expect(vm!.showHints).toBe(false);\n expect(vm!.isQuiz).toBe(true);\n });\n\n it(\"updates view model when user progress changes\", () => {\n procedureEntity.addEventId(\"event_1\");\n procedureEntity.addEventId(\"event_2\");\n\n procedureEntity.recordUserEvent(\"event_1\");\n\n const vm = procedurePM.lastVM;\n expect(vm!.userEventLog).toEqual([\"event_1\"]);\n expect(vm!.currentStepIndex).toBe(1);\n expect(vm!.progressPercentage).toBe(50);\n });\n\n it(\"correctly identifies equal view models\", () => {\n const vm1: ProcedureVM = {\n eventIds: [\"event_1\"],\n orderMatters: true,\n showHints: true,\n isQuiz: false,\n isRecording: false,\n userEventLog: [],\n currentStepIndex: 0,\n isComplete: false,\n validationMessage: null,\n nextExpectedEvent: \"event_1\",\n progressPercentage: 0,\n availableEvents: [],\n authoringValidationMessage: null,\n score: null,\n isSubmitted: false,\n stepCategories: { event_1: \"assessed\" },\n };\n\n const vm2: ProcedureVM = { ...vm1 };\n\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(true);\n });\n\n it(\"correctly identifies different view models\", () => {\n const vm1: ProcedureVM = {\n eventIds: [\"event_1\"],\n orderMatters: true,\n showHints: true,\n isQuiz: false,\n isRecording: false,\n userEventLog: [],\n currentStepIndex: 0,\n isComplete: false,\n validationMessage: null,\n nextExpectedEvent: \"event_1\",\n progressPercentage: 0,\n availableEvents: [],\n authoringValidationMessage: null,\n score: null,\n isSubmitted: false,\n stepCategories: { event_1: \"assessed\" },\n };\n\n const vm2: ProcedureVM = {\n ...vm1,\n orderMatters: false,\n };\n\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\n });\n\n it(\"treats a changed step category as a different view model (#53)\", () => {\n const vm1: ProcedureVM = {\n ...procedurePM.lastVM!,\n eventIds: [\"event_1\"],\n stepCategories: { event_1: \"assessed\" },\n };\n const vm2: ProcedureVM = {\n ...vm1,\n stepCategories: { event_1: \"instructional\" },\n };\n\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\n });\n\n it(\"maps each authored step to its category through the entity's lookup (#53)\", () => {\n procedureEntity.setEventCategoryLookup((eventId) =>\n eventId === \"navigate-to-overhead\" ? \"instructional\" : \"assessed\",\n );\n procedureEntity.addEventId(\"navigate-to-overhead\");\n procedureEntity.addEventId(\"lever\");\n\n expect(procedurePM.lastVM!.stepCategories).toEqual({\n \"navigate-to-overhead\": \"instructional\",\n lever: \"assessed\",\n });\n });\n\n it('represents an event id of \"__proto__\" as its own category entry (#53)', () => {\n const protoKey = \"__proto__\";\n procedureEntity.setEventCategoryLookup((eventId) =>\n eventId === protoKey ? \"instructional\" : \"assessed\",\n );\n procedureEntity.addEventId(protoKey);\n procedureEntity.addEventId(\"lever\");\n\n const vm = procedurePM.lastVM!;\n // A plain-object dictionary would drop this key; the null-prototype map keeps it.\n expect(vm.stepCategories[protoKey]).toBe(\"instructional\");\n expect(vm.stepCategories.lever).toBe(\"assessed\");\n });\n\n it(\"provides default view model when entity is missing\", () => {\n const isolatedAppObjects = makeAppObjectRepo();\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\n const isolatedPM = makeProcedurePM(isolatedAppObject);\n\n const vm = isolatedPM.lastVM;\n\n expect(vm).toBeDefined();\n expect(vm!.eventIds).toEqual([]);\n expect(vm!.orderMatters).toBe(true);\n expect(vm!.showHints).toBe(true);\n expect(vm!.isQuiz).toBe(false);\n });\n\n it(\"notifies subscribers when entity changes\", () => {\n let notificationCount = 0;\n let lastVM: ProcedureVM | null = null;\n\n const mockView = (vm: ProcedureVM) => {\n notificationCount++;\n lastVM = vm;\n };\n\n procedurePM.addView(mockView);\n\n expect(notificationCount).toBeGreaterThan(0);\n const initialCount = notificationCount;\n\n procedureEntity.addEventId(\"new_event\");\n\n expect(notificationCount).toBeGreaterThan(initialCount);\n expect(lastVM!.eventIds).toContain(\"new_event\");\n\n procedurePM.removeView(mockView);\n });\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC","sourcesContent":["export * from \"./ProcedurePM\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC","sourcesContent":["export * from \"./ProcedurePM\";\n"]}