WeakMap.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { observable, autorun, unwrap, isObservable } from '../../src'
  2. describe('observer/collections', () => {
  3. describe('WeakMap', () => {
  4. test('instanceof', () => {
  5. const original = new WeakMap()
  6. const observed = observable(original)
  7. expect(isObservable(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 = observable(new WeakMap())
  15. autorun(() => {
  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 = observable(new WeakMap())
  29. autorun(() => (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 = observable(new WeakMap())
  38. const mapSpy = jest.fn(() => (dummy = map.get(key)))
  39. autorun(mapSpy)
  40. expect(dummy).toBe(undefined)
  41. expect(mapSpy).toHaveBeenCalledTimes(1)
  42. map.set(key, 'value')
  43. expect(dummy).toBe('value')
  44. expect(mapSpy).toHaveBeenCalledTimes(2)
  45. map.set(key, 'value')
  46. expect(dummy).toBe('value')
  47. expect(mapSpy).toHaveBeenCalledTimes(2)
  48. map.delete(key)
  49. expect(dummy).toBe(undefined)
  50. expect(mapSpy).toHaveBeenCalledTimes(3)
  51. map.delete(key)
  52. expect(dummy).toBe(undefined)
  53. expect(mapSpy).toHaveBeenCalledTimes(3)
  54. })
  55. it('should not observe raw data', () => {
  56. let dummy
  57. const key = {}
  58. const map = observable(new WeakMap())
  59. autorun(() => (dummy = unwrap(map).get(key)))
  60. expect(dummy).toBe(undefined)
  61. map.set(key, 'Hello')
  62. expect(dummy).toBe(undefined)
  63. map.delete(key)
  64. expect(dummy).toBe(undefined)
  65. })
  66. it('should not pollute original Map with Proxies', () => {
  67. const map = new WeakMap()
  68. const observed = observable(map)
  69. const key = {}
  70. const value = observable({})
  71. observed.set(key, value)
  72. expect(map.get(key)).not.toBe(value)
  73. expect(map.get(key)).toBe(unwrap(value))
  74. })
  75. it('should return observable versions of contained values', () => {
  76. const observed = observable(new WeakMap())
  77. const key = {}
  78. const value = {}
  79. observed.set(key, value)
  80. const wrapped = observed.get(key)
  81. expect(isObservable(wrapped)).toBe(true)
  82. expect(unwrap(wrapped)).toBe(value)
  83. })
  84. it('should observed nested data', () => {
  85. const observed = observable(new Map())
  86. const key = {}
  87. observed.set(key, { a: 1 })
  88. let dummy
  89. autorun(() => {
  90. dummy = observed.get(key).a
  91. })
  92. observed.get(key).a = 2
  93. expect(dummy).toBe(2)
  94. })
  95. })
  96. })