diff --git a/e2e/playwright/fixtures/homePageFixture.ts b/e2e/playwright/fixtures/homePageFixture.ts index 2ca25f6ac..aa5eb23de 100644 --- a/e2e/playwright/fixtures/homePageFixture.ts +++ b/e2e/playwright/fixtures/homePageFixture.ts @@ -119,6 +119,9 @@ export class HomePageFixture { } goToModelingScene = async (name?: string = 'testDefault') => { + // On web this is a no-op. There is no project view. + if (process.env.PLATFORM === 'web') return + await this.createAndGoToProject(name) } } diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index 2d94fbfae..14d1677a7 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -16,7 +16,7 @@ test.describe('Testing segment overlays', () => { * @param {number} options.steps - The number of steps to perform */ const _clickConstrained = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, constraintType, @@ -50,10 +50,9 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText( - expectBeforeUnconstrained - ) + await editor.expectEditor.toContain(expectBeforeUnconstrained, { shouldNormalise: true }) const constrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` ) @@ -63,9 +62,7 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await constrainedLocator.click() - await expect(page.locator('.cm-content')).toContainText( - expectAfterUnconstrained - ) + await editor.expectEditor.toContain(expectAfterUnconstrained, { shouldNormalise: true }) await page.mouse.move(0, 0) await page.waitForTimeout(1000) @@ -73,6 +70,7 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) const unconstrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="false"]` @@ -92,6 +90,7 @@ test.describe('Testing segment overlays', () => { }) .click() await expect(page.locator('.cm-content')).toContainText(expectFinal) + await editor.expectEditor.toContain(expectFinal, { shouldNormalise: true }) } /** @@ -104,7 +103,7 @@ test.describe('Testing segment overlays', () => { * @param {number} options.steps - The number of steps to perform */ const _clickUnconstrained = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, constraintType, @@ -136,11 +135,10 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) await expect(page.getByText('Added variable')).not.toBeVisible() - await expect(page.locator('.cm-content')).toContainText( - expectBeforeUnconstrained - ) + await editor.expectEditor.toContain(expectBeforeUnconstrained, { shouldNormalise: true }) const unconstrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="false"]` ) @@ -158,9 +156,7 @@ test.describe('Testing segment overlays', () => { name: 'arrow right Continue', }) .click() - await expect(page.locator('.cm-content')).toContainText( - expectAfterUnconstrained - ) + await editor.expectEditor.toContain(expectAfterUnconstrained, { shouldNormalise: true }) await expect(page.getByText('Added variable')).not.toBeVisible() await page.mouse.move(0, 0) @@ -169,6 +165,7 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) const constrainedLocator = page.locator( `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` @@ -179,11 +176,12 @@ test.describe('Testing segment overlays', () => { await page.getByTestId('constraint-symbol-popover').count() ).toBeGreaterThan(0) await constrainedLocator.click() - await expect(page.locator('.cm-content')).toContainText(expectFinal) + await editor.expectEditor.toContain(expectFinal, { shouldNormalise: true }) } test.setTimeout(120000) test('for segments [line, angledLine, lineTo, xLineTo]', async ({ page, + editor, homePage, }) => { await page.addInitScript(async () => { @@ -192,20 +190,20 @@ test.describe('Testing segment overlays', () => { `part001 = startSketchOn('XZ') |> startProfileAt([5 + 0, 20 + 0], %) |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) |> lineTo([5 + 33, 20 + 11.5 + 0], %) |> xLineTo(5 + 9 - 5, %) |> yLineTo(20 + -10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 5 + 26 }, %) - |> angledLineToY({ angle: 89, to: 20 + 9.14 + 0 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 5 + 26 }, %) + |> angledLineToY({ angle = 89, to = 20 + 9.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %) |> tangentialArcTo([5 + 3.14 + 13, 20 + 3.14], %) ` @@ -228,8 +226,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) await u.openAndClearDebugPanel() await u.sendCustomCmd({ @@ -346,7 +344,7 @@ test.describe('Testing segment overlays', () => { locator: '[data-overlay-toolbar-index="3"]', }) }) - test('for segments [yLineTo, xLine]', async ({ page, homePage }) => { + test('for segments [yLineTo, xLine]', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', @@ -360,13 +358,13 @@ test.describe('Testing segment overlays', () => { part001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0.5, yRel001], %) - |> angledLine({ angle: angle001, length: len001 }, %) + |> angledLine({ angle = angle001, length = len001 }, %) |> lineTo([33, yAbs001], %) |> xLineTo(xAbs002, %) |> yLineTo(-10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) ` ) }) @@ -387,7 +385,7 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(8) - const clickUnconstrained = _clickUnconstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) await page.mouse.move(700, 250) await page.waitForTimeout(100) @@ -423,6 +421,7 @@ test.describe('Testing segment overlays', () => { }) test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({ page, + editor, homePage, }) => { await page.addInitScript(async () => { @@ -431,20 +430,20 @@ test.describe('Testing segment overlays', () => { `part001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) |> lineTo([33, 11.5 + 0], %) |> xLineTo(9 - 5, %) |> yLineTo(-10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %) |> tangentialArcTo([3.14 + 13, 3.14], %) ` @@ -469,8 +468,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) let ang = 0 @@ -552,6 +551,7 @@ test.describe('Testing segment overlays', () => { }) test('for segments [angledLineToX, angledLineToY, angledLineThatIntersects]', async ({ page, + editor, homePage, }) => { await page.addInitScript(async () => { @@ -560,20 +560,20 @@ test.describe('Testing segment overlays', () => { `part001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) |> lineTo([33, 11.5 + 0], %) |> xLineTo(9 - 5, %) |> yLineTo(-10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %) |> tangentialArcTo([3.14 + 13, 1.14], %) ` @@ -597,8 +597,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) let ang = 0 @@ -666,19 +666,19 @@ test.describe('Testing segment overlays', () => { }, constraintType: 'angle', expectBeforeUnconstrained: `angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %)`, expectAfterUnconstrained: `angledLineThatIntersects({ - angle: angle003, - intersectTag: a, - offset: 9 + angle = angle003, + intersectTag = a, + offset = 9 }, %)`, expectFinal: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a + angle = -176, + offset = 9, + intersectTag = a }, %)`, ang: ang + 180, locator: '[data-overlay-toolbar-index="11"]', @@ -691,45 +691,45 @@ test.describe('Testing segment overlays', () => { }, constraintType: 'intersectionOffset', expectBeforeUnconstrained: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a + angle = -176, + offset = 9, + intersectTag = a }, %)`, expectAfterUnconstrained: `angledLineThatIntersects({ - angle: -176, - offset: perpDist001, - intersectTag: a + angle = -176, + offset = perpDist001, + intersectTag = a }, %)`, expectFinal: `angledLineThatIntersects({ - angle: -176, - offset: 9, - intersectTag: a + angle = -176, + offset = 9, + intersectTag = a }, %)`, ang: ang + 180, locator: '[data-overlay-toolbar-index="11"]', }) }) - test('for segment [tangentialArcTo]', async ({ page, homePage }) => { + test('for segment [tangentialArcTo]', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) |> lineTo([33, 11.5 + 0], %) |> xLineTo(9 - 5, %) |> yLineTo(-10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %) |> tangentialArcTo([3.14 + 13, -3.14], %) ` @@ -753,8 +753,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) const tangentialArcTo = await u.getBoundingBox( '[data-overlay-index="12"]' @@ -783,12 +783,12 @@ test.describe('Testing segment overlays', () => { locator: '[data-overlay-toolbar-index="12"]', }) }) - test('for segment [circle]', async ({ page, homePage }) => { + test('for segment [circle]', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') - |> circle({ center: [1 + 0, 0], radius: 8 }, %) + |> circle({ center = [1 + 0, 0], radius = 8 }, %) ` ) localStorage.setItem('disableAxis', 'true') @@ -812,8 +812,8 @@ test.describe('Testing segment overlays', () => { await expect(page.getByTestId('segment-overlay')).toHaveCount(1) - const clickUnconstrained = _clickUnconstrained(page) - const clickConstrained = _clickConstrained(page) + const clickUnconstrained = _clickUnconstrained(page, editor) + const clickConstrained = _clickConstrained(page, editor) const hoverPos = { x: 789, y: 114 } as const let ang = await u.getAngle('[data-overlay-index="0"]') @@ -837,10 +837,10 @@ test.describe('Testing segment overlays', () => { expectBeforeUnconstrained: 'circle({ center: [xAbs001, 0], radius: 8 }, %)', expectAfterUnconstrained: - 'circle({ center: [xAbs001, yAbs001], radius: 8 }, %)', - expectFinal: 'circle({ center: [xAbs001, 0], radius: 8 }, %)', - ang: ang + 105, - steps: 10, + 'circle({ center = [xAbs001, yAbs001], radius = 8 }, %)', + expectFinal: 'circle({ center = [xAbs001, 0], radius = 8 }, %)', + ang: ang + 180, + steps: 30, locator: '[data-overlay-toolbar-index="0"]', }) console.log('circle radius') @@ -860,7 +860,7 @@ test.describe('Testing segment overlays', () => { }) test.describe('Testing deleting a segment', () => { const _deleteSegmentSequence = - (page: Page) => + (page: Page, editor: EditorFixture) => async ({ hoverPos, codeToBeDeleted, @@ -886,37 +886,36 @@ test.describe('Testing segment overlays', () => { y = hoverPos.y - Math.sin(ang * deg) * 32 await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText(codeToBeDeleted) + await editor.expectEditor.toContain(codeToBeDeleted, { shouldNormalise: true }) await page.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`).click() await page.getByText('Delete Segment').click() - await expect(page.locator('.cm-content')).not.toContainText( - codeToBeDeleted - ) + await editor.expectEditor.not.toContain(codeToBeDeleted, { shouldNormalise: true }) } - test('all segment types', async ({ page, homePage }) => { + test('all segment types', async ({ page, editor, homePage }) => { await page.addInitScript(async () => { localStorage.setItem( 'persistCode', `part001 = startSketchOn('XZ') |> startProfileAt([0, 0], %) |> line([0.5, -14 + 0], %) - |> angledLine({ angle: 3 + 0, length: 32 + 0 }, %) + |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %) |> lineTo([33, 11.5 + 0], %) |> xLineTo(9 - 5, %) |> yLineTo(-10.77, %, $a) |> xLine(26.04, %) |> yLine(21.14 + 0, %) - |> angledLineOfXLength({ angle: 181 + 0, length: 23.14 }, %) - |> angledLineOfYLength({ angle: -91, length: 19 + 0 }, %) - |> angledLineToX({ angle: 3 + 0, to: 26 }, %) - |> angledLineToY({ angle: 89, to: 9.14 + 0 }, %) + |> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %) + |> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %) + |> angledLineToX({ angle = 3 + 0, to = 26 }, %) + |> angledLineToY({ angle = 89, to = 9.14 + 0 }, %) |> angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %) |> tangentialArcTo([3.14 + 13, 1.14], %) ` @@ -927,6 +926,7 @@ test.describe('Testing segment overlays', () => { await page.setViewportSize({ width: 1200, height: 500 }) await homePage.goToModelingScene() + await u.waitForPageLoad() // wait for execution done await u.openDebugPanel() @@ -939,7 +939,7 @@ test.describe('Testing segment overlays', () => { await page.waitForTimeout(500) await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - const deleteSegmentSequence = _deleteSegmentSequence(page) + const deleteSegmentSequence = _deleteSegmentSequence(page, editor) let segmentToDelete @@ -961,9 +961,9 @@ test.describe('Testing segment overlays', () => { await deleteSegmentSequence({ hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, codeToBeDeleted: `angledLineThatIntersects({ - angle: 4.14, - intersectTag: a, - offset: 9 + angle = 4.14, + intersectTag = a, + offset = 9 }, %)`, stdLibFnName: 'angledLineThatIntersects', ang: ang + 180, @@ -1072,16 +1072,15 @@ test.describe('Testing segment overlays', () => { 5, '[data-overlay-toolbar-index="2"]' ) + await page.mouse.move(hoverPos.x, hoverPos.y) const codeToBeDeleted = 'lineTo([33, 11.5 + 0], %)' - await expect(page.locator('.cm-content')).toContainText(codeToBeDeleted) + await editor.expectEditor.toContain(codeToBeDeleted, { shouldNormalise: true }) await page.getByTestId('overlay-menu').click() await page.getByText('Delete Segment').click() - await expect(page.locator('.cm-content')).not.toContainText( - codeToBeDeleted - ) + await editor.expectEditor.not.toContain(codeToBeDeleted, { shouldNormalise: true }) segmentToDelete = await getOverlayByIndex(1) ang = await u.getAngle(`[data-overlay-index="${1}"]`) @@ -1127,7 +1126,7 @@ test.describe('Testing segment overlays', () => { const isObj = lineOfInterest.includes('{ angle = 3,') test(`${lineOfInterest.split('(')[0]}${isObj ? '-[obj-input]' : ''}${ doesHaveTagOutsideSketch ? '-[tagOutsideSketch]' : '' - }`, async ({ page, homePage }) => { + }`, async ({ page, editor, homePage }) => { await page.addInitScript( async ({ lineToBeDeleted, extraLine }) => { localStorage.setItem( @@ -1176,9 +1175,7 @@ test.describe('Testing segment overlays', () => { await page.mouse.move(hoverPos.x + x, hoverPos.y + y) await page.mouse.move(hoverPos.x, hoverPos.y, { steps: 5 }) - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { shouldNormalise: true }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) @@ -1189,9 +1186,7 @@ test.describe('Testing segment overlays', () => { await page.mouse.move(hoverPos.x + x, hoverPos.y + y) await page.mouse.move(hoverPos.x, hoverPos.y, { steps: 5 }) - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { shouldNormalise: true }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) @@ -1207,16 +1202,12 @@ test.describe('Testing segment overlays', () => { ) ).toBeTruthy() // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).toContainText( - lineOfInterest - ) + await editor.expectEditor.toContain(lineOfInterest, { shouldNormalise: true }) } else { // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).not.toContainText( - lineOfInterest - ) + await editor.expectEditor.not.toContain(lineOfInterest, { shouldNormalise: true }) // eslint-disable-next-line jest/no-conditional-expect - await expect(page.locator('.cm-content')).not.toContainText('seg01') + await editor.expectEditor.not.toContain('seg01', { shouldNormalise: true }) } }) } @@ -1287,6 +1278,7 @@ test.describe('Testing segment overlays', () => { const isObj = before.includes('{ angle: 3') test(`${before.split('(')[0]}${isObj ? '-[obj-input]' : ''}`, async ({ page, + editor, homePage, }) => { await page.addInitScript( @@ -1308,6 +1300,7 @@ test.describe('Testing segment overlays', () => { await page.setViewportSize({ width: 1200, height: 500 }) await homePage.goToModelingScene() + await u.waitForPageLoad() await page.waitForTimeout(300) await page.getByText(before).click() @@ -1340,14 +1333,16 @@ test.describe('Testing segment overlays', () => { 5, '[data-overlay-toolbar-index="0"]' ) + await page.mouse.move(x, y) - await expect(page.locator('.cm-content')).toContainText(before) + await editor.expectEditor.toContain(before, { shouldNormalise: true }) await page.getByTestId('overlay-menu').click() await page.waitForTimeout(100) await page.getByText('Remove constraints').click() - await expect(page.locator('.cm-content')).toContainText(after) + await editor.expectEditor.toContain(after, { shouldNormalise: true }) + // check the cursor was left in the correct place after transform await expect(page.locator('.cm-activeLine')).toHaveText('|> ' + after) await expect(page.getByTestId('segment-overlay')).toHaveCount(3) diff --git a/e2e/playwright/zoo-test.ts b/e2e/playwright/zoo-test.ts index b9558ae0c..146c65bc3 100644 --- a/e2e/playwright/zoo-test.ts +++ b/e2e/playwright/zoo-test.ts @@ -3,6 +3,7 @@ import { fixtures, Fixtures, AuthenticatedTronApp, + AuthenticatedApp, } from './fixtures/fixtureSetup' export { expect, Page, BrowserContext, TestInfo } from '@playwright/test' @@ -24,8 +25,17 @@ export function test(desc, objOrFn, fnMaybe) { { page, context, cmdBar, editor, toolbar, scene, homePage }, testInfo ) => { - // To switch to web, change this to AuthenticatedApp from fixtureSetup.ts - const tronApp = new AuthenticatedTronApp(context, page, testInfo) + // To switch to web, use PLATFORM=web environment variable. + // Only use this for debugging, since the playwright tracer is busted + // for electron. + + let tronApp; + + if (process.env.PLATFORM === 'web') { + tronApp = new AuthenticatedApp(context, page, testInfo) + } else { + tronApp = new AuthenticatedTronApp(context, page, testInfo) + } const fixtures: Fixtures = { cmdBar, editor, toolbar, scene, homePage } const options = { @@ -51,33 +61,35 @@ export function test(desc, objOrFn, fnMaybe) { await tronApp.page.reload() } - // 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: { - width: number - height: number - }) { - await tronApp.electronApp.evaluateHandle(async ({ app }, dims) => { - await app.resizeWindow(dims.width, dims.height) - }, dims) + if (tronApp instanceof AuthenticatedTronApp) { + // 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: { + width: number + height: number + }) { + 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.height = dims.height + 'px' - window.document.documentElement.style.width = dims.width + 'px' - window.document.documentElement.style.height = dims.height + 'px' - }, 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.height = dims.height + 'px' + window.document.documentElement.style.width = dims.width + 'px' + window.document.documentElement.style.height = dims.height + 'px' + }, dims) + } - // We need to expose this in order for some tests that require folder - // creation. Before they used to do this by their own electronSetup({...}) - // calls. - tronApp.context.folderSetupFn = function (fn) { - return fn(tronApp.dir).then(() => ({ dir: tronApp.dir })) + // We need to expose this in order for some tests that require folder + // creation. Before they used to do this by their own electronSetup({...}) + // calls. + tronApp.context.folderSetupFn = function (fn) { + return fn(tronApp.dir).then(() => ({ dir: tronApp.dir })) + } } await fn( diff --git a/package.json b/package.json index abe30435d..174b37a2a 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,7 @@ "tron:package": "electron-forge package", "tron:make": "electron-forge make", "tron:publish": "electron-forge publish", + "chrome:test": "PLATFORM=web NODE_ENV=development yarn playwright test --config=playwright.config.ts --project='Google Chrome' --grep-invert='@snapshot'", "tron:test": "NODE_ENV=development yarn playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot'", "tronb:vite": "vite build -c vite.main.config.ts && vite build -c vite.preload.config.ts && vite build -c vite.renderer.config.ts", "tronb:package": "electron-builder --config electron-builder.yml",