WeakSet.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { vi } from 'vitest'
  2. import { reactive, isReactive, effect, toRaw } from '../../src'
  3. describe('reactivity/collections', () => {
  4. describe('WeakSet', () => {
  5. it('instanceof', () => {
  6. const original = new WeakSet()
  7. const observed = reactive(original)
  8. expect(isReactive(observed)).toBe(true)
  9. expect(original instanceof WeakSet).toBe(true)
  10. expect(observed instanceof WeakSet).toBe(true)
  11. })
  12. it('should observe mutations', () => {
  13. let dummy
  14. const value = {}
  15. const set = reactive(new WeakSet())
  16. effect(() => (dummy = set.has(value)))
  17. expect(dummy).toBe(false)
  18. set.add(value)
  19. expect(dummy).toBe(true)
  20. set.delete(value)
  21. expect(dummy).toBe(false)
  22. })
  23. it('should observe mutations with observed value', () => {
  24. let dummy
  25. const value = reactive({})
  26. const set = reactive(new WeakSet())
  27. effect(() => (dummy = set.has(value)))
  28. expect(dummy).toBe(false)
  29. set.add(value)
  30. expect(dummy).toBe(true)
  31. set.delete(value)
  32. expect(dummy).toBe(false)
  33. })
  34. it('should not observe custom property mutations', () => {
  35. let dummy
  36. const set: any = reactive(new WeakSet())
  37. effect(() => (dummy = set.customProp))
  38. expect(dummy).toBe(undefined)
  39. set.customProp = 'Hello World'
  40. expect(dummy).toBe(undefined)
  41. })
  42. it('should not observe non value changing mutations', () => {
  43. let dummy
  44. const value = {}
  45. const set = reactive(new WeakSet())
  46. const setSpy = vi.fn(() => (dummy = set.has(value)))
  47. effect(setSpy)
  48. expect(dummy).toBe(false)
  49. expect(setSpy).toHaveBeenCalledTimes(1)
  50. set.add(value)
  51. expect(dummy).toBe(true)
  52. expect(setSpy).toHaveBeenCalledTimes(2)
  53. set.add(value)
  54. expect(dummy).toBe(true)
  55. expect(setSpy).toHaveBeenCalledTimes(2)
  56. set.delete(value)
  57. expect(dummy).toBe(false)
  58. expect(setSpy).toHaveBeenCalledTimes(3)
  59. set.delete(value)
  60. expect(dummy).toBe(false)
  61. expect(setSpy).toHaveBeenCalledTimes(3)
  62. })
  63. it('should not observe raw data', () => {
  64. const value = {}
  65. let dummy
  66. const set = reactive(new WeakSet())
  67. effect(() => (dummy = toRaw(set).has(value)))
  68. expect(dummy).toBe(false)
  69. set.add(value)
  70. expect(dummy).toBe(false)
  71. })
  72. it('should not be triggered by raw mutations', () => {
  73. const value = {}
  74. let dummy
  75. const set = reactive(new WeakSet())
  76. effect(() => (dummy = set.has(value)))
  77. expect(dummy).toBe(false)
  78. toRaw(set).add(value)
  79. expect(dummy).toBe(false)
  80. })
  81. it('should not pollute original Set with Proxies', () => {
  82. const set = new WeakSet()
  83. const observed = reactive(set)
  84. const value = reactive({})
  85. observed.add(value)
  86. expect(observed.has(value)).toBe(true)
  87. expect(set.has(value)).toBe(false)
  88. })
  89. it('should return proxy from WeakSet.add call', () => {
  90. const set = reactive(new WeakSet())
  91. const result = set.add({})
  92. expect(result).toBe(set)
  93. })
  94. })
  95. })