WeakMap.spec.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { reactive, effect, toRaw, isReactive } from '../../src'
  2. describe('reactivity/collections', () => {
  3. describe('WeakMap', () => {
  4. test('instanceof', () => {
  5. const original = new WeakMap()
  6. const observed = reactive(original)
  7. expect(isReactive(observed)).toBe(true)
  8. expect(original instanceof WeakMap).toBe(true)
  9. expect(observed instanceof WeakMap).toBe(true)
  10. })
  11. it('should observe mutations', () => {
  12. let dummy
  13. const key = {}
  14. const map = reactive(new WeakMap())
  15. effect(() => {
  16. dummy = map.get(key)
  17. })
  18. expect(dummy).toBe(undefined)
  19. map.set(key, 'value')
  20. expect(dummy).toBe('value')
  21. map.set(key, 'value2')
  22. expect(dummy).toBe('value2')
  23. map.delete(key)
  24. expect(dummy).toBe(undefined)
  25. })
  26. it('should not observe custom property mutations', () => {
  27. let dummy
  28. const map: any = reactive(new WeakMap())
  29. effect(() => (dummy = map.customProp))
  30. expect(dummy).toBe(undefined)
  31. map.customProp = 'Hello World'
  32. expect(dummy).toBe(undefined)
  33. })
  34. it('should not observe non value changing mutations', () => {
  35. let dummy
  36. const key = {}
  37. const map = reactive(new WeakMap())
  38. const mapSpy = jest.fn(() => (dummy = map.get(key)))
  39. effect(mapSpy)
  40. expect(dummy).toBe(undefined)
  41. expect(mapSpy).toHaveBeenCalledTimes(1)
  42. map.set(key, undefined)
  43. expect(dummy).toBe(undefined)
  44. expect(mapSpy).toHaveBeenCalledTimes(2)
  45. map.set(key, 'value')
  46. expect(dummy).toBe('value')
  47. expect(mapSpy).toHaveBeenCalledTimes(3)
  48. map.set(key, 'value')
  49. expect(dummy).toBe('value')
  50. expect(mapSpy).toHaveBeenCalledTimes(3)
  51. map.delete(key)
  52. expect(dummy).toBe(undefined)
  53. expect(mapSpy).toHaveBeenCalledTimes(4)
  54. map.delete(key)
  55. expect(dummy).toBe(undefined)
  56. expect(mapSpy).toHaveBeenCalledTimes(4)
  57. })
  58. it('should not observe raw data', () => {
  59. let dummy
  60. const key = {}
  61. const map = reactive(new WeakMap())
  62. effect(() => (dummy = toRaw(map).get(key)))
  63. expect(dummy).toBe(undefined)
  64. map.set(key, 'Hello')
  65. expect(dummy).toBe(undefined)
  66. map.delete(key)
  67. expect(dummy).toBe(undefined)
  68. })
  69. it('should not pollute original Map with Proxies', () => {
  70. const map = new WeakMap()
  71. const observed = reactive(map)
  72. const key = {}
  73. const value = reactive({})
  74. observed.set(key, value)
  75. expect(map.get(key)).not.toBe(value)
  76. expect(map.get(key)).toBe(toRaw(value))
  77. })
  78. it('should return observable versions of contained values', () => {
  79. const observed = reactive(new WeakMap())
  80. const key = {}
  81. const value = {}
  82. observed.set(key, value)
  83. const wrapped = observed.get(key)
  84. expect(isReactive(wrapped)).toBe(true)
  85. expect(toRaw(wrapped)).toBe(value)
  86. })
  87. it('should observed nested data', () => {
  88. const observed = reactive(new WeakMap())
  89. const key = {}
  90. observed.set(key, { a: 1 })
  91. let dummy
  92. effect(() => {
  93. dummy = observed.get(key).a
  94. })
  95. observed.get(key).a = 2
  96. expect(dummy).toBe(2)
  97. })
  98. it('should not be trigger when the value and the old value both are NaN', () => {
  99. const map = new WeakMap()
  100. const key = {}
  101. map.set(key, NaN)
  102. const mapSpy = jest.fn(() => map.get(key))
  103. effect(mapSpy)
  104. map.set(key, NaN)
  105. expect(mapSpy).toHaveBeenCalledTimes(1)
  106. })
  107. })
  108. })