* Fix keyboard shortcuts to use Control instead of Meta on Windows and Linux * Convert more tests to use Playwright built-in
		
			
				
	
	
		
			518 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			518 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { test, expect } from '@playwright/test'
 | 
						|
import { getUtils, setup, tearDown } from './test-utils'
 | 
						|
 | 
						|
test.beforeEach(async ({ context, page }) => {
 | 
						|
  await setup(context, page)
 | 
						|
})
 | 
						|
 | 
						|
test.afterEach(async ({ page }, testInfo) => {
 | 
						|
  await tearDown(page, testInfo)
 | 
						|
})
 | 
						|
test.describe('Copilot ghost text', () => {
 | 
						|
  // eslint-disable-next-line jest/valid-title
 | 
						|
  test.skip(true, 'Needs to get covered again')
 | 
						|
 | 
						|
  test('completes code in empty file', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // We should be able to hit Tab to accept the completion.
 | 
						|
    await page.keyboard.press('Tab')
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
 | 
						|
    // Hit enter a few times.
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)    `
 | 
						|
    )
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
  })
 | 
						|
 | 
						|
  test.skip('copilot disabled in sketch mode no select plane', async ({
 | 
						|
    page,
 | 
						|
  }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    // Click sketch mode.
 | 
						|
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    // Exit sketch mode.
 | 
						|
    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
						|
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // We should be able to hit Tab to accept the completion.
 | 
						|
    await page.keyboard.press('Tab')
 | 
						|
    await expect(page.locator('.cm-content')).toContainText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
  })
 | 
						|
 | 
						|
  test('copilot disabled in sketch mode after selecting plane', async ({
 | 
						|
    page,
 | 
						|
  }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    // Click sketch mode.
 | 
						|
    await expect(
 | 
						|
      page.getByRole('button', { name: 'Start Sketch' })
 | 
						|
    ).not.toBeDisabled()
 | 
						|
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
						|
 | 
						|
    // select a plane
 | 
						|
    await page.mouse.click(700, 200)
 | 
						|
    await page.waitForTimeout(700) // wait for animation
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `const sketch001 = startSketchOn('XZ')`
 | 
						|
    )
 | 
						|
 | 
						|
    // Escape to exit the tool.
 | 
						|
    await u.openDebugPanel()
 | 
						|
    await u.closeDebugPanel()
 | 
						|
    await page.keyboard.press('Escape')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `const sketch001 = startSketchOn('XZ')`
 | 
						|
    )
 | 
						|
 | 
						|
    // Escape again to exit sketch mode.
 | 
						|
    await u.openDebugPanel()
 | 
						|
    await u.closeDebugPanel()
 | 
						|
    await page.keyboard.press('Escape')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // We should be able to hit Tab to accept the completion.
 | 
						|
    await page.keyboard.press('Tab')
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
 | 
						|
    // Hit enter a few times.
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `const sketch001 = startSketchOn('XZ')fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)    `
 | 
						|
    )
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
  })
 | 
						|
 | 
						|
  test('ArrowUp in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('ArrowUp')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('ArrowDown in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('ArrowDown')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('ArrowLeft in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('ArrowLeft')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('ArrowRight in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('ArrowRight')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('Enter in code scoots it down', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
  })
 | 
						|
 | 
						|
  test('Ctrl+shift+z in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.down('ControlOrMeta')
 | 
						|
    await page.keyboard.down('Shift')
 | 
						|
    await page.keyboard.press('KeyZ')
 | 
						|
    await page.keyboard.up('ControlOrMeta')
 | 
						|
    await page.keyboard.up('Shift')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('Ctrl+z in code rejects the suggestion and undos the last code', async ({
 | 
						|
    page,
 | 
						|
  }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await page.waitForTimeout(800)
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await page.keyboard.type('{thing: "blah"}', { delay: 0 })
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(`{thing: "blah"}`)
 | 
						|
 | 
						|
    // We wanna make sure the code saves.
 | 
						|
    await page.waitForTimeout(800)
 | 
						|
 | 
						|
    // Ctrl+z
 | 
						|
    await page.keyboard.down('ControlOrMeta')
 | 
						|
    await page.keyboard.press('KeyZ')
 | 
						|
    await page.keyboard.up('ControlOrMeta')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    // Ctrl+shift+z
 | 
						|
    await page.keyboard.down('ControlOrMeta')
 | 
						|
    await page.keyboard.down('Shift')
 | 
						|
    await page.keyboard.press('KeyZ')
 | 
						|
    await page.keyboard.up('ControlOrMeta')
 | 
						|
    await page.keyboard.up('Shift')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(`{thing: "blah"}`)
 | 
						|
 | 
						|
    // We wanna make sure the code saves.
 | 
						|
    await page.waitForTimeout(800)
 | 
						|
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `{thing: "blah"}fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Once for the enter.
 | 
						|
    await page.keyboard.down('ControlOrMeta')
 | 
						|
    await page.keyboard.press('KeyZ')
 | 
						|
    await page.keyboard.up('ControlOrMeta')
 | 
						|
 | 
						|
    // Once for the text.
 | 
						|
    await page.keyboard.down('ControlOrMeta')
 | 
						|
    await page.keyboard.press('KeyZ')
 | 
						|
    await page.keyboard.up('ControlOrMeta')
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    // TODO when we make codemirror a widget, we can test this.
 | 
						|
    //await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('delete in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('Delete')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('backspace in code rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going elsewhere in the code should hide the ghost text.
 | 
						|
    await page.keyboard.press('Backspace')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
 | 
						|
  test('focus outside code pane rejects the suggestion', async ({ page }) => {
 | 
						|
    const u = await getUtils(page)
 | 
						|
    // const PUR = 400 / 37.5 //pixeltoUnitRatio
 | 
						|
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
						|
 | 
						|
    await u.waitForAuthSkipAppStart()
 | 
						|
 | 
						|
    await u.codeLocator.click()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
 | 
						|
    await expect(page.locator('.cm-ghostText')).not.toBeVisible()
 | 
						|
    await page.waitForTimeout(500)
 | 
						|
    await page.keyboard.press('Enter')
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toBeVisible()
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {  const sg = startSketchOn('XY')    |> startProfileAt(pos, %)    |> line([0, scale], %)    |> line([scale, 0], %)    |> line([0, -scale], %)  return sg}const part001 = cube([0,0], 20)    |> close(%)    |> extrude(20, %)`
 | 
						|
    )
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).toHaveText(
 | 
						|
      `fn cube = (pos, scale) => {`
 | 
						|
    )
 | 
						|
 | 
						|
    // Going outside the editor should hide the ghost text.
 | 
						|
    await page.mouse.move(0, 0)
 | 
						|
    await page
 | 
						|
      .getByRole('button', { name: 'Start Sketch' })
 | 
						|
      .waitFor({ state: 'visible' })
 | 
						|
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
						|
    await expect(page.locator('.cm-ghostText').first()).not.toBeVisible()
 | 
						|
 | 
						|
    await expect(page.locator('.cm-content')).toHaveText(``)
 | 
						|
  })
 | 
						|
})
 |