import ep, {PredictionResult} from "../src/element-predictor"; let resultSelector: string; document.body.style.margin = "0"; document.body.style.padding = "0"; document.body.style.position = "relative"; document.body.style.width = "1000px"; document.body.style.height = "500px"; document.body.innerHTML = ` `; const moveMouse = ( fromX: number, fromY: number, toX: number, toY: number, numOfSteps: number = 20 ): void => { let stepX = ( toX - fromX ) / numOfSteps; let stepY = ( toY - fromY ) / numOfSteps; for ( let i = 1; i <= numOfSteps; i++ ) { let clientX = fromX + stepX * i; let clientY = fromY + stepY * i; document.dispatchEvent( new MouseEvent( "mousemove", { clientX, clientY } ) ); } }; const elementSelectors = [ "#btnTopLeft", "#btnTopRight", "#btnBottomLeft", "#btnBottomRight" ]; elementSelectors.forEach( selector => { let element: HTMLElement = document.querySelector( selector ); element.getBoundingClientRect = () => { let width = Number( element.style.width.replace( "px", "" ) ); let height = Number( element.style.height.replace( "px", "" ) ); let top = Number( element.style.top.replace( "px", "" ) ); let left = Number( element.style.left.replace( "px", "" ) ); let right = left + width; let bottom = top + height; return { top, left, right, bottom, width, height } as ClientRect; }; } ); beforeEach( () => { resultSelector = undefined; ep.setup( { elementSelectors, handler: ( result: PredictionResult ): void => { resultSelector = result && result.selector; } } ); ep.start(); } ); afterEach( () => { ep.stop(); ep.destroy(); } ); test("Predict No Result - Mouse not moved", () => { expect( resultSelector ).toBeUndefined(); }); test("Predict Top Left Button", () => { moveMouse( 500, 250, 100, 50 ); expect( resultSelector ).toBe( "#btnTopLeft" ); }); test("Predict Bottom Right Button", () => { moveMouse( 500, 250, 900, 450 ); expect( resultSelector ).toBe( "#btnBottomRight" ); }); test("Predict Top Left Button and then nothing - Mouse move in and out", () => { moveMouse( 500, 250, 100, 50 ); expect( resultSelector ).toBe( "#btnTopLeft" ); moveMouse( 100, 50, 200, 150 ); expect( resultSelector ).toBeUndefined(); });