Pass camera-movement.spec tests
This commit is contained in:
		@ -1,127 +1,30 @@
 | 
				
			|||||||
import { test, expect } from '@playwright/test'
 | 
					import { test, expect } from './zoo-test'
 | 
				
			||||||
import { EngineCommand } from 'lang/std/artifactGraph'
 | 
					import { EngineCommand } from 'lang/std/artifactGraph'
 | 
				
			||||||
import { uuidv4 } from 'lib/utils'
 | 
					import { uuidv4 } from 'lib/utils'
 | 
				
			||||||
import { getUtils, setup, tearDown } from './test-utils'
 | 
					import { getUtils,  } from './test-utils'
 | 
				
			||||||
 | 
					 | 
				
			||||||
test.beforeEach(async ({ context, page }, testInfo) => {
 | 
					 | 
				
			||||||
  await setup(context, page, testInfo)
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
test.afterEach(async ({ page }, testInfo) => {
 | 
					 | 
				
			||||||
  await tearDown(page, testInfo)
 | 
					 | 
				
			||||||
})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
test.describe('Testing Camera Movement', () => {
 | 
					test.describe('Testing Camera Movement', () => {
 | 
				
			||||||
  test('Can move camera reliably', async ({ page, context }) => {
 | 
					  test('Can move camera reliably', async ({ page, context, homePage }) => {
 | 
				
			||||||
    test.skip(process.platform === 'darwin', 'Can move camera reliably')
 | 
					  const u = await getUtils(page)
 | 
				
			||||||
    const u = await getUtils(page)
 | 
					  await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
				
			||||||
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
					  
 | 
				
			||||||
 | 
					  await homePage.goToModelingScene()
 | 
				
			||||||
    await u.waitForAuthSkipAppStart()
 | 
					  await u.openAndClearDebugPanel()
 | 
				
			||||||
    await u.openAndClearDebugPanel()
 | 
					  await u.closeKclCodePanel()
 | 
				
			||||||
    await u.closeKclCodePanel()
 | 
					  
 | 
				
			||||||
 | 
					  const camPos: [number, number, number] = [0, 85, 85]
 | 
				
			||||||
    const camPos: [number, number, number] = [0, 85, 85]
 | 
					  const bakeInRetries = async (
 | 
				
			||||||
    const bakeInRetries = async (
 | 
					    mouseActions: any,
 | 
				
			||||||
      mouseActions: any,
 | 
					    xyz: [number, number, number],
 | 
				
			||||||
      xyz: [number, number, number],
 | 
					    cnt = 0
 | 
				
			||||||
      cnt = 0
 | 
					  ) => {
 | 
				
			||||||
    ) => {
 | 
					    // hack that we're implemented our own retry instead of using retries built into playwright.
 | 
				
			||||||
      // hack that we're implemented our own retry instead of using retries built into playwright.
 | 
					    // however each of these camera drags can be flaky, because of udp
 | 
				
			||||||
      // however each of these camera drags can be flaky, because of udp
 | 
					    // and so putting them together means only one needs to fail to make this test extra flaky.
 | 
				
			||||||
      // and so putting them together means only one needs to fail to make this test extra flaky.
 | 
					    // this way we can retry within the test
 | 
				
			||||||
      // this way we can retry within the test
 | 
					    // We could break them out into separate tests, but the longest past of the test is waiting
 | 
				
			||||||
      // We could break them out into separate tests, but the longest past of the test is waiting
 | 
					    // for the stream to start, so it can be good to bundle related things together.
 | 
				
			||||||
      // for the stream to start, so it can be good to bundle related things together.
 | 
					  
 | 
				
			||||||
 | 
					 | 
				
			||||||
      const camCommand: EngineCommand = {
 | 
					 | 
				
			||||||
        type: 'modeling_cmd_req',
 | 
					 | 
				
			||||||
        cmd_id: uuidv4(),
 | 
					 | 
				
			||||||
        cmd: {
 | 
					 | 
				
			||||||
          type: 'default_camera_look_at',
 | 
					 | 
				
			||||||
          center: { x: 0, y: 0, z: 0 },
 | 
					 | 
				
			||||||
          vantage: { x: camPos[0], y: camPos[1], z: camPos[2] },
 | 
					 | 
				
			||||||
          up: { x: 0, y: 0, z: 1 },
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      const updateCamCommand: EngineCommand = {
 | 
					 | 
				
			||||||
        type: 'modeling_cmd_req',
 | 
					 | 
				
			||||||
        cmd_id: uuidv4(),
 | 
					 | 
				
			||||||
        cmd: {
 | 
					 | 
				
			||||||
          type: 'default_camera_get_settings',
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      await u.sendCustomCmd(camCommand)
 | 
					 | 
				
			||||||
      await page.waitForTimeout(100)
 | 
					 | 
				
			||||||
      await u.sendCustomCmd(updateCamCommand)
 | 
					 | 
				
			||||||
      await page.waitForTimeout(100)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // rotate
 | 
					 | 
				
			||||||
      await u.closeDebugPanel()
 | 
					 | 
				
			||||||
      await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
					 | 
				
			||||||
      await page.waitForTimeout(100)
 | 
					 | 
				
			||||||
      // const yo = page.getByTestId('cam-x-position').inputValue()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await u.doAndWaitForImageDiff(async () => {
 | 
					 | 
				
			||||||
        await mouseActions()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        await u.openAndClearDebugPanel()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        await u.closeDebugPanel()
 | 
					 | 
				
			||||||
        await page.waitForTimeout(100)
 | 
					 | 
				
			||||||
      }, 300)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await u.openAndClearDebugPanel()
 | 
					 | 
				
			||||||
      await page.getByTestId('cam-x-position').isVisible()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const vals = await Promise.all([
 | 
					 | 
				
			||||||
        page.getByTestId('cam-x-position').inputValue(),
 | 
					 | 
				
			||||||
        page.getByTestId('cam-y-position').inputValue(),
 | 
					 | 
				
			||||||
        page.getByTestId('cam-z-position').inputValue(),
 | 
					 | 
				
			||||||
      ])
 | 
					 | 
				
			||||||
      const xError = Math.abs(Number(vals[0]) + xyz[0])
 | 
					 | 
				
			||||||
      const yError = Math.abs(Number(vals[1]) + xyz[1])
 | 
					 | 
				
			||||||
      const zError = Math.abs(Number(vals[2]) + xyz[2])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      let shouldRetry = false
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (xError > 5 || yError > 5 || zError > 5) {
 | 
					 | 
				
			||||||
        if (cnt > 2) {
 | 
					 | 
				
			||||||
          console.log('xVal', vals[0], 'xError', xError)
 | 
					 | 
				
			||||||
          console.log('yVal', vals[1], 'yError', yError)
 | 
					 | 
				
			||||||
          console.log('zVal', vals[2], 'zError', zError)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          throw new Error('Camera position not as expected')
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        shouldRetry = true
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
					 | 
				
			||||||
      await page.waitForTimeout(100)
 | 
					 | 
				
			||||||
      if (shouldRetry) await bakeInRetries(mouseActions, xyz, cnt + 1)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    await bakeInRetries(async () => {
 | 
					 | 
				
			||||||
      await page.mouse.move(700, 200)
 | 
					 | 
				
			||||||
      await page.mouse.down({ button: 'right' })
 | 
					 | 
				
			||||||
      const appLogoBBox = await page.getByTestId('app-logo').boundingBox()
 | 
					 | 
				
			||||||
      expect(appLogoBBox).not.toBeNull()
 | 
					 | 
				
			||||||
      if (!appLogoBBox) throw new Error('app logo not found')
 | 
					 | 
				
			||||||
      await page.mouse.move(
 | 
					 | 
				
			||||||
        appLogoBBox.x + appLogoBBox.width / 2,
 | 
					 | 
				
			||||||
        appLogoBBox.y + appLogoBBox.height / 2
 | 
					 | 
				
			||||||
      )
 | 
					 | 
				
			||||||
      await page.mouse.move(600, 303)
 | 
					 | 
				
			||||||
      await page.mouse.up({ button: 'right' })
 | 
					 | 
				
			||||||
    }, [4, -10.5, -120])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await bakeInRetries(async () => {
 | 
					 | 
				
			||||||
      await page.keyboard.down('Shift')
 | 
					 | 
				
			||||||
      await page.mouse.move(600, 200)
 | 
					 | 
				
			||||||
      await page.mouse.down({ button: 'right' })
 | 
					 | 
				
			||||||
      await page.mouse.move(700, 200, { steps: 2 })
 | 
					 | 
				
			||||||
      await page.mouse.up({ button: 'right' })
 | 
					 | 
				
			||||||
      await page.keyboard.up('Shift')
 | 
					 | 
				
			||||||
    }, [-19, -85, -85])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const camCommand: EngineCommand = {
 | 
					    const camCommand: EngineCommand = {
 | 
				
			||||||
      type: 'modeling_cmd_req',
 | 
					      type: 'modeling_cmd_req',
 | 
				
			||||||
      cmd_id: uuidv4(),
 | 
					      cmd_id: uuidv4(),
 | 
				
			||||||
@ -143,340 +46,421 @@ test.describe('Testing Camera Movement', () => {
 | 
				
			|||||||
    await page.waitForTimeout(100)
 | 
					    await page.waitForTimeout(100)
 | 
				
			||||||
    await u.sendCustomCmd(updateCamCommand)
 | 
					    await u.sendCustomCmd(updateCamCommand)
 | 
				
			||||||
    await page.waitForTimeout(100)
 | 
					    await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
    await u.clearCommandLogs()
 | 
					    // rotate
 | 
				
			||||||
    await u.closeDebugPanel()
 | 
					    await u.closeDebugPanel()
 | 
				
			||||||
 | 
					 | 
				
			||||||
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
					 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // zoom
 | 
					 | 
				
			||||||
    await u.doAndWaitForImageDiff(async () => {
 | 
					 | 
				
			||||||
      await page.keyboard.down('Control')
 | 
					 | 
				
			||||||
      await page.mouse.move(700, 400)
 | 
					 | 
				
			||||||
      await page.mouse.down({ button: 'right' })
 | 
					 | 
				
			||||||
      await page.mouse.move(700, 300)
 | 
					 | 
				
			||||||
      await page.mouse.up({ button: 'right' })
 | 
					 | 
				
			||||||
      await page.keyboard.up('Control')
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await u.openDebugPanel()
 | 
					 | 
				
			||||||
      await page.waitForTimeout(300)
 | 
					 | 
				
			||||||
      await u.clearCommandLogs()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await u.closeDebugPanel()
 | 
					 | 
				
			||||||
    }, 300)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // zoom with scroll
 | 
					 | 
				
			||||||
    await u.openAndClearDebugPanel()
 | 
					 | 
				
			||||||
    // TODO, it appears we don't get the cam setting back from the engine when the interaction is zoom into `backInRetries` once the information is sent back on zoom
 | 
					 | 
				
			||||||
    // await expect(Math.abs(Number(await page.getByTestId('cam-x-position').inputValue()) + 12)).toBeLessThan(1.5)
 | 
					 | 
				
			||||||
    // await expect(Math.abs(Number(await page.getByTestId('cam-y-position').inputValue()) - 85)).toBeLessThan(1.5)
 | 
					 | 
				
			||||||
    // await expect(Math.abs(Number(await page.getByTestId('cam-z-position').inputValue()) - 85)).toBeLessThan(1.5)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await bakeInRetries(async () => {
 | 
					 | 
				
			||||||
      await page.mouse.move(700, 400)
 | 
					 | 
				
			||||||
      await page.mouse.wheel(0, -100)
 | 
					 | 
				
			||||||
    }, [0, -85, -85])
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  test('Zoom should be consistent when exiting or entering sketches', async ({
 | 
					 | 
				
			||||||
    page,
 | 
					 | 
				
			||||||
  }) => {
 | 
					 | 
				
			||||||
    // start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place
 | 
					 | 
				
			||||||
    // than zoom and pan outside of sketch mode and enter again and it should not change from where it is
 | 
					 | 
				
			||||||
    // than again for sketching
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    test.skip(process.platform !== 'darwin', 'Zoom should be consistent')
 | 
					 | 
				
			||||||
    const u = await getUtils(page)
 | 
					 | 
				
			||||||
    await page.setViewportSize({ width: 1200, height: 500 })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await u.waitForAuthSkipAppStart()
 | 
					 | 
				
			||||||
    await u.openDebugPanel()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await expect(
 | 
					 | 
				
			||||||
      page.getByRole('button', { name: 'Start Sketch' })
 | 
					 | 
				
			||||||
    ).not.toBeDisabled()
 | 
					 | 
				
			||||||
    await expect(
 | 
					 | 
				
			||||||
      page.getByRole('button', { name: 'Start Sketch' })
 | 
					 | 
				
			||||||
    ).toBeVisible()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // click on "Start Sketch" button
 | 
					 | 
				
			||||||
    await u.clearCommandLogs()
 | 
					 | 
				
			||||||
    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
					    await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
				
			||||||
    await page.waitForTimeout(100)
 | 
					    await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					    // const yo = page.getByTestId('cam-x-position').inputValue()
 | 
				
			||||||
    // select a plane
 | 
					  
 | 
				
			||||||
    await page.mouse.click(700, 325)
 | 
					    await u.doAndWaitForImageDiff(async () => {
 | 
				
			||||||
 | 
					      await mouseActions()
 | 
				
			||||||
    let code = `sketch001 = startSketchOn('XY')`
 | 
					  
 | 
				
			||||||
    await expect(u.codeLocator).toHaveText(code)
 | 
					      await u.openAndClearDebugPanel()
 | 
				
			||||||
    await u.closeDebugPanel()
 | 
					  
 | 
				
			||||||
 | 
					      await u.closeDebugPanel()
 | 
				
			||||||
    await page.waitForTimeout(500) // TODO detect animation ending, or disable animation
 | 
					      await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					    }, 300)
 | 
				
			||||||
    // move the camera slightly
 | 
					  
 | 
				
			||||||
    await page.keyboard.down('Shift')
 | 
					    await u.openAndClearDebugPanel()
 | 
				
			||||||
    await page.mouse.move(700, 300)
 | 
					    await page.getByTestId('cam-x-position').isVisible()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    const vals = await Promise.all([
 | 
				
			||||||
 | 
					      page.getByTestId('cam-x-position').inputValue(),
 | 
				
			||||||
 | 
					      page.getByTestId('cam-y-position').inputValue(),
 | 
				
			||||||
 | 
					      page.getByTestId('cam-z-position').inputValue(),
 | 
				
			||||||
 | 
					    ])
 | 
				
			||||||
 | 
					    const xError = Math.abs(Number(vals[0]) + xyz[0])
 | 
				
			||||||
 | 
					    const yError = Math.abs(Number(vals[1]) + xyz[1])
 | 
				
			||||||
 | 
					    const zError = Math.abs(Number(vals[2]) + xyz[2])
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    let shouldRetry = false
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    if (xError > 5 || yError > 5 || zError > 5) {
 | 
				
			||||||
 | 
					      if (cnt > 2) {
 | 
				
			||||||
 | 
					        console.log('xVal', vals[0], 'xError', xError)
 | 
				
			||||||
 | 
					        console.log('yVal', vals[1], 'yError', yError)
 | 
				
			||||||
 | 
					        console.log('zVal', vals[2], 'zError', zError)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					        throw new Error('Camera position not as expected')
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      shouldRetry = true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
				
			||||||
 | 
					    await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					    if (shouldRetry) await bakeInRetries(mouseActions, xyz, cnt + 1)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  await bakeInRetries(async () => {
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 200)
 | 
				
			||||||
    await page.mouse.down({ button: 'right' })
 | 
					    await page.mouse.down({ button: 'right' })
 | 
				
			||||||
    await page.mouse.move(800, 200)
 | 
					    const appLogoBBox = await page.getByTestId('app-logo').boundingBox()
 | 
				
			||||||
 | 
					    expect(appLogoBBox).not.toBeNull()
 | 
				
			||||||
 | 
					    if (!appLogoBBox) throw new Error('app logo not found')
 | 
				
			||||||
 | 
					    await page.mouse.move(
 | 
				
			||||||
 | 
					      appLogoBBox.x + appLogoBBox.width / 2,
 | 
				
			||||||
 | 
					      appLogoBBox.y + appLogoBBox.height / 2
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    await page.mouse.move(600, 303)
 | 
				
			||||||
 | 
					    await page.mouse.up({ button: 'right' })
 | 
				
			||||||
 | 
					  }, [4, -10.5, -120])
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await bakeInRetries(async () => {
 | 
				
			||||||
 | 
					    await page.keyboard.down('Shift')
 | 
				
			||||||
 | 
					    await page.mouse.move(600, 200)
 | 
				
			||||||
 | 
					    await page.mouse.down({ button: 'right' })
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 200, { steps: 2 })
 | 
				
			||||||
    await page.mouse.up({ button: 'right' })
 | 
					    await page.mouse.up({ button: 'right' })
 | 
				
			||||||
    await page.keyboard.up('Shift')
 | 
					    await page.keyboard.up('Shift')
 | 
				
			||||||
 | 
					  }, [-19, -85, -85])
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  const camCommand: EngineCommand = {
 | 
				
			||||||
 | 
					    type: 'modeling_cmd_req',
 | 
				
			||||||
 | 
					    cmd_id: uuidv4(),
 | 
				
			||||||
 | 
					    cmd: {
 | 
				
			||||||
 | 
					      type: 'default_camera_look_at',
 | 
				
			||||||
 | 
					      center: { x: 0, y: 0, z: 0 },
 | 
				
			||||||
 | 
					      vantage: { x: camPos[0], y: camPos[1], z: camPos[2] },
 | 
				
			||||||
 | 
					      up: { x: 0, y: 0, z: 1 },
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  const updateCamCommand: EngineCommand = {
 | 
				
			||||||
 | 
					    type: 'modeling_cmd_req',
 | 
				
			||||||
 | 
					    cmd_id: uuidv4(),
 | 
				
			||||||
 | 
					    cmd: {
 | 
				
			||||||
 | 
					      type: 'default_camera_get_settings',
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  await u.sendCustomCmd(camCommand)
 | 
				
			||||||
 | 
					  await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					  await u.sendCustomCmd(updateCamCommand)
 | 
				
			||||||
 | 
					  await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await u.clearCommandLogs()
 | 
				
			||||||
 | 
					  await u.closeDebugPanel()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // zoom
 | 
				
			||||||
 | 
					  await u.doAndWaitForImageDiff(async () => {
 | 
				
			||||||
 | 
					    await page.keyboard.down('Control')
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 400)
 | 
				
			||||||
 | 
					    await page.mouse.down({ button: 'right' })
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 300)
 | 
				
			||||||
 | 
					    await page.mouse.up({ button: 'right' })
 | 
				
			||||||
 | 
					    await page.keyboard.up('Control')
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    await u.openDebugPanel()
 | 
				
			||||||
 | 
					    await page.waitForTimeout(300)
 | 
				
			||||||
 | 
					    await u.clearCommandLogs()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    await u.closeDebugPanel()
 | 
				
			||||||
 | 
					  }, 300)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // zoom with scroll
 | 
				
			||||||
 | 
					  await u.openAndClearDebugPanel()
 | 
				
			||||||
 | 
					  // TODO, it appears we don't get the cam setting back from the engine when the interaction is zoom into `backInRetries` once the information is sent back on zoom
 | 
				
			||||||
 | 
					  // await expect(Math.abs(Number(await page.getByTestId('cam-x-position').inputValue()) + 12)).toBeLessThan(1.5)
 | 
				
			||||||
 | 
					  // await expect(Math.abs(Number(await page.getByTestId('cam-y-position').inputValue()) - 85)).toBeLessThan(1.5)
 | 
				
			||||||
 | 
					  // await expect(Math.abs(Number(await page.getByTestId('cam-z-position').inputValue()) - 85)).toBeLessThan(1.5)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await bakeInRetries(async () => {
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 400)
 | 
				
			||||||
 | 
					    await page.mouse.wheel(0, -100)
 | 
				
			||||||
 | 
					  }, [0, -85, -85]) })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let y = 350,
 | 
					  test('Zoom should be consistent when exiting or entering sketches', async ({ page,  homePage }) => { // start new sketch pan and zoom before exiting, when exiting the sketch should stay in the same place
 | 
				
			||||||
      x = 948
 | 
					  // than zoom and pan outside of sketch mode and enter again and it should not change from where it is
 | 
				
			||||||
 | 
					  // than again for sketching
 | 
				
			||||||
    await u.canvasLocator.click({ position: { x: 783, y } })
 | 
					  
 | 
				
			||||||
    code += `\n  |> startProfileAt([8.12, -12.98], %)`
 | 
					  test.skip(process.platform !== 'darwin', 'Zoom should be consistent')
 | 
				
			||||||
    // await expect(u.codeLocator).toHaveText(code)
 | 
					  const u = await getUtils(page)
 | 
				
			||||||
    await u.canvasLocator.click({ position: { x, y } })
 | 
					  await page.setBodyDimensions({ width: 1200, height: 500 })
 | 
				
			||||||
    code += `\n  |> line([11.18, 0], %)`
 | 
					  
 | 
				
			||||||
    // await expect(u.codeLocator).toHaveText(code)
 | 
					  await homePage.goToModelingScene()
 | 
				
			||||||
    await u.canvasLocator.click({ position: { x, y: 275 } })
 | 
					  await u.openDebugPanel()
 | 
				
			||||||
    code += `\n  |> line([0, 6.99], %)`
 | 
					  
 | 
				
			||||||
    // await expect(u.codeLocator).toHaveText(code)
 | 
					  await expect(
 | 
				
			||||||
 | 
					    page.getByRole('button', { name: 'Start Sketch' })
 | 
				
			||||||
    // click the line button
 | 
					  ).not.toBeDisabled()
 | 
				
			||||||
    await page.getByRole('button', { name: 'line Line', exact: true }).click()
 | 
					  await expect(
 | 
				
			||||||
 | 
					    page.getByRole('button', { name: 'Start Sketch' })
 | 
				
			||||||
    const hoverOverNothing = async () => {
 | 
					  ).toBeVisible()
 | 
				
			||||||
      // await u.canvasLocator.hover({position: {x: 700, y: 325}})
 | 
					  
 | 
				
			||||||
      await page.mouse.move(700, 325)
 | 
					  // click on "Start Sketch" button
 | 
				
			||||||
      await page.waitForTimeout(100)
 | 
					  await u.clearCommandLogs()
 | 
				
			||||||
      await expect(page.getByTestId('hover-highlight')).not.toBeVisible({
 | 
					  await page.getByRole('button', { name: 'Start Sketch' }).click()
 | 
				
			||||||
        timeout: 10_000,
 | 
					  await page.waitForTimeout(100)
 | 
				
			||||||
      })
 | 
					  
 | 
				
			||||||
    }
 | 
					  // select a plane
 | 
				
			||||||
 | 
					  await page.mouse.click(700, 325)
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight')).not.toBeVisible()
 | 
					  
 | 
				
			||||||
 | 
					  let code = `sketch001 = startSketchOn('XY')`
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  await expect(u.codeLocator).toHaveText(code)
 | 
				
			||||||
    // hover over horizontal line
 | 
					  await u.closeDebugPanel()
 | 
				
			||||||
    await u.canvasLocator.hover({ position: { x: 800, y } })
 | 
					  
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					  await page.waitForTimeout(500) // TODO detect animation ending, or disable animation
 | 
				
			||||||
      timeout: 10_000,
 | 
					  
 | 
				
			||||||
    })
 | 
					  // move the camera slightly
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  await page.keyboard.down('Shift')
 | 
				
			||||||
 | 
					  await page.mouse.move(700, 300)
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  await page.mouse.down({ button: 'right' })
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  await page.mouse.move(800, 200)
 | 
				
			||||||
    // hover over vertical line
 | 
					  await page.mouse.up({ button: 'right' })
 | 
				
			||||||
    await u.canvasLocator.hover({ position: { x, y: 325 } })
 | 
					  await page.keyboard.up('Shift')
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					  
 | 
				
			||||||
      timeout: 10_000,
 | 
					  let y = 350,
 | 
				
			||||||
    })
 | 
					    x = 948
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  await u.canvasLocator.click({ position: { x: 783, y } })
 | 
				
			||||||
 | 
					  code += `\n  |> startProfileAt([8.12, -12.98], %)`
 | 
				
			||||||
    // click exit sketch
 | 
					  // await expect(u.codeLocator).toHaveText(code)
 | 
				
			||||||
    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
					  await u.canvasLocator.click({ position: { x, y } })
 | 
				
			||||||
    await page.waitForTimeout(400)
 | 
					  code += `\n  |> line([11.18, 0], %)`
 | 
				
			||||||
 | 
					  // await expect(u.codeLocator).toHaveText(code)
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  await u.canvasLocator.click({ position: { x, y: 275 } })
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  code += `\n  |> line([0, 6.99], %)`
 | 
				
			||||||
    // hover over horizontal line
 | 
					  // await expect(u.codeLocator).toHaveText(code)
 | 
				
			||||||
    await page.mouse.move(858, y, { steps: 5 })
 | 
					  
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					  // click the line button
 | 
				
			||||||
      timeout: 10_000,
 | 
					  await page.getByRole('button', { name: 'line Line', exact: true }).click()
 | 
				
			||||||
    })
 | 
					  
 | 
				
			||||||
 | 
					  const hoverOverNothing = async () => {
 | 
				
			||||||
    await hoverOverNothing()
 | 
					    // await u.canvasLocator.hover({position: {x: 700, y: 325}})
 | 
				
			||||||
 | 
					    await page.mouse.move(700, 325)
 | 
				
			||||||
    // hover over vertical line
 | 
					 | 
				
			||||||
    await page.mouse.move(x, 325)
 | 
					 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					 | 
				
			||||||
      timeout: 10_000,
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await hoverOverNothing()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // hover over vertical line
 | 
					 | 
				
			||||||
    await page.mouse.move(857, y)
 | 
					 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					 | 
				
			||||||
      timeout: 10_000,
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    // now click it
 | 
					 | 
				
			||||||
    await page.mouse.click(857, y)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await expect(
 | 
					 | 
				
			||||||
      page.getByRole('button', { name: 'Edit Sketch' })
 | 
					 | 
				
			||||||
    ).toBeVisible()
 | 
					 | 
				
			||||||
    await hoverOverNothing()
 | 
					 | 
				
			||||||
    await page.getByRole('button', { name: 'Edit Sketch' }).click()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await page.waitForTimeout(400)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    x = 975
 | 
					 | 
				
			||||||
    y = 468
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await page.waitForTimeout(100)
 | 
					    await page.waitForTimeout(100)
 | 
				
			||||||
    await page.mouse.move(x, 419, { steps: 5 })
 | 
					    await expect(page.getByTestId('hover-highlight')).not.toBeVisible({
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					 | 
				
			||||||
      timeout: 10_000,
 | 
					      timeout: 10_000,
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight')).not.toBeVisible()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  // hover over horizontal line
 | 
				
			||||||
 | 
					  await u.canvasLocator.hover({ position: { x: 800, y } })
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  // hover over vertical line
 | 
				
			||||||
 | 
					  await u.canvasLocator.hover({ position: { x, y: 325 } })
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // click exit sketch
 | 
				
			||||||
 | 
					  await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(400)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  // hover over horizontal line
 | 
				
			||||||
 | 
					  await page.mouse.move(858, y, { steps: 5 })
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // hover over vertical line
 | 
				
			||||||
 | 
					  await page.mouse.move(x, 325)
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // hover over vertical line
 | 
				
			||||||
 | 
					  await page.mouse.move(857, y)
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  // now click it
 | 
				
			||||||
 | 
					  await page.mouse.click(857, y)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await expect(
 | 
				
			||||||
 | 
					    page.getByRole('button', { name: 'Edit Sketch' })
 | 
				
			||||||
 | 
					  ).toBeVisible()
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  await page.getByRole('button', { name: 'Edit Sketch' }).click()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.waitForTimeout(400)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  x = 975
 | 
				
			||||||
 | 
					  y = 468
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.waitForTimeout(100)
 | 
				
			||||||
 | 
					  await page.mouse.move(x, 419, { steps: 5 })
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.mouse.move(855, y)
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  await page.waitForTimeout(200)
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.mouse.move(x, 419)
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await hoverOverNothing()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await page.mouse.move(855, y)
 | 
				
			||||||
 | 
					  await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
				
			||||||
 | 
					    timeout: 10_000,
 | 
				
			||||||
 | 
					  }) })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  test(`Zoom by scroll should not fire while orbiting`, async ({ page, homePage }) => { /**
 | 
				
			||||||
 | 
					   * Currently we only allow zooming by scroll when no other camera movement is happening,
 | 
				
			||||||
    await page.mouse.move(855, y)
 | 
					   * set within cameraMouseDragGuards in cameraControls.ts,
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					   * until the engine supports unifying multiple camera movements.
 | 
				
			||||||
      timeout: 10_000,
 | 
					   * This verifies that scrollCallback's guard is working as expected.
 | 
				
			||||||
    })
 | 
					   */
 | 
				
			||||||
 | 
					  const u = await getUtils(page)
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  
 | 
				
			||||||
 | 
					  // Constants and locators
 | 
				
			||||||
    await page.getByRole('button', { name: 'Exit Sketch' }).click()
 | 
					  const settingsLink = page.getByTestId('settings-link')
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  const settingsDialogHeading = page.getByRole('heading', {
 | 
				
			||||||
 | 
					    name: 'Settings',
 | 
				
			||||||
    await hoverOverNothing()
 | 
					    exact: true,
 | 
				
			||||||
    await page.waitForTimeout(200)
 | 
					  })
 | 
				
			||||||
 | 
					  const userSettingsTab = page.getByRole('radio', { name: 'User' })
 | 
				
			||||||
    await page.mouse.move(x, 419)
 | 
					  const mouseControlsSetting = page
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					    .locator('#mouseControls')
 | 
				
			||||||
      timeout: 10_000,
 | 
					    .getByRole('combobox')
 | 
				
			||||||
    })
 | 
					  const mouseControlSuccesToast = page.getByText(
 | 
				
			||||||
 | 
					    'Set mouse controls to "Solidworks"'
 | 
				
			||||||
    await hoverOverNothing()
 | 
					  )
 | 
				
			||||||
 | 
					  const settingsCloseButton = page.getByTestId('settings-close-button')
 | 
				
			||||||
    await page.mouse.move(855, y)
 | 
					  const gizmo = page.locator('[aria-label*=gizmo]')
 | 
				
			||||||
    await expect(page.getByTestId('hover-highlight').first()).toBeVisible({
 | 
					  const resetCameraButton = page.getByRole('button', { name: 'Reset view' })
 | 
				
			||||||
      timeout: 10_000,
 | 
					  const orbitMouseStart = { x: 800, y: 130 }
 | 
				
			||||||
 | 
					  const orbitMouseEnd = { x: 0, y: 130 }
 | 
				
			||||||
 | 
					  const mid = (v1: number, v2: number) => v1 + (v2 - v1) / 2
 | 
				
			||||||
 | 
					  type Point = { x: number; y: number }
 | 
				
			||||||
 | 
					  const midPoint = (p1: Point, p2: Point) => ({
 | 
				
			||||||
 | 
					    x: mid(p1.x, p2.x),
 | 
				
			||||||
 | 
					    y: mid(p1.y, p2.y),
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  const orbitMouseStepOne = midPoint(orbitMouseStart, orbitMouseEnd)
 | 
				
			||||||
 | 
					  const expectedStartCamZPosition = 64.0
 | 
				
			||||||
 | 
					  const expectedZoomCamZPosition = 32.0
 | 
				
			||||||
 | 
					  const expectedOrbitCamZPosition = 64.0
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await test.step(`Test setup`, async () => {
 | 
				
			||||||
 | 
					    await homePage.goToModelingScene()
 | 
				
			||||||
 | 
					    await u.closeKclCodePanel()
 | 
				
			||||||
 | 
					    // This test requires the mouse controls to be set to Solidworks
 | 
				
			||||||
 | 
					    await u.openDebugPanel()
 | 
				
			||||||
 | 
					    await test.step(`Set mouse controls setting to Solidworks`, async () => {
 | 
				
			||||||
 | 
					      await settingsLink.click()
 | 
				
			||||||
 | 
					      await expect(settingsDialogHeading).toBeVisible()
 | 
				
			||||||
 | 
					      await userSettingsTab.click()
 | 
				
			||||||
 | 
					      await mouseControlsSetting.selectOption({ label: 'Solidworks' })
 | 
				
			||||||
 | 
					      await expect(mouseControlSuccesToast).toBeVisible()
 | 
				
			||||||
 | 
					      await settingsCloseButton.click()
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
  })
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  test(`Zoom by scroll should not fire while orbiting`, async ({ page }) => {
 | 
					  await test.step(`Test scrolling zoom works`, async () => {
 | 
				
			||||||
    /**
 | 
					    await resetCamera()
 | 
				
			||||||
     * Currently we only allow zooming by scroll when no other camera movement is happening,
 | 
					    await page.mouse.move(orbitMouseStart.x, orbitMouseStart.y)
 | 
				
			||||||
     * set within cameraMouseDragGuards in cameraControls.ts,
 | 
					    await page.mouse.wheel(0, -100)
 | 
				
			||||||
     * until the engine supports unifying multiple camera movements.
 | 
					    await test.step(`Force a refresh of the camera position`, async () => {
 | 
				
			||||||
     * This verifies that scrollCallback's guard is working as expected.
 | 
					      await u.openAndClearDebugPanel()
 | 
				
			||||||
     */
 | 
					      await u.sendCustomCmd({
 | 
				
			||||||
    const u = await getUtils(page)
 | 
					        type: 'modeling_cmd_req',
 | 
				
			||||||
 | 
					        cmd_id: uuidv4(),
 | 
				
			||||||
    // Constants and locators
 | 
					        cmd: {
 | 
				
			||||||
    const settingsLink = page.getByTestId('settings-link')
 | 
					          type: 'default_camera_get_settings',
 | 
				
			||||||
    const settingsDialogHeading = page.getByRole('heading', {
 | 
					        },
 | 
				
			||||||
      name: 'Settings',
 | 
					 | 
				
			||||||
      exact: true,
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    const userSettingsTab = page.getByRole('radio', { name: 'User' })
 | 
					 | 
				
			||||||
    const mouseControlsSetting = page
 | 
					 | 
				
			||||||
      .locator('#mouseControls')
 | 
					 | 
				
			||||||
      .getByRole('combobox')
 | 
					 | 
				
			||||||
    const mouseControlSuccesToast = page.getByText(
 | 
					 | 
				
			||||||
      'Set mouse controls to "Solidworks"'
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    const settingsCloseButton = page.getByTestId('settings-close-button')
 | 
					 | 
				
			||||||
    const gizmo = page.locator('[aria-label*=gizmo]')
 | 
					 | 
				
			||||||
    const resetCameraButton = page.getByRole('button', { name: 'Reset view' })
 | 
					 | 
				
			||||||
    const orbitMouseStart = { x: 800, y: 130 }
 | 
					 | 
				
			||||||
    const orbitMouseEnd = { x: 0, y: 130 }
 | 
					 | 
				
			||||||
    const mid = (v1: number, v2: number) => v1 + (v2 - v1) / 2
 | 
					 | 
				
			||||||
    type Point = { x: number; y: number }
 | 
					 | 
				
			||||||
    const midPoint = (p1: Point, p2: Point) => ({
 | 
					 | 
				
			||||||
      x: mid(p1.x, p2.x),
 | 
					 | 
				
			||||||
      y: mid(p1.y, p2.y),
 | 
					 | 
				
			||||||
    })
 | 
					 | 
				
			||||||
    const orbitMouseStepOne = midPoint(orbitMouseStart, orbitMouseEnd)
 | 
					 | 
				
			||||||
    const expectedStartCamZPosition = 64.0
 | 
					 | 
				
			||||||
    const expectedZoomCamZPosition = 32.0
 | 
					 | 
				
			||||||
    const expectedOrbitCamZPosition = 64.0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    await test.step(`Test setup`, async () => {
 | 
					 | 
				
			||||||
      await u.waitForAuthSkipAppStart()
 | 
					 | 
				
			||||||
      await u.closeKclCodePanel()
 | 
					 | 
				
			||||||
      // This test requires the mouse controls to be set to Solidworks
 | 
					 | 
				
			||||||
      await u.openDebugPanel()
 | 
					 | 
				
			||||||
      await test.step(`Set mouse controls setting to Solidworks`, async () => {
 | 
					 | 
				
			||||||
        await settingsLink.click()
 | 
					 | 
				
			||||||
        await expect(settingsDialogHeading).toBeVisible()
 | 
					 | 
				
			||||||
        await userSettingsTab.click()
 | 
					 | 
				
			||||||
        await mouseControlsSetting.selectOption({ label: 'Solidworks' })
 | 
					 | 
				
			||||||
        await expect(mouseControlSuccesToast).toBeVisible()
 | 
					 | 
				
			||||||
        await settingsCloseButton.click()
 | 
					 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
 | 
					      await u.waitForCmdReceive('default_camera_get_settings')
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
    await test.step(`Test scrolling zoom works`, async () => {
 | 
					    await expect
 | 
				
			||||||
      await resetCamera()
 | 
					      .poll(getCameraZValue, {
 | 
				
			||||||
      await page.mouse.move(orbitMouseStart.x, orbitMouseStart.y)
 | 
					        message: 'Camera should be at expected position after zooming',
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .toEqual(expectedZoomCamZPosition)
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await test.step(`Test orbiting works`, async () => {
 | 
				
			||||||
 | 
					    await doOrbitWith()
 | 
				
			||||||
 | 
					  })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  await test.step(`Test scrolling while orbiting doesn't zoom`, async () => {
 | 
				
			||||||
 | 
					    await doOrbitWith(async () => {
 | 
				
			||||||
      await page.mouse.wheel(0, -100)
 | 
					      await page.mouse.wheel(0, -100)
 | 
				
			||||||
      await test.step(`Force a refresh of the camera position`, async () => {
 | 
					    })
 | 
				
			||||||
        await u.openAndClearDebugPanel()
 | 
					  })
 | 
				
			||||||
        await u.sendCustomCmd({
 | 
					  
 | 
				
			||||||
          type: 'modeling_cmd_req',
 | 
					  // Helper functions
 | 
				
			||||||
          cmd_id: uuidv4(),
 | 
					  async function resetCamera() {
 | 
				
			||||||
          cmd: {
 | 
					    await test.step(`Reset camera`, async () => {
 | 
				
			||||||
            type: 'default_camera_get_settings',
 | 
					      await u.openDebugPanel()
 | 
				
			||||||
          },
 | 
					      await u.clearCommandLogs()
 | 
				
			||||||
        })
 | 
					      await u.doAndWaitForCmd(async () => {
 | 
				
			||||||
        await u.waitForCmdReceive('default_camera_get_settings')
 | 
					        await gizmo.click({ button: 'right' })
 | 
				
			||||||
      })
 | 
					        await resetCameraButton.click()
 | 
				
			||||||
 | 
					      }, 'zoom_to_fit')
 | 
				
			||||||
      await expect
 | 
					      await expect
 | 
				
			||||||
        .poll(getCameraZValue, {
 | 
					        .poll(getCameraZValue, {
 | 
				
			||||||
          message: 'Camera should be at expected position after zooming',
 | 
					          message: 'Camera Z should be at expected position after reset',
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        .toEqual(expectedZoomCamZPosition)
 | 
					        .toEqual(expectedStartCamZPosition)
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
    await test.step(`Test orbiting works`, async () => {
 | 
					  
 | 
				
			||||||
      await doOrbitWith()
 | 
					  async function getCameraZValue() {
 | 
				
			||||||
    })
 | 
					    return page
 | 
				
			||||||
 | 
					      .getByTestId('cam-z-position')
 | 
				
			||||||
    await test.step(`Test scrolling while orbiting doesn't zoom`, async () => {
 | 
					      .inputValue()
 | 
				
			||||||
      await doOrbitWith(async () => {
 | 
					      .then((value) => parseFloat(value))
 | 
				
			||||||
        await page.mouse.wheel(0, -100)
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  async function doOrbitWith(callback = async () => {}) {
 | 
				
			||||||
 | 
					    await resetCamera()
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					    await test.step(`Perform orbit`, async () => {
 | 
				
			||||||
 | 
					      await page.mouse.move(orbitMouseStart.x, orbitMouseStart.y)
 | 
				
			||||||
 | 
					      await page.mouse.down({ button: 'middle' })
 | 
				
			||||||
 | 
					      await page.mouse.move(orbitMouseStepOne.x, orbitMouseStepOne.y, {
 | 
				
			||||||
 | 
					        steps: 3,
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      await callback()
 | 
				
			||||||
 | 
					      await page.mouse.move(orbitMouseEnd.x, orbitMouseEnd.y, {
 | 
				
			||||||
 | 
					        steps: 3,
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
    // Helper functions
 | 
					    await test.step(`Verify orbit`, async () => {
 | 
				
			||||||
    async function resetCamera() {
 | 
					      await expect
 | 
				
			||||||
      await test.step(`Reset camera`, async () => {
 | 
					        .poll(getCameraZValue, {
 | 
				
			||||||
        await u.openDebugPanel()
 | 
					          message: 'Camera should be at expected position after orbiting',
 | 
				
			||||||
        await u.clearCommandLogs()
 | 
					 | 
				
			||||||
        await u.doAndWaitForCmd(async () => {
 | 
					 | 
				
			||||||
          await gizmo.click({ button: 'right' })
 | 
					 | 
				
			||||||
          await resetCameraButton.click()
 | 
					 | 
				
			||||||
        }, 'zoom_to_fit')
 | 
					 | 
				
			||||||
        await expect
 | 
					 | 
				
			||||||
          .poll(getCameraZValue, {
 | 
					 | 
				
			||||||
            message: 'Camera Z should be at expected position after reset',
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
          .toEqual(expectedStartCamZPosition)
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    async function getCameraZValue() {
 | 
					 | 
				
			||||||
      return page
 | 
					 | 
				
			||||||
        .getByTestId('cam-z-position')
 | 
					 | 
				
			||||||
        .inputValue()
 | 
					 | 
				
			||||||
        .then((value) => parseFloat(value))
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    async function doOrbitWith(callback = async () => {}) {
 | 
					 | 
				
			||||||
      await resetCamera()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await test.step(`Perform orbit`, async () => {
 | 
					 | 
				
			||||||
        await page.mouse.move(orbitMouseStart.x, orbitMouseStart.y)
 | 
					 | 
				
			||||||
        await page.mouse.down({ button: 'middle' })
 | 
					 | 
				
			||||||
        await page.mouse.move(orbitMouseStepOne.x, orbitMouseStepOne.y, {
 | 
					 | 
				
			||||||
          steps: 3,
 | 
					 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        await callback()
 | 
					        .toEqual(expectedOrbitCamZPosition)
 | 
				
			||||||
        await page.mouse.move(orbitMouseEnd.x, orbitMouseEnd.y, {
 | 
					      await page.mouse.up({ button: 'middle' })
 | 
				
			||||||
          steps: 3,
 | 
					    })
 | 
				
			||||||
        })
 | 
					  } })
 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      await test.step(`Verify orbit`, async () => {
 | 
					 | 
				
			||||||
        await expect
 | 
					 | 
				
			||||||
          .poll(getCameraZValue, {
 | 
					 | 
				
			||||||
            message: 'Camera should be at expected position after orbiting',
 | 
					 | 
				
			||||||
          })
 | 
					 | 
				
			||||||
          .toEqual(expectedOrbitCamZPosition)
 | 
					 | 
				
			||||||
        await page.mouse.up({ button: 'middle' })
 | 
					 | 
				
			||||||
      })
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  })
 | 
					 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user