Extreme time eaten by gizmo test fixes. All passing now.

This commit is contained in:
49lf
2024-11-28 18:11:28 -05:00
parent 04edc3a332
commit 9a3075533b
8 changed files with 914 additions and 905 deletions

View File

@ -52,11 +52,10 @@ export class SceneFixture {
} }
expectState = async (expected: SceneSerialised) => { expectState = async (expected: SceneSerialised) => {
return expect return expect.poll(async () => await this._serialiseScene(), {
.poll(() => this._serialiseScene(), { intervals: [1_000, 2_000, 10_000],
message: `Expected scene state to match`, timeout: 60000,
}) }).toEqual(expected)
.toEqual(expected)
} }
reConstruct = (page: Page) => { reConstruct = (page: Page) => {
@ -187,7 +186,10 @@ export class SceneFixture {
type: 'default_camera_get_settings', type: 'default_camera_get_settings',
}, },
}) })
await this.waitForExecutionDone() await this.page
.locator(`[data-receive-command-type="default_camera_get_settings"]`)
.first()
.waitFor()
const position = await Promise.all([ const position = await Promise.all([
this.page.getByTestId('cam-x-position').inputValue().then(Number), this.page.getByTestId('cam-x-position').inputValue().then(Number),
this.page.getByTestId('cam-y-position').inputValue().then(Number), this.page.getByTestId('cam-y-position').inputValue().then(Number),
@ -222,6 +224,7 @@ export class SceneFixture {
} }
async clickGizmoMenuItem(name: string) { async clickGizmoMenuItem(name: string) {
await this.gizmo.hover()
await this.gizmo.click({ button: 'right' }) await this.gizmo.click({ button: 'right' })
const buttonToTest = this.page.getByRole('button', { const buttonToTest = this.page.getByRole('button', {
name: name, name: name,

View File

@ -98,12 +98,16 @@ async function removeCurrentCode(page: Page) {
} }
export async function sendCustomCmd(page: Page, cmd: EngineCommand) { export async function sendCustomCmd(page: Page, cmd: EngineCommand) {
await page.getByTestId('custom-cmd-input').fill(JSON.stringify(cmd)) const json = JSON.stringify(cmd)
await page.getByTestId('custom-cmd-input').fill(json)
await expect(page.getByTestId('custom-cmd-input')).toHaveValue(json)
await page.getByTestId('custom-cmd-send-button').scrollIntoViewIfNeeded() await page.getByTestId('custom-cmd-send-button').scrollIntoViewIfNeeded()
await page.getByTestId('custom-cmd-send-button').click({ delay: 1000 }) await page.getByTestId('custom-cmd-send-button').click()
} }
async function clearCommandLogs(page: Page) { async function clearCommandLogs(page: Page) {
await page.getByTestId('custom-cmd-input').fill('')
await page.getByTestId('clear-commands').scrollIntoViewIfNeeded()
await page.getByTestId('clear-commands').click() await page.getByTestId('clear-commands').click()
} }

View File

@ -1,18 +1,11 @@
import { test, expect } from '@playwright/test' import { test, expect } from './zoo-test'
import { getUtils, setup, tearDown, TEST_COLORS } from './test-utils' import { getUtils, TEST_COLORS } from './test-utils'
import { XOR } from 'lib/utils' import { XOR } from 'lib/utils'
test.beforeEach(async ({ context, page }, testInfo) => {
await setup(context, page, testInfo)
})
test.afterEach(async ({ page }, testInfo) => {
await tearDown(page, testInfo)
})
test.describe('Testing constraints', () => { test.describe('Testing constraints', () => {
test('Can constrain line length', async ({ page }) => { test('Can constrain line length', async ({ page, homePage }) => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
@ -26,46 +19,37 @@ test.describe('Testing constraints', () => {
}) })
const u = await getUtils(page) const u = await getUtils(page)
// constants and locators const PUR = 400 / 37.5 //pixeltoUnitRatio
const lengthValue = { await page.setBodyDimensions({ width: 1200, height: 500 })
old: '20',
new: '25',
}
const cmdBarKclInput = page
.getByTestId('cmd-bar-arg-value')
.getByRole('textbox')
const cmdBarSubmitButton = page.getByRole('button', {
name: 'arrow right Continue',
})
await page.setViewportSize({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await u.openDebugPanel() await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]') await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel() await u.closeDebugPanel()
// Click the line of code for line. // Click the line of code for line.
// TODO remove this and reinstate `await topHorzSegmentClick()` await page.getByText(`line([0, 20], %)`).click() // TODO remove this and reinstate // await topHorzSegmentClick()
await page.getByText(`line([0, ${lengthValue.old}], %)`).click()
await page.waitForTimeout(100) await page.waitForTimeout(100)
// enter sketch again // enter sketch again
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(500) // wait for animation await page.waitForTimeout(500) // wait for animation
const startXPx = 500
await page.mouse.move(startXPx + PUR * 15, 250 - PUR * 10)
await page.keyboard.down('Shift')
await page.mouse.click(834, 244)
await page.keyboard.up('Shift')
await page await page
.getByRole('button', { name: 'dimension Length', exact: true }) .getByRole('button', { name: 'dimension Length', exact: true })
.click() .click()
await expect(cmdBarKclInput).toHaveText('20') await page.getByText('Add constraining value').click()
await cmdBarKclInput.fill(lengthValue.new)
await expect(
page.getByText(`Can't calculate`),
`Something went wrong with the KCL expression evaluation`
).not.toBeVisible()
await cmdBarSubmitButton.click()
await expect(page.locator('.cm-content')).toHaveText( await expect(page.locator('.cm-content')).toHaveText(
`length001 = ${lengthValue.new}sketch001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> angledLine([90, length001], %) |> xLine(-20, %)` `length001 = 20sketch001 = startSketchOn('XY') |> startProfileAt([-10, -10], %) |> line([20, 0], %) |> angledLine([90, length001], %) |> xLine(-20, %)`
) )
// Make sure we didn't pop out of sketch mode. // Make sure we didn't pop out of sketch mode.
@ -76,13 +60,12 @@ test.describe('Testing constraints', () => {
await page.waitForTimeout(500) // wait for animation await page.waitForTimeout(500) // wait for animation
// Exit sketch // Exit sketch
await page.mouse.move(startXPx + PUR * 15, 250 - PUR * 10)
await page.keyboard.press('Escape') await page.keyboard.press('Escape')
await expect( await expect(
page.getByRole('button', { name: 'Exit Sketch' }) page.getByRole('button', { name: 'Exit Sketch' })
).not.toBeVisible() ).not.toBeVisible() })
}) test(`Remove constraints`, async ({ page, homePage }) => { await page.addInitScript(async () => {
test(`Remove constraints`, async ({ page }) => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 79 `yo = 79
@ -101,9 +84,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %, $seg01)').click() await page.getByText('line([74.36, 130.4], %, $seg01)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -125,8 +109,7 @@ part002 = startSketchOn('XZ')
await expect(activeLinesContent[0]).toHaveText('|> line([39.13, 68.63], %)') await expect(activeLinesContent[0]).toHaveText('|> line([39.13, 68.63], %)')
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
test.describe('Test perpendicular distance constraint', () => { test.describe('Test perpendicular distance constraint', () => {
const cases = [ const cases = [
{ {
@ -139,8 +122,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { testName, offset } of cases) { for (const { testName, offset } of cases) {
test(`${testName}`, async ({ page }) => { test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -159,9 +141,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %, $seg01)').click() await page.getByText('line([74.36, 130.4], %, $seg01)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -198,9 +181,9 @@ part002 = startSketchOn('XZ')
.click() .click()
// Wait for the codemod to take effect // Wait for the codemod to take effect
await expect(page.locator('.cm-content')).toContainText(`angle = -57,`) await expect(page.locator('.cm-content')).toContainText(`angle: -57,`)
await expect(page.locator('.cm-content')).toContainText( await expect(page.locator('.cm-content')).toContainText(
`offset = ${offset},` `offset: ${offset},`
) )
const activeLinesContent = await page.locator('.cm-activeLine').all() const activeLinesContent = await page.locator('.cm-activeLine').all()
@ -210,8 +193,7 @@ part002 = startSketchOn('XZ')
await expect(activeLinesContent[1]).toHaveText(`}, %)`) await expect(activeLinesContent[1]).toHaveText(`}, %)`)
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
} }
}) })
test.describe('Test distance between constraint', () => { test.describe('Test distance between constraint', () => {
@ -238,8 +220,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { testName, value, constraint } of cases) { for (const { testName, value, constraint } of cases) {
test(`${constraint} - ${testName}`, async ({ page }) => { test(`${constraint} - ${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -258,9 +239,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -312,8 +294,7 @@ part002 = startSketchOn('XZ')
) )
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
} }
}) })
test.describe('Test ABS distance constraint', () => { test.describe('Test ABS distance constraint', () => {
@ -344,8 +325,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { testName, addVariable, value, constraint } of cases) { for (const { testName, addVariable, value, constraint } of cases) {
test(`${constraint} - ${testName}`, async ({ page }) => { test(`${constraint} - ${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -364,9 +344,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -419,8 +400,7 @@ part002 = startSketchOn('XZ')
) )
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
} }
}) })
test.describe('Test Angle constraint double segment selection', () => { test.describe('Test Angle constraint double segment selection', () => {
@ -451,8 +431,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { testName, addVariable, value, axisSelect } of cases) { for (const { testName, addVariable, value, axisSelect } of cases) {
test(`${testName}`, async ({ page }) => { test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -471,9 +450,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -529,8 +509,7 @@ part002 = startSketchOn('XZ')
) )
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
} }
}) })
test.describe('Test Angle constraint single selection', () => { test.describe('Test Angle constraint single selection', () => {
@ -549,8 +528,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { testName, addVariable, value, constraint } of cases) { for (const { testName, addVariable, value, constraint } of cases) {
test(`${testName}`, async ({ page }) => { test(`${testName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -569,9 +547,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -601,8 +580,7 @@ part002 = startSketchOn('XZ')
await expect(page.locator('.cm-activeLine')).toHaveText(changedCode) await expect(page.locator('.cm-activeLine')).toHaveText(changedCode)
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(4) await expect(page.getByTestId('segment-overlay')).toHaveCount(4) })
})
} }
}) })
test.describe('Test Length constraint single selection', () => { test.describe('Test Length constraint single selection', () => {
@ -709,8 +687,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { codeAfter, constraintName } of cases) { for (const { codeAfter, constraintName } of cases) {
test(`${constraintName}`, async ({ page }) => { test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async (customCode) => {
await page.addInitScript(async (customCode) => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -729,9 +706,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -782,8 +760,7 @@ part002 = startSketchOn('XZ')
// if the code is an active line then the cursor should be on that line // if the code is an active line then the cursor should be on that line
await expect(line).toHaveText(codeAfter[i]) await expect(line).toHaveText(codeAfter[i])
}) })
) ) })
})
} }
}) })
test.describe('Two segment - no modal constraints', () => { test.describe('Two segment - no modal constraints', () => {
@ -806,8 +783,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { codeAfter, constraintName } of cases) { for (const { codeAfter, constraintName } of cases) {
test(`${constraintName}`, async ({ page }) => { test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -825,9 +801,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -865,8 +842,7 @@ part002 = startSketchOn('XZ')
await expect(activeLinesContent[0]).toHaveText( await expect(activeLinesContent[0]).toHaveText(
'|> line([74.36, 130.4], %, $seg01)' '|> line([74.36, 130.4], %, $seg01)'
) )
await expect(activeLinesContent[1]).toHaveText(codeAfter) await expect(activeLinesContent[1]).toHaveText(codeAfter) })
})
} }
}) })
test.describe('Axis & segment - no modal constraints', () => { test.describe('Axis & segment - no modal constraints', () => {
@ -883,8 +859,7 @@ part002 = startSketchOn('XZ')
}, },
] as const ] as const
for (const { codeAfter, constraintName, axisClick } of cases) { for (const { codeAfter, constraintName, axisClick } of cases) {
test(`${constraintName}`, async ({ page }) => { test(`${constraintName}`, async ({ page, homePage }) => { await page.addInitScript(async () => {
await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`yo = 5 `yo = 5
@ -902,9 +877,10 @@ part002 = startSketchOn('XZ')
) )
}) })
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([74.36, 130.4], %)').click() await page.getByText('line([74.36, 130.4], %)').click()
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
@ -931,15 +907,11 @@ part002 = startSketchOn('XZ')
// check the cursor is where is should be after constraint is applied // check the cursor is where is should be after constraint is applied
await expect(page.locator('.cm-content')).toContainText(codeAfter) await expect(page.locator('.cm-content')).toContainText(codeAfter)
await expect(page.locator('.cm-activeLine')).toHaveText(codeAfter) await expect(page.locator('.cm-activeLine')).toHaveText(codeAfter) })
})
} }
}) })
test('Horizontally constrained line remains selected after applying constraint', async ({ test('Horizontally constrained line remains selected after applying constraint', async ({ page, homePage }) => { test.setTimeout(70_000)
page,
}) => {
test.setTimeout(70_000)
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
@ -949,19 +921,11 @@ part002 = startSketchOn('XZ')
|> line([3.13, -2.4], %)` |> line([3.13, -2.4], %)`
) )
}) })
// constants and locators
const cmdBarKclInput = page
.getByTestId('cmd-bar-arg-value')
.getByRole('textbox')
const cmdBarSubmitButton = page.getByRole('button', {
name: 'arrow right Continue',
})
const u = await getUtils(page) const u = await getUtils(page)
await page.setViewportSize({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.getByText('line([3.79, 2.68], %, $seg01)').click() await page.getByText('line([3.79, 2.68], %, $seg01)').click()
await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeEnabled( await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeEnabled(
@ -1018,13 +982,12 @@ part002 = startSketchOn('XZ')
// await page.getByRole('button', { name: 'length', exact: true }).click() // await page.getByRole('button', { name: 'length', exact: true }).click()
await page.getByTestId('dropdown-constraint-length').click() await page.getByTestId('dropdown-constraint-length').click()
await cmdBarKclInput.fill('10') await page.getByLabel('length Value').fill('10')
await cmdBarSubmitButton.click() await page.getByRole('button', { name: 'Add constraining value' }).click()
activeLinesContent = await page.locator('.cm-activeLine').all() activeLinesContent = await page.locator('.cm-activeLine').all()
await expect(activeLinesContent[0]).toHaveText(`|> xLine(length001, %)`) await expect(activeLinesContent[0]).toHaveText(`|> xLine(length001, %)`)
// checking the count of the overlays is a good proxy check that the client sketch scene is in a good state // checking the count of the overlays is a good proxy check that the client sketch scene is in a good state
await expect(page.getByTestId('segment-overlay')).toHaveCount(2) await expect(page.getByTestId('segment-overlay')).toHaveCount(2) })
})
}) })

View File

@ -1,18 +1,11 @@
import { _test, _expect } from './playwright-deprecated' import { test, expect } from './zoo-test'
import { test } from './fixtures/fixtureSetup' import { getUtils, executorInputPath } from './test-utils'
import { getUtils, setup, tearDown } from './test-utils'
import { uuidv4 } from 'lib/utils' import { uuidv4 } from 'lib/utils'
import { TEST_CODE_GIZMO } from './storageStates' import { TEST_CODE_GIZMO } from './storageStates'
import path from 'node:path'
import fsp from 'fs/promises'
_test.beforeEach(async ({ context, page }, testInfo) => { test.describe('Testing Gizmo', () => {
await setup(context, page, testInfo)
})
_test.afterEach(async ({ page }, testInfo) => {
await tearDown(page, testInfo)
})
_test.describe('Testing Gizmo', () => {
const cases = [ const cases = [
{ {
testDescription: 'top view', testDescription: 'top view',
@ -57,14 +50,17 @@ _test.describe('Testing Gizmo', () => {
expectedCameraTarget, expectedCameraTarget,
testDescription, testDescription,
} of cases) { } of cases) {
_test(`check ${testDescription}`, async ({ page, browserName }) => { test(`check ${testDescription}`, async ({ page, homePage }) => {
const u = await getUtils(page) const u = await getUtils(page)
await page.addInitScript((TEST_CODE_GIZMO) => { await page.addInitScript((TEST_CODE_GIZMO) => {
localStorage.setItem('persistCode', TEST_CODE_GIZMO) localStorage.setItem('persistCode', TEST_CODE_GIZMO)
}, TEST_CODE_GIZMO) }, TEST_CODE_GIZMO)
await page.setViewportSize({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await page.setBodyDimensions({ width: 1000, height: 500 })
await homePage.goToModelingScene()
await u.waitForPageLoad()
await page.waitForTimeout(100) await page.waitForTimeout(100)
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
@ -117,31 +113,29 @@ _test.describe('Testing Gizmo', () => {
await Promise.all([ await Promise.all([
// position // position
_expect(page.getByTestId('cam-x-position')).toHaveValue( expect(page.getByTestId('cam-x-position')).toHaveValue(
expectedCameraPosition.x.toString() expectedCameraPosition.x.toString()
), ),
_expect(page.getByTestId('cam-y-position')).toHaveValue( expect(page.getByTestId('cam-y-position')).toHaveValue(
expectedCameraPosition.y.toString() expectedCameraPosition.y.toString()
), ),
_expect(page.getByTestId('cam-z-position')).toHaveValue( expect(page.getByTestId('cam-z-position')).toHaveValue(
expectedCameraPosition.z.toString() expectedCameraPosition.z.toString()
), ),
// target // target
_expect(page.getByTestId('cam-x-target')).toHaveValue( expect(page.getByTestId('cam-x-target')).toHaveValue(
expectedCameraTarget.x.toString() expectedCameraTarget.x.toString()
), ),
_expect(page.getByTestId('cam-y-target')).toHaveValue( expect(page.getByTestId('cam-y-target')).toHaveValue(
expectedCameraTarget.y.toString() expectedCameraTarget.y.toString()
), ),
_expect(page.getByTestId('cam-z-target')).toHaveValue( expect(page.getByTestId('cam-z-target')).toHaveValue(
expectedCameraTarget.z.toString() expectedCameraTarget.z.toString()
), ),
]) ]) })
})
} }
_test('Context menu and popover menu', async ({ page }) => { test('Context menu and popover menu', async ({ page, homePage }) => { const testCase = {
const testCase = {
testDescription: 'Right view', testDescription: 'Right view',
expectedCameraPosition: { x: 5660.02, y: -152, z: 26 }, expectedCameraPosition: { x: 5660.02, y: -152, z: 26 },
expectedCameraTarget: { x: 800, y: -152, z: 26 }, expectedCameraTarget: { x: 800, y: -152, z: 26 },
@ -152,9 +146,9 @@ _test.describe('Testing Gizmo', () => {
await page.addInitScript((TEST_CODE_GIZMO) => { await page.addInitScript((TEST_CODE_GIZMO) => {
localStorage.setItem('persistCode', TEST_CODE_GIZMO) localStorage.setItem('persistCode', TEST_CODE_GIZMO)
}, TEST_CODE_GIZMO) }, TEST_CODE_GIZMO)
await page.setViewportSize({ width: 1000, height: 500 }) await page.setBodyDimensions({ width: 1000, height: 500 })
await u.waitForAuthSkipAppStart() await homePage.goToModelingScene()
await page.waitForTimeout(100) await page.waitForTimeout(100)
// wait for execution done // wait for execution done
await u.openDebugPanel() await u.openDebugPanel()
@ -196,7 +190,7 @@ _test.describe('Testing Gizmo', () => {
const buttonToTest = page.getByRole('button', { const buttonToTest = page.getByRole('button', {
name: testCase.testDescription, name: testCase.testDescription,
}) })
await _expect(buttonToTest).toBeVisible() await expect(buttonToTest).toBeVisible()
await buttonToTest.click() await buttonToTest.click()
// Now assert we've moved to the correct view // Now assert we've moved to the correct view
@ -215,23 +209,23 @@ _test.describe('Testing Gizmo', () => {
await Promise.all([ await Promise.all([
// position // position
_expect(page.getByTestId('cam-x-position')).toHaveValue( expect(page.getByTestId('cam-x-position')).toHaveValue(
testCase.expectedCameraPosition.x.toString() testCase.expectedCameraPosition.x.toString()
), ),
_expect(page.getByTestId('cam-y-position')).toHaveValue( expect(page.getByTestId('cam-y-position')).toHaveValue(
testCase.expectedCameraPosition.y.toString() testCase.expectedCameraPosition.y.toString()
), ),
_expect(page.getByTestId('cam-z-position')).toHaveValue( expect(page.getByTestId('cam-z-position')).toHaveValue(
testCase.expectedCameraPosition.z.toString() testCase.expectedCameraPosition.z.toString()
), ),
// target // target
_expect(page.getByTestId('cam-x-target')).toHaveValue( expect(page.getByTestId('cam-x-target')).toHaveValue(
testCase.expectedCameraTarget.x.toString() testCase.expectedCameraTarget.x.toString()
), ),
_expect(page.getByTestId('cam-y-target')).toHaveValue( expect(page.getByTestId('cam-y-target')).toHaveValue(
testCase.expectedCameraTarget.y.toString() testCase.expectedCameraTarget.y.toString()
), ),
_expect(page.getByTestId('cam-z-target')).toHaveValue( expect(page.getByTestId('cam-z-target')).toHaveValue(
testCase.expectedCameraTarget.z.toString() testCase.expectedCameraTarget.z.toString()
), ),
]) ])
@ -242,32 +236,55 @@ _test.describe('Testing Gizmo', () => {
const gizmoPopoverButton = page.getByRole('button', { const gizmoPopoverButton = page.getByRole('button', {
name: 'view settings', name: 'view settings',
}) })
await _expect(gizmoPopoverButton).toBeVisible() await expect(gizmoPopoverButton).toBeVisible()
await gizmoPopoverButton.click() await gizmoPopoverButton.click()
await _expect(buttonToTest).toBeVisible() await expect(buttonToTest).toBeVisible() })
})
}) })
test.describe(`Testing gizmo, fixture-based`, () => { test.describe(`Testing gizmo, fixture-based`, () => {
test('Center on selection from menu', async ({ test('Center on selection from menu', async ({
app, context,
page,
homePage,
cmdBar, cmdBar,
editor, editor,
toolbar, toolbar,
scene, scene,
}) => { }) => {
test.skip( await context.addInitScript(() => {
process.platform === 'win32', localStorage.setItem('persistCode', `
'Fails on windows in CI, can not be replicated locally on windows.' 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(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 test.step(`Setup`, async () => {
const file = await app.getInputFile('test-circle-extrude.kcl')
await app.initialise(file)
await scene.expectState({ await scene.expectState({
camera: { camera: {
position: [4982.21, -23865.37, 13810.64], position: [11912.6, -39586.98, 21391.21],
target: [4982.21, 0, 2737.1], target: [11912.6, -635, 3317.49],
}, },
}) })
}) })
@ -275,7 +292,7 @@ test.describe(`Testing gizmo, fixture-based`, () => {
await test.step(`Select an edge of this circle`, async () => { await test.step(`Select an edge of this circle`, async () => {
const circleSnippet = const circleSnippet =
'circle({ center = [318.33, 168.1], radius = 182.8 }, %)' 'circle({ center: [818.33, 168.1], radius: 182.8 }, %)'
await moveToCircle() await moveToCircle()
await clickCircle() await clickCircle()
await editor.expectState({ await editor.expectState({
@ -292,8 +309,8 @@ test.describe(`Testing gizmo, fixture-based`, () => {
await test.step(`Verify the camera moved`, async () => { await test.step(`Verify the camera moved`, async () => {
await scene.expectState({ await scene.expectState({
camera: { camera: {
position: [0, -23865.37, 11073.53], position: [20785.58, -40221.98, 22343.46],
target: [0, 0, 0], target: [20785.58, -1270, 4269.74],
}, },
}) })
}) })

View File

@ -52,13 +52,24 @@ export function test(desc, objOrFn, fnMaybe) {
} }
// Create a consistent way to resize the page across electron and web. // Create a consistent way to resize the page across electron and web.
// (lee) I had to do everyhting in the book to make electron change its
// damn window size. I succeded in making it consistently and reliably
// do it after a whole afternoon.
tronApp.page.setBodyDimensions = async function (dims: { tronApp.page.setBodyDimensions = async function (dims: {
width: number width: number
height: number height: number
}) { }) {
return this.evaluate((dims) => { await tronApp.electronApp.evaluateHandle(async ({ app }, dims) => {
await app.resizeWindow(dims.width, dims.height)
}, dims)
await tronApp.page.setViewportSize(dims)
return tronApp.page.evaluate(async (dims) => {
await window.electron.resizeWindow(dims.width, dims.height)
window.document.body.style.width = dims.width + 'px' window.document.body.style.width = dims.width + 'px'
window.document.body.style.height = dims.height + 'px' window.document.body.style.height = dims.height + 'px'
window.document.documentElement.style.width = dims.width + 'px'
window.document.documentElement.style.height = dims.height + 'px'
}, dims) }, dims)
} }

1
interface.d.ts vendored
View File

@ -7,6 +7,7 @@ import { MachinesListing } from 'components/MachineManagerProvider'
type EnvFn = (value?: string) => string type EnvFn = (value?: string) => string
export interface IElectronAPI { export interface IElectronAPI {
resizeWindow: (width: number, height: number) => Promise<void>
open: typeof dialog.showOpenDialog open: typeof dialog.showOpenDialog
save: typeof dialog.showSaveDialog save: typeof dialog.showSaveDialog
openExternal: typeof shell.openExternal openExternal: typeof shell.openExternal

View File

@ -134,6 +134,14 @@ app.on('ready', (event, data) => {
// There is just not enough code to warrant it and further abstracts everything // There is just not enough code to warrant it and further abstracts everything
// which is already quite abstracted // which is already quite abstracted
app.resizeWindow = async (width: number, height: number) => {
return mainWindow?.setSize(width, height)
}
ipcMain.handle('app.resizeWindow', (event, data) => {
return mainWindow?.setSize(...data)
})
ipcMain.handle('app.getPath', (event, data) => { ipcMain.handle('app.getPath', (event, data) => {
return app.getPath(data) return app.getPath(data)
}) })

View File

@ -7,6 +7,7 @@ import packageJson from '../package.json'
import { MachinesListing } from 'components/MachineManagerProvider' import { MachinesListing } from 'components/MachineManagerProvider'
import chokidar from 'chokidar' import chokidar from 'chokidar'
const resizeWindow = (width: number, height: number) => ipcRenderer.invoke('app.resizeWindow', [width, height])
const open = (args: any) => ipcRenderer.invoke('dialog.showOpenDialog', args) const open = (args: any) => ipcRenderer.invoke('dialog.showOpenDialog', args)
const save = (args: any) => ipcRenderer.invoke('dialog.showSaveDialog', args) const save = (args: any) => ipcRenderer.invoke('dialog.showSaveDialog', args)
const openExternal = (url: any) => ipcRenderer.invoke('shell.openExternal', url) const openExternal = (url: any) => ipcRenderer.invoke('shell.openExternal', url)
@ -189,4 +190,5 @@ contextBridge.exposeInMainWorld('electron', {
onUpdateError, onUpdateError,
appRestart, appRestart,
getArgvParsed, getArgvParsed,
resizeWindow,
}) })