WeakSet.spec.ts 3.0 KB

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