delta.test.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. selectedLinearElementIsEditing: null,
  17. lockedMultiSelections: {},
  18. activeLockedId: null,
  19. };
  20. const prevAppState1: ObservedAppState = {
  21. ...commonAppState,
  22. name: "",
  23. selectedLinearElementId: null,
  24. };
  25. const nextAppState1: ObservedAppState = {
  26. ...commonAppState,
  27. name,
  28. selectedLinearElementId,
  29. };
  30. const prevAppState2: ObservedAppState = {
  31. selectedLinearElementId: null,
  32. name: "",
  33. ...commonAppState,
  34. };
  35. const nextAppState2: ObservedAppState = {
  36. selectedLinearElementId,
  37. name,
  38. ...commonAppState,
  39. };
  40. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  41. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  42. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  43. });
  44. it("should maintain stable order for selectedElementIds", () => {
  45. const commonAppState = {
  46. name: "",
  47. viewBackgroundColor: "#ffffff",
  48. selectedGroupIds: {},
  49. editingGroupId: null,
  50. croppingElementId: null,
  51. selectedLinearElementId: null,
  52. selectedLinearElementIsEditing: null,
  53. editingLinearElementId: null,
  54. activeLockedId: null,
  55. lockedMultiSelections: {},
  56. };
  57. const prevAppState1: ObservedAppState = {
  58. ...commonAppState,
  59. selectedElementIds: { id5: true, id2: true, id4: true },
  60. };
  61. const nextAppState1: ObservedAppState = {
  62. ...commonAppState,
  63. selectedElementIds: {
  64. id1: true,
  65. id2: true,
  66. id3: true,
  67. },
  68. };
  69. const prevAppState2: ObservedAppState = {
  70. ...commonAppState,
  71. selectedElementIds: { id4: true, id2: true, id5: true },
  72. };
  73. const nextAppState2: ObservedAppState = {
  74. ...commonAppState,
  75. selectedElementIds: {
  76. id3: true,
  77. id2: true,
  78. id1: true,
  79. },
  80. };
  81. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  82. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  83. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  84. });
  85. it("should maintain stable order for selectedGroupIds", () => {
  86. const commonAppState = {
  87. name: "",
  88. viewBackgroundColor: "#ffffff",
  89. selectedElementIds: {},
  90. editingGroupId: null,
  91. croppingElementId: null,
  92. selectedLinearElementId: null,
  93. selectedLinearElementIsEditing: null,
  94. editingLinearElementId: null,
  95. activeLockedId: null,
  96. lockedMultiSelections: {},
  97. };
  98. const prevAppState1: ObservedAppState = {
  99. ...commonAppState,
  100. selectedGroupIds: { id5: false, id2: true, id4: true, id0: true },
  101. };
  102. const nextAppState1: ObservedAppState = {
  103. ...commonAppState,
  104. selectedGroupIds: {
  105. id0: true,
  106. id1: true,
  107. id2: false,
  108. id3: true,
  109. },
  110. };
  111. const prevAppState2: ObservedAppState = {
  112. ...commonAppState,
  113. selectedGroupIds: { id0: true, id4: true, id2: true, id5: false },
  114. };
  115. const nextAppState2: ObservedAppState = {
  116. ...commonAppState,
  117. selectedGroupIds: {
  118. id3: true,
  119. id2: false,
  120. id1: true,
  121. id0: true,
  122. },
  123. };
  124. const delta1 = AppStateDelta.calculate(prevAppState1, nextAppState1);
  125. const delta2 = AppStateDelta.calculate(prevAppState2, nextAppState2);
  126. expect(JSON.stringify(delta1)).toBe(JSON.stringify(delta2));
  127. });
  128. });
  129. });