delta.test.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import type { ObservedAppState } from "@excalidraw/excalidraw/types";
  2. import type { LinearElementEditor } from "@excalidraw/element";
  3. import { AppStateDelta } from "../src/delta";
  4. describe("AppStateDelta", () => {
  5. describe("ensure stable delta properties order", () => {
  6. it("should maintain stable order for root properties", () => {
  7. const name = "untitled scene";
  8. const selectedLinearElementId = "id1" as LinearElementEditor["elementId"];
  9. const commonAppState = {
  10. viewBackgroundColor: "#ffffff",
  11. selectedElementIds: {},
  12. selectedGroupIds: {},
  13. editingGroupId: null,
  14. croppingElementId: null,
  15. editingLinearElementId: null,
  16. lockedMultiSelections: {},
  17. activeLockedId: null,
  18. };
  19. const prevAppState1: ObservedAppState = {
  20. ...commonAppState,
  21. name: "",
  22. selectedLinearElementId: null,
  23. };
  24. const nextAppState1: ObservedAppState = {
  25. ...commonAppState,
  26. name,
  27. selectedLinearElementId,
  28. };
  29. const prevAppState2: ObservedAppState = {
  30. selectedLinearElementId: null,
  31. name: "",
  32. ...commonAppState,
  33. };
  34. const nextAppState2: ObservedAppState = {
  35. selectedLinearElementId,
  36. name,
  37. ...commonAppState,
  38. };
  39. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  40. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  41. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  42. });
  43. it("should maintain stable order for selectedElementIds", () => {
  44. const commonAppState = {
  45. name: "",
  46. viewBackgroundColor: "#ffffff",
  47. selectedGroupIds: {},
  48. editingGroupId: null,
  49. croppingElementId: null,
  50. selectedLinearElementId: null,
  51. editingLinearElementId: null,
  52. activeLockedId: null,
  53. lockedMultiSelections: {},
  54. };
  55. const prevAppState1: ObservedAppState = {
  56. ...commonAppState,
  57. selectedElementIds: { id5: true, id2: true, id4: true },
  58. };
  59. const nextAppState1: ObservedAppState = {
  60. ...commonAppState,
  61. selectedElementIds: {
  62. id1: true,
  63. id2: true,
  64. id3: true,
  65. },
  66. };
  67. const prevAppState2: ObservedAppState = {
  68. ...commonAppState,
  69. selectedElementIds: { id4: true, id2: true, id5: true },
  70. };
  71. const nextAppState2: ObservedAppState = {
  72. ...commonAppState,
  73. selectedElementIds: {
  74. id3: true,
  75. id2: true,
  76. id1: true,
  77. },
  78. };
  79. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  80. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  81. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  82. });
  83. it("should maintain stable order for selectedGroupIds", () => {
  84. const commonAppState = {
  85. name: "",
  86. viewBackgroundColor: "#ffffff",
  87. selectedElementIds: {},
  88. editingGroupId: null,
  89. croppingElementId: null,
  90. selectedLinearElementId: null,
  91. editingLinearElementId: null,
  92. activeLockedId: null,
  93. lockedMultiSelections: {},
  94. };
  95. const prevAppState1: ObservedAppState = {
  96. ...commonAppState,
  97. selectedGroupIds: { id5: false, id2: true, id4: true, id0: true },
  98. };
  99. const nextAppState1: ObservedAppState = {
  100. ...commonAppState,
  101. selectedGroupIds: {
  102. id0: true,
  103. id1: true,
  104. id2: false,
  105. id3: true,
  106. },
  107. };
  108. const prevAppState2: ObservedAppState = {
  109. ...commonAppState,
  110. selectedGroupIds: { id0: true, id4: true, id2: true, id5: false },
  111. };
  112. const nextAppState2: ObservedAppState = {
  113. ...commonAppState,
  114. selectedGroupIds: {
  115. id3: true,
  116. id2: false,
  117. id1: true,
  118. id0: true,
  119. },
  120. };
  121. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  122. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  123. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  124. });
  125. });
  126. });