* Start implementing a "prepareToEdit" callback for extrude
* Start of generic edit flow for operations
* Actually invoking command bar send generically on double-click
* Refactor: break out non-React hook helper to calculate Kcl expression value
* Add unit tests, fmt
* Integrate helper to get calculated KclExpression
* Clean up unused imports, simplify use of `programMemoryFromVariables`
* Implement basic extrude editing
* Refactor: move DefaultPlanesStr to its own lib file
* Add support for editing offset planes
* Add Edit right-click menu option
* Turn off edit flow for sketch for now
* Add e2e tests for sketch and offset plane editing, fix bug found with offset plane editing
* Add failing e2e extrude edit test
* Remove action version of extrude AST mod
* Fix behavior when adding a constant while editing operation, fixing e2e test
* Patch in changes from 61b02b5703
* Remove shell's prepareToEdit
* Add other Surface types to `artifactIsPlaneWithPaths`
* refactor: rename `item` to `operation`
* Allow `prepareToEdit` to fail with a toast, signal sketch-on-offset is unimplemented
* Rework sketch e2e test to test several working and failing cases
* Fix tsc errors related to making `codeRef` optional
* Make basic error messages more friendly
* fmt
* Reset modifyAst.ts to main
* Fix broken artifactGraph unit test
* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)
* Remove unused import
* Look at this (photo)Graph *in the voice of Nickelback*
* Make the offset plane insert at the end, not one before
* Fix bug caught by e2e test failure with "Command needs review" logic
* Update src/machines/modelingMachine.ts
Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>
* Remove console logs per @pierremtb
* Update src/components/CommandBar/CommandBarHeader.tsx
Co-authored-by: Jonathan Tran <jonnytran@gmail.com>
* Use better programMemory init thanks @jtran
* Fix tsc post merge of #5068
* Fix logic for `artifactIsPlaneWithPaths` post-merge
* Need to disable the sketch-on-face case now that artifactGraph is in Rust. Will active in a future PR (cc @jtran)
* Re-run CI after snapshots
* Update FeatureTreePane to not use `useCommandsContext`, missed during merge
* Fix merge issue, import location change on edited file
* fix click test step, which I believe is waiting for context scripts to load
* Convert toolbarFixture.exeIndicator to getter
We need to convert all these selectors on fixtures to getters, because
they can go stale if called on the fixture constructor.
* Missed a dumb little thing in toolbarFixture.ts
* Fix goof with merge
* fmt
* Another dumb missed thing during merge
I gotta get used to the LazyGit merge tool I'm not good at it yet
* 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)
* Conver sceneFixture's exeIndicator to a getter
Locators on fixtures will be frozen from the time of the fixture's
initialization, I'm increasingly convinced
* 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)
* 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)
* Post-kwargs E2E test cleanup
* 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)
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>
Co-authored-by: Jonathan Tran <jonnytran@gmail.com>
171 lines
5.0 KiB
TypeScript
171 lines
5.0 KiB
TypeScript
import type { Page, Locator } from '@playwright/test'
|
|
import { expect } from '@playwright/test'
|
|
|
|
type CmdBarSerialised =
|
|
| {
|
|
stage: 'commandBarClosed'
|
|
}
|
|
| {
|
|
stage: 'pickCommand'
|
|
// TODO this will need more properties when implemented in _serialiseCmdBar
|
|
}
|
|
| {
|
|
stage: 'arguments'
|
|
currentArgKey: string
|
|
currentArgValue: string
|
|
headerArguments: Record<string, string>
|
|
highlightedHeaderArg: string
|
|
commandName: string
|
|
}
|
|
| {
|
|
stage: 'review'
|
|
headerArguments: Record<string, string>
|
|
commandName: string
|
|
}
|
|
|
|
export class CmdBarFixture {
|
|
public page: Page
|
|
cmdBarOpenBtn!: Locator
|
|
cmdBarElement!: Locator
|
|
|
|
constructor(page: Page) {
|
|
this.page = page
|
|
this.cmdBarOpenBtn = page.getByTestId('command-bar-open-button')
|
|
this.cmdBarElement = page.getByTestId('command-bar')
|
|
}
|
|
|
|
get currentArgumentInput() {
|
|
return this.page.getByTestId('cmd-bar-arg-value')
|
|
}
|
|
|
|
reConstruct = (page: Page) => {
|
|
this.page = page
|
|
}
|
|
|
|
private _serialiseCmdBar = async (): Promise<CmdBarSerialised> => {
|
|
if (!(await this.page.getByTestId('command-bar-wrapper').isVisible())) {
|
|
return { stage: 'commandBarClosed' }
|
|
}
|
|
const reviewForm = this.page.locator('#review-form')
|
|
const getHeaderArgs = async () => {
|
|
const inputs = await this.page.getByTestId('cmd-bar-input-tab').all()
|
|
const entries = await Promise.all(
|
|
inputs.map((input) => {
|
|
const key = input
|
|
.locator('[data-test-name="arg-name"]')
|
|
.innerText()
|
|
.then((a) => a.trim())
|
|
const value = input
|
|
.getByTestId('header-arg-value')
|
|
.innerText()
|
|
.then((a) => a.trim())
|
|
return Promise.all([key, value])
|
|
})
|
|
)
|
|
return Object.fromEntries(entries)
|
|
}
|
|
const getCommandName = () =>
|
|
this.page.getByTestId('command-name').textContent()
|
|
if (await reviewForm.isVisible()) {
|
|
const [headerArguments, commandName] = await Promise.all([
|
|
getHeaderArgs(),
|
|
getCommandName(),
|
|
])
|
|
return {
|
|
stage: 'review',
|
|
headerArguments,
|
|
commandName: commandName || '',
|
|
}
|
|
}
|
|
const [
|
|
currentArgKey,
|
|
currentArgValue,
|
|
headerArguments,
|
|
highlightedHeaderArg,
|
|
commandName,
|
|
] = await Promise.all([
|
|
this.page.getByTestId('cmd-bar-arg-name').textContent(),
|
|
this.page.getByTestId('cmd-bar-arg-value').textContent(),
|
|
getHeaderArgs(),
|
|
this.page
|
|
.locator('[data-is-current-arg="true"]')
|
|
.locator('[data-test-name="arg-name"]')
|
|
.textContent(),
|
|
getCommandName(),
|
|
])
|
|
return {
|
|
stage: 'arguments',
|
|
currentArgKey: currentArgKey || '',
|
|
currentArgValue: currentArgValue || '',
|
|
headerArguments,
|
|
highlightedHeaderArg: highlightedHeaderArg || '',
|
|
commandName: commandName || '',
|
|
}
|
|
}
|
|
expectState = async (expected: CmdBarSerialised) => {
|
|
return expect.poll(() => this._serialiseCmdBar()).toEqual(expected)
|
|
}
|
|
/** The method will use buttons OR press enter randomly to progress the cmdbar,
|
|
* this could have unexpected results depending on what's focused
|
|
*
|
|
* TODO: This method assumes the user has a valid input to the current stage,
|
|
* and assumes we are past the `pickCommand` step.
|
|
*/
|
|
progressCmdBar = async (shouldFuzzProgressMethod = true) => {
|
|
if (shouldFuzzProgressMethod || Math.random() > 0.5) {
|
|
const arrowButton = this.page.getByRole('button', {
|
|
name: 'arrow right Continue',
|
|
})
|
|
if (await arrowButton.isVisible()) {
|
|
await arrowButton.click()
|
|
} else {
|
|
await this.page
|
|
.getByRole('button', { name: 'checkmark Submit command' })
|
|
.click()
|
|
}
|
|
} else {
|
|
await this.page.keyboard.press('Enter')
|
|
}
|
|
}
|
|
|
|
openCmdBar = async (selectCmd?: 'promptToEdit') => {
|
|
// TODO why does this button not work in electron tests?
|
|
// await this.cmdBarOpenBtn.click()
|
|
await this.page.keyboard.down('ControlOrMeta')
|
|
await this.page.keyboard.press('KeyK')
|
|
await this.page.keyboard.up('ControlOrMeta')
|
|
await expect(this.page.getByPlaceholder('Search commands')).toBeVisible()
|
|
if (selectCmd === 'promptToEdit') {
|
|
const promptEditCommand = this.page.getByText(
|
|
'Use Zoo AI to edit your kcl'
|
|
)
|
|
await expect(promptEditCommand.first()).toBeVisible()
|
|
await promptEditCommand.first().scrollIntoViewIfNeeded()
|
|
await promptEditCommand.first().click()
|
|
}
|
|
}
|
|
|
|
get cmdSearchInput() {
|
|
return this.page.getByTestId('cmd-bar-search')
|
|
}
|
|
|
|
get argumentInput() {
|
|
return this.page.getByTestId('cmd-bar-arg-value')
|
|
}
|
|
|
|
get cmdOptions() {
|
|
return this.page.getByTestId('cmd-bar-option')
|
|
}
|
|
|
|
chooseCommand = async (commandName: string) => {
|
|
await this.cmdOptions.getByText(commandName).click()
|
|
}
|
|
|
|
/**
|
|
* Select an option from the command bar
|
|
*/
|
|
selectOption = (options: Parameters<typeof this.page.getByRole>[1]) => {
|
|
return this.page.getByRole('option', options)
|
|
}
|
|
}
|