@vived/host 4.0.3 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js +24 -0
  2. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  3. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js +49 -0
  4. package/dist/cjs/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  5. package/dist/cjs/StateMachine/Adapters/index.js +1 -0
  6. package/dist/cjs/StateMachine/Adapters/index.js.map +1 -1
  7. package/dist/cjs/StateMachine/Controllers/editStateName.js +13 -0
  8. package/dist/cjs/StateMachine/Controllers/editStateName.js.map +1 -0
  9. package/dist/cjs/StateMachine/Controllers/editStateName.test.js +49 -0
  10. package/dist/cjs/StateMachine/Controllers/editStateName.test.js.map +1 -0
  11. package/dist/cjs/StateMachine/Controllers/index.js +1 -0
  12. package/dist/cjs/StateMachine/Controllers/index.js.map +1 -1
  13. package/dist/cjs/StateMachine/Entities/HostStateMachine.js +67 -24
  14. package/dist/cjs/StateMachine/Entities/HostStateMachine.js.map +1 -1
  15. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js +174 -0
  16. package/dist/cjs/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  17. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js +12 -0
  18. package/dist/cjs/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  19. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js +23 -0
  20. package/dist/cjs/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  21. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js +21 -15
  22. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  23. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  24. package/dist/cjs/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  25. package/dist/cjs/StateMachine/PMs/HostStatePM.js +136 -0
  26. package/dist/cjs/StateMachine/PMs/HostStatePM.js.map +1 -0
  27. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js +405 -0
  28. package/dist/cjs/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  29. package/dist/cjs/StateMachine/PMs/index.js +1 -0
  30. package/dist/cjs/StateMachine/PMs/index.js.map +1 -1
  31. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js +35 -0
  32. package/dist/cjs/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  33. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js +58 -0
  34. package/dist/cjs/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  35. package/dist/cjs/StateMachine/UCs/index.js +1 -0
  36. package/dist/cjs/StateMachine/UCs/index.js.map +1 -1
  37. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js +21 -0
  38. package/dist/esm/StateMachine/Adapters/hostStateAdapter.js.map +1 -0
  39. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js +47 -0
  40. package/dist/esm/StateMachine/Adapters/hostStateAdapter.test.js.map +1 -0
  41. package/dist/esm/StateMachine/Adapters/index.js +1 -0
  42. package/dist/esm/StateMachine/Adapters/index.js.map +1 -1
  43. package/dist/esm/StateMachine/Controllers/editStateName.js +10 -0
  44. package/dist/esm/StateMachine/Controllers/editStateName.js.map +1 -0
  45. package/dist/esm/StateMachine/Controllers/editStateName.test.js +47 -0
  46. package/dist/esm/StateMachine/Controllers/editStateName.test.js.map +1 -0
  47. package/dist/esm/StateMachine/Controllers/index.js +1 -0
  48. package/dist/esm/StateMachine/Controllers/index.js.map +1 -1
  49. package/dist/esm/StateMachine/Entities/HostStateMachine.js +67 -24
  50. package/dist/esm/StateMachine/Entities/HostStateMachine.js.map +1 -1
  51. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js +174 -0
  52. package/dist/esm/StateMachine/Entities/HostStateMachine.test.js.map +1 -1
  53. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js +8 -0
  54. package/dist/esm/StateMachine/Mocks/MockEditStateNameUC.js.map +1 -0
  55. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js +18 -0
  56. package/dist/esm/StateMachine/Mocks/MockHostStatePM.js.map +1 -0
  57. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js +21 -15
  58. package/dist/esm/StateMachine/PMs/HostStateMachinePM.js.map +1 -1
  59. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js +65 -56
  60. package/dist/esm/StateMachine/PMs/HostStateMachinePM.test.js.map +1 -1
  61. package/dist/esm/StateMachine/PMs/HostStatePM.js +131 -0
  62. package/dist/esm/StateMachine/PMs/HostStatePM.js.map +1 -0
  63. package/dist/esm/StateMachine/PMs/HostStatePM.test.js +403 -0
  64. package/dist/esm/StateMachine/PMs/HostStatePM.test.js.map +1 -0
  65. package/dist/esm/StateMachine/PMs/index.js +1 -0
  66. package/dist/esm/StateMachine/PMs/index.js.map +1 -1
  67. package/dist/esm/StateMachine/UCs/EditStateNameUC.js +30 -0
  68. package/dist/esm/StateMachine/UCs/EditStateNameUC.js.map +1 -0
  69. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js +56 -0
  70. package/dist/esm/StateMachine/UCs/EditStateNameUC.test.js.map +1 -0
  71. package/dist/esm/StateMachine/UCs/index.js +1 -0
  72. package/dist/esm/StateMachine/UCs/index.js.map +1 -1
  73. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts +4 -0
  74. package/dist/types/StateMachine/Adapters/hostStateAdapter.d.ts.map +1 -0
  75. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts +2 -0
  76. package/dist/types/StateMachine/Adapters/hostStateAdapter.test.d.ts.map +1 -0
  77. package/dist/types/StateMachine/Adapters/index.d.ts +1 -0
  78. package/dist/types/StateMachine/Adapters/index.d.ts.map +1 -1
  79. package/dist/types/StateMachine/Controllers/editStateName.d.ts +3 -0
  80. package/dist/types/StateMachine/Controllers/editStateName.d.ts.map +1 -0
  81. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts +2 -0
  82. package/dist/types/StateMachine/Controllers/editStateName.test.d.ts.map +1 -0
  83. package/dist/types/StateMachine/Controllers/index.d.ts +1 -0
  84. package/dist/types/StateMachine/Controllers/index.d.ts.map +1 -1
  85. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts +6 -0
  86. package/dist/types/StateMachine/Entities/HostStateMachine.d.ts.map +1 -1
  87. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts +7 -0
  88. package/dist/types/StateMachine/Mocks/MockEditStateNameUC.d.ts.map +1 -0
  89. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts +9 -0
  90. package/dist/types/StateMachine/Mocks/MockHostStatePM.d.ts.map +1 -0
  91. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts +3 -4
  92. package/dist/types/StateMachine/PMs/HostStateMachinePM.d.ts.map +1 -1
  93. package/dist/types/StateMachine/PMs/HostStatePM.d.ts +18 -0
  94. package/dist/types/StateMachine/PMs/HostStatePM.d.ts.map +1 -0
  95. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts +2 -0
  96. package/dist/types/StateMachine/PMs/HostStatePM.test.d.ts.map +1 -0
  97. package/dist/types/StateMachine/PMs/index.d.ts +1 -0
  98. package/dist/types/StateMachine/PMs/index.d.ts.map +1 -1
  99. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts +9 -0
  100. package/dist/types/StateMachine/UCs/EditStateNameUC.d.ts.map +1 -0
  101. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts +2 -0
  102. package/dist/types/StateMachine/UCs/EditStateNameUC.test.d.ts.map +1 -0
  103. package/dist/types/StateMachine/UCs/index.d.ts +1 -0
  104. package/dist/types/StateMachine/UCs/index.d.ts.map +1 -1
  105. package/package.json +1 -1
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hostStateAdapter = void 0;
4
+ const HostStatePM_1 = require("../PMs/HostStatePM");
5
+ exports.hostStateAdapter = {
6
+ defaultVM: HostStatePM_1.HostStatePM.defaultVM,
7
+ subscribe: (id, appObjects, setVM) => {
8
+ if (!id) {
9
+ return;
10
+ }
11
+ const pm = HostStatePM_1.HostStatePM.getById(id, appObjects);
12
+ if (!pm) {
13
+ appObjects.submitError("hostStateAdapter", `Unable to find HostStatePM for ID: ${id}`);
14
+ return;
15
+ }
16
+ pm.addView(setVM);
17
+ },
18
+ unsubscribe: (id, appObjects, setVM) => {
19
+ if (!id)
20
+ return;
21
+ HostStatePM_1.HostStatePM.getById(id, appObjects)?.removeView(setVM);
22
+ }
23
+ };
24
+ //# sourceMappingURL=hostStateAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostStateAdapter.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/hostStateAdapter.ts"],"names":[],"mappings":";;;AACA,oDAA8D;AAEjD,QAAA,gBAAgB,GAA2B;IACtD,SAAS,EAAE,yBAAW,CAAC,SAAS;IAChC,SAAS,EAAE,CACT,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,yBAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,WAAW,CACpB,kBAAkB,EAClB,sCAAsC,EAAE,EAAE,CAC3C,CAAC;YACF,OAAO;QACT,CAAC;QAED,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,WAAW,EAAE,CACX,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,yBAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;CACF,CAAC","sourcesContent":["import { AppObjectRepo, PmAdapter } from \"@vived/core\";\r\nimport { HostStatePM, HostStateVM } from \"../PMs/HostStatePM\";\r\n\r\nexport const hostStateAdapter: PmAdapter<HostStateVM> = {\r\n defaultVM: HostStatePM.defaultVM,\r\n subscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: HostStateVM) => void\r\n ) => {\r\n if (!id) {\r\n return;\r\n }\r\n\r\n const pm = HostStatePM.getById(id, appObjects);\r\n if (!pm) {\r\n appObjects.submitError(\r\n \"hostStateAdapter\",\r\n `Unable to find HostStatePM for ID: ${id}`\r\n );\r\n return;\r\n }\r\n\r\n pm.addView(setVM);\r\n },\r\n unsubscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: HostStateVM) => void\r\n ) => {\r\n if (!id) return;\r\n\r\n HostStatePM.getById(id, appObjects)?.removeView(setVM);\r\n }\r\n};\r\n"]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@vived/core");
4
+ const HostStatePM_1 = require("../PMs/HostStatePM");
5
+ const hostStateAdapter_1 = require("./hostStateAdapter");
6
+ const MockHostStatePM_1 = require("../Mocks/MockHostStatePM");
7
+ describe("hostStateAdapter", () => {
8
+ let appObjects;
9
+ let appObject;
10
+ let mockPM;
11
+ const testId = "test-state-id";
12
+ const setVM = jest.fn();
13
+ beforeEach(() => {
14
+ appObjects = (0, core_1.makeAppObjectRepo)();
15
+ appObject = appObjects.getOrCreate(testId);
16
+ // Create the mock PM instead of a real one
17
+ mockPM = (0, MockHostStatePM_1.makeMockHostStatePM)(appObject);
18
+ // Reset the mock function before each test
19
+ setVM.mockReset();
20
+ });
21
+ it("should provide the default VM from HostStatePM", () => {
22
+ expect(hostStateAdapter_1.hostStateAdapter.defaultVM).toEqual(HostStatePM_1.HostStatePM.defaultVM);
23
+ });
24
+ it("should add a view on subscribe", () => {
25
+ const addViewSpy = jest.spyOn(mockPM, "addView");
26
+ hostStateAdapter_1.hostStateAdapter.subscribe(testId, appObjects, setVM);
27
+ expect(addViewSpy).toHaveBeenCalledWith(setVM);
28
+ });
29
+ it("should remove a view on unsubscribe", () => {
30
+ const removeViewSpy = jest.spyOn(mockPM, "removeView");
31
+ hostStateAdapter_1.hostStateAdapter.unsubscribe(testId, appObjects, setVM);
32
+ expect(removeViewSpy).toHaveBeenCalledWith(setVM);
33
+ });
34
+ it("should handle missing PM on subscribe", () => {
35
+ // Create a new AppObjectRepo without the PM
36
+ const emptyAppObjects = (0, core_1.makeAppObjectRepo)();
37
+ emptyAppObjects.submitError = jest.fn();
38
+ // Using an ID that doesn't have a PM
39
+ hostStateAdapter_1.hostStateAdapter.subscribe(testId, emptyAppObjects, setVM);
40
+ expect(emptyAppObjects.submitError).toHaveBeenCalledWith("hostStateAdapter", expect.stringContaining("Unable to find HostStatePM"));
41
+ });
42
+ it("should handle missing PM on unsubscribe without error", () => {
43
+ // This should not throw an error
44
+ expect(() => {
45
+ hostStateAdapter_1.hostStateAdapter.unsubscribe("non-existent", appObjects, setVM);
46
+ }).not.toThrow();
47
+ });
48
+ });
49
+ //# sourceMappingURL=hostStateAdapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostStateAdapter.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/hostStateAdapter.test.ts"],"names":[],"mappings":";;AAAA,sCAA0E;AAC1E,oDAAiD;AACjD,yDAAsD;AACtD,8DAAgF;AAEhF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,UAAyB,CAAC;IAC9B,IAAI,SAAoB,CAAC;IACzB,IAAI,MAAuB,CAAC;IAC5B,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAExB,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;QACjC,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE3C,2CAA2C;QAC3C,MAAM,GAAG,IAAA,qCAAmB,EAAC,SAAS,CAAC,CAAC;QAExC,2CAA2C;QAC3C,KAAK,CAAC,SAAS,EAAE,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,mCAAgB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,yBAAW,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAEjD,mCAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEtD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAEvD,mCAAgB,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAExD,MAAM,CAAC,aAAa,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,4CAA4C;QAC5C,MAAM,eAAe,GAAG,IAAA,wBAAiB,GAAE,CAAC;QAC5C,eAAe,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAExC,qCAAqC;QACrC,mCAAgB,CAAC,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QAE3D,MAAM,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,oBAAoB,CACtD,kBAAkB,EAClB,MAAM,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,CACtD,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE;YACV,mCAAgB,CAAC,WAAW,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { AppObject, AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { HostStatePM } from \"../PMs/HostStatePM\";\r\nimport { hostStateAdapter } from \"./hostStateAdapter\";\r\nimport { MockHostStatePM, makeMockHostStatePM } from \"../Mocks/MockHostStatePM\";\r\n\r\ndescribe(\"hostStateAdapter\", () => {\r\n let appObjects: AppObjectRepo;\r\n let appObject: AppObject;\r\n let mockPM: MockHostStatePM;\r\n const testId = \"test-state-id\";\r\n const setVM = jest.fn();\r\n\r\n beforeEach(() => {\r\n appObjects = makeAppObjectRepo();\r\n appObject = appObjects.getOrCreate(testId);\r\n\r\n // Create the mock PM instead of a real one\r\n mockPM = makeMockHostStatePM(appObject);\r\n\r\n // Reset the mock function before each test\r\n setVM.mockReset();\r\n });\r\n\r\n it(\"should provide the default VM from HostStatePM\", () => {\r\n expect(hostStateAdapter.defaultVM).toEqual(HostStatePM.defaultVM);\r\n });\r\n\r\n it(\"should add a view on subscribe\", () => {\r\n const addViewSpy = jest.spyOn(mockPM, \"addView\");\r\n\r\n hostStateAdapter.subscribe(testId, appObjects, setVM);\r\n\r\n expect(addViewSpy).toHaveBeenCalledWith(setVM);\r\n });\r\n\r\n it(\"should remove a view on unsubscribe\", () => {\r\n const removeViewSpy = jest.spyOn(mockPM, \"removeView\");\r\n\r\n hostStateAdapter.unsubscribe(testId, appObjects, setVM);\r\n\r\n expect(removeViewSpy).toHaveBeenCalledWith(setVM);\r\n });\r\n\r\n it(\"should handle missing PM on subscribe\", () => {\r\n // Create a new AppObjectRepo without the PM\r\n const emptyAppObjects = makeAppObjectRepo();\r\n emptyAppObjects.submitError = jest.fn();\r\n\r\n // Using an ID that doesn't have a PM\r\n hostStateAdapter.subscribe(testId, emptyAppObjects, setVM);\r\n\r\n expect(emptyAppObjects.submitError).toHaveBeenCalledWith(\r\n \"hostStateAdapter\",\r\n expect.stringContaining(\"Unable to find HostStatePM\")\r\n );\r\n });\r\n\r\n it(\"should handle missing PM on unsubscribe without error\", () => {\r\n // This should not throw an error\r\n expect(() => {\r\n hostStateAdapter.unsubscribe(\"non-existent\", appObjects, setVM);\r\n }).not.toThrow();\r\n });\r\n});\r\n"]}
@@ -16,4 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./editingStateAdapter"), exports);
18
18
  __exportStar(require("./hostStateMachinePMAdapter"), exports);
19
+ __exportStar(require("./hostStateAdapter"), exports);
19
20
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,8DAA4C","sourcesContent":["export * from \"./editingStateAdapter\";\r\nexport * from \"./hostStateMachinePMAdapter\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,8DAA4C;AAC5C,qDAAmC","sourcesContent":["export * from \"./editingStateAdapter\";\r\nexport * from \"./hostStateMachinePMAdapter\";\r\nexport * from \"./hostStateAdapter\";\r\n"]}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.editStateName = editStateName;
4
+ const EditStateNameUC_1 = require("../UCs/EditStateNameUC");
5
+ function editStateName(name, id, appObjects) {
6
+ const uc = EditStateNameUC_1.EditStateNameUC.getById(id, appObjects);
7
+ if (!uc) {
8
+ appObjects.submitWarning("editStateName", "Unable to find EditStateNameUC");
9
+ return;
10
+ }
11
+ uc.editStateName(name);
12
+ }
13
+ //# sourceMappingURL=editStateName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editStateName.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/editStateName.ts"],"names":[],"mappings":";;AAGA,sCAYC;AAdD,4DAAyD;AAEzD,SAAgB,aAAa,CAC3B,IAAY,EACZ,EAAU,EACV,UAAyB;IAEzB,MAAM,EAAE,GAAG,iCAAe,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,UAAU,CAAC,aAAa,CAAC,eAAe,EAAE,gCAAgC,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { EditStateNameUC } from \"../UCs/EditStateNameUC\";\r\n\r\nexport function editStateName(\r\n name: string,\r\n id: string,\r\n appObjects: AppObjectRepo\r\n) {\r\n const uc = EditStateNameUC.getById(id, appObjects);\r\n if (!uc) {\r\n appObjects.submitWarning(\"editStateName\", \"Unable to find EditStateNameUC\");\r\n return;\r\n }\r\n\r\n uc.editStateName(name);\r\n}\r\n"]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const core_1 = require("@vived/core");
4
+ const MockEditStateNameUC_1 = require("../Mocks/MockEditStateNameUC");
5
+ const editStateName_1 = require("./editStateName");
6
+ describe("editStateName", () => {
7
+ let appObjects;
8
+ let mockUC;
9
+ let mockEditFunction;
10
+ const testId = "test-state-id";
11
+ const testName = "New State Name";
12
+ beforeEach(() => {
13
+ // Create a fresh repository for each test
14
+ appObjects = (0, core_1.makeAppObjectRepo)();
15
+ const testAppObject = appObjects.getOrCreate(testId);
16
+ // Create the mock UC
17
+ mockUC = new MockEditStateNameUC_1.MockEditStateNameUC(testAppObject);
18
+ // Setup the spy on the mock function
19
+ mockEditFunction = jest.fn();
20
+ mockUC.editStateName = mockEditFunction;
21
+ });
22
+ it("should call EditStateNameUC with the provided name", () => {
23
+ // Call the controller function
24
+ (0, editStateName_1.editStateName)(testName, testId, appObjects);
25
+ // Verify the use case was called with the correct name
26
+ expect(mockEditFunction).toBeCalledWith(testName);
27
+ });
28
+ it("should do nothing when UC cannot be found", () => {
29
+ // Call with an ID that doesn't have the UC
30
+ const nonExistentId = "non-existent-id";
31
+ // This should not throw an error
32
+ expect(() => {
33
+ (0, editStateName_1.editStateName)(testName, nonExistentId, appObjects);
34
+ }).not.toThrow();
35
+ // Verify our original mock wasn't called
36
+ expect(mockEditFunction).not.toHaveBeenCalled();
37
+ });
38
+ it("should submit a warning when UC is not found", () => {
39
+ // Spy on the warning submission method
40
+ const submitWarningSpy = jest.spyOn(appObjects, "submitWarning");
41
+ // Call the controller function with a non-existent ID
42
+ (0, editStateName_1.editStateName)(testName, "non-existent-id", appObjects);
43
+ // Verify warning was submitted
44
+ expect(submitWarningSpy).toHaveBeenCalledWith("editStateName", "Unable to find EditStateNameUC");
45
+ // Verify that the edit function was not called
46
+ expect(mockEditFunction).not.toHaveBeenCalled();
47
+ });
48
+ });
49
+ //# sourceMappingURL=editStateName.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editStateName.test.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/editStateName.test.ts"],"names":[],"mappings":";;AAAA,sCAA+D;AAC/D,sEAAkE;AAClE,mDAAgD;AAEhD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,IAAI,UAAyB,CAAC;IAC9B,IAAI,MAA2B,CAAC;IAChC,IAAI,gBAA2B,CAAC;IAChC,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAElC,UAAU,CAAC,GAAG,EAAE;QACf,0CAA0C;QAC1C,UAAU,GAAG,IAAA,wBAAiB,GAAE,CAAC;QACjC,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAErD,qBAAqB;QACrB,MAAM,GAAG,IAAI,yCAAmB,CAAC,aAAa,CAAC,CAAC;QAEhD,qCAAqC;QACrC,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,CAAC,aAAa,GAAG,gBAAgB,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,+BAA+B;QAC/B,IAAA,6BAAa,EAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAE5C,uDAAuD;QACvD,MAAM,CAAC,gBAAgB,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,2CAA2C;QAC3C,MAAM,aAAa,GAAG,iBAAiB,CAAC;QAExC,iCAAiC;QACjC,MAAM,CAAC,GAAG,EAAE;YACX,IAAA,6BAAa,EAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAEjB,yCAAyC;QACzC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,uCAAuC;QACvC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAEjE,sDAAsD;QACtD,IAAA,6BAAa,EAAC,QAAQ,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;QAEvD,+BAA+B;QAC/B,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAC5C,eAAe,EACf,gCAAgC,CAChC,CAAC;QAEF,+CAA+C;QAC/C,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport {MockEditStateNameUC } from \"../Mocks/MockEditStateNameUC\";\r\nimport { editStateName } from \"./editStateName\";\r\n\r\ndescribe(\"editStateName\", () => {\r\n\tlet appObjects: AppObjectRepo;\r\n\tlet mockUC: MockEditStateNameUC;\r\n\tlet mockEditFunction: jest.Mock;\r\n\tconst testId = \"test-state-id\";\r\n\tconst testName = \"New State Name\";\r\n\r\n\tbeforeEach(() => {\r\n\t\t// Create a fresh repository for each test\r\n\t\tappObjects = makeAppObjectRepo();\r\n\t\tconst testAppObject = appObjects.getOrCreate(testId);\r\n\r\n\t\t// Create the mock UC\r\n\t\tmockUC = new MockEditStateNameUC(testAppObject);\r\n\t\t\r\n\t\t// Setup the spy on the mock function\r\n\t\tmockEditFunction = jest.fn();\r\n\t\tmockUC.editStateName = mockEditFunction;\r\n\t});\r\n\r\n\tit(\"should call EditStateNameUC with the provided name\", () => {\r\n\t\t// Call the controller function\r\n\t\teditStateName(testName, testId, appObjects);\r\n\r\n\t\t// Verify the use case was called with the correct name\r\n\t\texpect(mockEditFunction).toBeCalledWith(testName);\r\n\t});\r\n\r\n\tit(\"should do nothing when UC cannot be found\", () => {\r\n\t\t// Call with an ID that doesn't have the UC\r\n\t\tconst nonExistentId = \"non-existent-id\";\r\n\r\n\t\t// This should not throw an error\r\n\t\texpect(() => {\r\n\t\t\teditStateName(testName, nonExistentId, appObjects);\r\n\t\t}).not.toThrow();\r\n\r\n\t\t// Verify our original mock wasn't called\r\n\t\texpect(mockEditFunction).not.toHaveBeenCalled();\r\n\t});\r\n\r\n\tit(\"should submit a warning when UC is not found\", () => {\r\n\t\t// Spy on the warning submission method\r\n\t\tconst submitWarningSpy = jest.spyOn(appObjects, \"submitWarning\");\r\n\r\n\t\t// Call the controller function with a non-existent ID\r\n\t\teditStateName(testName, \"non-existent-id\", appObjects);\r\n\r\n\t\t// Verify warning was submitted\r\n\t\texpect(submitWarningSpy).toHaveBeenCalledWith(\r\n\t\t\t\"editStateName\",\r\n\t\t\t\"Unable to find EditStateNameUC\"\r\n\t\t);\r\n\r\n\t\t// Verify that the edit function was not called\r\n\t\texpect(mockEditFunction).not.toHaveBeenCalled();\r\n\t});\r\n});\r\n"]}
@@ -20,6 +20,7 @@ __exportStar(require("./deleteState"), exports);
20
20
  __exportStar(require("./duplicateState"), exports);
21
21
  __exportStar(require("./editActiveState"), exports);
22
22
  __exportStar(require("./editState"), exports);
23
+ __exportStar(require("./editStateName"), exports);
23
24
  __exportStar(require("./endActivity"), exports);
24
25
  __exportStar(require("./newState"), exports);
25
26
  __exportStar(require("./saveAuthoring"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,gDAA8B;AAC9B,mDAAiC;AACjC,oDAAkC;AAClC,8CAA4B;AAC5B,gDAA8B;AAC9B,6CAA2B;AAC3B,kDAAgC;AAChC,sDAAoC;AACpC,yDAAuC","sourcesContent":["export * from \"./cancelEditing\";\r\nexport * from \"./consumeState\";\r\nexport * from \"./deleteState\";\r\nexport * from \"./duplicateState\";\r\nexport * from \"./editActiveState\";\r\nexport * from \"./editState\";\r\nexport * from \"./endActivity\";\r\nexport * from \"./newState\";\r\nexport * from \"./saveAuthoring\";\r\nexport * from \"./transitionToState\";\r\nexport * from \"./savePersistentStates\";\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/StateMachine/Controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,iDAA+B;AAC/B,gDAA8B;AAC9B,mDAAiC;AACjC,oDAAkC;AAClC,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,6CAA2B;AAC3B,kDAAgC;AAChC,sDAAoC;AACpC,yDAAuC","sourcesContent":["export * from \"./cancelEditing\";\r\nexport * from \"./consumeState\";\r\nexport * from \"./deleteState\";\r\nexport * from \"./duplicateState\";\r\nexport * from \"./editActiveState\";\r\nexport * from \"./editState\";\r\nexport * from \"./editStateName\";\r\nexport * from \"./endActivity\";\r\nexport * from \"./newState\";\r\nexport * from \"./saveAuthoring\";\r\nexport * from \"./transitionToState\";\r\nexport * from \"./savePersistentStates\";\r\n"]}
@@ -19,14 +19,27 @@ class HostStateMachineImp extends HostStateMachine {
19
19
  get states() {
20
20
  return this._states.map((state) => state.id);
21
21
  }
22
+ get stateCount() {
23
+ return this._states.length;
24
+ }
22
25
  get activeState() {
23
26
  return this._activeState;
24
27
  }
25
28
  get previousState() {
26
- return this._previousState;
29
+ if (!this._activeState)
30
+ return undefined;
31
+ const currentIndex = this.getStateIndex(this._activeState);
32
+ if (currentIndex === undefined || currentIndex === 0)
33
+ return undefined;
34
+ return this._states[currentIndex - 1].id;
27
35
  }
28
36
  get nextState() {
29
- return this._nextState;
37
+ if (!this._activeState)
38
+ return undefined;
39
+ const currentIndex = this.getStateIndex(this._activeState);
40
+ if (currentIndex === undefined || currentIndex >= this._states.length - 1)
41
+ return undefined;
42
+ return this._states[currentIndex + 1].id;
30
43
  }
31
44
  get isAuthoring() {
32
45
  return this.memoizedIsAuthoring.val;
@@ -85,33 +98,17 @@ class HostStateMachineImp extends HostStateMachine {
85
98
  if (state.id === this._activeState)
86
99
  return;
87
100
  this._activeState = state.id;
88
- const index = this.getStateIndex(id);
89
- if (index === undefined) {
90
- this._nextState = undefined;
91
- this._previousState = undefined;
92
- return;
93
- }
94
- const prevIndex = index - 1;
95
- const nextIndex = index + 1;
96
- if (prevIndex >= 0) {
97
- this._previousState = this._states[prevIndex].id;
98
- }
99
- else {
100
- this._previousState = undefined;
101
- }
102
- if (nextIndex < this._states.length) {
103
- this._nextState = this._states[nextIndex].id;
104
- }
105
- else {
106
- this._nextState = undefined;
107
- }
108
101
  this.notifyOnChange();
109
102
  };
103
+ this.setActiveStateByIndex = (index) => {
104
+ if (index < 0 || index >= this._states.length)
105
+ return;
106
+ const state = this._states[index];
107
+ this.setActiveStateByID(state.id);
108
+ };
110
109
  this.clearActiveState = () => {
111
110
  if (!this.activeState)
112
111
  return;
113
- this._nextState = undefined;
114
- this._previousState = undefined;
115
112
  this._activeState = undefined;
116
113
  this.notifyOnChange();
117
114
  };
@@ -142,6 +139,17 @@ class HostStateMachineImp extends HostStateMachine {
142
139
  this._states.splice(index, 1);
143
140
  this.notifyOnChange();
144
141
  };
142
+ this.deleteAllStates = () => {
143
+ if (this._states.length === 0)
144
+ return;
145
+ // Dispose all state app objects
146
+ this._states.forEach((state) => {
147
+ state.appObject.dispose();
148
+ });
149
+ this._states = [];
150
+ this.clearActiveState();
151
+ this.notifyOnChange();
152
+ };
145
153
  this.getStateIndex = (id) => {
146
154
  let index = -1;
147
155
  this._states.forEach((state, i) => {
@@ -156,6 +164,41 @@ class HostStateMachineImp extends HostStateMachine {
156
164
  return undefined;
157
165
  }
158
166
  };
167
+ this.setPreviousStateActive = () => {
168
+ if (!this.previousState)
169
+ return;
170
+ this.setActiveStateByID(this.previousState);
171
+ };
172
+ this.setNextStateActive = () => {
173
+ if (!this.nextState)
174
+ return;
175
+ this.setActiveStateByID(this.nextState);
176
+ };
177
+ this.setStateIndex = (stateID, index) => {
178
+ // Check if the state exists
179
+ const state = this.getStateByID(stateID);
180
+ if (!state)
181
+ return;
182
+ // Check if the index is valid
183
+ if (index < 0 || index >= this._states.length)
184
+ return;
185
+ // Get the current index
186
+ const currentIndex = this.getStateIndex(stateID);
187
+ if (currentIndex === undefined)
188
+ return;
189
+ // If the index is the same, do nothing
190
+ if (currentIndex === index)
191
+ return;
192
+ // Remove the state from the current position
193
+ const stateToMove = this._states.splice(currentIndex, 1)[0];
194
+ // Insert it at the new position
195
+ this._states.splice(index, 0, stateToMove);
196
+ // If the moved state was active, update previous and next states
197
+ if (stateID === this._activeState) {
198
+ this.setActiveStateByID(stateID);
199
+ }
200
+ this.notifyOnChange();
201
+ };
159
202
  this.appObjects.registerSingleton(this);
160
203
  }
161
204
  }
@@ -1 +1 @@
1
- {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":";;;AAsCA,oDAEC;AAxCD,sCAAgE;AAChE,sCAKqB;AACrB,uDAAyE;AAEzE,MAAsB,gBAAiB,SAAQ,sBAAe;IAqB5D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAC1B,gBAAgB,CAAC,IAAI,EACrB,UAAU,CACX,CAAC;IACJ,CAAC;;AA1BH,4CA2BC;AA1BQ,qBAAI,GAAG,kBAAkB,CAAC;AA4BnC,SAAgB,oBAAoB,CAAC,SAAoB;IACvD,OAAO,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,mBAAoB,SAAQ,gBAAgB;IAKhD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC;IAGD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAGD,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAGD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAGD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,GAAY;QAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,GAAG,GAAG,CAAC;IACrC,CAAC;IAKD,IAAI,gBAAgB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,IAAI,gBAAgB,CAAC,GAAuB;QAC1C,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO;QAEtE,MAAM,YAAY,GAChB,IAAI,CAAC,gBAAgB,KAAK,SAAS;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,YAAY,KAAK,WAAW;YAAE,OAAO;QAEzC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAGD,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,UAAU,CAAC,UAAoB;QACjC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IA4GO,aAAa,CAAC,EAAU;QAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;gBACpB,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAlLlC,YAAO,GAAsB,EAAE,CAAC;QAExC,uBAAkB,GAAG,CAAC,CAAC;QAqBf,wBAAmB,GAAG,IAAI,sBAAe,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QA6BtE,gBAAW,GAAa,EAAE,CAAC;QAWnC,aAAQ,GAAG,CAAC,EAAU,EAAW,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QAEF,uBAAkB,GAAG,CAAC,EAAU,EAAQ,EAAE;YACxC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEnB,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY;gBAAE,OAAO;YAC3C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC;YAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC5B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;YAC5B,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;YAE5B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAClC,CAAC;YAED,IAAI,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC9B,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,qBAAgB,GAAG,GAAS,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAE9B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,cAAS,GAAG,CAAC,MAAyB,EAAQ,EAAE;YAC9C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,EAAU,EAAmB,EAAE;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC3C,OAAO,IAAA,qCAAmB,EAAC,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC;QAEF,mBAAc,GAAG,GAAoB,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAA,uBAAgB,GAAE,CAAC,CAAC;YAEvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC;QAEF,iBAAY,GAAG,CAAC,EAAU,EAA+B,EAAE;YACzD,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,gBAAW,GAAG,CAAC,EAAU,EAAQ,EAAE;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAErC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;YAE3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,CAAC;QAEF,kBAAa,GAAG,CAAC,EAAU,EAAsB,EAAE;YACjD,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;YAEf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;gBAChC,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;oBACpB,KAAK,GAAG,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QAeA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n private _previousState: string | undefined;\r\n get previousState() {\r\n return this._previousState;\r\n }\r\n\r\n private _nextState: string | undefined;\r\n get nextState() {\r\n return this._nextState;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n return;\r\n }\r\n\r\n const prevIndex = index - 1;\r\n const nextIndex = index + 1;\r\n\r\n if (prevIndex >= 0) {\r\n this._previousState = this._states[prevIndex].id;\r\n } else {\r\n this._previousState = undefined;\r\n }\r\n\r\n if (nextIndex < this._states.length) {\r\n this._nextState = this._states[nextIndex].id;\r\n } else {\r\n this._nextState = undefined;\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._nextState = undefined;\r\n this._previousState = undefined;\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"HostStateMachine.js","sourceRoot":"","sources":["../../../../src/StateMachine/Entities/HostStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateUniqueID, MemoizedBoolean } from \"@vived/core\";\r\nimport {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\nimport { HostStateEntity, makeHostStateEntity } from \"./HostStateEntity\";\r\n\r\nexport abstract class HostStateMachine extends AppObjectEntity {\r\n static type = \"HostStateMachine\";\r\n\r\n abstract states: string[];\r\n abstract stateCount: number;\r\n\r\n abstract activeState: string | undefined;\r\n abstract previousState: string | undefined;\r\n abstract nextState: string | undefined;\r\n\r\n abstract transitionDuration: number;\r\n\r\n abstract setActiveStateByID: (id: string) => void;\r\n abstract setActiveStateByIndex: (index: number) => void;\r\n abstract clearActiveState: () => void;\r\n abstract setStates: (states: HostStateEntity[]) => void;\r\n abstract createNewState: () => HostStateEntity;\r\n abstract getStateByID: (id: string) => HostStateEntity | undefined;\r\n abstract deleteState: (id: string) => void;\r\n abstract deleteAllStates: () => void;\r\n abstract getStateIndex: (id: string) => number | undefined;\r\n abstract hasState: (id: string) => boolean;\r\n abstract stateFactory: (id: string) => HostStateEntity;\r\n abstract setPreviousStateActive: () => void;\r\n abstract setNextStateActive: () => void;\r\n abstract setStateIndex: (stateID: string, index: number) => void;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HostStateMachine>(\r\n HostStateMachine.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHostStateMachine(appObject: AppObject): HostStateMachine {\r\n return new HostStateMachineImp(appObject);\r\n}\r\n\r\nclass HostStateMachineImp extends HostStateMachine {\r\n private _states: HostStateEntity[] = [];\r\n\r\n transitionDuration = 1;\r\n\r\n get states() {\r\n return this._states.map((state) => state.id);\r\n }\r\n\r\n get stateCount(): number {\r\n return this._states.length;\r\n }\r\n\r\n private _activeState: string | undefined;\r\n get activeState() {\r\n return this._activeState;\r\n }\r\n\r\n get previousState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex === 0) return undefined;\r\n \r\n return this._states[currentIndex - 1].id;\r\n }\r\n\r\n get nextState(): string | undefined {\r\n if (!this._activeState) return undefined;\r\n \r\n const currentIndex = this.getStateIndex(this._activeState);\r\n if (currentIndex === undefined || currentIndex >= this._states.length - 1) return undefined;\r\n \r\n return this._states[currentIndex + 1].id;\r\n }\r\n\r\n private memoizedIsAuthoring = new MemoizedBoolean(false, this.notifyOnChange);\r\n get isAuthoring() {\r\n return this.memoizedIsAuthoring.val;\r\n }\r\n set isAuthoring(val: boolean) {\r\n this.memoizedIsAuthoring.val = val;\r\n }\r\n\r\n public initialEditingState?: string;\r\n\r\n private _lastEditingState: object | undefined;\r\n get lastEditingState(): object | undefined {\r\n return this._lastEditingState;\r\n }\r\n set lastEditingState(val: object | undefined) {\r\n if (this._lastEditingState === undefined && val === undefined) return;\r\n\r\n const lastStateStr =\r\n this.lastEditingState === undefined\r\n ? \"\"\r\n : JSON.stringify(this.lastEditingState);\r\n const valStateStr = val === undefined ? \"\" : JSON.stringify(val);\r\n\r\n if (lastStateStr === valStateStr) return;\r\n\r\n this._lastEditingState = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _lastAssets: string[] = [];\r\n get lastAssets(): string[] {\r\n return this._lastAssets;\r\n }\r\n\r\n set lastAssets(lastAssets: string[]) {\r\n this._lastAssets = lastAssets;\r\n }\r\n\r\n public validationErrorMessage?: string;\r\n\r\n hasState = (id: string): boolean => {\r\n const state = this.findStateByID(id);\r\n if (state) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n setActiveStateByID = (id: string): void => {\r\n const state = this.findStateByID(id);\r\n\r\n if (!state) return;\r\n\r\n if (state.id === this._activeState) return;\r\n this._activeState = state.id;\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n setActiveStateByIndex = (index: number): void => {\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n const state = this._states[index];\r\n this.setActiveStateByID(state.id);\r\n };\r\n\r\n clearActiveState = (): void => {\r\n if (!this.activeState) return;\r\n\r\n this._activeState = undefined;\r\n this.notifyOnChange();\r\n };\r\n\r\n setStates = (states: HostStateEntity[]): void => {\r\n this._states = states;\r\n this.notifyOnChange();\r\n };\r\n\r\n stateFactory = (id: string): HostStateEntity => {\r\n const ao = this.appObjects.getOrCreate(id);\r\n return makeHostStateEntity(ao);\r\n };\r\n\r\n createNewState = (): HostStateEntity => {\r\n const newState = this.stateFactory(generateUniqueID());\r\n\r\n this._states.push(newState);\r\n this.notifyOnChange();\r\n return newState;\r\n };\r\n\r\n getStateByID = (id: string): HostStateEntity | undefined => {\r\n return this.findStateByID(id);\r\n };\r\n\r\n deleteState = (id: string): void => {\r\n const index = this.getStateIndex(id);\r\n\r\n if (index === undefined) {\r\n return;\r\n }\r\n\r\n const state = this.getStateByID(id);\r\n state?.appObject.dispose();\r\n\r\n this._states.splice(index, 1);\r\n this.notifyOnChange();\r\n };\r\n\r\n deleteAllStates = (): void => {\r\n if (this._states.length === 0) return;\r\n\r\n // Dispose all state app objects\r\n this._states.forEach((state) => {\r\n state.appObject.dispose();\r\n });\r\n\r\n this._states = [];\r\n this.clearActiveState();\r\n this.notifyOnChange();\r\n };\r\n\r\n getStateIndex = (id: string): number | undefined => {\r\n let index = -1;\r\n\r\n this._states.forEach((state, i) => {\r\n if (state.id === id) {\r\n index = i;\r\n }\r\n });\r\n\r\n if (index >= 0) {\r\n return index;\r\n } else {\r\n return undefined;\r\n }\r\n };\r\n\r\n private findStateByID(id: string): HostStateEntity | undefined {\r\n for (const state of this._states) {\r\n if (state.id === id) {\r\n return state;\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n setPreviousStateActive = (): void => {\r\n if (!this.previousState) return;\r\n\r\n this.setActiveStateByID(this.previousState);\r\n };\r\n\r\n setNextStateActive = (): void => {\r\n if (!this.nextState) return;\r\n\r\n this.setActiveStateByID(this.nextState);\r\n };\r\n\r\n setStateIndex = (stateID: string, index: number): void => {\r\n // Check if the state exists\r\n const state = this.getStateByID(stateID);\r\n if (!state) return;\r\n\r\n // Check if the index is valid\r\n if (index < 0 || index >= this._states.length) return;\r\n\r\n // Get the current index\r\n const currentIndex = this.getStateIndex(stateID);\r\n if (currentIndex === undefined) return;\r\n\r\n // If the index is the same, do nothing\r\n if (currentIndex === index) return;\r\n\r\n // Remove the state from the current position\r\n const stateToMove = this._states.splice(currentIndex, 1)[0];\r\n\r\n // Insert it at the new position\r\n this._states.splice(index, 0, stateToMove);\r\n\r\n // If the moved state was active, update previous and next states\r\n if (stateID === this._activeState) {\r\n this.setActiveStateByID(stateID);\r\n }\r\n\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HostStateMachine.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -130,5 +130,179 @@ describe("State Machine", () => {
130
130
  expect(stateMachine.hasState("state1")).toEqual(true);
131
131
  expect(stateMachine.hasState("somethingElse")).toEqual(false);
132
132
  });
133
+ it("Reports correct state count", () => {
134
+ const { stateMachine } = makeTestRig();
135
+ // Initial state has 2 states
136
+ expect(stateMachine.stateCount).toEqual(2);
137
+ // After adding a state
138
+ stateMachine.createNewState();
139
+ expect(stateMachine.stateCount).toEqual(3);
140
+ // After deleting a state
141
+ stateMachine.deleteState("state1");
142
+ expect(stateMachine.stateCount).toEqual(2);
143
+ });
144
+ it("Sets active state by index", () => {
145
+ const { stateMachine, observer } = makeTestRig();
146
+ observer.mockClear();
147
+ stateMachine.setActiveStateByIndex(1);
148
+ expect(stateMachine.activeState).toEqual("state2");
149
+ expect(observer).toBeCalled();
150
+ });
151
+ it("Does nothing if index is out of bounds", () => {
152
+ const { stateMachine, observer } = makeTestRig();
153
+ observer.mockClear();
154
+ // With negative index
155
+ stateMachine.setActiveStateByIndex(-1);
156
+ expect(stateMachine.activeState).toBeUndefined();
157
+ expect(observer).not.toBeCalled();
158
+ // With too large index
159
+ stateMachine.setActiveStateByIndex(5);
160
+ expect(stateMachine.activeState).toBeUndefined();
161
+ expect(observer).not.toBeCalled();
162
+ });
163
+ it("Sets previous and next state correctly when using setActiveStateByIndex", () => {
164
+ const { stateMachine } = makeTestRig();
165
+ stateMachine.createNewState(); // Now 3 states
166
+ stateMachine.setActiveStateByIndex(1);
167
+ expect(stateMachine.activeState).toEqual("state2");
168
+ expect(stateMachine.previousState).toEqual("state1");
169
+ expect(stateMachine.nextState).not.toBeUndefined();
170
+ });
171
+ it("Deletes all states", () => {
172
+ const { stateMachine, observer } = makeTestRig();
173
+ observer.mockClear();
174
+ stateMachine.deleteAllStates();
175
+ expect(stateMachine.states).toHaveLength(0);
176
+ expect(stateMachine.stateCount).toEqual(0);
177
+ expect(observer).toBeCalled();
178
+ });
179
+ it("Does not notify if there are no states to delete", () => {
180
+ const { stateMachine, observer } = makeTestRig();
181
+ stateMachine.deleteAllStates(); // Clear all states first
182
+ observer.mockClear();
183
+ stateMachine.deleteAllStates(); // Try again with empty states
184
+ expect(observer).not.toBeCalled();
185
+ });
186
+ it("Disposes all state app objects when deleting all states", () => {
187
+ const { stateMachine } = makeTestRig();
188
+ // Create mock dispose functions for each state
189
+ const state1 = stateMachine.getStateByID("state1");
190
+ const state2 = stateMachine.getStateByID("state2");
191
+ expect(state1).not.toBeUndefined();
192
+ expect(state2).not.toBeUndefined();
193
+ state1.appObject.dispose = jest.fn();
194
+ state2.appObject.dispose = jest.fn();
195
+ stateMachine.deleteAllStates();
196
+ expect(state1.appObject.dispose).toBeCalled();
197
+ expect(state2.appObject.dispose).toBeCalled();
198
+ });
199
+ it("Clears active state when deleting all states", () => {
200
+ const { stateMachine } = makeTestRig();
201
+ stateMachine.setActiveStateByID("state1");
202
+ expect(stateMachine.activeState).toEqual("state1");
203
+ stateMachine.deleteAllStates();
204
+ expect(stateMachine.activeState).toBeUndefined();
205
+ expect(stateMachine.previousState).toBeUndefined();
206
+ expect(stateMachine.nextState).toBeUndefined();
207
+ });
208
+ it("Sets previous state active", () => {
209
+ const { stateMachine, observer } = makeTestRig();
210
+ // Set state2 as active so state1 becomes the previous state
211
+ stateMachine.setActiveStateByID("state2");
212
+ observer.mockClear();
213
+ // Now call setPreviousStateActive
214
+ stateMachine.setPreviousStateActive();
215
+ expect(stateMachine.activeState).toEqual("state1");
216
+ expect(observer).toBeCalled();
217
+ });
218
+ it("Does nothing when setting previous state active if there is no previous state", () => {
219
+ const { stateMachine, observer } = makeTestRig();
220
+ // Set state1 as active (which has no previous state)
221
+ stateMachine.setActiveStateByID("state1");
222
+ observer.mockClear();
223
+ // Now call setPreviousStateActive
224
+ stateMachine.setPreviousStateActive();
225
+ // Should remain on state1
226
+ expect(stateMachine.activeState).toEqual("state1");
227
+ expect(observer).not.toHaveBeenCalled();
228
+ });
229
+ it("Sets next state active", () => {
230
+ const { stateMachine, observer } = makeTestRig();
231
+ // Set state1 as active so state2 becomes the next state
232
+ stateMachine.setActiveStateByID("state1");
233
+ observer.mockClear();
234
+ // Now call setNextStateActive
235
+ stateMachine.setNextStateActive();
236
+ expect(stateMachine.activeState).toEqual("state2");
237
+ expect(observer).toHaveBeenCalled();
238
+ });
239
+ it("Does nothing when setting next state active if there is no next state", () => {
240
+ const { stateMachine, observer } = makeTestRig();
241
+ // Set state2 as active (which has no next state)
242
+ stateMachine.setActiveStateByID("state2");
243
+ observer.mockClear();
244
+ // Now call setNextStateActive
245
+ stateMachine.setNextStateActive();
246
+ // Should remain on state2
247
+ expect(stateMachine.activeState).toEqual("state2");
248
+ expect(observer).not.toHaveBeenCalled();
249
+ });
250
+ it("Sets state index", () => {
251
+ const { stateMachine, observer } = makeTestRig();
252
+ observer.mockClear();
253
+ // Save the initial states order
254
+ const initialStates = [...stateMachine.states];
255
+ // Move state2 to index 0 (before state1)
256
+ stateMachine.setStateIndex("state2", 0);
257
+ // Check that the order changed correctly
258
+ expect(stateMachine.states[0]).toEqual("state2");
259
+ expect(stateMachine.states[1]).toEqual("state1");
260
+ expect(observer).toHaveBeenCalled();
261
+ });
262
+ it("Does nothing if state ID doesn't exist when setting state index", () => {
263
+ const { stateMachine, observer } = makeTestRig();
264
+ observer.mockClear();
265
+ // Save the initial states order
266
+ const initialStates = [...stateMachine.states];
267
+ // Try to move a non-existent state
268
+ stateMachine.setStateIndex("nonExistentState", 0);
269
+ // Check that states remain unchanged
270
+ expect(stateMachine.states).toEqual(initialStates);
271
+ expect(observer).not.toHaveBeenCalled();
272
+ });
273
+ it("Does nothing if index is out of bounds when setting state index", () => {
274
+ const { stateMachine, observer } = makeTestRig();
275
+ observer.mockClear();
276
+ // Save the initial states order
277
+ const initialStates = [...stateMachine.states];
278
+ // Try to move to an invalid index (negative)
279
+ stateMachine.setStateIndex("state1", -1);
280
+ expect(stateMachine.states).toEqual(initialStates);
281
+ expect(observer).not.toHaveBeenCalled();
282
+ // Try to move to an invalid index (too large)
283
+ stateMachine.setStateIndex("state1", 10);
284
+ expect(stateMachine.states).toEqual(initialStates);
285
+ expect(observer).not.toHaveBeenCalled();
286
+ });
287
+ it("Does nothing if moving state to its current index", () => {
288
+ const { stateMachine, observer } = makeTestRig();
289
+ observer.mockClear();
290
+ // Try to move state1 to index 0 (its current position)
291
+ stateMachine.setStateIndex("state1", 0);
292
+ // Verify no notification happened
293
+ expect(observer).not.toHaveBeenCalled();
294
+ });
295
+ it("Updates active state relationships when moving the active state", () => {
296
+ const { stateMachine } = makeTestRig();
297
+ // Set state1 as active
298
+ stateMachine.setActiveStateByID("state1");
299
+ expect(stateMachine.nextState).toEqual("state2");
300
+ // Move state1 after state2
301
+ stateMachine.setStateIndex("state1", 1);
302
+ // Check that relationships updated correctly
303
+ expect(stateMachine.activeState).toEqual("state1");
304
+ expect(stateMachine.previousState).toEqual("state2");
305
+ expect(stateMachine.nextState).toBeUndefined();
306
+ });
133
307
  });
134
308
  //# sourceMappingURL=HostStateMachine.test.js.map