Wait for ICE gathering completion before requesting video track + create file e2e test fix (#5193)
* Test main e2e * Create projects separately in home page tests I think creating them in Promise.all was introducing nondeterminism and making tests flaky. * Query the homepage projects in an order-insensitive way * Wait for ICE candidate gathering to complete before requesting video track * Update src/lang/std/engineConnection.ts Co-authored-by: Jonathan Tran <jonnytran@gmail.com> * Fix create file e2e failure * Yarn fmt * Fix typo: s/that/this yarn tsc was failing with this error: ``` src/lang/std/engineConnection.ts:1285:7 - error TS2304: Cannot find name 'that'. 1285 that.triggeredStart = false ~~~~ ``` * Fix up revolve tests * Turn off 3 flaky Windows tests * Fix tags --------- Co-authored-by: Adam Chalmers <adam.chalmers@zoo.dev> Co-authored-by: Jonathan Tran <jonnytran@gmail.com>
This commit is contained in:
		@ -127,54 +127,54 @@ test.describe('Command bar tests', () => {
 | 
			
		||||
    await expect(commandLevelArgButton).toHaveText('level: project')
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('Command bar keybinding works from code editor and can change a setting', async ({
 | 
			
		||||
    page,
 | 
			
		||||
    homePage,
 | 
			
		||||
  }) => {
 | 
			
		||||
    await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
			
		||||
    await homePage.goToModelingScene()
 | 
			
		||||
  test(
 | 
			
		||||
    'Command bar keybinding works from code editor and can change a setting',
 | 
			
		||||
    { tag: ['@skipWin'] },
 | 
			
		||||
    async ({ page, homePage }) => {
 | 
			
		||||
      await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
			
		||||
      await homePage.goToModelingScene()
 | 
			
		||||
 | 
			
		||||
    await expect(
 | 
			
		||||
      page.getByRole('button', { name: 'Start Sketch' })
 | 
			
		||||
    ).not.toBeDisabled()
 | 
			
		||||
      await expect(
 | 
			
		||||
        page.getByRole('button', { name: 'Start Sketch' })
 | 
			
		||||
      ).not.toBeDisabled()
 | 
			
		||||
 | 
			
		||||
    // Put the cursor in the code editor
 | 
			
		||||
    await page.locator('.cm-content').click()
 | 
			
		||||
      // Put the cursor in the code editor
 | 
			
		||||
      await page.locator('.cm-content').click()
 | 
			
		||||
 | 
			
		||||
    // Now try the same, but with the keyboard shortcut, check focus
 | 
			
		||||
    await page.keyboard.press('ControlOrMeta+K')
 | 
			
		||||
      // Now try the same, but with the keyboard shortcut, check focus
 | 
			
		||||
      await page.keyboard.press('ControlOrMeta+K')
 | 
			
		||||
 | 
			
		||||
    let cmdSearchBar = page.getByPlaceholder('Search commands')
 | 
			
		||||
    await expect(cmdSearchBar).toBeVisible()
 | 
			
		||||
    await expect(cmdSearchBar).toBeFocused()
 | 
			
		||||
      let cmdSearchBar = page.getByPlaceholder('Search commands')
 | 
			
		||||
      await expect(cmdSearchBar).toBeVisible()
 | 
			
		||||
      await expect(cmdSearchBar).toBeFocused()
 | 
			
		||||
 | 
			
		||||
    // Try typing in the command bar
 | 
			
		||||
    await cmdSearchBar.fill('theme')
 | 
			
		||||
    const themeOption = page.getByRole('option', {
 | 
			
		||||
      name: 'Settings · app · theme',
 | 
			
		||||
    })
 | 
			
		||||
    await expect(themeOption).toBeVisible()
 | 
			
		||||
    await themeOption.click()
 | 
			
		||||
    const themeInput = page.getByPlaceholder('dark')
 | 
			
		||||
    await expect(themeInput).toBeVisible()
 | 
			
		||||
    await expect(themeInput).toBeFocused()
 | 
			
		||||
    // Select dark theme
 | 
			
		||||
    await page.keyboard.press('ArrowDown')
 | 
			
		||||
    await page.keyboard.press('ArrowDown')
 | 
			
		||||
    await page.keyboard.press('ArrowDown')
 | 
			
		||||
    await expect(page.getByRole('option', { name: 'system' })).toHaveAttribute(
 | 
			
		||||
      'data-headlessui-state',
 | 
			
		||||
      'active'
 | 
			
		||||
    )
 | 
			
		||||
    await page.keyboard.press('Enter')
 | 
			
		||||
      // Try typing in the command bar
 | 
			
		||||
      await cmdSearchBar.fill('theme')
 | 
			
		||||
      const themeOption = page.getByRole('option', {
 | 
			
		||||
        name: 'Settings · app · theme',
 | 
			
		||||
      })
 | 
			
		||||
      await expect(themeOption).toBeVisible()
 | 
			
		||||
      await themeOption.click()
 | 
			
		||||
      const themeInput = page.getByPlaceholder('dark')
 | 
			
		||||
      await expect(themeInput).toBeVisible()
 | 
			
		||||
      await expect(themeInput).toBeFocused()
 | 
			
		||||
      // Select dark theme
 | 
			
		||||
      await page.keyboard.press('ArrowDown')
 | 
			
		||||
      await page.keyboard.press('ArrowDown')
 | 
			
		||||
      await page.keyboard.press('ArrowDown')
 | 
			
		||||
      await expect(
 | 
			
		||||
        page.getByRole('option', { name: 'system' })
 | 
			
		||||
      ).toHaveAttribute('data-headlessui-state', 'active')
 | 
			
		||||
      await page.keyboard.press('Enter')
 | 
			
		||||
 | 
			
		||||
    // Check the toast appeared
 | 
			
		||||
    await expect(
 | 
			
		||||
      page.getByText(`Set theme to "system" as a user default`)
 | 
			
		||||
    ).toBeVisible()
 | 
			
		||||
    // Check that the theme changed
 | 
			
		||||
    await expect(page.locator('body')).not.toHaveClass(`body-bg dark`)
 | 
			
		||||
  })
 | 
			
		||||
      // Check the toast appeared
 | 
			
		||||
      await expect(
 | 
			
		||||
        page.getByText(`Set theme to "system" as a user default`)
 | 
			
		||||
      ).toBeVisible()
 | 
			
		||||
      // Check that the theme changed
 | 
			
		||||
      await expect(page.locator('body')).not.toHaveClass(`body-bg dark`)
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  test('Can extrude from the command bar', async ({ page, homePage }) => {
 | 
			
		||||
    await page.addInitScript(async () => {
 | 
			
		||||
 | 
			
		||||
@ -966,106 +966,106 @@ test.describe('Editor tests', () => {
 | 
			
		||||
  |> close(%)`)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('Can undo a sketch modification with ctrl+z', async ({
 | 
			
		||||
    page,
 | 
			
		||||
    homePage,
 | 
			
		||||
  }) => {
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    await page.addInitScript(async () => {
 | 
			
		||||
      localStorage.setItem(
 | 
			
		||||
        'persistCode',
 | 
			
		||||
        `sketch001 = startSketchOn('XZ')
 | 
			
		||||
  test(
 | 
			
		||||
    'Can undo a sketch modification with ctrl+z',
 | 
			
		||||
    { tag: ['@skipWin'] },
 | 
			
		||||
    async ({ page, homePage }) => {
 | 
			
		||||
      const u = await getUtils(page)
 | 
			
		||||
      await page.addInitScript(async () => {
 | 
			
		||||
        localStorage.setItem(
 | 
			
		||||
          'persistCode',
 | 
			
		||||
          `sketch001 = startSketchOn('XZ')
 | 
			
		||||
  |> startProfileAt([4.61, -10.01], %)
 | 
			
		||||
  |> line([12.73, -0.09], %)
 | 
			
		||||
  |> tangentialArcTo([24.95, -0.38], %)
 | 
			
		||||
  |> close(%)
 | 
			
		||||
  |> extrude(5, %)`
 | 
			
		||||
      )
 | 
			
		||||
    })
 | 
			
		||||
        )
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
    await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
			
		||||
      await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
			
		||||
 | 
			
		||||
    await homePage.goToModelingScene()
 | 
			
		||||
    await expect(
 | 
			
		||||
      page.getByRole('button', { name: 'Start Sketch' })
 | 
			
		||||
    ).not.toBeDisabled()
 | 
			
		||||
      await homePage.goToModelingScene()
 | 
			
		||||
      await expect(
 | 
			
		||||
        page.getByRole('button', { name: 'Start Sketch' })
 | 
			
		||||
      ).not.toBeDisabled()
 | 
			
		||||
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await u.openAndClearDebugPanel()
 | 
			
		||||
    await u.sendCustomCmd({
 | 
			
		||||
      type: 'modeling_cmd_req',
 | 
			
		||||
      cmd_id: uuidv4(),
 | 
			
		||||
      cmd: {
 | 
			
		||||
        type: 'default_camera_look_at',
 | 
			
		||||
        vantage: { x: 0, y: -1250, z: 580 },
 | 
			
		||||
        center: { x: 0, y: 0, z: 0 },
 | 
			
		||||
        up: { x: 0, y: 0, z: 1 },
 | 
			
		||||
      },
 | 
			
		||||
    })
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await u.sendCustomCmd({
 | 
			
		||||
      type: 'modeling_cmd_req',
 | 
			
		||||
      cmd_id: uuidv4(),
 | 
			
		||||
      cmd: {
 | 
			
		||||
        type: 'default_camera_get_settings',
 | 
			
		||||
      },
 | 
			
		||||
    })
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await u.openAndClearDebugPanel()
 | 
			
		||||
      await u.sendCustomCmd({
 | 
			
		||||
        type: 'modeling_cmd_req',
 | 
			
		||||
        cmd_id: uuidv4(),
 | 
			
		||||
        cmd: {
 | 
			
		||||
          type: 'default_camera_look_at',
 | 
			
		||||
          vantage: { x: 0, y: -1250, z: 580 },
 | 
			
		||||
          center: { x: 0, y: 0, z: 0 },
 | 
			
		||||
          up: { x: 0, y: 0, z: 1 },
 | 
			
		||||
        },
 | 
			
		||||
      })
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await u.sendCustomCmd({
 | 
			
		||||
        type: 'modeling_cmd_req',
 | 
			
		||||
        cmd_id: uuidv4(),
 | 
			
		||||
        cmd: {
 | 
			
		||||
          type: 'default_camera_get_settings',
 | 
			
		||||
        },
 | 
			
		||||
      })
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
 | 
			
		||||
    const startPX = [1200 / 2, 500 / 2]
 | 
			
		||||
      const startPX = [1200 / 2, 500 / 2]
 | 
			
		||||
 | 
			
		||||
    const dragPX = 40
 | 
			
		||||
      const dragPX = 40
 | 
			
		||||
 | 
			
		||||
    await page.getByText('startProfileAt([4.61, -10.01], %)').click()
 | 
			
		||||
    await expect(
 | 
			
		||||
      page.getByRole('button', { name: 'Edit Sketch' })
 | 
			
		||||
    ).toBeVisible()
 | 
			
		||||
    await page.getByRole('button', { name: 'Edit Sketch' }).click()
 | 
			
		||||
    await page.waitForTimeout(400)
 | 
			
		||||
    let prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
      await page.getByText('startProfileAt([4.61, -10.01], %)').click()
 | 
			
		||||
      await expect(
 | 
			
		||||
        page.getByRole('button', { name: 'Edit Sketch' })
 | 
			
		||||
      ).toBeVisible()
 | 
			
		||||
      await page.getByRole('button', { name: 'Edit Sketch' }).click()
 | 
			
		||||
      await page.waitForTimeout(400)
 | 
			
		||||
      let prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
 | 
			
		||||
    await expect(page.getByTestId('segment-overlay')).toHaveCount(2)
 | 
			
		||||
      await expect(page.getByTestId('segment-overlay')).toHaveCount(2)
 | 
			
		||||
 | 
			
		||||
    // drag startProfileAt handle
 | 
			
		||||
    await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
      sourcePosition: { x: startPX[0] + 68, y: startPX[1] + 147 },
 | 
			
		||||
      targetPosition: { x: startPX[0] + dragPX, y: startPX[1] + dragPX },
 | 
			
		||||
    })
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
    prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
      // drag startProfileAt handle
 | 
			
		||||
      await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
        sourcePosition: { x: startPX[0] + 68, y: startPX[1] + 147 },
 | 
			
		||||
        targetPosition: { x: startPX[0] + dragPX, y: startPX[1] + dragPX },
 | 
			
		||||
      })
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
      prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
 | 
			
		||||
    // drag line handle
 | 
			
		||||
    // we wait so it saves the code
 | 
			
		||||
    await page.waitForTimeout(800)
 | 
			
		||||
      // drag line handle
 | 
			
		||||
      // we wait so it saves the code
 | 
			
		||||
      await page.waitForTimeout(800)
 | 
			
		||||
 | 
			
		||||
    const lineEnd = await u.getBoundingBox('[data-overlay-index="0"]')
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
      sourcePosition: { x: lineEnd.x - 5, y: lineEnd.y },
 | 
			
		||||
      targetPosition: { x: lineEnd.x + dragPX, y: lineEnd.y + dragPX },
 | 
			
		||||
    })
 | 
			
		||||
    await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
    prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
      const lineEnd = await u.getBoundingBox('[data-overlay-index="0"]')
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
        sourcePosition: { x: lineEnd.x - 5, y: lineEnd.y },
 | 
			
		||||
        targetPosition: { x: lineEnd.x + dragPX, y: lineEnd.y + dragPX },
 | 
			
		||||
      })
 | 
			
		||||
      await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
      prevContent = await page.locator('.cm-content').innerText()
 | 
			
		||||
 | 
			
		||||
    // we wait so it saves the code
 | 
			
		||||
    await page.waitForTimeout(800)
 | 
			
		||||
      // we wait so it saves the code
 | 
			
		||||
      await page.waitForTimeout(800)
 | 
			
		||||
 | 
			
		||||
    // drag tangentialArcTo handle
 | 
			
		||||
    const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]')
 | 
			
		||||
    await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
      sourcePosition: { x: tangentEnd.x + 10, y: tangentEnd.y - 5 },
 | 
			
		||||
      targetPosition: {
 | 
			
		||||
        x: tangentEnd.x + dragPX,
 | 
			
		||||
        y: tangentEnd.y + dragPX,
 | 
			
		||||
      },
 | 
			
		||||
    })
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
      // drag tangentialArcTo handle
 | 
			
		||||
      const tangentEnd = await u.getBoundingBox('[data-overlay-index="1"]')
 | 
			
		||||
      await page.dragAndDrop('#stream', '#stream', {
 | 
			
		||||
        sourcePosition: { x: tangentEnd.x + 10, y: tangentEnd.y - 5 },
 | 
			
		||||
        targetPosition: {
 | 
			
		||||
          x: tangentEnd.x + dragPX,
 | 
			
		||||
          y: tangentEnd.y + dragPX,
 | 
			
		||||
        },
 | 
			
		||||
      })
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await expect(page.locator('.cm-content')).not.toHaveText(prevContent)
 | 
			
		||||
 | 
			
		||||
    // expect the code to have changed
 | 
			
		||||
    await expect(page.locator('.cm-content'))
 | 
			
		||||
      .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
      // expect the code to have changed
 | 
			
		||||
      await expect(page.locator('.cm-content'))
 | 
			
		||||
        .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
    |> startProfileAt([2.71, -2.71], %)
 | 
			
		||||
    |> line([15.4, -2.78], %)
 | 
			
		||||
    |> tangentialArcTo([27.6, -3.05], %)
 | 
			
		||||
@ -1073,26 +1073,26 @@ test.describe('Editor tests', () => {
 | 
			
		||||
    |> extrude(5, %)
 | 
			
		||||
  `)
 | 
			
		||||
 | 
			
		||||
    // Hit undo
 | 
			
		||||
    await page.keyboard.down('Control')
 | 
			
		||||
    await page.keyboard.press('KeyZ')
 | 
			
		||||
    await page.keyboard.up('Control')
 | 
			
		||||
      // Hit undo
 | 
			
		||||
      await page.keyboard.down('Control')
 | 
			
		||||
      await page.keyboard.press('KeyZ')
 | 
			
		||||
      await page.keyboard.up('Control')
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content'))
 | 
			
		||||
      .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
      await expect(page.locator('.cm-content'))
 | 
			
		||||
        .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
    |> startProfileAt([2.71, -2.71], %)
 | 
			
		||||
    |> line([15.4, -2.78], %)
 | 
			
		||||
    |> tangentialArcTo([24.95, -0.38], %)
 | 
			
		||||
    |> close(%)
 | 
			
		||||
    |> extrude(5, %)`)
 | 
			
		||||
 | 
			
		||||
    // Hit undo again.
 | 
			
		||||
    await page.keyboard.down('Control')
 | 
			
		||||
    await page.keyboard.press('KeyZ')
 | 
			
		||||
    await page.keyboard.up('Control')
 | 
			
		||||
      // Hit undo again.
 | 
			
		||||
      await page.keyboard.down('Control')
 | 
			
		||||
      await page.keyboard.press('KeyZ')
 | 
			
		||||
      await page.keyboard.up('Control')
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content'))
 | 
			
		||||
      .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
      await expect(page.locator('.cm-content'))
 | 
			
		||||
        .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
    |> startProfileAt([2.71, -2.71], %)
 | 
			
		||||
    |> line([12.73, -0.09], %)
 | 
			
		||||
    |> tangentialArcTo([24.95, -0.38], %)
 | 
			
		||||
@ -1100,20 +1100,21 @@ test.describe('Editor tests', () => {
 | 
			
		||||
    |> extrude(5, %)
 | 
			
		||||
  `)
 | 
			
		||||
 | 
			
		||||
    // Hit undo again.
 | 
			
		||||
    await page.keyboard.down('Control')
 | 
			
		||||
    await page.keyboard.press('KeyZ')
 | 
			
		||||
    await page.keyboard.up('Control')
 | 
			
		||||
      // Hit undo again.
 | 
			
		||||
      await page.keyboard.down('Control')
 | 
			
		||||
      await page.keyboard.press('KeyZ')
 | 
			
		||||
      await page.keyboard.up('Control')
 | 
			
		||||
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
    await expect(page.locator('.cm-content'))
 | 
			
		||||
      .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
      await page.waitForTimeout(100)
 | 
			
		||||
      await expect(page.locator('.cm-content'))
 | 
			
		||||
        .toHaveText(`sketch001 = startSketchOn('XZ')
 | 
			
		||||
  |> startProfileAt([4.61, -10.01], %)
 | 
			
		||||
  |> line([12.73, -0.09], %)
 | 
			
		||||
  |> tangentialArcTo([24.95, -0.38], %)
 | 
			
		||||
  |> close(%)
 | 
			
		||||
  |> extrude(5, %)`)
 | 
			
		||||
  })
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  test.fixme(
 | 
			
		||||
    `Can use the import stdlib function on a local OBJ file`,
 | 
			
		||||
 | 
			
		||||
@ -19,7 +19,7 @@ test.describe('integrations tests', () => {
 | 
			
		||||
        )
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      const [clickObj] = await scene.makeMouseHelpers(600, 300)
 | 
			
		||||
      const [clickObj] = await scene.makeMouseHelpers(726, 272)
 | 
			
		||||
 | 
			
		||||
      await test.step('setup test', async () => {
 | 
			
		||||
        await homePage.expectState({
 | 
			
		||||
@ -61,6 +61,7 @@ test.describe('integrations tests', () => {
 | 
			
		||||
      })
 | 
			
		||||
      await test.step('setup for next assertion', async () => {
 | 
			
		||||
        await toolbar.openFile('main.kcl')
 | 
			
		||||
        await scene.waitForExecutionDone()
 | 
			
		||||
        await clickObj()
 | 
			
		||||
        await scene.moveNoWhere()
 | 
			
		||||
        await editor.expectState({
 | 
			
		||||
 | 
			
		||||
@ -89,18 +89,11 @@ export class HomePageFixture {
 | 
			
		||||
   * Maybe there a good sanity check we can do each time?
 | 
			
		||||
   */
 | 
			
		||||
  expectState = async (expectedState: HomePageState) => {
 | 
			
		||||
    await expect
 | 
			
		||||
      .poll(async () => {
 | 
			
		||||
        const [projectCards, sortBy] = await Promise.all([
 | 
			
		||||
          this._serialiseProjectCards(),
 | 
			
		||||
          this._serialiseSortBy(),
 | 
			
		||||
        ])
 | 
			
		||||
        return {
 | 
			
		||||
          projectCards,
 | 
			
		||||
          sortBy,
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .toEqual(expectedState)
 | 
			
		||||
    await expect.poll(this._serialiseSortBy).toEqual(expectedState.sortBy)
 | 
			
		||||
 | 
			
		||||
    for (const projectCard of expectedState.projectCards) {
 | 
			
		||||
      await expect.poll(this._serialiseProjectCards).toContainEqual(projectCard)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  createAndGoToProject = async (projectTitle = 'project-$nnn') => {
 | 
			
		||||
 | 
			
		||||
@ -62,7 +62,9 @@ export class ToolbarFixture {
 | 
			
		||||
    this.filePane = page.locator('#files-pane')
 | 
			
		||||
    this.featureTreePane = page.locator('#feature-tree-pane')
 | 
			
		||||
    this.fileCreateToast = page.getByText('Successfully created')
 | 
			
		||||
    this.exeIndicator = page.getByTestId('model-state-indicator-execution-done')
 | 
			
		||||
    this.exeIndicator = page.getByTestId(
 | 
			
		||||
      'model-state-indicator-receive-reliable'
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get logoLink() {
 | 
			
		||||
 | 
			
		||||
@ -2273,10 +2273,6 @@ radius = 8.69
 | 
			
		||||
    const lineCodeToSelection = `|> angledLine([0, 202.6], %, $rectangleSegmentA001)`
 | 
			
		||||
    await page.getByText(lineCodeToSelection).click()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
 | 
			
		||||
    const newCodeToFind = `revolve001 = revolve({angle = 360, axis = getOppositeEdge(rectangleSegmentA001)}, sketch002) `
 | 
			
		||||
    expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
 | 
			
		||||
@ -2328,10 +2324,6 @@ radius = 8.69
 | 
			
		||||
    const lineCodeToSelection = `|> xLine(2.6, %)`
 | 
			
		||||
    await page.getByText(lineCodeToSelection).click()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
    await cmdBar.progressCmdBar()
 | 
			
		||||
 | 
			
		||||
    const newCodeToFind = `revolve001 = revolve({ angle = 360, axis = seg01 }, sketch003)`
 | 
			
		||||
    expect(editor.expectEditor.toContain(newCodeToFind)).toBeTruthy()
 | 
			
		||||
 | 
			
		||||
@ -1527,34 +1527,32 @@ test(
 | 
			
		||||
  { tag: '@electron' },
 | 
			
		||||
  async ({ context, page, cmdBar, homePage }, testInfo) => {
 | 
			
		||||
    await context.folderSetupFn(async (dir) => {
 | 
			
		||||
      await Promise.all([
 | 
			
		||||
        fsp.mkdir(path.join(dir, 'router-template-slate'), { recursive: true }),
 | 
			
		||||
        fsp.mkdir(path.join(dir, 'bracket'), { recursive: true }),
 | 
			
		||||
      ])
 | 
			
		||||
      await Promise.all([
 | 
			
		||||
        fsp.copyFile(
 | 
			
		||||
          path.join(
 | 
			
		||||
            'src',
 | 
			
		||||
            'wasm-lib',
 | 
			
		||||
            'tests',
 | 
			
		||||
            'executor',
 | 
			
		||||
            'inputs',
 | 
			
		||||
            'router-template-slate.kcl'
 | 
			
		||||
          ),
 | 
			
		||||
          path.join(dir, 'router-template-slate', 'main.kcl')
 | 
			
		||||
      await fsp.mkdir(path.join(dir, 'router-template-slate'), {
 | 
			
		||||
        recursive: true,
 | 
			
		||||
      })
 | 
			
		||||
      await fsp.copyFile(
 | 
			
		||||
        path.join(
 | 
			
		||||
          'src',
 | 
			
		||||
          'wasm-lib',
 | 
			
		||||
          'tests',
 | 
			
		||||
          'executor',
 | 
			
		||||
          'inputs',
 | 
			
		||||
          'router-template-slate.kcl'
 | 
			
		||||
        ),
 | 
			
		||||
        fsp.copyFile(
 | 
			
		||||
          path.join(
 | 
			
		||||
            'src',
 | 
			
		||||
            'wasm-lib',
 | 
			
		||||
            'tests',
 | 
			
		||||
            'executor',
 | 
			
		||||
            'inputs',
 | 
			
		||||
            'focusrite_scarlett_mounting_braket.kcl'
 | 
			
		||||
          ),
 | 
			
		||||
          path.join(dir, 'bracket', 'main.kcl')
 | 
			
		||||
        path.join(dir, 'router-template-slate', 'main.kcl')
 | 
			
		||||
      )
 | 
			
		||||
      await fsp.mkdir(path.join(dir, 'bracket'), { recursive: true })
 | 
			
		||||
      await fsp.copyFile(
 | 
			
		||||
        path.join(
 | 
			
		||||
          'src',
 | 
			
		||||
          'wasm-lib',
 | 
			
		||||
          'tests',
 | 
			
		||||
          'executor',
 | 
			
		||||
          'inputs',
 | 
			
		||||
          'focusrite_scarlett_mounting_braket.kcl'
 | 
			
		||||
        ),
 | 
			
		||||
      ])
 | 
			
		||||
        path.join(dir, 'bracket', 'main.kcl')
 | 
			
		||||
      )
 | 
			
		||||
    })
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
			
		||||
 | 
			
		||||
@ -312,32 +312,40 @@ test.describe('Sketch tests', () => {
 | 
			
		||||
      |> line([1.97, 2.06], %)
 | 
			
		||||
      |> close(%)`)
 | 
			
		||||
    }
 | 
			
		||||
    test('code pane open at start-handles', async ({ page, homePage }) => {
 | 
			
		||||
      // Load the app with the code panes
 | 
			
		||||
      await page.addInitScript(async () => {
 | 
			
		||||
        localStorage.setItem(
 | 
			
		||||
          'store',
 | 
			
		||||
          JSON.stringify({
 | 
			
		||||
            state: {
 | 
			
		||||
              openPanes: ['code'],
 | 
			
		||||
            },
 | 
			
		||||
            version: 0,
 | 
			
		||||
          })
 | 
			
		||||
        )
 | 
			
		||||
      })
 | 
			
		||||
      await doEditSegmentsByDraggingHandle(page, homePage, ['code'])
 | 
			
		||||
    })
 | 
			
		||||
    test(
 | 
			
		||||
      'code pane open at start-handles',
 | 
			
		||||
      { tag: ['@skipWin'] },
 | 
			
		||||
      async ({ page, homePage }) => {
 | 
			
		||||
        // Load the app with the code panes
 | 
			
		||||
        await page.addInitScript(async () => {
 | 
			
		||||
          localStorage.setItem(
 | 
			
		||||
            'store',
 | 
			
		||||
            JSON.stringify({
 | 
			
		||||
              state: {
 | 
			
		||||
                openPanes: ['code'],
 | 
			
		||||
              },
 | 
			
		||||
              version: 0,
 | 
			
		||||
            })
 | 
			
		||||
          )
 | 
			
		||||
        })
 | 
			
		||||
        await doEditSegmentsByDraggingHandle(page, homePage, ['code'])
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    test('code pane closed at start-handles', async ({ page, homePage }) => {
 | 
			
		||||
      // Load the app with the code panes
 | 
			
		||||
      await page.addInitScript(async (persistModelingContext) => {
 | 
			
		||||
        localStorage.setItem(
 | 
			
		||||
          persistModelingContext,
 | 
			
		||||
          JSON.stringify({ openPanes: [] })
 | 
			
		||||
        )
 | 
			
		||||
      }, PERSIST_MODELING_CONTEXT)
 | 
			
		||||
      await doEditSegmentsByDraggingHandle(page, homePage, [])
 | 
			
		||||
    })
 | 
			
		||||
    test(
 | 
			
		||||
      'code pane closed at start-handles',
 | 
			
		||||
      { tag: ['@skipWin'] },
 | 
			
		||||
      async ({ page, homePage }) => {
 | 
			
		||||
        // Load the app with the code panes
 | 
			
		||||
        await page.addInitScript(async (persistModelingContext) => {
 | 
			
		||||
          localStorage.setItem(
 | 
			
		||||
            persistModelingContext,
 | 
			
		||||
            JSON.stringify({ openPanes: [] })
 | 
			
		||||
          )
 | 
			
		||||
        }, PERSIST_MODELING_CONTEXT)
 | 
			
		||||
        await doEditSegmentsByDraggingHandle(page, homePage, [])
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  test('Can edit a circle center and radius by dragging its handles', async ({
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user