@vived/app 6.6.0 → 6.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/BaseApp/UC/RenderCanvasUC.js +17 -36
- package/dist/cjs/BaseApp/UC/RenderCanvasUC.js.map +1 -1
- package/dist/cjs/BaseApp/UC/RenderCanvasUC.test.js +18 -18
- package/dist/cjs/BaseApp/UC/RenderCanvasUC.test.js.map +1 -1
- package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.js +9 -28
- package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.js.map +1 -1
- package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.test.js +51 -0
- package/dist/cjs/Challenge/Factories/ChallengeFeatureFactory.test.js.map +1 -0
- package/dist/cjs/EventSystem/Entities/EventEntity.js +12 -2
- package/dist/cjs/EventSystem/Entities/EventEntity.js.map +1 -1
- package/dist/cjs/EventSystem/Entities/EventEntity.test.js +45 -0
- package/dist/cjs/EventSystem/Entities/EventEntity.test.js.map +1 -1
- package/dist/cjs/EventSystem/Mocks/MockEventEntity.js +7 -2
- package/dist/cjs/EventSystem/Mocks/MockEventEntity.js.map +1 -1
- package/dist/cjs/EventSystem/types.js.map +1 -1
- package/dist/cjs/ObjectPick/Factories/setupObjectPick.js +18 -1
- package/dist/cjs/ObjectPick/Factories/setupObjectPick.js.map +1 -1
- package/dist/cjs/ObjectPick/Factories/setupObjectPick.test.js +55 -0
- package/dist/cjs/ObjectPick/Factories/setupObjectPick.test.js.map +1 -0
- package/dist/cjs/Procedure/Adapters/procedureAdapter.js +1 -0
- package/dist/cjs/Procedure/Adapters/procedureAdapter.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureAdapter.test.js +1 -0
- package/dist/cjs/Procedure/Adapters/procedureAdapter.test.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.js +2 -0
- package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.test.js +3 -0
- package/dist/cjs/Procedure/Adapters/procedureAuthoringAdapter.test.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureHintAdapter.test.js +1 -0
- package/dist/cjs/Procedure/Adapters/procedureHintAdapter.test.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.js +2 -0
- package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.test.js +3 -0
- package/dist/cjs/Procedure/Adapters/procedureProgressAdapter.test.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.js +2 -0
- package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.js.map +1 -1
- package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.test.js +3 -0
- package/dist/cjs/Procedure/Adapters/procedureQuizResultAdapter.test.js.map +1 -1
- package/dist/cjs/Procedure/Entities/ProcedureEntity.js +163 -24
- package/dist/cjs/Procedure/Entities/ProcedureEntity.js.map +1 -1
- package/dist/cjs/Procedure/Entities/ProcedureEntity.test.js +240 -0
- package/dist/cjs/Procedure/Entities/ProcedureEntity.test.js.map +1 -1
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js +20 -0
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.test.js +25 -0
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.test.js.map +1 -1
- package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js +2 -0
- package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
- package/dist/cjs/Procedure/PM/ProcedurePM.js +13 -1
- package/dist/cjs/Procedure/PM/ProcedurePM.js.map +1 -1
- package/dist/cjs/Procedure/PM/ProcedurePM.test.js +34 -0
- package/dist/cjs/Procedure/PM/ProcedurePM.test.js.map +1 -1
- package/dist/cjs/Procedure/UCs/UpdateProcedureEventsUCHook.test.js +3 -0
- package/dist/cjs/Procedure/UCs/UpdateProcedureEventsUCHook.test.js.map +1 -1
- package/dist/cjs/Procedure/types.js.map +1 -1
- package/dist/cjs/TouchController/UC/UpdateTouchInoutBound.test.js +37 -0
- package/dist/cjs/TouchController/UC/UpdateTouchInoutBound.test.js.map +1 -1
- package/dist/cjs/TouchController/UC/UpdateTouchInputBound.js +17 -4
- package/dist/cjs/TouchController/UC/UpdateTouchInputBound.js.map +1 -1
- package/dist/esm/BaseApp/UC/RenderCanvasUC.js +17 -36
- package/dist/esm/BaseApp/UC/RenderCanvasUC.js.map +1 -1
- package/dist/esm/BaseApp/UC/RenderCanvasUC.test.js +18 -18
- package/dist/esm/BaseApp/UC/RenderCanvasUC.test.js.map +1 -1
- package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.js +9 -28
- package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.js.map +1 -1
- package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.test.js +49 -0
- package/dist/esm/Challenge/Factories/ChallengeFeatureFactory.test.js.map +1 -0
- package/dist/esm/EventSystem/Entities/EventEntity.js +12 -2
- package/dist/esm/EventSystem/Entities/EventEntity.js.map +1 -1
- package/dist/esm/EventSystem/Entities/EventEntity.test.js +45 -0
- package/dist/esm/EventSystem/Entities/EventEntity.test.js.map +1 -1
- package/dist/esm/EventSystem/Mocks/MockEventEntity.js +7 -2
- package/dist/esm/EventSystem/Mocks/MockEventEntity.js.map +1 -1
- package/dist/esm/EventSystem/types.js.map +1 -1
- package/dist/esm/ObjectPick/Factories/setupObjectPick.js +18 -1
- package/dist/esm/ObjectPick/Factories/setupObjectPick.js.map +1 -1
- package/dist/esm/ObjectPick/Factories/setupObjectPick.test.js +53 -0
- package/dist/esm/ObjectPick/Factories/setupObjectPick.test.js.map +1 -0
- package/dist/esm/Procedure/Adapters/procedureAdapter.js +1 -0
- package/dist/esm/Procedure/Adapters/procedureAdapter.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureAdapter.test.js +1 -0
- package/dist/esm/Procedure/Adapters/procedureAdapter.test.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.js +2 -0
- package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.test.js +3 -0
- package/dist/esm/Procedure/Adapters/procedureAuthoringAdapter.test.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureHintAdapter.test.js +1 -0
- package/dist/esm/Procedure/Adapters/procedureHintAdapter.test.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureProgressAdapter.js +2 -0
- package/dist/esm/Procedure/Adapters/procedureProgressAdapter.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureProgressAdapter.test.js +3 -0
- package/dist/esm/Procedure/Adapters/procedureProgressAdapter.test.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.js +2 -0
- package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.test.js +3 -0
- package/dist/esm/Procedure/Adapters/procedureQuizResultAdapter.test.js.map +1 -1
- package/dist/esm/Procedure/Entities/ProcedureEntity.js +163 -24
- package/dist/esm/Procedure/Entities/ProcedureEntity.js.map +1 -1
- package/dist/esm/Procedure/Entities/ProcedureEntity.test.js +240 -0
- package/dist/esm/Procedure/Entities/ProcedureEntity.test.js.map +1 -1
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js +20 -0
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.test.js +26 -1
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.test.js.map +1 -1
- package/dist/esm/Procedure/Mocks/MockProcedureEntity.js +2 -0
- package/dist/esm/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
- package/dist/esm/Procedure/PM/ProcedurePM.js +13 -1
- package/dist/esm/Procedure/PM/ProcedurePM.js.map +1 -1
- package/dist/esm/Procedure/PM/ProcedurePM.test.js +34 -0
- package/dist/esm/Procedure/PM/ProcedurePM.test.js.map +1 -1
- package/dist/esm/Procedure/UCs/UpdateProcedureEventsUCHook.test.js +3 -0
- package/dist/esm/Procedure/UCs/UpdateProcedureEventsUCHook.test.js.map +1 -1
- package/dist/esm/Procedure/types.js.map +1 -1
- package/dist/esm/TouchController/UC/UpdateTouchInoutBound.test.js +37 -0
- package/dist/esm/TouchController/UC/UpdateTouchInoutBound.test.js.map +1 -1
- package/dist/esm/TouchController/UC/UpdateTouchInputBound.js +17 -4
- package/dist/esm/TouchController/UC/UpdateTouchInputBound.js.map +1 -1
- package/dist/types/Challenge/Factories/ChallengeFeatureFactory.d.ts +7 -16
- package/dist/types/Challenge/Factories/ChallengeFeatureFactory.d.ts.map +1 -1
- package/dist/types/Challenge/Factories/ChallengeFeatureFactory.test.d.ts +2 -0
- package/dist/types/Challenge/Factories/ChallengeFeatureFactory.test.d.ts.map +1 -0
- package/dist/types/EventSystem/Entities/EventEntity.d.ts +13 -2
- package/dist/types/EventSystem/Entities/EventEntity.d.ts.map +1 -1
- package/dist/types/EventSystem/Mocks/MockEventEntity.d.ts +3 -2
- package/dist/types/EventSystem/Mocks/MockEventEntity.d.ts.map +1 -1
- package/dist/types/EventSystem/types.d.ts +23 -0
- package/dist/types/EventSystem/types.d.ts.map +1 -1
- package/dist/types/ObjectPick/Factories/setupObjectPick.d.ts +10 -0
- package/dist/types/ObjectPick/Factories/setupObjectPick.d.ts.map +1 -1
- package/dist/types/ObjectPick/Factories/setupObjectPick.test.d.ts +2 -0
- package/dist/types/ObjectPick/Factories/setupObjectPick.test.d.ts.map +1 -0
- package/dist/types/Procedure/Adapters/procedureAdapter.d.ts.map +1 -1
- package/dist/types/Procedure/Adapters/procedureAuthoringAdapter.d.ts.map +1 -1
- package/dist/types/Procedure/Adapters/procedureProgressAdapter.d.ts.map +1 -1
- package/dist/types/Procedure/Adapters/procedureQuizResultAdapter.d.ts.map +1 -1
- package/dist/types/Procedure/Entities/ProcedureEntity.d.ts +10 -0
- package/dist/types/Procedure/Entities/ProcedureEntity.d.ts.map +1 -1
- package/dist/types/Procedure/Factories/ProcedureFeatureFactory.d.ts +6 -0
- package/dist/types/Procedure/Factories/ProcedureFeatureFactory.d.ts.map +1 -1
- package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts +3 -0
- package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts.map +1 -1
- package/dist/types/Procedure/types.d.ts +17 -1
- package/dist/types/Procedure/types.d.ts.map +1 -1
- package/dist/types/TouchController/UC/UpdateTouchInputBound.d.ts +11 -0
- package/dist/types/TouchController/UC/UpdateTouchInputBound.d.ts.map +1 -1
- package/package.json +6 -3
- package/src/EventSystem/CONTEXT.md +29 -17
- package/dist/cjs/FramedScreen/Factories/setupStandardFramedScreen.test.js +0 -31
- package/dist/cjs/FramedScreen/Factories/setupStandardFramedScreen.test.js.map +0 -1
- package/dist/cjs/StateMachine/Controller/clickRestoreScene.js +0 -14
- package/dist/cjs/StateMachine/Controller/clickRestoreScene.js.map +0 -1
- package/dist/cjs/StateMachine/Controller/clickRestoreScene.test.js +0 -26
- package/dist/cjs/StateMachine/Controller/clickRestoreScene.test.js.map +0 -1
- package/dist/cjs/TestUtils/index.js +0 -18
- package/dist/cjs/TestUtils/index.js.map +0 -1
- package/dist/cjs/TestUtils/setupFeatureForTesting.js +0 -60
- package/dist/cjs/TestUtils/setupFeatureForTesting.js.map +0 -1
- package/dist/esm/FramedScreen/Factories/setupStandardFramedScreen.test.js +0 -29
- package/dist/esm/FramedScreen/Factories/setupStandardFramedScreen.test.js.map +0 -1
- package/dist/esm/StateMachine/Controller/clickRestoreScene.js +0 -11
- package/dist/esm/StateMachine/Controller/clickRestoreScene.js.map +0 -1
- package/dist/esm/StateMachine/Controller/clickRestoreScene.test.js +0 -24
- package/dist/esm/StateMachine/Controller/clickRestoreScene.test.js.map +0 -1
- package/dist/esm/TestUtils/index.js +0 -2
- package/dist/esm/TestUtils/index.js.map +0 -1
- package/dist/esm/TestUtils/setupFeatureForTesting.js +0 -57
- package/dist/esm/TestUtils/setupFeatureForTesting.js.map +0 -1
- package/dist/types/FramedScreen/Factories/setupStandardFramedScreen.test.d.ts +0 -2
- package/dist/types/FramedScreen/Factories/setupStandardFramedScreen.test.d.ts.map +0 -1
- package/dist/types/StateMachine/Controller/clickRestoreScene.d.ts +0 -3
- package/dist/types/StateMachine/Controller/clickRestoreScene.d.ts.map +0 -1
- package/dist/types/StateMachine/Controller/clickRestoreScene.test.d.ts +0 -2
- package/dist/types/StateMachine/Controller/clickRestoreScene.test.d.ts.map +0 -1
- package/dist/types/TestUtils/index.d.ts +0 -2
- package/dist/types/TestUtils/index.d.ts.map +0 -1
- package/dist/types/TestUtils/setupFeatureForTesting.d.ts +0 -48
- package/dist/types/TestUtils/setupFeatureForTesting.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedureEntity.ts"],"names":[],"mappings":";;;
|
|
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\";\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"]}
|
|
@@ -34,7 +34,8 @@ class ProcedurePMImp extends ProcedurePM {
|
|
|
34
34
|
a.progressPercentage === b.progressPercentage &&
|
|
35
35
|
JSON.stringify(a.availableEvents) === JSON.stringify(b.availableEvents) &&
|
|
36
36
|
JSON.stringify(a.score) === JSON.stringify(b.score) &&
|
|
37
|
-
a.isSubmitted === b.isSubmitted
|
|
37
|
+
a.isSubmitted === b.isSubmitted &&
|
|
38
|
+
JSON.stringify(a.stepCategories) === JSON.stringify(b.stepCategories));
|
|
38
39
|
}
|
|
39
40
|
getDefaultVM() {
|
|
40
41
|
return {
|
|
@@ -53,6 +54,7 @@ class ProcedurePMImp extends ProcedurePM {
|
|
|
53
54
|
authoringValidationMessage: "At least one event must be added to the procedure",
|
|
54
55
|
score: null,
|
|
55
56
|
isSubmitted: false,
|
|
57
|
+
stepCategories: {},
|
|
56
58
|
};
|
|
57
59
|
}
|
|
58
60
|
constructor(appObject) {
|
|
@@ -67,6 +69,15 @@ class ProcedurePMImp extends ProcedurePM {
|
|
|
67
69
|
const availableEvents = eventEntity
|
|
68
70
|
? eventEntity.getRegisteredEvents()
|
|
69
71
|
: [];
|
|
72
|
+
// Resolved through the entity's injected lookup at VM-build time, so a
|
|
73
|
+
// registration that lands after authoring is reflected on the next change.
|
|
74
|
+
// Null-prototype map: event ids are arbitrary developer-chosen strings, and
|
|
75
|
+
// a plain object would drop the id "__proto__" (its setter swallows the
|
|
76
|
+
// assignment) — Object.create(null) makes every accepted id representable.
|
|
77
|
+
const stepCategories = Object.create(null);
|
|
78
|
+
for (const eventId of procedureEntity.eventIds) {
|
|
79
|
+
stepCategories[eventId] = procedureEntity.getEventCategory(eventId);
|
|
80
|
+
}
|
|
70
81
|
const viewModel = {
|
|
71
82
|
eventIds: procedureEntity.eventIds,
|
|
72
83
|
orderMatters: procedureEntity.orderMatters,
|
|
@@ -83,6 +94,7 @@ class ProcedurePMImp extends ProcedurePM {
|
|
|
83
94
|
authoringValidationMessage: procedureEntity.getAuthoringValidationMessage(),
|
|
84
95
|
score: procedureEntity.score,
|
|
85
96
|
isSubmitted: procedureEntity.isSubmitted,
|
|
97
|
+
stepCategories,
|
|
86
98
|
};
|
|
87
99
|
this.doUpdateView(viewModel);
|
|
88
100
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.ts"],"names":[],"mappings":";;;AAiBA,0CAEC;AAnBD,sCAKqB;AACrB,iEAA8D;AAC9D,
|
|
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"]}
|
|
@@ -34,6 +34,7 @@ describe("ProcedurePM", () => {
|
|
|
34
34
|
expect(vm.nextExpectedEvent).toBe(null);
|
|
35
35
|
expect(vm.progressPercentage).toBe(0);
|
|
36
36
|
expect(vm.availableEvents).toEqual([]);
|
|
37
|
+
expect(vm.stepCategories).toEqual({});
|
|
37
38
|
});
|
|
38
39
|
it("reflects entity state changes in view model", () => {
|
|
39
40
|
procedureEntity.addEventId("test_event_1");
|
|
@@ -73,6 +74,7 @@ describe("ProcedurePM", () => {
|
|
|
73
74
|
authoringValidationMessage: null,
|
|
74
75
|
score: null,
|
|
75
76
|
isSubmitted: false,
|
|
77
|
+
stepCategories: { event_1: "assessed" },
|
|
76
78
|
};
|
|
77
79
|
const vm2 = { ...vm1 };
|
|
78
80
|
expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(true);
|
|
@@ -94,6 +96,7 @@ describe("ProcedurePM", () => {
|
|
|
94
96
|
authoringValidationMessage: null,
|
|
95
97
|
score: null,
|
|
96
98
|
isSubmitted: false,
|
|
99
|
+
stepCategories: { event_1: "assessed" },
|
|
97
100
|
};
|
|
98
101
|
const vm2 = {
|
|
99
102
|
...vm1,
|
|
@@ -101,6 +104,37 @@ describe("ProcedurePM", () => {
|
|
|
101
104
|
};
|
|
102
105
|
expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);
|
|
103
106
|
});
|
|
107
|
+
it("treats a changed step category as a different view model (#53)", () => {
|
|
108
|
+
const vm1 = {
|
|
109
|
+
...procedurePM.lastVM,
|
|
110
|
+
eventIds: ["event_1"],
|
|
111
|
+
stepCategories: { event_1: "assessed" },
|
|
112
|
+
};
|
|
113
|
+
const vm2 = {
|
|
114
|
+
...vm1,
|
|
115
|
+
stepCategories: { event_1: "instructional" },
|
|
116
|
+
};
|
|
117
|
+
expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
it("maps each authored step to its category through the entity's lookup (#53)", () => {
|
|
120
|
+
procedureEntity.setEventCategoryLookup((eventId) => eventId === "navigate-to-overhead" ? "instructional" : "assessed");
|
|
121
|
+
procedureEntity.addEventId("navigate-to-overhead");
|
|
122
|
+
procedureEntity.addEventId("lever");
|
|
123
|
+
expect(procedurePM.lastVM.stepCategories).toEqual({
|
|
124
|
+
"navigate-to-overhead": "instructional",
|
|
125
|
+
lever: "assessed",
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
it("represents an event id of \"__proto__\" as its own category entry (#53)", () => {
|
|
129
|
+
const protoKey = "__proto__";
|
|
130
|
+
procedureEntity.setEventCategoryLookup((eventId) => eventId === protoKey ? "instructional" : "assessed");
|
|
131
|
+
procedureEntity.addEventId(protoKey);
|
|
132
|
+
procedureEntity.addEventId("lever");
|
|
133
|
+
const vm = procedurePM.lastVM;
|
|
134
|
+
// A plain-object dictionary would drop this key; the null-prototype map keeps it.
|
|
135
|
+
expect(vm.stepCategories[protoKey]).toBe("instructional");
|
|
136
|
+
expect(vm.stepCategories.lever).toBe("assessed");
|
|
137
|
+
});
|
|
104
138
|
it("provides default view model when entity is missing", () => {
|
|
105
139
|
const isolatedAppObjects = (0, core_1.makeAppObjectRepo)();
|
|
106
140
|
const isolatedAppObject = isolatedAppObjects.getOrCreate("Isolated");
|
|
@@ -1 +1 @@
|
|
|
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\";\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 });\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 };\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 };\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(\"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\";\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateProcedureEventsUCHook.test.js","sourceRoot":"","sources":["../../../../src/Procedure/UCs/UpdateProcedureEventsUCHook.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n makeAppObjectRepo,\r\n} from \"@vived/core\";\r\nimport {\r\n UpdateProcedureEventsUCHook,\r\n makeUpdateProcedureEventsUCHook,\r\n} from \"./UpdateProcedureEventsUCHook\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { EventEntity } from \"../../EventSystem/Entities/EventEntity\";\r\n\r\nclass MockBaseAppState extends AppObjectEntity {\r\n static readonly type = \"BaseAppState\";\r\n private _isAuthoring = false;\r\n private observers: (() => void)[] = [];\r\n\r\n get isAuthoring(): boolean {\r\n return this._isAuthoring;\r\n }\r\n\r\n set isAuthoring(val: boolean) {\r\n this._isAuthoring = val;\r\n this.notifyObservers();\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers.indexOf(observer);\r\n if (index >= 0) this.observers.splice(index, 1);\r\n };\r\n\r\n private notifyObservers(): void {\r\n this.observers.forEach((o) => o());\r\n }\r\n\r\n static get(appObjects: AppObjectRepo): MockBaseAppState | undefined {\r\n return appObjects.getSingleton(MockBaseAppState.type) as\r\n | MockBaseAppState\r\n | undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, MockBaseAppState.type);\r\n }\r\n}\r\n\r\nclass MockChallengeEntity extends AppObjectEntity {\r\n static readonly type = \"ChallengeEntity\";\r\n private _selectedChallenge = \"OTHER\";\r\n private observers: (() => void)[] = [];\r\n\r\n get selectedChallenge(): string {\r\n return this._selectedChallenge;\r\n }\r\n\r\n set selectedChallenge(id: string) {\r\n this._selectedChallenge = id;\r\n this.notifyObservers();\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers.indexOf(observer);\r\n if (index >= 0) this.observers.splice(index, 1);\r\n };\r\n\r\n private notifyObservers(): void {\r\n this.observers.forEach((o) => o());\r\n }\r\n\r\n static get(appObjects: AppObjectRepo): MockChallengeEntity | undefined {\r\n return appObjects.getSingleton(MockChallengeEntity.type) as\r\n | MockChallengeEntity\r\n | undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, MockChallengeEntity.type);\r\n }\r\n}\r\n\r\nclass MockEventEntity extends EventEntity {\r\n private eventRegistry = new Map<string, { name: string }>();\r\n private eventLog: string[] = [];\r\n private lastEmittedId_: string | null = null;\r\n private observers_: (() => void)[] = [];\r\n private emissionListeners_: ((eventId: string) => void)[] = [];\r\n\r\n register(id: string, name: string): void {\r\n this.eventRegistry.set(id, { name });\r\n }\r\n\r\n emit(id: string): void {\r\n if (this.eventRegistry.has(id)) {\r\n this.eventLog.push(id);\r\n this.lastEmittedId_ = id;\r\n this.notifyOnChange();\r\n this.observers_.forEach((o) => o());\r\n this.emissionListeners_.forEach((l) => l(id));\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.eventLog = [];\r\n this.lastEmittedId_ = null;\r\n this.notifyOnChange();\r\n this.observers_.forEach((o) => o());\r\n }\r\n\r\n getRegisteredEvents() {\r\n return Array.from(this.eventRegistry.entries()).map(([id, { name }]) => ({\r\n id,\r\n name,\r\n }));\r\n }\r\n\r\n getEmittedEvents(): string[] {\r\n return [...this.eventLog];\r\n }\r\n\r\n getLastEmittedId(): string | null {\r\n return this.lastEmittedId_;\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers_.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers_.indexOf(observer);\r\n if (index >= 0) this.observers_.splice(index, 1);\r\n };\r\n\r\n addEmissionListener = (callback: (eventId: string) => void): void => {\r\n this.emissionListeners_.push(callback);\r\n };\r\n\r\n removeEmissionListener = (callback: (eventId: string) => void): void => {\r\n const index = this.emissionListeners_.indexOf(callback);\r\n if (index >= 0) this.emissionListeners_.splice(index, 1);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EventEntity.type);\r\n }\r\n}\r\n\r\ndescribe(\"UpdateProcedureEventsUCHook\", () => {\r\n\tlet appObjects: AppObjectRepo;\r\n\tlet uc: UpdateProcedureEventsUCHook;\r\n\tlet procedureEntity: ProcedureEntity;\r\n\tlet eventEntity: MockEventEntity;\r\n\tlet baseAppState: MockBaseAppState;\r\n\tlet challengeEntity: MockChallengeEntity;\r\n\r\n\tbeforeEach(() => {\r\n\t\tappObjects = makeAppObjectRepo();\r\n\t\tconst appObject = appObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tprocedureEntity = makeProcedureEntity(appObject);\r\n\t\teventEntity = new MockEventEntity(appObject);\r\n\t\tbaseAppState = new MockBaseAppState(appObject);\r\n\t\tchallengeEntity = new MockChallengeEntity(appObject);\r\n\r\n\t\tbaseAppState.isAuthoring = false;\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tappObjects.registerSingleton(eventEntity);\r\n\t\tappObjects.registerSingleton(baseAppState);\r\n\t\tappObjects.registerSingleton(challengeEntity);\r\n\r\n\t\tuc = makeUpdateProcedureEventsUCHook(appObject);\r\n\t});\r\n\r\n\tit(\"can be retrieved via static get method\", () => {\r\n\t\tconst retrieved = UpdateProcedureEventsUCHook.get(appObjects);\r\n\t\texpect(retrieved).toBe(uc);\r\n\t});\r\n\r\n\tit(\"registers itself as a singleton\", () => {\r\n\t\tconst singleton = appObjects.getSingleton(UpdateProcedureEventsUCHook.type);\r\n\t\texpect(singleton).toBe(uc);\r\n\t});\r\n\r\n\tit(\"records events when conditions are met\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"records ALL events without relevance filtering\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"unrelated\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"unrelated\");\r\n\t});\r\n\r\n\tit(\"does not process events when in authoring mode\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\tbaseAppState.isAuthoring = true;\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not process events when not on PROCEDURE challenge\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"records each emission independently, including consecutive identical events\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(2);\r\n\t});\r\n\r\n\tit(\"processes multiple different events in sequence\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event2\");\r\n\t\teventEntity.emit(\"event3\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(3);\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event2\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event3\");\r\n\t});\r\n\r\n\tit(\"records same event again after EventEntity reset\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(1);\r\n\r\n\t\teventEntity.reset();\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(2);\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"resets procedure when switching TO PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when already on PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when switching FROM PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when in authoring mode\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tbaseAppState.isAuthoring = true;\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not record stale event from previous challenge after switching to PROCEDURE\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\trecordSpy.mockClear();\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\t});\r\n\r\n\tit(\"records first event after challenge switch even if same as stale event\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"detects external procedure reset during PROCEDURE to PROCEDURE transition\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event1\"]);\r\n\r\n\t\tprocedureEntity.reset();\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"records same event after PROCEDURE to PROCEDURE transition\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event1\"]);\r\n\r\n\t\tprocedureEntity.reset();\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"does not reset EventEntity when procedure has recorded events\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event2\");\r\n\r\n\t\tconst resetSpy = jest.spyOn(eventEntity, \"reset\");\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"processes new event even when external reset is detected from unrelated event\", () => {\r\n\t\teventEntity.register(\"unrelated-event\", \"Unrelated\");\r\n\t\teventEntity.register(\"procedure-event\", \"Procedure Event\");\r\n\t\tprocedureEntity.addEventId(\"procedure-event\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"unrelated-event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\teventEntity.emit(\"procedure-event\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"procedure-event\");\r\n\t\texpect(procedureEntity.userEventLog).toContain(\"procedure-event\");\r\n\t});\r\n\r\n\tit(\"responds to authoring mode changes\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\tbaseAppState.isAuthoring = true;\r\n\r\n\t\teventEntity.emit(\"event2\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"responds to challenge changes for event processing\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\teventEntity.emit(\"event2\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"handles missing ProcedureEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutProcedure = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutProcedure).toBeDefined();\r\n\r\n\t\tnewEventEntity.register(\"test\", \"Test\");\r\n\t\tnewEventEntity.emit(\"test\");\r\n\t});\r\n\r\n\tit(\"handles missing EventEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutEvent = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutEvent).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles missing BaseAppState gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutBaseApp = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutBaseApp).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles missing ChallengeEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\r\n\t\tconst ucWithoutChallenge = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutChallenge).toBeDefined();\r\n\t});\r\n\r\n\tit(\"removes observers during disposal\", () => {\r\n\t\tconst removeBaseAppSpy = jest.spyOn(baseAppState, \"removeChangeObserver\");\r\n\t\tconst removeChallengeSpy = jest.spyOn(challengeEntity, \"removeChangeObserver\");\r\n\t\tconst removeEmissionListenerSpy = jest.spyOn(eventEntity, \"removeEmissionListener\");\r\n\r\n\t\tuc.dispose();\r\n\r\n\t\texpect(removeBaseAppSpy).toHaveBeenCalled();\r\n\t\texpect(removeChallengeSpy).toHaveBeenCalled();\r\n\t\texpect(removeEmissionListenerSpy).toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"resets state during disposal\", () => {\r\n\t\teventEntity.emit(\"event1\");\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tuc.dispose();\r\n\r\n\t\texpect(uc).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles disposal gracefully when entities are missing\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\t\tconst ucForDisposal = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\r\n\t\texpect(() => ucForDisposal.dispose()).not.toThrow();\r\n\t});\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"UpdateProcedureEventsUCHook.test.js","sourceRoot":"","sources":["../../../../src/Procedure/UCs/UpdateProcedureEventsUCHook.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n makeAppObjectRepo,\r\n} from \"@vived/core\";\r\nimport {\r\n UpdateProcedureEventsUCHook,\r\n makeUpdateProcedureEventsUCHook,\r\n} from \"./UpdateProcedureEventsUCHook\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { EventEntity } from \"../../EventSystem/Entities/EventEntity\";\r\n\r\nclass MockBaseAppState extends AppObjectEntity {\r\n static readonly type = \"BaseAppState\";\r\n private _isAuthoring = false;\r\n private observers: (() => void)[] = [];\r\n\r\n get isAuthoring(): boolean {\r\n return this._isAuthoring;\r\n }\r\n\r\n set isAuthoring(val: boolean) {\r\n this._isAuthoring = val;\r\n this.notifyObservers();\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers.indexOf(observer);\r\n if (index >= 0) this.observers.splice(index, 1);\r\n };\r\n\r\n private notifyObservers(): void {\r\n this.observers.forEach((o) => o());\r\n }\r\n\r\n static get(appObjects: AppObjectRepo): MockBaseAppState | undefined {\r\n return appObjects.getSingleton(MockBaseAppState.type) as\r\n | MockBaseAppState\r\n | undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, MockBaseAppState.type);\r\n }\r\n}\r\n\r\nclass MockChallengeEntity extends AppObjectEntity {\r\n static readonly type = \"ChallengeEntity\";\r\n private _selectedChallenge = \"OTHER\";\r\n private observers: (() => void)[] = [];\r\n\r\n get selectedChallenge(): string {\r\n return this._selectedChallenge;\r\n }\r\n\r\n set selectedChallenge(id: string) {\r\n this._selectedChallenge = id;\r\n this.notifyObservers();\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers.indexOf(observer);\r\n if (index >= 0) this.observers.splice(index, 1);\r\n };\r\n\r\n private notifyObservers(): void {\r\n this.observers.forEach((o) => o());\r\n }\r\n\r\n static get(appObjects: AppObjectRepo): MockChallengeEntity | undefined {\r\n return appObjects.getSingleton(MockChallengeEntity.type) as\r\n | MockChallengeEntity\r\n | undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, MockChallengeEntity.type);\r\n }\r\n}\r\n\r\nclass MockEventEntity extends EventEntity {\r\n private eventRegistry = new Map<string, { name: string }>();\r\n private eventLog: string[] = [];\r\n private lastEmittedId_: string | null = null;\r\n private observers_: (() => void)[] = [];\r\n private emissionListeners_: ((eventId: string) => void)[] = [];\r\n\r\n register(id: string, name: string): void {\r\n this.eventRegistry.set(id, { name });\r\n }\r\n\r\n emit(id: string): void {\r\n if (this.eventRegistry.has(id)) {\r\n this.eventLog.push(id);\r\n this.lastEmittedId_ = id;\r\n this.notifyOnChange();\r\n this.observers_.forEach((o) => o());\r\n this.emissionListeners_.forEach((l) => l(id));\r\n }\r\n }\r\n\r\n reset(): void {\r\n this.eventLog = [];\r\n this.lastEmittedId_ = null;\r\n this.notifyOnChange();\r\n this.observers_.forEach((o) => o());\r\n }\r\n\r\n getRegisteredEvents() {\r\n return Array.from(this.eventRegistry.entries()).map(([id, { name }]) => ({\r\n id,\r\n name,\r\n }));\r\n }\r\n\r\n getEventCategory(): \"assessed\" | \"instructional\" {\r\n return \"assessed\";\r\n }\r\n\r\n getEmittedEvents(): string[] {\r\n return [...this.eventLog];\r\n }\r\n\r\n getLastEmittedId(): string | null {\r\n return this.lastEmittedId_;\r\n }\r\n\r\n addChangeObserver = (observer: () => void): void => {\r\n this.observers_.push(observer);\r\n };\r\n\r\n removeChangeObserver = (observer: () => void): void => {\r\n const index = this.observers_.indexOf(observer);\r\n if (index >= 0) this.observers_.splice(index, 1);\r\n };\r\n\r\n addEmissionListener = (callback: (eventId: string) => void): void => {\r\n this.emissionListeners_.push(callback);\r\n };\r\n\r\n removeEmissionListener = (callback: (eventId: string) => void): void => {\r\n const index = this.emissionListeners_.indexOf(callback);\r\n if (index >= 0) this.emissionListeners_.splice(index, 1);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, EventEntity.type);\r\n }\r\n}\r\n\r\ndescribe(\"UpdateProcedureEventsUCHook\", () => {\r\n\tlet appObjects: AppObjectRepo;\r\n\tlet uc: UpdateProcedureEventsUCHook;\r\n\tlet procedureEntity: ProcedureEntity;\r\n\tlet eventEntity: MockEventEntity;\r\n\tlet baseAppState: MockBaseAppState;\r\n\tlet challengeEntity: MockChallengeEntity;\r\n\r\n\tbeforeEach(() => {\r\n\t\tappObjects = makeAppObjectRepo();\r\n\t\tconst appObject = appObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tprocedureEntity = makeProcedureEntity(appObject);\r\n\t\teventEntity = new MockEventEntity(appObject);\r\n\t\tbaseAppState = new MockBaseAppState(appObject);\r\n\t\tchallengeEntity = new MockChallengeEntity(appObject);\r\n\r\n\t\tbaseAppState.isAuthoring = false;\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tappObjects.registerSingleton(eventEntity);\r\n\t\tappObjects.registerSingleton(baseAppState);\r\n\t\tappObjects.registerSingleton(challengeEntity);\r\n\r\n\t\tuc = makeUpdateProcedureEventsUCHook(appObject);\r\n\t});\r\n\r\n\tit(\"can be retrieved via static get method\", () => {\r\n\t\tconst retrieved = UpdateProcedureEventsUCHook.get(appObjects);\r\n\t\texpect(retrieved).toBe(uc);\r\n\t});\r\n\r\n\tit(\"registers itself as a singleton\", () => {\r\n\t\tconst singleton = appObjects.getSingleton(UpdateProcedureEventsUCHook.type);\r\n\t\texpect(singleton).toBe(uc);\r\n\t});\r\n\r\n\tit(\"records events when conditions are met\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"records ALL events without relevance filtering\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"unrelated\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"unrelated\");\r\n\t});\r\n\r\n\tit(\"does not process events when in authoring mode\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\tbaseAppState.isAuthoring = true;\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not process events when not on PROCEDURE challenge\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"records each emission independently, including consecutive identical events\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(2);\r\n\t});\r\n\r\n\tit(\"processes multiple different events in sequence\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event2\");\r\n\t\teventEntity.emit(\"event3\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(3);\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event2\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event3\");\r\n\t});\r\n\r\n\tit(\"records same event again after EventEntity reset\", () => {\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\t\tprocedureEntity.addEventId(\"event3\");\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\t\teventEntity.register(\"event3\", \"Event 3\");\r\n\t\teventEntity.register(\"unrelated\", \"Unrelated Event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(1);\r\n\r\n\t\teventEntity.reset();\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledTimes(2);\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"resets procedure when switching TO PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when already on PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when switching FROM PROCEDURE challenge\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not reset when in authoring mode\", () => {\r\n\t\tconst resetSpy = jest.spyOn(procedureEntity, \"reset\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tbaseAppState.isAuthoring = true;\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"does not record stale event from previous challenge after switching to PROCEDURE\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\trecordSpy.mockClear();\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\t});\r\n\r\n\tit(\"records first event after challenge switch even if same as stale event\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"detects external procedure reset during PROCEDURE to PROCEDURE transition\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event1\"]);\r\n\r\n\t\tprocedureEntity.reset();\r\n\t\texpect(procedureEntity.userEventLog).toEqual([]);\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"records same event after PROCEDURE to PROCEDURE transition\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(procedureEntity.userEventLog).toEqual([\"event1\"]);\r\n\r\n\t\tprocedureEntity.reset();\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\t});\r\n\r\n\tit(\"does not reset EventEntity when procedure has recorded events\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tprocedureEntity.addEventId(\"event1\");\r\n\t\tprocedureEntity.addEventId(\"event2\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"event1\");\r\n\t\teventEntity.emit(\"event2\");\r\n\r\n\t\tconst resetSpy = jest.spyOn(eventEntity, \"reset\");\r\n\t\tresetSpy.mockClear();\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(resetSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"processes new event even when external reset is detected from unrelated event\", () => {\r\n\t\teventEntity.register(\"unrelated-event\", \"Unrelated\");\r\n\t\teventEntity.register(\"procedure-event\", \"Procedure Event\");\r\n\t\tprocedureEntity.addEventId(\"procedure-event\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\teventEntity.emit(\"unrelated-event\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\teventEntity.emit(\"procedure-event\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"procedure-event\");\r\n\t\texpect(procedureEntity.userEventLog).toContain(\"procedure-event\");\r\n\t});\r\n\r\n\tit(\"responds to authoring mode changes\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\tbaseAppState.isAuthoring = true;\r\n\r\n\t\teventEntity.emit(\"event2\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"responds to challenge changes for event processing\", () => {\r\n\t\teventEntity.register(\"event1\", \"Event 1\");\r\n\t\teventEntity.register(\"event2\", \"Event 2\");\r\n\r\n\t\tconst recordSpy = jest.spyOn(procedureEntity, \"recordUserEvent\");\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\t\tbaseAppState.isAuthoring = false;\r\n\r\n\t\teventEntity.emit(\"event1\");\r\n\t\texpect(recordSpy).toHaveBeenCalledWith(\"event1\");\r\n\r\n\t\trecordSpy.mockClear();\r\n\r\n\t\tchallengeEntity.selectedChallenge = \"OTHER\";\r\n\r\n\t\teventEntity.emit(\"event2\");\r\n\t\texpect(recordSpy).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"handles missing ProcedureEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutProcedure = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutProcedure).toBeDefined();\r\n\r\n\t\tnewEventEntity.register(\"test\", \"Test\");\r\n\t\tnewEventEntity.emit(\"test\");\r\n\t});\r\n\r\n\tit(\"handles missing EventEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutEvent = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutEvent).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles missing BaseAppState gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newChallenge = new MockChallengeEntity(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newChallenge);\r\n\r\n\t\tconst ucWithoutBaseApp = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutBaseApp).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles missing ChallengeEntity gracefully\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\r\n\t\tconst newProcedure = makeProcedureEntity(newAppObject);\r\n\t\tconst newEventEntity = new MockEventEntity(newAppObject);\r\n\t\tconst newBaseApp = new MockBaseAppState(newAppObject);\r\n\r\n\t\tnewAppObjects.registerSingleton(newProcedure);\r\n\t\tnewAppObjects.registerSingleton(newEventEntity);\r\n\t\tnewAppObjects.registerSingleton(newBaseApp);\r\n\r\n\t\tconst ucWithoutChallenge = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\t\texpect(ucWithoutChallenge).toBeDefined();\r\n\t});\r\n\r\n\tit(\"removes observers during disposal\", () => {\r\n\t\tconst removeBaseAppSpy = jest.spyOn(baseAppState, \"removeChangeObserver\");\r\n\t\tconst removeChallengeSpy = jest.spyOn(challengeEntity, \"removeChangeObserver\");\r\n\t\tconst removeEmissionListenerSpy = jest.spyOn(eventEntity, \"removeEmissionListener\");\r\n\r\n\t\tuc.dispose();\r\n\r\n\t\texpect(removeBaseAppSpy).toHaveBeenCalled();\r\n\t\texpect(removeChallengeSpy).toHaveBeenCalled();\r\n\t\texpect(removeEmissionListenerSpy).toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"resets state during disposal\", () => {\r\n\t\teventEntity.emit(\"event1\");\r\n\t\tchallengeEntity.selectedChallenge = \"PROCEDURE\";\r\n\r\n\t\tuc.dispose();\r\n\r\n\t\texpect(uc).toBeDefined();\r\n\t});\r\n\r\n\tit(\"handles disposal gracefully when entities are missing\", () => {\r\n\t\tconst newAppObjects = makeAppObjectRepo();\r\n\t\tconst newAppObject = newAppObjects.getOrCreate(\"Procedure\");\r\n\t\tconst ucForDisposal = makeUpdateProcedureEventsUCHook(newAppObject);\r\n\r\n\t\texpect(() => ucForDisposal.dispose()).not.toThrow();\r\n\t});\r\n});\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Procedure/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAG,WAAW,CAAC","sourcesContent":["import { EventDefinition } from \"../EventSystem/types\";\r\n\r\nexport const PROCEDURE_SYSTEM_NAME = \"procedure\";\r\n\r\n/**\r\n * Serialization format for Procedure state persistence (Version 1)\r\n */\r\nexport interface SerializeProcedureStateV1 {\r\n eventIds: string[];\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n}\r\n\r\n/**\r\n * View Model interface for Procedure presentation\r\n */\r\nexport interface ProcedureVM {\r\n eventIds: string[];\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n isRecording: boolean;\r\n userEventLog: string[];\r\n currentStepIndex: number;\r\n isComplete: boolean;\r\n validationMessage: string | null;\r\n nextExpectedEvent: string | null;\r\n progressPercentage: number;\r\n availableEvents: EventDefinition[];\r\n authoringValidationMessage: string | null;\r\n score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n isSubmitted: boolean;\r\n}\r\n\r\n\r\n/** Fields needed by the Babylon hint view */\r\nexport interface ProcedureHintVM {\r\n showHints: boolean;\r\n nextExpectedEvent: string | null;\r\n}\r\n\r\n/** Fields needed by the runtime step checklist and slide content */\r\nexport interface ProcedureProgressVM {\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n userEventLog: string[];\r\n currentStepIndex: number;\r\n isComplete: boolean;\r\n orderMatters: boolean;\r\n progressPercentage: number;\r\n isQuiz: boolean;\r\n isSubmitted: boolean;\r\n}\r\n\r\n/** Fields needed by the quiz review / score screen */\r\nexport interface ProcedureQuizResultVM {\r\n isComplete: boolean;\r\n isQuiz: boolean;\r\n progressPercentage: number;\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n orderMatters: boolean;\r\n userEventLog: string[];\r\n score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n isSubmitted: boolean;\r\n}\r\n/** Fields needed by the authoring inspector UI */\r\nexport interface ProcedureAuthoringVM {\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n authoringValidationMessage: string | null;\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/Procedure/types.ts"],"names":[],"mappings":";;;AAEa,QAAA,qBAAqB,GAAG,WAAW,CAAC","sourcesContent":["import { EventCategory, EventDefinition } from \"../EventSystem/types\";\r\n\r\nexport const PROCEDURE_SYSTEM_NAME = \"procedure\";\r\n\r\n/**\r\n * Resolves an authored step's `EventCategory` at evaluation time. Injected into\r\n * the `ProcedureEntity` by `ProcedureFeatureFactory` from the EventSystem\r\n * Registry; never serialized. Unknown ids must resolve to `\"assessed\"`.\r\n */\r\nexport type EventCategoryLookup = (eventId: string) => EventCategory;\r\n\r\n/**\r\n * Serialization format for Procedure state persistence (Version 1)\r\n */\r\nexport interface SerializeProcedureStateV1 {\r\n eventIds: string[];\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n}\r\n\r\n/**\r\n * View Model interface for Procedure presentation\r\n */\r\nexport interface ProcedureVM {\r\n eventIds: string[];\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n isRecording: boolean;\r\n userEventLog: string[];\r\n currentStepIndex: number;\r\n isComplete: boolean;\r\n validationMessage: string | null;\r\n nextExpectedEvent: string | null;\r\n progressPercentage: number;\r\n availableEvents: EventDefinition[];\r\n authoringValidationMessage: string | null;\r\n score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n isSubmitted: boolean;\r\n /**\r\n * Each authored step's category, keyed by event id (#53). A view hides a row\r\n * when `isQuiz && stepCategories[id] === \"instructional\"`; the authoring\r\n * inspector shows a \"guidance\" badge on the same rows. `eventIds` itself is\r\n * never filtered.\r\n */\r\n stepCategories: Record<string, EventCategory>;\r\n}\r\n\r\n\r\n/** Fields needed by the Babylon hint view */\r\nexport interface ProcedureHintVM {\r\n showHints: boolean;\r\n nextExpectedEvent: string | null;\r\n}\r\n\r\n/** Fields needed by the runtime step checklist and slide content */\r\nexport interface ProcedureProgressVM {\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n userEventLog: string[];\r\n currentStepIndex: number;\r\n isComplete: boolean;\r\n orderMatters: boolean;\r\n progressPercentage: number;\r\n isQuiz: boolean;\r\n isSubmitted: boolean;\r\n stepCategories: Record<string, EventCategory>;\r\n}\r\n\r\n/** Fields needed by the quiz review / score screen */\r\nexport interface ProcedureQuizResultVM {\r\n isComplete: boolean;\r\n isQuiz: boolean;\r\n progressPercentage: number;\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n orderMatters: boolean;\r\n userEventLog: string[];\r\n score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n isSubmitted: boolean;\r\n stepCategories: Record<string, EventCategory>;\r\n}\r\n/** Fields needed by the authoring inspector UI */\r\nexport interface ProcedureAuthoringVM {\r\n eventIds: string[];\r\n availableEvents: EventDefinition[];\r\n authoringValidationMessage: string | null;\r\n orderMatters: boolean;\r\n showHints: boolean;\r\n isQuiz: boolean;\r\n stepCategories: Record<string, EventCategory>;\r\n}\r\n"]}
|
|
@@ -27,11 +27,48 @@ function makeTestRig() {
|
|
|
27
27
|
const updateTouchHook = new UpdateTouchInputBound_1.UpdateTouchInputBoundUC(containerAO);
|
|
28
28
|
return { updateTouchHook, mockTouchInput, framedContainer };
|
|
29
29
|
}
|
|
30
|
+
function makeRigWithoutTouchInput() {
|
|
31
|
+
const appObjects = (0, core_1.makeAppObjectRepo)();
|
|
32
|
+
const mockWarn = jest.fn();
|
|
33
|
+
const mockError = jest.fn();
|
|
34
|
+
appObjects.submitWarning = mockWarn;
|
|
35
|
+
appObjects.submitError = mockError;
|
|
36
|
+
const containerAO = appObjects.getOrCreate("Canvas");
|
|
37
|
+
const framedContainer = (0, FramedScreen_1.makeFramedScreenContainer)(containerAO);
|
|
38
|
+
return { appObjects, containerAO, framedContainer, mockWarn, mockError };
|
|
39
|
+
}
|
|
30
40
|
describe("Update Touch Input Bounds UC Hook", () => {
|
|
31
41
|
it("Calls update input element when the framed container notifies", () => {
|
|
32
42
|
const { mockTouchInput, framedContainer } = makeTestRig();
|
|
33
43
|
framedContainer.position = new core_2.Vector2(21, 35);
|
|
34
44
|
expect(mockTouchInput.updateInputElementBounds).toHaveBeenCalled();
|
|
35
45
|
});
|
|
46
|
+
it("Constructs silently when there is no touch input", () => {
|
|
47
|
+
const { containerAO, mockWarn, mockError } = makeRigWithoutTouchInput();
|
|
48
|
+
expect(() => new UpdateTouchInputBound_1.UpdateTouchInputBoundUC(containerAO)).not.toThrow();
|
|
49
|
+
expect(mockWarn).not.toHaveBeenCalled();
|
|
50
|
+
expect(mockError).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it("Constructs silently when there is no framed container", () => {
|
|
53
|
+
const appObjects = (0, core_1.makeAppObjectRepo)();
|
|
54
|
+
const mockWarn = jest.fn();
|
|
55
|
+
const mockError = jest.fn();
|
|
56
|
+
appObjects.submitWarning = mockWarn;
|
|
57
|
+
appObjects.submitError = mockError;
|
|
58
|
+
// An AppObject that never got a FramedScreenContainer.
|
|
59
|
+
const bareAO = appObjects.getOrCreate("NoContainer");
|
|
60
|
+
expect(() => new UpdateTouchInputBound_1.UpdateTouchInputBoundUC(bareAO)).not.toThrow();
|
|
61
|
+
expect(mockWarn).not.toHaveBeenCalled();
|
|
62
|
+
expect(mockError).not.toHaveBeenCalled();
|
|
63
|
+
});
|
|
64
|
+
it("Skips the update silently when there is no touch input", () => {
|
|
65
|
+
const { containerAO, framedContainer, mockWarn, mockError } = makeRigWithoutTouchInput();
|
|
66
|
+
new UpdateTouchInputBound_1.UpdateTouchInputBoundUC(containerAO);
|
|
67
|
+
expect(() => {
|
|
68
|
+
framedContainer.position = new core_2.Vector2(21, 35);
|
|
69
|
+
}).not.toThrow();
|
|
70
|
+
expect(mockWarn).not.toHaveBeenCalled();
|
|
71
|
+
expect(mockError).not.toHaveBeenCalled();
|
|
72
|
+
});
|
|
36
73
|
});
|
|
37
74
|
//# sourceMappingURL=UpdateTouchInoutBound.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateTouchInoutBound.test.js","sourceRoot":"","sources":["../../../../src/TouchController/UC/UpdateTouchInoutBound.test.ts"],"names":[],"mappings":";;AAAA,sCAAgD;AAChD,sCAAsC;AACtC,qDAG4B;AAC5B,0CAA+C;AAC/C,mEAAkE;AAElE,MAAM,cAAe,SAAQ,2BAAgB;IAA7C;;QAKE,oBAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,sBAAiB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9B,6BAAwB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,uBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/B,qBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC/B,CAAC;IATC,IAAI,YAAY;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CAOF;AAED,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAExE,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,wCAAyB,EAAC,WAAW,CAAC,CAAC;IAE/D,MAAM,eAAe,GAAG,IAAI,+CAAuB,CAAC,WAAW,CAAC,CAAC;IAEjE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAC9D,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAAC;QAE1D,eAAe,CAAC,QAAQ,GAAG,IAAI,cAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { makeAppObjectRepo } from \"@vived/core\";\nimport { Vector2 } from \"@vived/core\";\nimport {\n makeFramedContainerPM,\n makeFramedScreenContainer,\n} from \"../../FramedScreen\";\nimport { TouchInputEntity } from \"../Entities\";\nimport { UpdateTouchInputBoundUC } from \"./UpdateTouchInputBound\";\n\nclass MockTouchInput extends TouchInputEntity {\n get eventElement(): HTMLElement | undefined {\n throw new Error(\"Method not implemented.\");\n }\n eventElementBounds?: DOMRect | undefined;\n setEventElement = jest.fn();\n clearInputElement = jest.fn();\n updateInputElementBounds = jest.fn();\n registerController = jest.fn();\n removeController = jest.fn();\n}\n\nfunction makeTestRig() {\n const appObjects = makeAppObjectRepo();\n const appAO = appObjects.getOrCreate(\"App\");\n const mockTouchInput = new MockTouchInput(appAO, TouchInputEntity.type);\n\n const containerAO = appObjects.getOrCreate(\"Canvas\");\n const framedContainer = makeFramedScreenContainer(containerAO);\n\n const updateTouchHook = new UpdateTouchInputBoundUC(containerAO);\n\n return { updateTouchHook, mockTouchInput, framedContainer };\n}\n\ndescribe(\"Update Touch Input Bounds UC Hook\", () => {\n it(\"Calls update input element when the framed container notifies\", () => {\n const { mockTouchInput, framedContainer } = makeTestRig();\n\n framedContainer.position = new Vector2(21, 35);\n expect(mockTouchInput.updateInputElementBounds).toHaveBeenCalled();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"UpdateTouchInoutBound.test.js","sourceRoot":"","sources":["../../../../src/TouchController/UC/UpdateTouchInoutBound.test.ts"],"names":[],"mappings":";;AAAA,sCAAgD;AAChD,sCAAsC;AACtC,qDAG4B;AAC5B,0CAA+C;AAC/C,mEAAkE;AAElE,MAAM,cAAe,SAAQ,2BAAgB;IAA7C;;QAKE,oBAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,sBAAiB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC9B,6BAAwB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QACrC,uBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC/B,qBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC/B,CAAC;IATC,IAAI,YAAY;QACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;CAOF;AAED,SAAS,WAAW;IAClB,MAAM,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;IACvC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,KAAK,EAAE,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAExE,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,wCAAyB,EAAC,WAAW,CAAC,CAAC;IAE/D,MAAM,eAAe,GAAG,IAAI,+CAAuB,CAAC,WAAW,CAAC,CAAC;IAEjE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,wBAAwB;IAC/B,MAAM,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;IAEvC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC5B,UAAU,CAAC,aAAa,GAAG,QAAQ,CAAC;IACpC,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC;IAEnC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACrD,MAAM,eAAe,GAAG,IAAA,wCAAyB,EAAC,WAAW,CAAC,CAAC;IAE/D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAC3E,CAAC;AAED,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,WAAW,EAAE,CAAC;QAE1D,eAAe,CAAC,QAAQ,GAAG,IAAI,cAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,wBAAwB,EAAE,CAAC;QAExE,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,+CAAuB,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC5B,UAAU,CAAC,aAAa,GAAG,QAAQ,CAAC;QACpC,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC;QAEnC,uDAAuD;QACvD,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAErD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,+CAAuB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,GACzD,wBAAwB,EAAE,CAAC;QAC7B,IAAI,+CAAuB,CAAC,WAAW,CAAC,CAAC;QAEzC,MAAM,CAAC,GAAG,EAAE;YACV,eAAe,CAAC,QAAQ,GAAG,IAAI,cAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { makeAppObjectRepo } from \"@vived/core\";\r\nimport { Vector2 } from \"@vived/core\";\r\nimport {\r\n makeFramedContainerPM,\r\n makeFramedScreenContainer,\r\n} from \"../../FramedScreen\";\r\nimport { TouchInputEntity } from \"../Entities\";\r\nimport { UpdateTouchInputBoundUC } from \"./UpdateTouchInputBound\";\r\n\r\nclass MockTouchInput extends TouchInputEntity {\r\n get eventElement(): HTMLElement | undefined {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n eventElementBounds?: DOMRect | undefined;\r\n setEventElement = jest.fn();\r\n clearInputElement = jest.fn();\r\n updateInputElementBounds = jest.fn();\r\n registerController = jest.fn();\r\n removeController = jest.fn();\r\n}\r\n\r\nfunction makeTestRig() {\r\n const appObjects = makeAppObjectRepo();\r\n const appAO = appObjects.getOrCreate(\"App\");\r\n const mockTouchInput = new MockTouchInput(appAO, TouchInputEntity.type);\r\n\r\n const containerAO = appObjects.getOrCreate(\"Canvas\");\r\n const framedContainer = makeFramedScreenContainer(containerAO);\r\n\r\n const updateTouchHook = new UpdateTouchInputBoundUC(containerAO);\r\n\r\n return { updateTouchHook, mockTouchInput, framedContainer };\r\n}\r\n\r\nfunction makeRigWithoutTouchInput() {\r\n const appObjects = makeAppObjectRepo();\r\n\r\n const mockWarn = jest.fn();\r\n const mockError = jest.fn();\r\n appObjects.submitWarning = mockWarn;\r\n appObjects.submitError = mockError;\r\n\r\n const containerAO = appObjects.getOrCreate(\"Canvas\");\r\n const framedContainer = makeFramedScreenContainer(containerAO);\r\n\r\n return { appObjects, containerAO, framedContainer, mockWarn, mockError };\r\n}\r\n\r\ndescribe(\"Update Touch Input Bounds UC Hook\", () => {\r\n it(\"Calls update input element when the framed container notifies\", () => {\r\n const { mockTouchInput, framedContainer } = makeTestRig();\r\n\r\n framedContainer.position = new Vector2(21, 35);\r\n expect(mockTouchInput.updateInputElementBounds).toHaveBeenCalled();\r\n });\r\n\r\n it(\"Constructs silently when there is no touch input\", () => {\r\n const { containerAO, mockWarn, mockError } = makeRigWithoutTouchInput();\r\n\r\n expect(() => new UpdateTouchInputBoundUC(containerAO)).not.toThrow();\r\n expect(mockWarn).not.toHaveBeenCalled();\r\n expect(mockError).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Constructs silently when there is no framed container\", () => {\r\n const appObjects = makeAppObjectRepo();\r\n const mockWarn = jest.fn();\r\n const mockError = jest.fn();\r\n appObjects.submitWarning = mockWarn;\r\n appObjects.submitError = mockError;\r\n\r\n // An AppObject that never got a FramedScreenContainer.\r\n const bareAO = appObjects.getOrCreate(\"NoContainer\");\r\n\r\n expect(() => new UpdateTouchInputBoundUC(bareAO)).not.toThrow();\r\n expect(mockWarn).not.toHaveBeenCalled();\r\n expect(mockError).not.toHaveBeenCalled();\r\n });\r\n\r\n it(\"Skips the update silently when there is no touch input\", () => {\r\n const { containerAO, framedContainer, mockWarn, mockError } =\r\n makeRigWithoutTouchInput();\r\n new UpdateTouchInputBoundUC(containerAO);\r\n\r\n expect(() => {\r\n framedContainer.position = new Vector2(21, 35);\r\n }).not.toThrow();\r\n expect(mockWarn).not.toHaveBeenCalled();\r\n expect(mockError).not.toHaveBeenCalled();\r\n });\r\n});\r\n"]}
|
|
@@ -5,19 +5,32 @@ const core_1 = require("@vived/core");
|
|
|
5
5
|
const FramedScreen_1 = require("../../FramedScreen");
|
|
6
6
|
const Entities_1 = require("../Entities");
|
|
7
7
|
class UpdateTouchInputBoundUC extends core_1.AppObjectUC {
|
|
8
|
+
/**
|
|
9
|
+
* The container is optional - this UC is only useful on an AppObject that
|
|
10
|
+
* has one. hasComponent is checked first because getCachedLocalComponent
|
|
11
|
+
* throws when the component is absent, which would defeat the constructor's
|
|
12
|
+
* guard rather than let it skip.
|
|
13
|
+
*/
|
|
8
14
|
get container() {
|
|
15
|
+
if (!this.appObject.hasComponent(FramedScreen_1.FramedScreenContainer.type)) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
9
18
|
return this.getCachedLocalComponent(FramedScreen_1.FramedScreenContainer.type);
|
|
10
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* TouchInputEntity is optional - a composition may decline touch input.
|
|
22
|
+
* hasSingleton is checked first because both the repo lookup and
|
|
23
|
+
* getCachedSingleton complain when the type is absent (the latter throws).
|
|
24
|
+
*/
|
|
11
25
|
get touchInput() {
|
|
26
|
+
if (!this.appObjects.hasSingleton(Entities_1.TouchInputEntity.type)) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
12
29
|
return this.getCachedSingleton(Entities_1.TouchInputEntity.type);
|
|
13
30
|
}
|
|
14
31
|
constructor(appObject) {
|
|
15
32
|
super(appObject, UpdateTouchInputBoundUC.type);
|
|
16
33
|
this.onContainerChange = () => {
|
|
17
|
-
if (!this.touchInput) {
|
|
18
|
-
this.warn("Unable to find TouchInputEntity");
|
|
19
|
-
return;
|
|
20
|
-
}
|
|
21
34
|
this.touchInput?.updateInputElementBounds();
|
|
22
35
|
};
|
|
23
36
|
if (!this.container) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UpdateTouchInputBound.js","sourceRoot":"","sources":["../../../../src/TouchController/UC/UpdateTouchInputBound.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,qDAA2D;AAC3D,0CAA+C;AAE/C,MAAa,uBAAwB,SAAQ,kBAAW;IAGtD,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,uBAAuB,CACjC,oCAAqB,CAAC,IAAI,CAC3B,CAAC;IACJ,CAAC;IAED,IAAY,UAAU;QACpB,
|
|
1
|
+
{"version":3,"file":"UpdateTouchInputBound.js","sourceRoot":"","sources":["../../../../src/TouchController/UC/UpdateTouchInputBound.ts"],"names":[],"mappings":";;;AAAA,sCAAqD;AACrD,qDAA2D;AAC3D,0CAA+C;AAE/C,MAAa,uBAAwB,SAAQ,kBAAW;IAGtD;;;;;OAKG;IACH,IAAY,SAAS;QACnB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,oCAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,uBAAuB,CACjC,oCAAqB,CAAC,IAAI,CAC3B,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,IAAY,UAAU;QACpB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,2BAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAmB,2BAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAMD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,uBAAuB,CAAC,IAAI,CAAC,CAAC;QALjD,sBAAiB,GAAG,GAAG,EAAE;YACvB,IAAI,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC;QAC9C,CAAC,CAAC;QAKA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACzD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;;AA7CH,0DA8CC;AA7CQ,4BAAI,GAAG,yBAAyB,AAA5B,CAA6B","sourcesContent":["import { AppObject, AppObjectUC } from \"@vived/core\";\r\nimport { FramedScreenContainer } from \"../../FramedScreen\";\r\nimport { TouchInputEntity } from \"../Entities\";\r\n\r\nexport class UpdateTouchInputBoundUC extends AppObjectUC {\r\n static type = \"UpdateTouchInputBoundUC\";\r\n\r\n /**\r\n * The container is optional - this UC is only useful on an AppObject that\r\n * has one. hasComponent is checked first because getCachedLocalComponent\r\n * throws when the component is absent, which would defeat the constructor's\r\n * guard rather than let it skip.\r\n */\r\n private get container(): FramedScreenContainer | undefined {\r\n if (!this.appObject.hasComponent(FramedScreenContainer.type)) {\r\n return undefined;\r\n }\r\n\r\n return this.getCachedLocalComponent<FramedScreenContainer>(\r\n FramedScreenContainer.type,\r\n );\r\n }\r\n\r\n /**\r\n * TouchInputEntity is optional - a composition may decline touch input.\r\n * hasSingleton is checked first because both the repo lookup and\r\n * getCachedSingleton complain when the type is absent (the latter throws).\r\n */\r\n private get touchInput(): TouchInputEntity | undefined {\r\n if (!this.appObjects.hasSingleton(TouchInputEntity.type)) {\r\n return undefined;\r\n }\r\n\r\n return this.getCachedSingleton<TouchInputEntity>(TouchInputEntity.type);\r\n }\r\n\r\n onContainerChange = () => {\r\n this.touchInput?.updateInputElementBounds();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, UpdateTouchInputBoundUC.type);\r\n\r\n if (!this.container) {\r\n return;\r\n }\r\n\r\n this.container.addChangeObserver(this.onContainerChange);\r\n this.onContainerChange();\r\n }\r\n}\r\n"]}
|