2024-11-22 14:34:32 -05:00
import { test , expect } from './zoo-test'
2024-08-07 19:27:32 +10:00
2024-11-22 16:09:09 -05:00
import { getUtils , executorInputPath } from './test-utils'
2024-08-23 10:50:40 -04:00
import { join } from 'path'
2024-08-07 19:27:32 +10:00
import { bracket } from 'lib/exampleKcl'
import { TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW } from './storageStates'
2024-08-20 22:11:21 -04:00
import fsp from 'fs/promises'
2024-08-07 19:27:32 +10:00
test . describe ( 'Code pane and errors' , ( ) = > {
2024-11-22 16:09:09 -05:00
test ( 'Typing KCL errors induces a badge on the code pane button' , async ( {
page ,
homePage ,
} ) = > {
const u = await getUtils ( page )
// Load the app with the working starter code
await page . addInitScript ( ( ) = > {
localStorage . setItem (
'persistCode' ,
` // Extruded Triangle
2024-11-22 14:34:32 -05:00
sketch001 = startSketchOn ( 'XZ' )
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 10 , 0 ] , % )
| > line ( [ - 5 , 10 ] , % )
| > lineTo ( [ profileStartX ( % ) , profileStartY ( % ) ] , % )
| > close ( % )
extrude001 = extrude ( 5 , sketch001 ) `
)
2024-11-22 16:09:09 -05:00
} )
await page . setBodyDimensions ( { width : 1200 , height : 500 } )
await homePage . goToModelingScene ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
// Ensure no badge is present
const codePaneButtonHolder = page . locator ( '#code-button-holder' )
await expect ( codePaneButtonHolder ) . not . toContainText ( 'notification' )
// Delete a character to break the KCL
await u . openKclCodePanel ( )
await page . getByText ( 'extrude(' ) . click ( )
await page . keyboard . press ( 'Backspace' )
// Ensure that a badge appears on the button
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
} )
2024-12-09 12:11:47 -05:00
test . skip ( 'Opening and closing the code pane will consistently show error diagnostics' , async ( {
2024-11-22 16:09:09 -05:00
page ,
homePage ,
2024-11-25 12:50:09 -05:00
editor ,
2024-11-22 16:09:09 -05:00
} ) = > {
const u = await getUtils ( page )
// Load the app with the working starter code
await page . addInitScript ( ( code ) = > {
localStorage . setItem ( 'persistCode' , code )
} , bracket )
await page . setBodyDimensions ( { width : 1200 , height : 900 } )
await homePage . goToModelingScene ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
// Ensure we have no errors in the gutter.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . not . toBeVisible ( )
// Ensure no badge is present
const codePaneButton = page . getByRole ( 'button' , { name : 'KCL Code pane' } )
const codePaneButtonHolder = page . locator ( '#code-button-holder' )
await expect ( codePaneButtonHolder ) . not . toContainText ( 'notification' )
// Delete a character to break the KCL
2024-11-25 12:50:09 -05:00
await editor . openPane ( )
await editor . scrollToText ( 'thickness, bracketLeg1Sketch)' )
await page . getByText ( 'extrude(thickness, bracketLeg1Sketch)' ) . click ( )
2024-11-22 16:09:09 -05:00
await page . keyboard . press ( 'Backspace' )
// Ensure that a badge appears on the button
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
// Ensure we have an error diagnostic.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . toBeVisible ( )
// error text on hover
await page . hover ( '.cm-lint-marker-error' )
await expect ( page . locator ( '.cm-tooltip' ) . first ( ) ) . toBeVisible ( )
// Close the code pane
await codePaneButton . click ( )
await page . waitForTimeout ( 500 )
// Ensure that a badge appears on the button
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
// Ensure we have no errors in the gutter.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . not . toBeVisible ( )
// Open the code pane
2024-11-25 12:50:09 -05:00
await editor . openPane ( )
// Go to our problematic code again (missing closing paren!)
await editor . scrollToText ( 'extrude(thickness, bracketLeg1Sketch' )
2024-11-22 16:09:09 -05:00
// Ensure that a badge appears on the button
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
// Ensure we have an error diagnostic.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . toBeVisible ( )
// error text on hover
await page . hover ( '.cm-lint-marker-error' )
await expect ( page . locator ( '.cm-tooltip' ) . first ( ) ) . toBeVisible ( )
} )
2024-12-11 12:25:03 -05:00
test . fixme (
'When error is not in view you can click the badge to scroll to it' ,
async ( { page , homePage , context } ) = > {
// Load the app with the working starter code
await context . addInitScript ( ( code ) = > {
localStorage . setItem ( 'persistCode' , code )
} , TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW )
await page . setBodyDimensions ( { width : 1200 , height : 500 } )
await homePage . goToModelingScene ( )
await page . waitForTimeout ( 1000 )
// Ensure badge is present
const codePaneButtonHolder = page . locator ( '#code-button-holder' )
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
// Ensure we have no errors in the gutter, since error out of view.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . not . toBeVisible ( )
// Click the badge.
const badge = page . locator ( '#code-badge' )
await expect ( badge ) . toBeVisible ( )
await badge . click ( )
// Ensure we have an error diagnostic.
await expect ( page . locator ( '.cm-lint-marker-error' ) . first ( ) ) . toBeVisible ( )
// Hover over the error to see the error message
await page . hover ( '.cm-lint-marker-error' )
await expect (
page
. getByText (
'Modeling command failed: [ApiError { error_code: InternalEngine, message: "Solid3D revolve failed: sketch profile must lie entirely on one side of the revolution axis" }]'
)
. first ( )
) . toBeVisible ( )
}
)
2024-11-22 16:09:09 -05:00
test ( 'When error is not in view WITH LINTS you can click the badge to scroll to it' , async ( {
context ,
page ,
homePage ,
} ) = > {
// Load the app with the working starter code
await context . addInitScript ( ( code ) = > {
localStorage . setItem ( 'persistCode' , code )
} , TEST_CODE_LONG_WITH_ERROR_OUT_OF_VIEW )
await page . setBodyDimensions ( { width : 1200 , height : 500 } )
await homePage . goToModelingScene ( )
await page . waitForTimeout ( 1000 )
// Ensure badge is present
const codePaneButtonHolder = page . locator ( '#code-button-holder' )
await expect ( codePaneButtonHolder ) . toContainText ( 'notification' )
// Ensure we have no errors in the gutter, since error out of view.
await expect ( page . locator ( '.cm-lint-marker-error' ) ) . not . toBeVisible ( )
// click in the editor to focus it
await page . locator ( '.cm-content' ) . click ( )
await page . waitForTimeout ( 500 )
// go to the start of the editor and enter more text which will trigger
// a lint error.
// GO to the start of the editor.
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'ArrowUp' )
await page . keyboard . press ( 'Home' )
await page . keyboard . type ( 'foo_bar = 1' )
await page . waitForTimeout ( 500 )
await page . keyboard . press ( 'Enter' )
// ensure we have a lint error
await expect ( page . locator ( '.cm-lint-marker-info' ) . first ( ) ) . toBeVisible ( )
// Click the badge.
const badge = page . locator ( '#code-badge' )
await expect ( badge ) . toBeVisible ( )
await badge . click ( )
// Ensure we have an error diagnostic.
await expect ( page . locator ( '.cm-lint-marker-error' ) . first ( ) ) . toBeVisible ( )
// Hover over the error to see the error message
await page . hover ( '.cm-lint-marker-error' )
await expect (
page
. getByText (
'sketch profile must lie entirely on one side of the revolution axis'
)
. first ( )
) . toBeVisible ( )
} )
2024-08-07 19:27:32 +10:00
} )
2024-08-20 22:11:21 -04:00
test (
'Opening multiple panes persists when switching projects' ,
{ tag : '@electron' } ,
2024-12-05 16:37:56 -05:00
async ( { context , page } , testInfo ) = > {
2024-08-20 22:11:21 -04:00
// Setup multiple projects.
2024-12-05 16:37:56 -05:00
await context . folderSetupFn ( async ( dir ) = > {
2024-11-22 14:34:32 -05:00
const routerTemplateDir = join ( dir , 'router-template-slate' )
const bracketDir = join ( dir , 'bracket' )
await Promise . all ( [
fsp . mkdir ( routerTemplateDir , { recursive : true } ) ,
fsp . mkdir ( bracketDir , { recursive : true } ) ,
] )
await Promise . all ( [
fsp . copyFile (
executorInputPath ( 'router-template-slate.kcl' ) ,
join ( routerTemplateDir , 'main.kcl' )
) ,
fsp . copyFile (
executorInputPath ( 'focusrite_scarlett_mounting_braket.kcl' ) ,
join ( bracketDir , 'main.kcl' )
) ,
] )
2024-08-20 22:11:21 -04:00
} )
const u = await getUtils ( page )
2024-11-22 14:34:32 -05:00
await page . setBodyDimensions ( { width : 1200 , height : 500 } )
2024-08-20 22:11:21 -04:00
await test . step ( 'Opening the bracket project should load' , async ( ) = > {
await expect ( page . getByText ( 'bracket' ) ) . toBeVisible ( )
await page . getByText ( 'bracket' ) . click ( )
2024-09-04 11:30:09 -04:00
await u . waitForPageLoad ( )
2024-08-20 22:11:21 -04:00
} )
// If they're open by default, we're not actually testing anything.
await test . step ( 'Pre-condition: panes are not already visible' , async ( ) = > {
await expect ( page . locator ( '#variables-pane' ) ) . not . toBeVisible ( )
await expect ( page . locator ( '#logs-pane' ) ) . not . toBeVisible ( )
} )
await test . step ( 'Open multiple panes' , async ( ) = > {
await u . openKclCodePanel ( )
await u . openVariablesPane ( )
await u . openLogsPane ( )
} )
await test . step ( 'Clicking the logo takes us back to the projects page / home' , async ( ) = > {
await page . getByTestId ( 'app-logo' ) . click ( )
await expect ( page . getByRole ( 'link' , { name : 'bracket' } ) ) . toBeVisible ( )
await expect ( page . getByText ( 'router-template-slate' ) ) . toBeVisible ( )
await expect ( page . getByText ( 'New Project' ) ) . toBeVisible ( )
} )
await test . step ( 'Opening the router-template project should load' , async ( ) = > {
await expect ( page . getByText ( 'router-template-slate' ) ) . toBeVisible ( )
await page . getByText ( 'router-template-slate' ) . click ( )
2024-09-04 11:30:09 -04:00
await u . waitForPageLoad ( )
2024-08-20 22:11:21 -04:00
} )
await test . step ( 'All panes opened before should be visible' , async ( ) = > {
await expect ( page . locator ( '#code-pane' ) ) . toBeVisible ( )
await expect ( page . locator ( '#variables-pane' ) ) . toBeVisible ( )
await expect ( page . locator ( '#logs-pane' ) ) . toBeVisible ( )
} )
}
)
2024-10-17 23:42:24 -04:00
test (
'external change of file contents are reflected in editor' ,
{ tag : '@electron' } ,
2024-12-05 16:37:56 -05:00
async ( { context , page } , testInfo ) = > {
2024-10-17 23:42:24 -04:00
const PROJECT_DIR_NAME = 'lee-was-here'
2024-11-22 16:09:09 -05:00
const { dir : projectsDir } = await context . folderSetupFn ( async ( dir ) = > {
2024-11-22 14:34:32 -05:00
const aProjectDir = join ( dir , PROJECT_DIR_NAME )
await fsp . mkdir ( aProjectDir , { recursive : true } )
2024-10-17 23:42:24 -04:00
} )
const u = await getUtils ( page )
2024-11-22 14:34:32 -05:00
await page . setBodyDimensions ( { width : 1200 , height : 500 } )
2024-10-17 23:42:24 -04:00
await test . step ( 'Open the project' , async ( ) = > {
await expect ( page . getByText ( PROJECT_DIR_NAME ) ) . toBeVisible ( )
await page . getByText ( PROJECT_DIR_NAME ) . click ( )
await u . waitForPageLoad ( )
} )
await u . openFilePanel ( )
await u . openKclCodePanel ( )
await test . step ( 'Write to file externally and check for changed content' , async ( ) = > {
const content = 'ha he ho ho ha blap scap be dap'
await fsp . writeFile (
join ( projectsDir , PROJECT_DIR_NAME , 'main.kcl' ) ,
content
)
await u . editorTextMatches ( content )
} )
}
)