|
|
|
export const tests = []
|
|
|
|
|
|
|
|
export const setup = async ({ page }) => {
|
|
|
|
return {
|
|
|
|
getCirclesPos: async () =>
|
|
|
|
await page.$$eval('.circle', nodes => {
|
|
|
|
const circleRadius = 25
|
|
|
|
const formatPos = pos => Number(pos.replace('px', '')) + circleRadius
|
|
|
|
return nodes.map(node => [
|
|
|
|
formatPos(node.style.left),
|
|
|
|
formatPos(node.style.top),
|
|
|
|
])
|
|
|
|
}),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
tests.push(async ({ page, viewport, eq, getCirclesPos }) => {
|
|
|
|
// check that a circle is created on click at the mouse position
|
|
|
|
const { width, height } = await page.evaluate(() => ({
|
|
|
|
width: document.documentElement.clientWidth,
|
|
|
|
height: document.documentElement.clientHeight,
|
|
|
|
}))
|
|
|
|
|
|
|
|
const clicks = [...Array(10).keys()].map(e => [random(width), random(height)])
|
|
|
|
|
|
|
|
for (const [i, click] of clicks.entries()) {
|
|
|
|
const [posX, posY] = click
|
|
|
|
await page.mouse.click(posX, posY)
|
|
|
|
const currentCircle = (await getCirclesPos())[i]
|
|
|
|
eq(currentCircle, click)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
tests.push(async ({ page, eq, getCirclesPos }) => {
|
|
|
|
// check that the last created circle moves along the mouse
|
|
|
|
let move = 0
|
|
|
|
while (move < 100) {
|
|
|
|
move++
|
|
|
|
const x = move
|
|
|
|
const y = move * 2
|
|
|
|
await page.mouse.move(x, y)
|
|
|
|
const circles = await getCirclesPos()
|
|
|
|
const currentCirclePos = circles[circles.length - 1]
|
|
|
|
eq(currentCirclePos, [x, y])
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
tests.push(async ({ page, eq, getCirclesPos }) => {
|
|
|
|
// check that a circle is trapped and purple when inside the box
|
|
|
|
const box = await page.$eval('.box', box => ({
|
|
|
|
top: box.getBoundingClientRect().top,
|
|
|
|
right: box.getBoundingClientRect().right,
|
|
|
|
left: box.getBoundingClientRect().left,
|
|
|
|
bottom: box.getBoundingClientRect().bottom,
|
|
|
|
}))
|
|
|
|
|
|
|
|
await page.mouse.click(200, 200)
|
|
|
|
|
|
|
|
let move = 200
|
|
|
|
let hasEntered = false
|
|
|
|
|
|
|
|
while (move < 500) {
|
|
|
|
const x = move + 50
|
|
|
|
const y = move
|
|
|
|
await page.mouse.move(x, y)
|
|
|
|
|
|
|
|
const circles = await getCirclesPos()
|
|
|
|
const currentCircle = circles[circles.length - 1]
|
|
|
|
|
|
|
|
const circleRadius = 25
|
|
|
|
|
|
|
|
const bg = await page.$$eval(
|
|
|
|
'.circle',
|
|
|
|
nodes => nodes[nodes.length - 1].style.background,
|
|
|
|
)
|
|
|
|
|
|
|
|
const insideX = x > box.left + circleRadius && x < box.right - circleRadius
|
|
|
|
const insideY = y > box.top + circleRadius && y < box.bottom - circleRadius
|
|
|
|
const isInside = insideX && insideY
|
|
|
|
|
|
|
|
// check that the background is set to the right color
|
|
|
|
if (isInside) {
|
|
|
|
hasEntered = true
|
|
|
|
eq(bg, 'var(--purple)')
|
|
|
|
} else {
|
|
|
|
eq(bg, hasEntered ? 'var(--purple)' : 'white')
|
|
|
|
}
|
|
|
|
|
|
|
|
// check that the mouse is trapped inside the box
|
|
|
|
if (hasEntered) {
|
|
|
|
if (insideY) {
|
|
|
|
eq(currentCircle[1], y)
|
|
|
|
} else {
|
|
|
|
const maxY =
|
|
|
|
currentCircle[1] === box.top + circleRadius + 1 ||
|
|
|
|
currentCircle[1] === box.top + circleRadius ||
|
|
|
|
currentCircle[1] === box.bottom - circleRadius ||
|
|
|
|
currentCircle[1] === box.bottom - circleRadius - 1
|
|
|
|
eq(maxY, true)
|
|
|
|
}
|
|
|
|
if (insideX) {
|
|
|
|
eq(currentCircle[0], x)
|
|
|
|
} else {
|
|
|
|
const maxX =
|
|
|
|
currentCircle[0] === box.left + circleRadius ||
|
|
|
|
currentCircle[0] === box.left + circleRadius + 1 ||
|
|
|
|
currentCircle[0] === box.right - circleRadius ||
|
|
|
|
currentCircle[0] === box.right - circleRadius - 1
|
|
|
|
eq(maxX, true)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
move++
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
const random = (min, max) => {
|
|
|
|
if (!max) {
|
|
|
|
max = min
|
|
|
|
min = 0
|
|
|
|
}
|
|
|
|
min = Math.ceil(min)
|
|
|
|
max = Math.floor(max)
|
|
|
|
return Math.floor(Math.random() * (max - min + 1)) + min
|
|
|
|
}
|