deep-equals.test.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import { describe, expect, it } from "vitest";
  2. import { deepEquals } from "@/app/[locale]/settings/providers/_components/batch-edit/deep-equals";
  3. describe("deepEquals", () => {
  4. describe("基本类型", () => {
  5. it("应该正确比较相同的基本类型", () => {
  6. expect(deepEquals(1, 1)).toBe(true);
  7. expect(deepEquals("test", "test")).toBe(true);
  8. expect(deepEquals(true, true)).toBe(true);
  9. expect(deepEquals(null, null)).toBe(true);
  10. expect(deepEquals(undefined, undefined)).toBe(true);
  11. });
  12. it("应该正确比较不同的基本类型", () => {
  13. expect(deepEquals(1, 2)).toBe(false);
  14. expect(deepEquals("test", "other")).toBe(false);
  15. expect(deepEquals(true, false)).toBe(false);
  16. expect(deepEquals(null, undefined)).toBe(false);
  17. });
  18. it("应该正确处理 NaN", () => {
  19. expect(deepEquals(Number.NaN, Number.NaN)).toBe(true);
  20. });
  21. it("应该正确处理 +0 和 -0", () => {
  22. expect(deepEquals(0, -0)).toBe(false);
  23. expect(deepEquals(+0, -0)).toBe(false);
  24. });
  25. });
  26. describe("数组", () => {
  27. it("应该正确比较相同的数组", () => {
  28. expect(deepEquals([1, 2, 3], [1, 2, 3])).toBe(true);
  29. expect(deepEquals(["a", "b"], ["a", "b"])).toBe(true);
  30. expect(deepEquals([], [])).toBe(true);
  31. });
  32. it("应该正确比较不同的数组", () => {
  33. expect(deepEquals([1, 2, 3], [1, 2, 4])).toBe(false);
  34. expect(deepEquals([1, 2], [1, 2, 3])).toBe(false);
  35. expect(deepEquals(["a"], ["b"])).toBe(false);
  36. });
  37. it("应该正确比较嵌套数组", () => {
  38. expect(
  39. deepEquals(
  40. [
  41. [1, 2],
  42. [3, 4],
  43. ],
  44. [
  45. [1, 2],
  46. [3, 4],
  47. ]
  48. )
  49. ).toBe(true);
  50. expect(
  51. deepEquals(
  52. [
  53. [1, 2],
  54. [3, 4],
  55. ],
  56. [
  57. [1, 2],
  58. [3, 5],
  59. ]
  60. )
  61. ).toBe(false);
  62. });
  63. });
  64. describe("对象", () => {
  65. it("应该正确比较相同的对象", () => {
  66. expect(deepEquals({ a: 1, b: 2 }, { a: 1, b: 2 })).toBe(true);
  67. expect(deepEquals({ a: 1, b: 2 }, { b: 2, a: 1 })).toBe(true); // 键顺序不同
  68. expect(deepEquals({}, {})).toBe(true);
  69. });
  70. it("应该正确比较不同的对象", () => {
  71. expect(deepEquals({ a: 1, b: 2 }, { a: 1, b: 3 })).toBe(false);
  72. expect(deepEquals({ a: 1 }, { a: 1, b: 2 })).toBe(false);
  73. expect(deepEquals({ a: 1 }, { b: 1 })).toBe(false);
  74. });
  75. it("应该正确比较嵌套对象", () => {
  76. expect(deepEquals({ a: { b: 1 } }, { a: { b: 1 } })).toBe(true);
  77. expect(deepEquals({ a: { b: 1 } }, { a: { b: 2 } })).toBe(false);
  78. });
  79. it("应该正确比较包含数组的对象", () => {
  80. expect(deepEquals({ a: [1, 2] }, { a: [1, 2] })).toBe(true);
  81. expect(deepEquals({ a: [1, 2] }, { a: [1, 3] })).toBe(false);
  82. });
  83. });
  84. describe("混合类型", () => {
  85. it("应该正确比较不同类型", () => {
  86. expect(deepEquals(1, "1")).toBe(false);
  87. expect(deepEquals([], {})).toBe(false);
  88. expect(deepEquals(null, {})).toBe(false);
  89. expect(deepEquals(undefined, null)).toBe(false);
  90. });
  91. it("应该正确比较复杂嵌套结构", () => {
  92. const obj1 = {
  93. a: 1,
  94. b: [2, 3, { c: 4 }],
  95. d: { e: [5, 6], f: { g: 7 } },
  96. };
  97. const obj2 = {
  98. a: 1,
  99. b: [2, 3, { c: 4 }],
  100. d: { e: [5, 6], f: { g: 7 } },
  101. };
  102. const obj3 = {
  103. a: 1,
  104. b: [2, 3, { c: 4 }],
  105. d: { e: [5, 6], f: { g: 8 } }, // 不同
  106. };
  107. expect(deepEquals(obj1, obj2)).toBe(true);
  108. expect(deepEquals(obj1, obj3)).toBe(false);
  109. });
  110. });
  111. });