* add package.json Signed-off-by: Jess Frazelle <github@jessfraz.com> initial run; Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> more fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> clientsidescne Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> paths Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fix styles Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> combine Signed-off-by: Jess Frazelle <github@jessfraz.com> eslint rule Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> my ocd Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> constants file Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> no more import sceneInfra Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> try fix circular import Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com>
		
			
				
	
	
		
			338 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			338 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { uuidv4 } from '@src/lib/utils'
 | 
						|
 | 
						|
import { TEST_CODE_GIZMO } from '@e2e/playwright/storageStates'
 | 
						|
import { getUtils } from '@e2e/playwright/test-utils'
 | 
						|
import { expect, test } from '@e2e/playwright/zoo-test'
 | 
						|
 | 
						|
test.describe('Testing Gizmo', { tag: ['@skipWin'] }, () => {
 | 
						|
  const cases = [
 | 
						|
    {
 | 
						|
      testDescription: 'top view',
 | 
						|
      clickPosition: { x: 951, y: 347 },
 | 
						|
      expectedCameraPosition: { x: 800, y: -152, z: 4886.02 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
    {
 | 
						|
      testDescription: 'bottom view',
 | 
						|
      clickPosition: { x: 951, y: 391 },
 | 
						|
      expectedCameraPosition: { x: 800, y: -152, z: -4834.02 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
    {
 | 
						|
      testDescription: 'right view',
 | 
						|
      clickPosition: { x: 929, y: 379 },
 | 
						|
      expectedCameraPosition: { x: 5660.02, y: -152, z: 26 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
    {
 | 
						|
      testDescription: 'left view',
 | 
						|
      clickPosition: { x: 974, y: 359 },
 | 
						|
      expectedCameraPosition: { x: -4060.02, y: -152, z: 26 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
    {
 | 
						|
      testDescription: 'back view',
 | 
						|
      clickPosition: { x: 967, y: 383 },
 | 
						|
      expectedCameraPosition: { x: 800, y: 4708.02, z: 26 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
    {
 | 
						|
      testDescription: 'front view',
 | 
						|
      clickPosition: { x: 935, y: 355 },
 | 
						|
      expectedCameraPosition: { x: 800, y: -5012.02, z: 26 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    },
 | 
						|
  ] as const
 | 
						|
  for (const {
 | 
						|
    clickPosition,
 | 
						|
    expectedCameraPosition,
 | 
						|
    expectedCameraTarget,
 | 
						|
    testDescription,
 | 
						|
  } of cases) {
 | 
						|
    test(`check ${testDescription}`, async ({ page, homePage }) => {
 | 
						|
      const u = await getUtils(page)
 | 
						|
      await page.addInitScript((TEST_CODE_GIZMO) => {
 | 
						|
        localStorage.setItem('persistCode', TEST_CODE_GIZMO)
 | 
						|
      }, TEST_CODE_GIZMO)
 | 
						|
 | 
						|
      await page.setBodyDimensions({ width: 1000, height: 500 })
 | 
						|
 | 
						|
      await homePage.goToModelingScene()
 | 
						|
      await u.waitForPageLoad()
 | 
						|
 | 
						|
      await page.waitForTimeout(100)
 | 
						|
      // wait for execution done
 | 
						|
      await u.openDebugPanel()
 | 
						|
      await u.expectCmdLog('[data-message-type="execution-done"]')
 | 
						|
      await u.sendCustomCmd({
 | 
						|
        type: 'modeling_cmd_req',
 | 
						|
        cmd_id: uuidv4(),
 | 
						|
        cmd: {
 | 
						|
          type: 'default_camera_look_at',
 | 
						|
          vantage: {
 | 
						|
            x: 3000,
 | 
						|
            y: 3000,
 | 
						|
            z: 3000,
 | 
						|
          },
 | 
						|
          center: {
 | 
						|
            x: 800,
 | 
						|
            y: -152,
 | 
						|
            z: 26,
 | 
						|
          },
 | 
						|
          up: { x: 0, y: 0, z: 1 },
 | 
						|
        },
 | 
						|
      })
 | 
						|
      await page.waitForTimeout(100)
 | 
						|
      await u.clearCommandLogs()
 | 
						|
      await u.sendCustomCmd({
 | 
						|
        type: 'modeling_cmd_req',
 | 
						|
        cmd_id: uuidv4(),
 | 
						|
        cmd: {
 | 
						|
          type: 'default_camera_get_settings',
 | 
						|
        },
 | 
						|
      })
 | 
						|
      await u.waitForCmdReceive('default_camera_get_settings')
 | 
						|
 | 
						|
      await u.clearCommandLogs()
 | 
						|
      await page.mouse.move(clickPosition.x, clickPosition.y)
 | 
						|
      await page.waitForTimeout(100)
 | 
						|
      await page.mouse.click(clickPosition.x, clickPosition.y)
 | 
						|
      await page.mouse.move(0, 0)
 | 
						|
      await u.waitForCmdReceive('default_camera_look_at')
 | 
						|
      await u.clearCommandLogs()
 | 
						|
 | 
						|
      await u.sendCustomCmd({
 | 
						|
        type: 'modeling_cmd_req',
 | 
						|
        cmd_id: uuidv4(),
 | 
						|
        cmd: {
 | 
						|
          type: 'default_camera_get_settings',
 | 
						|
        },
 | 
						|
      })
 | 
						|
      await u.waitForCmdReceive('default_camera_get_settings')
 | 
						|
 | 
						|
      await Promise.all([
 | 
						|
        // position
 | 
						|
        expect(page.getByTestId('cam-x-position')).toHaveValue(
 | 
						|
          expectedCameraPosition.x.toString()
 | 
						|
        ),
 | 
						|
        expect(page.getByTestId('cam-y-position')).toHaveValue(
 | 
						|
          expectedCameraPosition.y.toString()
 | 
						|
        ),
 | 
						|
        expect(page.getByTestId('cam-z-position')).toHaveValue(
 | 
						|
          expectedCameraPosition.z.toString()
 | 
						|
        ),
 | 
						|
        // target
 | 
						|
        expect(page.getByTestId('cam-x-target')).toHaveValue(
 | 
						|
          expectedCameraTarget.x.toString()
 | 
						|
        ),
 | 
						|
        expect(page.getByTestId('cam-y-target')).toHaveValue(
 | 
						|
          expectedCameraTarget.y.toString()
 | 
						|
        ),
 | 
						|
        expect(page.getByTestId('cam-z-target')).toHaveValue(
 | 
						|
          expectedCameraTarget.z.toString()
 | 
						|
        ),
 | 
						|
      ])
 | 
						|
    })
 | 
						|
  }
 | 
						|
 | 
						|
  test('Context menu and popover menu', async ({ page, homePage }) => {
 | 
						|
    const testCase = {
 | 
						|
      testDescription: 'Right view',
 | 
						|
      expectedCameraPosition: { x: 5660.02, y: -152, z: 26 },
 | 
						|
      expectedCameraTarget: { x: 800, y: -152, z: 26 },
 | 
						|
    }
 | 
						|
 | 
						|
    // Test prelude taken from the above test
 | 
						|
    const u = await getUtils(page)
 | 
						|
    await page.addInitScript((TEST_CODE_GIZMO) => {
 | 
						|
      localStorage.setItem('persistCode', TEST_CODE_GIZMO)
 | 
						|
    }, TEST_CODE_GIZMO)
 | 
						|
    await page.setBodyDimensions({ width: 1000, height: 500 })
 | 
						|
 | 
						|
    await homePage.goToModelingScene()
 | 
						|
    await page.waitForTimeout(100)
 | 
						|
    // wait for execution done
 | 
						|
    await u.openDebugPanel()
 | 
						|
    await u.expectCmdLog('[data-message-type="execution-done"]')
 | 
						|
    await u.sendCustomCmd({
 | 
						|
      type: 'modeling_cmd_req',
 | 
						|
      cmd_id: uuidv4(),
 | 
						|
      cmd: {
 | 
						|
        type: 'default_camera_look_at',
 | 
						|
        vantage: {
 | 
						|
          x: 3000,
 | 
						|
          y: 3000,
 | 
						|
          z: 3000,
 | 
						|
        },
 | 
						|
        center: {
 | 
						|
          x: 800,
 | 
						|
          y: -152,
 | 
						|
          z: 26,
 | 
						|
        },
 | 
						|
        up: { x: 0, y: 0, z: 1 },
 | 
						|
      },
 | 
						|
    })
 | 
						|
    await page.waitForTimeout(100)
 | 
						|
    await u.clearCommandLogs()
 | 
						|
    await u.sendCustomCmd({
 | 
						|
      type: 'modeling_cmd_req',
 | 
						|
      cmd_id: uuidv4(),
 | 
						|
      cmd: {
 | 
						|
        type: 'default_camera_get_settings',
 | 
						|
      },
 | 
						|
    })
 | 
						|
    await u.waitForCmdReceive('default_camera_get_settings')
 | 
						|
 | 
						|
    // Now find and select the correct
 | 
						|
    // view from the context menu
 | 
						|
    await u.clearCommandLogs()
 | 
						|
    const gizmo = page.locator('[aria-label*=gizmo]')
 | 
						|
    await gizmo.click({ button: 'right' })
 | 
						|
    const buttonToTest = page.getByRole('button', {
 | 
						|
      name: testCase.testDescription,
 | 
						|
    })
 | 
						|
    await expect(buttonToTest).toBeVisible()
 | 
						|
    await buttonToTest.click()
 | 
						|
 | 
						|
    // Now assert we've moved to the correct view
 | 
						|
    // Taken from the above test
 | 
						|
    await u.waitForCmdReceive('default_camera_look_at')
 | 
						|
 | 
						|
    await u.sendCustomCmd({
 | 
						|
      type: 'modeling_cmd_req',
 | 
						|
      cmd_id: uuidv4(),
 | 
						|
      cmd: {
 | 
						|
        type: 'default_camera_get_settings',
 | 
						|
      },
 | 
						|
    })
 | 
						|
    await u.waitForCmdReceive('default_camera_get_settings')
 | 
						|
    await page.waitForTimeout(400)
 | 
						|
 | 
						|
    await Promise.all([
 | 
						|
      // position
 | 
						|
      expect(page.getByTestId('cam-x-position')).toHaveValue(
 | 
						|
        testCase.expectedCameraPosition.x.toString()
 | 
						|
      ),
 | 
						|
      expect(page.getByTestId('cam-y-position')).toHaveValue(
 | 
						|
        testCase.expectedCameraPosition.y.toString()
 | 
						|
      ),
 | 
						|
      expect(page.getByTestId('cam-z-position')).toHaveValue(
 | 
						|
        testCase.expectedCameraPosition.z.toString()
 | 
						|
      ),
 | 
						|
      // target
 | 
						|
      expect(page.getByTestId('cam-x-target')).toHaveValue(
 | 
						|
        testCase.expectedCameraTarget.x.toString()
 | 
						|
      ),
 | 
						|
      expect(page.getByTestId('cam-y-target')).toHaveValue(
 | 
						|
        testCase.expectedCameraTarget.y.toString()
 | 
						|
      ),
 | 
						|
      expect(page.getByTestId('cam-z-target')).toHaveValue(
 | 
						|
        testCase.expectedCameraTarget.z.toString()
 | 
						|
      ),
 | 
						|
    ])
 | 
						|
 | 
						|
    // Now test the popover menu.
 | 
						|
    // It has the same click handlers, so we can just
 | 
						|
    // test that it opens and contains the same content.
 | 
						|
    const gizmoPopoverButton = page.getByRole('button', {
 | 
						|
      name: 'view settings',
 | 
						|
    })
 | 
						|
    await expect(gizmoPopoverButton).toBeVisible()
 | 
						|
    await gizmoPopoverButton.click()
 | 
						|
    await expect(buttonToTest).toBeVisible()
 | 
						|
  })
 | 
						|
})
 | 
						|
 | 
						|
test.describe(`Testing gizmo, fixture-based`, () => {
 | 
						|
  test('Center on selection from menu, disable interaction in sketch mode', async ({
 | 
						|
    context,
 | 
						|
    page,
 | 
						|
    homePage,
 | 
						|
    cmdBar,
 | 
						|
    editor,
 | 
						|
    toolbar,
 | 
						|
    scene,
 | 
						|
  }) => {
 | 
						|
    await context.addInitScript(() => {
 | 
						|
      localStorage.setItem(
 | 
						|
        'persistCode',
 | 
						|
        `@settings(defaultLengthUnit = in)
 | 
						|
        const sketch002 = startSketchOn(XZ)
 | 
						|
          |> startProfileAt([-108.83, -57.48], %)
 | 
						|
          |> angledLine([0, 105.13], %, $rectangleSegmentA001)
 | 
						|
          |> angledLine([
 | 
						|
               segAng(rectangleSegmentA001) - 90,
 | 
						|
               77.9
 | 
						|
             ], %)
 | 
						|
          |> angledLine([
 | 
						|
               segAng(rectangleSegmentA001),
 | 
						|
               -segLen(rectangleSegmentA001)
 | 
						|
             ], %)
 | 
						|
          |> close()
 | 
						|
        const sketch001 = startSketchOn(XZ)
 | 
						|
          |> circle(center = [818.33, 168.1], radius = 182.8)
 | 
						|
          |> extrude(length = 50)
 | 
						|
      `
 | 
						|
      )
 | 
						|
    })
 | 
						|
 | 
						|
    await page.setBodyDimensions({ width: 1000, height: 500 })
 | 
						|
 | 
						|
    await homePage.goToModelingScene()
 | 
						|
    const u = await getUtils(page)
 | 
						|
    await u.waitForPageLoad()
 | 
						|
 | 
						|
    await test.step(`Setup`, async () => {
 | 
						|
      await scene.expectState({
 | 
						|
        camera: {
 | 
						|
          position: [11796.52, -39216.59, 21103.27],
 | 
						|
          target: [11796.52, -635, 3201.42],
 | 
						|
        },
 | 
						|
      })
 | 
						|
    })
 | 
						|
    const [clickCircle, moveToCircle] = scene.makeMouseHelpers(582, 217)
 | 
						|
 | 
						|
    await test.step(`Select an edge of this circle`, async () => {
 | 
						|
      const circleSnippet = 'circle(center = [818.33, 168.1], radius = 182.8)'
 | 
						|
      await moveToCircle()
 | 
						|
      await clickCircle()
 | 
						|
      await editor.expectState({
 | 
						|
        activeLines: ['|>' + circleSnippet],
 | 
						|
        highlightedCode: circleSnippet,
 | 
						|
        diagnostics: [],
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    await test.step(`Center on selection from menu`, async () => {
 | 
						|
      await scene.clickGizmoMenuItem('Center view on selection')
 | 
						|
    })
 | 
						|
 | 
						|
    await test.step(`Verify the camera moved`, async () => {
 | 
						|
      await scene.expectState({
 | 
						|
        camera: {
 | 
						|
          position: [20785.58, -39851.59, 22171.6],
 | 
						|
          target: [20785.58, -1270, 4269.74],
 | 
						|
        },
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    await test.step(`Gizmo should be disabled when in sketch mode`, async () => {
 | 
						|
      const exitSketchButton = page.getByRole('button', {
 | 
						|
        name: 'Exit sketch',
 | 
						|
      })
 | 
						|
 | 
						|
      await toolbar.editSketch()
 | 
						|
      await expect(exitSketchButton).toBeVisible()
 | 
						|
      const gizmoPopoverButton = page.getByRole('button', {
 | 
						|
        name: 'view settings',
 | 
						|
      })
 | 
						|
      await gizmoPopoverButton.click()
 | 
						|
      const buttonToTest = page.getByRole('button', {
 | 
						|
        name: 'right view',
 | 
						|
      })
 | 
						|
      await expect(buttonToTest).toBeVisible()
 | 
						|
      await expect(buttonToTest).toBeDisabled()
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |