import { BehaviorCatcherMap } from '../BehaviorCatcherMap'; import { BehaviorCatcher } from '../behaviorCatchers'; export class MockBehaviorCatcher extends BehaviorCatcher { updateConfig() {} destroy() {} } describe('BehaviorCatcherMap', () => { it('should register Catcher correctly when el is not registered', () => { const catcherMap = new BehaviorCatcherMap(MockBehaviorCatcher); const el1 = document.createElement('div'); const el2 = document.createElement('video'); const el3 = document.createElement('canvas'); const catcher = catcherMap.register(el1); const catcherWithExtInfo = catcherMap.register(el2, { name: 'Jinx' }); const catcherWithConfig = catcherMap.register(el3, undefined, { config: 'config' }); expect(catcherMap.get(el1)).toBe(catcher); expect(catcherMap.get(el2)).toBe(catcherWithExtInfo); expect(catcherMap.get(el3)).toBe(catcherWithConfig); expect(catcherMap.get(el1)?.extInfo).toBeUndefined(); expect(catcherMap.get(el2)?.extInfo).toStrictEqual({ name: 'Jinx', }); expect(catcherMap.get(el3)?.extInfo).toBeUndefined(); }); it('should update Catcher correctly when el is already registered', () => { const catcherMap = new BehaviorCatcherMap(MockBehaviorCatcher); const el = document.createElement('div'); const catcher = catcherMap.register(el, { name: 'Powder' }); const catcher2 = catcherMap.register(el, { name: 'Jinx' }); expect(catcher).toBe(catcher2); expect(catcherMap.get(el)?.extInfo).toStrictEqual({ name: 'Jinx', }); }); it('should deregister Catcher correctly', () => { const catcherMap = new BehaviorCatcherMap(MockBehaviorCatcher); const el = document.createElement('div'); const catcher = catcherMap.register(el, { name: 'Powder' }); const catcherDestroySpy = jest.spyOn(catcher, 'destroy'); catcherMap.deregister(el); expect(catcherMap.get(el)).toBeUndefined(); expect(catcherDestroySpy).toHaveBeenCalledTimes(1); // 重复 deregister 无效 expect(() => catcherMap.deregister(el)).not.toThrow(); expect(catcherDestroySpy).toHaveBeenCalledTimes(1); }); // get set 不必测试,只是简单地透出 Map 的方法 it('should find Catcher correctly', () => { const catcherMap = new BehaviorCatcherMap(MockBehaviorCatcher); const el1 = document.createElement('div'); const el2 = document.createElement('video'); const el3 = document.createElement('canvas'); el3.setAttribute('ml-key', 'a-ml-video'); expect(catcherMap.find(() => true)).toBeUndefined(); catcherMap.register(el1); const catcher2 = catcherMap.register(el2, { name: 'Jinx' }); const catcher3 = catcherMap.register(el3, undefined, { config: 'config' }); expect(catcherMap.find(() => false)).toBeUndefined(); expect(catcherMap.find((c) => c.extInfo?.name === 'Jinx')).toBe(catcher2); expect(catcherMap.find((c) => c.extInfo?.name === 'Powder')).toBeUndefined(); expect(catcherMap.find((c) => c.key === 'a-ml-video')).toBe(catcher3); }); it('should be an empty Map after settle', () => { const catcherMap = new BehaviorCatcherMap(MockBehaviorCatcher); const el1 = document.createElement('div'); const el2 = document.createElement('video'); const el3 = document.createElement('canvas'); catcherMap.register(el1); catcherMap.register(el2, { name: 'Jinx' }); catcherMap.register(el3, undefined, { config: 'config' }); expect(catcherMap.catcherMap.size).toBe(3); catcherMap.settle(); expect(catcherMap.catcherMap.size).toBe(0); }); });