* fix: Needed to increase timeout for this test. waitForExecutionDone does not work since there are errors in the KCL code * fix: again another wait for execution does not work * fix: bug that desyncs codeManager, executeCode, lspPlugin * fix: fixing react race condition on parsing numeric literals in command bar on open * fix: adding comment to clarify the gotcha * fix: saving off debugging... * fix: added wait for execution done * fix: removing testing code * fix: adding wait for execution done * fix: adding execution done wait * fix: only fixes the chamfer point and click delete * fix: add 1250ms before every progresscmdbar, removed model loaded scene state that is flaky, added toast if someone presses the command bar too quickly * fix: adding a wait for execution * fix: updating wait for execution * fix: wait for execution done * fix: wait for execution done * fix: not waiting for scene, not waiting for command bar * fix: restoring name * fix: auto fixes * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores) * fix: bad prompt fix * fix: Fixed testing selections with wait * fix: last wait fix * fix: trying to resolve more flakes when running with more workers * chore: adding a skipLocalEngine tag * fix: fixing test when using local engine * fix: codespell * fix: big if true * chore: skipping one more local engine tests that fails * fix: auto fix: * fix: restoring this testing code --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { test, expect } from './zoo-test'
 | 
						|
 | 
						|
/* eslint-disable jest/no-conditional-expect */
 | 
						|
 | 
						|
const file = `sketch001 = startSketchOn('XZ')
 | 
						|
profile001 = startProfileAt([57.81, 250.51], sketch001)
 | 
						|
  |> line(end = [121.13, 56.63], tag = $seg02)
 | 
						|
  |> line(end = [83.37, -34.61], tag = $seg01)
 | 
						|
  |> line(end = [19.66, -116.4])
 | 
						|
  |> line(end = [-221.8, -41.69])
 | 
						|
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
						|
  |> close()
 | 
						|
extrude001 = extrude(profile001, length = 200)
 | 
						|
sketch002 = startSketchOn('XZ')
 | 
						|
  |> startProfileAt([-73.64, -42.89], %)
 | 
						|
  |> xLine(173.71, %)
 | 
						|
  |> line(end = [-22.12, -94.4])
 | 
						|
  |> xLine(-156.98, %)
 | 
						|
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
						|
  |> close()
 | 
						|
extrude002 = extrude(sketch002, length = 50)
 | 
						|
sketch003 = startSketchOn('XY')
 | 
						|
  |> startProfileAt([52.92, 157.81], %)
 | 
						|
  |> angledLine([0, 176.4], %, $rectangleSegmentA001)
 | 
						|
  |> angledLine([
 | 
						|
       segAng(rectangleSegmentA001) - 90,
 | 
						|
       53.4
 | 
						|
     ], %, $rectangleSegmentB001)
 | 
						|
  |> angledLine([
 | 
						|
       segAng(rectangleSegmentA001),
 | 
						|
       -segLen(rectangleSegmentA001)
 | 
						|
     ], %, $rectangleSegmentC001)
 | 
						|
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
						|
  |> close()
 | 
						|
extrude003 = extrude(sketch003, length = 20)
 | 
						|
`
 | 
						|
 | 
						|
test.describe('Prompt-to-edit tests', { tag: '@skipWin' }, () => {
 | 
						|
  test.fixme('Check the happy path, for basic changing color', () => {
 | 
						|
    const cases = [
 | 
						|
      {
 | 
						|
        desc: 'User accepts change',
 | 
						|
        shouldReject: false,
 | 
						|
      },
 | 
						|
      {
 | 
						|
        desc: 'User rejects change',
 | 
						|
        shouldReject: true,
 | 
						|
      },
 | 
						|
    ] as const
 | 
						|
    for (const { desc, shouldReject } of cases) {
 | 
						|
      test(`${desc}`, async ({
 | 
						|
        context,
 | 
						|
        homePage,
 | 
						|
        cmdBar,
 | 
						|
        editor,
 | 
						|
        page,
 | 
						|
        scene,
 | 
						|
      }) => {
 | 
						|
        await context.addInitScript((file) => {
 | 
						|
          localStorage.setItem('persistCode', file)
 | 
						|
        }, file)
 | 
						|
        await homePage.goToModelingScene()
 | 
						|
        await scene.waitForExecutionDone()
 | 
						|
 | 
						|
        const body1CapCoords = { x: 571, y: 351 }
 | 
						|
        const greenCheckCoords = { x: 565, y: 345 }
 | 
						|
        const body2WallCoords = { x: 609, y: 153 }
 | 
						|
        const [clickBody1Cap] = scene.makeMouseHelpers(
 | 
						|
          body1CapCoords.x,
 | 
						|
          body1CapCoords.y
 | 
						|
        )
 | 
						|
        const yellow: [number, number, number] = [179, 179, 131]
 | 
						|
        const green: [number, number, number] = [108, 152, 75]
 | 
						|
        const notGreen: [number, number, number] = [132, 132, 132]
 | 
						|
        const body2NotGreen: [number, number, number] = [88, 88, 88]
 | 
						|
        const submittingToast = page.getByText(
 | 
						|
          'Submitting to Text-to-CAD API...'
 | 
						|
        )
 | 
						|
        const successToast = page.getByText('Prompt to edit successful')
 | 
						|
        const acceptBtn = page.getByRole('button', {
 | 
						|
          name: 'checkmark Accept',
 | 
						|
        })
 | 
						|
        const rejectBtn = page.getByRole('button', { name: 'close Reject' })
 | 
						|
 | 
						|
        await test.step('wait for scene to load select body and check selection came through', async () => {
 | 
						|
          await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15)
 | 
						|
          await clickBody1Cap()
 | 
						|
          await scene.expectPixelColor(yellow, body1CapCoords, 20)
 | 
						|
          await editor.expectState({
 | 
						|
            highlightedCode: '',
 | 
						|
            activeLines: ['|>startProfileAt([-73.64,-42.89],%)'],
 | 
						|
            diagnostics: [],
 | 
						|
          })
 | 
						|
        })
 | 
						|
 | 
						|
        await test.step('fire off edit prompt', async () => {
 | 
						|
          await cmdBar.openCmdBar('promptToEdit')
 | 
						|
          // being specific about the color with a hex means asserting pixel color is more stable
 | 
						|
          await page
 | 
						|
            .getByTestId('cmd-bar-arg-value')
 | 
						|
            .fill('make this neon green please, use #39FF14')
 | 
						|
          await page.waitForTimeout(100)
 | 
						|
          await cmdBar.progressCmdBar()
 | 
						|
          await expect(submittingToast).toBeVisible()
 | 
						|
          await expect(submittingToast).not.toBeVisible({
 | 
						|
            timeout: 2 * 60_000,
 | 
						|
          }) // can take a while
 | 
						|
          await expect(successToast).toBeVisible()
 | 
						|
        })
 | 
						|
 | 
						|
        await test.step('verify initial change', async () => {
 | 
						|
          await scene.expectPixelColor(green, greenCheckCoords, 15)
 | 
						|
          await scene.expectPixelColor(body2NotGreen, body2WallCoords, 15)
 | 
						|
          await editor.expectEditor.toContain('appearance(')
 | 
						|
        })
 | 
						|
 | 
						|
        if (!shouldReject) {
 | 
						|
          await test.step('check accept works and can be "undo"ed', async () => {
 | 
						|
            await acceptBtn.click()
 | 
						|
            await expect(successToast).not.toBeVisible()
 | 
						|
 | 
						|
            await scene.expectPixelColor(green, greenCheckCoords, 15)
 | 
						|
            await editor.expectEditor.toContain('appearance(')
 | 
						|
 | 
						|
            // ctrl-z works after accepting
 | 
						|
            await page.keyboard.down('ControlOrMeta')
 | 
						|
            await page.keyboard.press('KeyZ')
 | 
						|
            await page.keyboard.up('ControlOrMeta')
 | 
						|
            await editor.expectEditor.not.toContain('appearance(')
 | 
						|
            await scene.expectPixelColor(notGreen, greenCheckCoords, 15)
 | 
						|
          })
 | 
						|
        } else {
 | 
						|
          await test.step('check reject works', async () => {
 | 
						|
            await rejectBtn.click()
 | 
						|
            await expect(successToast).not.toBeVisible()
 | 
						|
 | 
						|
            await scene.expectPixelColor(notGreen, greenCheckCoords, 15)
 | 
						|
            await editor.expectEditor.not.toContain('appearance(')
 | 
						|
          })
 | 
						|
        }
 | 
						|
      })
 | 
						|
    }
 | 
						|
  })
 | 
						|
 | 
						|
  test(`bad edit prompt`, async ({
 | 
						|
    context,
 | 
						|
    homePage,
 | 
						|
    cmdBar,
 | 
						|
    editor,
 | 
						|
    toolbar,
 | 
						|
    page,
 | 
						|
    scene,
 | 
						|
  }) => {
 | 
						|
    await context.addInitScript((file) => {
 | 
						|
      localStorage.setItem('persistCode', file)
 | 
						|
    }, file)
 | 
						|
    await homePage.goToModelingScene()
 | 
						|
    await scene.waitForExecutionDone()
 | 
						|
 | 
						|
    const body1CapCoords = { x: 571, y: 351 }
 | 
						|
    const [clickBody1Cap] = scene.makeMouseHelpers(
 | 
						|
      body1CapCoords.x,
 | 
						|
      body1CapCoords.y
 | 
						|
    )
 | 
						|
    const yellow: [number, number, number] = [179, 179, 131]
 | 
						|
    const submittingToast = page.getByText('Submitting to Text-to-CAD API...')
 | 
						|
    const failToast = page.getByText(
 | 
						|
      'Failed to edit your KCL code, please try again with a different prompt or selection'
 | 
						|
    )
 | 
						|
 | 
						|
    await test.step('wait for scene to load and select body', async () => {
 | 
						|
      await scene.expectPixelColor([134, 134, 134], body1CapCoords, 15)
 | 
						|
 | 
						|
      await clickBody1Cap()
 | 
						|
      await scene.expectPixelColor(yellow, body1CapCoords, 20)
 | 
						|
 | 
						|
      await editor.expectState({
 | 
						|
        highlightedCode: '',
 | 
						|
        activeLines: ['|>startProfileAt([-73.64,-42.89],%)'],
 | 
						|
        diagnostics: [],
 | 
						|
      })
 | 
						|
    })
 | 
						|
 | 
						|
    await test.step('fire of bad prompt', async () => {
 | 
						|
      await cmdBar.openCmdBar('promptToEdit')
 | 
						|
      await page
 | 
						|
        .getByTestId('cmd-bar-arg-value')
 | 
						|
        .fill('ansheusha asnthuatshoeuhtaoetuhthaeu laughs in dvorak')
 | 
						|
      await page.waitForTimeout(100)
 | 
						|
      await cmdBar.progressCmdBar()
 | 
						|
      await expect(submittingToast).toBeVisible()
 | 
						|
    })
 | 
						|
    await test.step('check fail toast appeared', async () => {
 | 
						|
      await expect(submittingToast).not.toBeVisible({ timeout: 2 * 60_000 }) // can take a while
 | 
						|
      await expect(failToast).toBeVisible()
 | 
						|
    })
 | 
						|
  })
 | 
						|
})
 |