|
|
|
@ -256,181 +256,186 @@ test('First escape in tool pops you out of tool, second exits sketch mode', asyn
|
|
|
|
|
).not.toBeVisible()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
test('Basic default modeling and sketch hotkeys work', async ({ page }) => {
|
|
|
|
|
const u = await getUtils(page)
|
|
|
|
|
test.fixme(
|
|
|
|
|
'Basic default modeling and sketch hotkeys work',
|
|
|
|
|
async ({ page }) => {
|
|
|
|
|
const u = await getUtils(page)
|
|
|
|
|
|
|
|
|
|
// This test can run long if it takes a little too long to load
|
|
|
|
|
// the engine.
|
|
|
|
|
test.setTimeout(90000)
|
|
|
|
|
// This test has a weird bug on ubuntu
|
|
|
|
|
test.skip(
|
|
|
|
|
process.platform === 'linux',
|
|
|
|
|
'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444'
|
|
|
|
|
)
|
|
|
|
|
// Load the app with the code pane open
|
|
|
|
|
// This test can run long if it takes a little too long to load
|
|
|
|
|
// the engine.
|
|
|
|
|
test.setTimeout(90000)
|
|
|
|
|
// This test has a weird bug on ubuntu
|
|
|
|
|
// Funny, it's flaking on Windows too :). I think there is just something
|
|
|
|
|
// actually wrong.
|
|
|
|
|
test.skip(
|
|
|
|
|
process.platform === 'linux',
|
|
|
|
|
'weird playwright bug on ubuntu https://github.com/KittyCAD/modeling-app/issues/2444'
|
|
|
|
|
)
|
|
|
|
|
// Load the app with the code pane open
|
|
|
|
|
|
|
|
|
|
await test.step(`Set up test`, async () => {
|
|
|
|
|
await page.addInitScript(async () => {
|
|
|
|
|
localStorage.setItem(
|
|
|
|
|
'store',
|
|
|
|
|
JSON.stringify({
|
|
|
|
|
state: {
|
|
|
|
|
openPanes: ['code'],
|
|
|
|
|
},
|
|
|
|
|
version: 0,
|
|
|
|
|
await test.step(`Set up test`, async () => {
|
|
|
|
|
await page.addInitScript(async () => {
|
|
|
|
|
localStorage.setItem(
|
|
|
|
|
'store',
|
|
|
|
|
JSON.stringify({
|
|
|
|
|
state: {
|
|
|
|
|
openPanes: ['code'],
|
|
|
|
|
},
|
|
|
|
|
version: 0,
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
await page.setViewportSize({ width: 1200, height: 500 })
|
|
|
|
|
await u.waitForAuthSkipAppStart()
|
|
|
|
|
await u.openDebugPanel()
|
|
|
|
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
|
|
|
|
await u.closeDebugPanel()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const codePane = page.locator('.cm-content')
|
|
|
|
|
const lineButton = page.getByRole('button', {
|
|
|
|
|
name: 'line Line',
|
|
|
|
|
exact: true,
|
|
|
|
|
})
|
|
|
|
|
const arcButton = page.getByRole('button', {
|
|
|
|
|
name: 'arc Tangential Arc',
|
|
|
|
|
exact: true,
|
|
|
|
|
})
|
|
|
|
|
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
|
|
|
|
|
const commandBarComboBox = page.getByPlaceholder('Search commands')
|
|
|
|
|
const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' })
|
|
|
|
|
|
|
|
|
|
await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => {
|
|
|
|
|
await codePane.click()
|
|
|
|
|
await page.keyboard.type('//')
|
|
|
|
|
await page.keyboard.press('s')
|
|
|
|
|
await expect(commandBarComboBox).not.toBeVisible()
|
|
|
|
|
await page.keyboard.press('e')
|
|
|
|
|
await expect(commandBarComboBox).not.toBeVisible()
|
|
|
|
|
await expect(codePane).toHaveText('//se')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Blur focus from the code editor, use the s command to sketch
|
|
|
|
|
await test.step(`Blur editor focus, enter sketch`, async () => {
|
|
|
|
|
/**
|
|
|
|
|
* TODO: There is a bug somewhere that causes this test to fail
|
|
|
|
|
* if you toggle the codePane closed before your trigger the
|
|
|
|
|
* start of the sketch.
|
|
|
|
|
* and a separate Safari-only bug that causes the test to fail
|
|
|
|
|
* if the pane is open the entire test. The maintainer of CodeMirror
|
|
|
|
|
* has pinpointed this to the unusual browser behavior:
|
|
|
|
|
* https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3
|
|
|
|
|
*/
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await page.keyboard.press('s')
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await page.mouse.move(800, 300, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 300)
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
|
|
|
|
|
timeout: 15_000,
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Use some sketch hotkeys to create a sketch (l and a for now)
|
|
|
|
|
await test.step(`Incomplete sketch with hotkeys`, async () => {
|
|
|
|
|
await test.step(`Draw a line`, async () => {
|
|
|
|
|
await page.mouse.move(700, 200, { steps: 5 })
|
|
|
|
|
await page.mouse.click(700, 200)
|
|
|
|
|
await page.mouse.move(800, 250, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 250)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Unequip line tool`, async () => {
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Draw a tangential arc`, async () => {
|
|
|
|
|
await page.keyboard.press('a')
|
|
|
|
|
await expect(arcButton).toHaveAttribute('aria-pressed', 'true', {
|
|
|
|
|
timeout: 10_000,
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
await page.mouse.move(1000, 100, { steps: 5 })
|
|
|
|
|
await page.mouse.click(1000, 100)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Unequip with escape, equip line tool`, async () => {
|
|
|
|
|
await page.keyboard.press('Escape')
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await page.waitForTimeout(50)
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
await page.setViewportSize({ width: 1200, height: 500 })
|
|
|
|
|
await u.waitForAuthSkipAppStart()
|
|
|
|
|
await u.openDebugPanel()
|
|
|
|
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
|
|
|
|
await u.closeDebugPanel()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const codePane = page.locator('.cm-content')
|
|
|
|
|
const lineButton = page.getByRole('button', {
|
|
|
|
|
name: 'line Line',
|
|
|
|
|
exact: true,
|
|
|
|
|
})
|
|
|
|
|
const arcButton = page.getByRole('button', {
|
|
|
|
|
name: 'arc Tangential Arc',
|
|
|
|
|
exact: true,
|
|
|
|
|
})
|
|
|
|
|
const extrudeButton = page.getByRole('button', { name: 'Extrude' })
|
|
|
|
|
const commandBarComboBox = page.getByPlaceholder('Search commands')
|
|
|
|
|
const exitSketchButton = page.getByRole('button', { name: 'Exit Sketch' })
|
|
|
|
|
await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => {
|
|
|
|
|
// Since there's code now, we have to get to the end of the line
|
|
|
|
|
await page.locator('.cm-line').last().click()
|
|
|
|
|
await page.keyboard.down('ControlOrMeta')
|
|
|
|
|
await page.keyboard.press('ArrowRight')
|
|
|
|
|
await page.keyboard.up('ControlOrMeta')
|
|
|
|
|
|
|
|
|
|
await test.step(`Type code with modeling hotkeys, shouldn't fire`, async () => {
|
|
|
|
|
await codePane.click()
|
|
|
|
|
await page.keyboard.type('//')
|
|
|
|
|
await page.keyboard.press('s')
|
|
|
|
|
await expect(commandBarComboBox).not.toBeVisible()
|
|
|
|
|
await page.keyboard.press('e')
|
|
|
|
|
await expect(commandBarComboBox).not.toBeVisible()
|
|
|
|
|
await expect(codePane).toHaveText('//se')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Blur focus from the code editor, use the s command to sketch
|
|
|
|
|
await test.step(`Blur editor focus, enter sketch`, async () => {
|
|
|
|
|
/**
|
|
|
|
|
* TODO: There is a bug somewhere that causes this test to fail
|
|
|
|
|
* if you toggle the codePane closed before your trigger the
|
|
|
|
|
* start of the sketch.
|
|
|
|
|
* and a separate Safari-only bug that causes the test to fail
|
|
|
|
|
* if the pane is open the entire test. The maintainer of CodeMirror
|
|
|
|
|
* has pinpointed this to the unusual browser behavior:
|
|
|
|
|
* https://discuss.codemirror.net/t/how-to-force-unfocus-of-the-codemirror-element-in-safari/8095/3
|
|
|
|
|
*/
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await page.keyboard.press('s')
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await page.mouse.move(800, 300, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 300)
|
|
|
|
|
await page.waitForTimeout(1000)
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true', {
|
|
|
|
|
timeout: 15_000,
|
|
|
|
|
await page.keyboard.press('Enter')
|
|
|
|
|
await page.keyboard.type('//')
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
await page.keyboard.press('a')
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
await expect(codePane).toContainText('//la')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Use some sketch hotkeys to create a sketch (l and a for now)
|
|
|
|
|
await test.step(`Incomplete sketch with hotkeys`, async () => {
|
|
|
|
|
await test.step(`Draw a line`, async () => {
|
|
|
|
|
await test.step(`Close profile and exit sketch`, async () => {
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await page.mouse.move(700, 200, { steps: 5 })
|
|
|
|
|
await page.mouse.click(700, 200)
|
|
|
|
|
await page.mouse.move(800, 250, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 250)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Unequip line tool`, async () => {
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await expect(lineButton).not.toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Draw a tangential arc`, async () => {
|
|
|
|
|
await page.keyboard.press('a')
|
|
|
|
|
await expect(arcButton).toHaveAttribute('aria-pressed', 'true', {
|
|
|
|
|
timeout: 10_000,
|
|
|
|
|
})
|
|
|
|
|
await page.mouse.move(1000, 100, { steps: 5 })
|
|
|
|
|
await page.mouse.click(1000, 100)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Unequip with escape, equip line tool`, async () => {
|
|
|
|
|
// On close it will unequip the line tool.
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'false')
|
|
|
|
|
await expect(exitSketchButton).toBeEnabled()
|
|
|
|
|
await page.keyboard.press('Escape')
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await page.waitForTimeout(50)
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
await expect(
|
|
|
|
|
page.getByRole('button', { name: 'Exit Sketch' })
|
|
|
|
|
).not.toBeVisible()
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Type code with sketch hotkeys, shouldn't fire`, async () => {
|
|
|
|
|
// Since there's code now, we have to get to the end of the line
|
|
|
|
|
await page.locator('.cm-line').last().click()
|
|
|
|
|
await page.keyboard.down('ControlOrMeta')
|
|
|
|
|
await page.keyboard.press('ArrowRight')
|
|
|
|
|
await page.keyboard.up('ControlOrMeta')
|
|
|
|
|
|
|
|
|
|
await page.keyboard.press('Enter')
|
|
|
|
|
await page.keyboard.type('//')
|
|
|
|
|
await page.keyboard.press('l')
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
await page.keyboard.press('a')
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'true')
|
|
|
|
|
await expect(codePane).toContainText('//la')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
await page.keyboard.press('Backspace')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await test.step(`Close profile and exit sketch`, async () => {
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await page.mouse.move(700, 200, { steps: 5 })
|
|
|
|
|
await page.mouse.click(700, 200)
|
|
|
|
|
// On close it will unequip the line tool.
|
|
|
|
|
await expect(lineButton).toHaveAttribute('aria-pressed', 'false')
|
|
|
|
|
await expect(exitSketchButton).toBeEnabled()
|
|
|
|
|
await page.keyboard.press('Escape')
|
|
|
|
|
await expect(
|
|
|
|
|
page.getByRole('button', { name: 'Exit Sketch' })
|
|
|
|
|
).not.toBeVisible()
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// Extrude with e
|
|
|
|
|
await test.step(`Extrude the sketch`, async () => {
|
|
|
|
|
await page.mouse.click(750, 150)
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await expect(extrudeButton).toBeEnabled()
|
|
|
|
|
await page.keyboard.press('e')
|
|
|
|
|
await page.waitForTimeout(500)
|
|
|
|
|
await page.mouse.move(800, 200, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 200)
|
|
|
|
|
await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({
|
|
|
|
|
timeout: 20_000,
|
|
|
|
|
// Extrude with e
|
|
|
|
|
await test.step(`Extrude the sketch`, async () => {
|
|
|
|
|
await page.mouse.click(750, 150)
|
|
|
|
|
await blurCodeEditor()
|
|
|
|
|
await expect(extrudeButton).toBeEnabled()
|
|
|
|
|
await page.keyboard.press('e')
|
|
|
|
|
await page.waitForTimeout(500)
|
|
|
|
|
await page.mouse.move(800, 200, { steps: 5 })
|
|
|
|
|
await page.mouse.click(800, 200)
|
|
|
|
|
await expect(page.getByRole('button', { name: 'Continue' })).toBeVisible({
|
|
|
|
|
timeout: 20_000,
|
|
|
|
|
})
|
|
|
|
|
await page.getByRole('button', { name: 'Continue' }).click()
|
|
|
|
|
await expect(
|
|
|
|
|
page.getByRole('button', { name: 'Submit command' })
|
|
|
|
|
).toBeVisible()
|
|
|
|
|
await page.getByRole('button', { name: 'Submit command' }).click()
|
|
|
|
|
await expect(page.locator('.cm-content')).toContainText('extrude(')
|
|
|
|
|
})
|
|
|
|
|
await page.getByRole('button', { name: 'Continue' }).click()
|
|
|
|
|
await expect(
|
|
|
|
|
page.getByRole('button', { name: 'Submit command' })
|
|
|
|
|
).toBeVisible()
|
|
|
|
|
await page.getByRole('button', { name: 'Submit command' }).click()
|
|
|
|
|
await expect(page.locator('.cm-content')).toContainText('extrude(')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// await codePaneButton.click()
|
|
|
|
|
// await expect(u.codeLocator).not.toBeVisible()
|
|
|
|
|
// await codePaneButton.click()
|
|
|
|
|
// await expect(u.codeLocator).not.toBeVisible()
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred
|
|
|
|
|
*/
|
|
|
|
|
async function blurCodeEditor() {
|
|
|
|
|
await page.getByRole('button', { name: 'Commands' }).click()
|
|
|
|
|
await page.waitForTimeout(100)
|
|
|
|
|
await page.keyboard.press('Escape')
|
|
|
|
|
await page.waitForTimeout(100)
|
|
|
|
|
/**
|
|
|
|
|
* work-around: to stop `keyboard.press()` from typing in the editor even when it should be blurred
|
|
|
|
|
*/
|
|
|
|
|
async function blurCodeEditor() {
|
|
|
|
|
await page.getByRole('button', { name: 'Commands' }).click()
|
|
|
|
|
await page.waitForTimeout(100)
|
|
|
|
|
await page.keyboard.press('Escape')
|
|
|
|
|
await page.waitForTimeout(100)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
test('Delete key does not navigate back', async ({ page }) => {
|
|
|
|
|
await page.setViewportSize({ width: 1200, height: 500 })
|
|
|
|
|