WeakSet.spec.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { reactive, isReactive, effect, toRaw } from '../../src'
  2. describe('reactivity/collections', () => {
  3. describe('WeakSet', () => {
  4. it('instanceof', () => {
  5. const original = new Set()
  6. const observed = reactive(original)
  7. expect(isReactive(observed)).toBe(true)
  8. expect(original instanceof Set).toBe(true)
  9. expect(observed instanceof Set).toBe(true)
  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 not observe custom property mutations', () => {
  23. let dummy
  24. const set: any = reactive(new WeakSet())
  25. effect(() => (dummy = set.customProp))
  26. expect(dummy).toBe(undefined)
  27. set.customProp = 'Hello World'
  28. expect(dummy).toBe(undefined)
  29. })
  30. it('should not observe non value changing mutations', () => {
  31. let dummy
  32. const value = {}
  33. const set = reactive(new WeakSet())
  34. const setSpy = jest.fn(() => (dummy = set.has(value)))
  35. effect(setSpy)
  36. expect(dummy).toBe(false)
  37. expect(setSpy).toHaveBeenCalledTimes(1)
  38. set.add(value)
  39. expect(dummy).toBe(true)
  40. expect(setSpy).toHaveBeenCalledTimes(2)
  41. set.add(value)
  42. expect(dummy).toBe(true)
  43. expect(setSpy).toHaveBeenCalledTimes(2)
  44. set.delete(value)
  45. expect(dummy).toBe(false)
  46. expect(setSpy).toHaveBeenCalledTimes(3)
  47. set.delete(value)
  48. expect(dummy).toBe(false)
  49. expect(setSpy).toHaveBeenCalledTimes(3)
  50. })
  51. it('should not observe raw data', () => {
  52. const value = {}
  53. let dummy
  54. const set = reactive(new WeakSet())
  55. effect(() => (dummy = toRaw(set).has(value)))
  56. expect(dummy).toBe(false)
  57. set.add(value)
  58. expect(dummy).toBe(false)
  59. })
  60. it('should not be triggered by raw mutations', () => {
  61. const value = {}
  62. let dummy
  63. const set = reactive(new WeakSet())
  64. effect(() => (dummy = set.has(value)))
  65. expect(dummy).toBe(false)
  66. toRaw(set).add(value)
  67. expect(dummy).toBe(false)
  68. })
  69. it('should not pollute original Set with Proxies', () => {
  70. const set = new WeakSet()
  71. const observed = reactive(set)
  72. const value = reactive({})
  73. observed.add(value)
  74. expect(observed.has(value)).toBe(true)
  75. expect(set.has(value)).toBe(false)
  76. })
  77. })
  78. })