@better-scroll/core
Version:
Minimalistic core scrolling for BetterScroll, it is pure and tiny
105 lines (92 loc) • 2.6 kB
text/typescript
export interface CustomHTMLDivElement extends HTMLDivElement {
clientWidth: number
clientHeight: number
offsetWidth: number
offsetHeight: number
offsetTop: number
offsetLeft: number
_jsdomMockClientWidth?: number
_jsdomMockClientHeight?: number
_jsdomMockOffsetWidth?: number
_jsdomMockOffsetHeight?: number
_jsdomMockOffsetTop?: number
_jsdomMockOffsetLeft?: number
[key: string]: any
}
function firstUpper(key: string) {
return key.charAt(0).toUpperCase() + key.slice(1)
}
function genMockPrototype(mockName: string) {
return {
get: jest.fn().mockImplementation(dom => {
return Number(dom.getAttribute(mockName))
})
}
}
function mockHTMLPrototype(propName: string, mockGetter: jest.Mock) {
Object.defineProperty(HTMLElement.prototype, propName, {
get: function() {
return mockGetter(this)
},
configurable: true
})
}
export function mockDomOffset(
dom: CustomHTMLDivElement,
offsetObj: {
width?: number
height?: number
top?: number
left?: number
[key: string]: any
}
) {
Object.keys(offsetObj).forEach(key => {
const mockName = `_jsdomMockOffset${firstUpper(key)}`
dom.setAttribute(mockName, offsetObj[key])
})
}
export function mockDomClient(
dom: CustomHTMLDivElement,
clientObj: {
width?: number
height?: number
[key: string]: any
}
) {
Object.keys(clientObj).forEach(key => {
const mockName = `_jsdomMockClient${firstUpper(key)}`
dom.setAttribute(mockName, clientObj[key])
})
}
export function createDiv(
width: number = 0,
height: number = 0,
top: number = 0,
left: number = 0
) {
const dom = document.createElement('div') as CustomHTMLDivElement
mockDomOffset(dom, {
width,
height,
top,
left
})
mockDomClient(dom, {
width,
height
})
return dom
}
export const mockClientWidth = genMockPrototype('_jsdomMockClientWidth')
mockHTMLPrototype('clientWidth', mockClientWidth.get)
export const mockClientHeight = genMockPrototype('_jsdomMockClientHeight')
mockHTMLPrototype('clientHeight', mockClientHeight.get)
export const mockOffsetWidth = genMockPrototype('_jsdomMockOffsetWidth')
mockHTMLPrototype('offsetWidth', mockOffsetWidth.get)
export const mockOffsetHeight = genMockPrototype('_jsdomMockOffsetHeight')
mockHTMLPrototype('offsetHeight', mockOffsetHeight.get)
export const mockOffsetTop = genMockPrototype('_jsdomMockOffsetTop')
mockHTMLPrototype('offsetTop', mockOffsetTop.get)
export const mockOffsetLeft = genMockPrototype('_jsdomMockOffsetLeft')
mockHTMLPrototype('offsetLeft', mockOffsetLeft.get)