Electron test: (regression) you can scroll the file pane when ETOOMANYFILES to view in one view (#3520)
* can scroll files pane * clean up
This commit is contained in:
@ -2,6 +2,7 @@ import { test, expect } from '@playwright/test'
|
|||||||
import {
|
import {
|
||||||
doExport,
|
doExport,
|
||||||
getUtils,
|
getUtils,
|
||||||
|
isOutOfViewInScrollContainer,
|
||||||
Paths,
|
Paths,
|
||||||
setupElectron,
|
setupElectron,
|
||||||
tearDown,
|
tearDown,
|
||||||
@ -964,6 +965,115 @@ test(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
test(
|
||||||
|
'file plane is scrollable when there are many files',
|
||||||
|
{ tag: '@electron' },
|
||||||
|
async ({ browserName }, testInfo) => {
|
||||||
|
const { electronApp, page } = await setupElectron({
|
||||||
|
testInfo,
|
||||||
|
folderSetupFn: async (dir) => {
|
||||||
|
await fsp.mkdir(`${dir}/testProject`, { recursive: true })
|
||||||
|
const fileNames = [
|
||||||
|
'angled_line.kcl',
|
||||||
|
'basic_fillet_cube_close_opposite.kcl',
|
||||||
|
'basic_fillet_cube_end.kcl',
|
||||||
|
'basic_fillet_cube_next_adjacent.kcl',
|
||||||
|
'basic_fillet_cube_previous_adjacent.kcl',
|
||||||
|
'basic_fillet_cube_start.kcl',
|
||||||
|
'big_number_angle_to_match_length_x.kcl',
|
||||||
|
'big_number_angle_to_match_length_y.kcl',
|
||||||
|
'close_arc.kcl',
|
||||||
|
'computed_var.kcl',
|
||||||
|
'cube-embedded.gltf',
|
||||||
|
'cube.bin',
|
||||||
|
'cube.glb',
|
||||||
|
'cube.gltf',
|
||||||
|
'cube.kcl',
|
||||||
|
'cube.mtl',
|
||||||
|
'cube.obj',
|
||||||
|
'cylinder.kcl',
|
||||||
|
'dimensions_match.kcl',
|
||||||
|
'extrude-custom-plane.kcl',
|
||||||
|
'extrude-inside-fn-with-tags.kcl',
|
||||||
|
'fillet-and-shell.kcl',
|
||||||
|
'fillet_duplicate_tags.kcl',
|
||||||
|
'focusrite_scarlett_mounting_braket.kcl',
|
||||||
|
'function_sketch.kcl',
|
||||||
|
'function_sketch_with_position.kcl',
|
||||||
|
'global-tags.kcl',
|
||||||
|
'helix_ccw.kcl',
|
||||||
|
'helix_defaults.kcl',
|
||||||
|
'helix_defaults_negative_extrude.kcl',
|
||||||
|
'helix_with_length.kcl',
|
||||||
|
'i_shape.kcl',
|
||||||
|
'kittycad_svg.kcl',
|
||||||
|
'lego.kcl',
|
||||||
|
'math.kcl',
|
||||||
|
'member_expression_sketch_group.kcl',
|
||||||
|
'mike_stress_test.kcl',
|
||||||
|
'negative_args.kcl',
|
||||||
|
'order-sketch-extrude-in-order.kcl',
|
||||||
|
'order-sketch-extrude-out-of-order.kcl',
|
||||||
|
'parametric.kcl',
|
||||||
|
'parametric_with_tan_arc.kcl',
|
||||||
|
'pattern_vase.kcl',
|
||||||
|
'pentagon_fillet_sugar.kcl',
|
||||||
|
'pipe_as_arg.kcl',
|
||||||
|
'pipes_on_pipes.kcl',
|
||||||
|
'riddle.kcl',
|
||||||
|
'riddle_small.kcl',
|
||||||
|
'router-template-slate.kcl',
|
||||||
|
'scoped-tags.kcl',
|
||||||
|
'server-rack-heavy.kcl',
|
||||||
|
'server-rack-lite.kcl',
|
||||||
|
'sketch_on_face.kcl',
|
||||||
|
'sketch_on_face_circle_tagged.kcl',
|
||||||
|
'sketch_on_face_end.kcl',
|
||||||
|
'sketch_on_face_end_negative_extrude.kcl',
|
||||||
|
'sketch_on_face_start.kcl',
|
||||||
|
'tan_arc_x_line.kcl',
|
||||||
|
'tangential_arc.kcl',
|
||||||
|
]
|
||||||
|
for (const fileName of fileNames) {
|
||||||
|
await fsp.copyFile(
|
||||||
|
`src/wasm-lib/tests/executor/inputs/${fileName}`,
|
||||||
|
`${dir}/testProject/${fileName}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
await page.setViewportSize({ width: 1200, height: 500 })
|
||||||
|
|
||||||
|
page.on('console', console.log)
|
||||||
|
|
||||||
|
await test.step('setup, open file pane', async () => {
|
||||||
|
await page.getByText('testProject').click()
|
||||||
|
await expect(page.getByTestId('loading')).toBeAttached()
|
||||||
|
await expect(page.getByTestId('loading')).not.toBeAttached({
|
||||||
|
timeout: 20_000,
|
||||||
|
})
|
||||||
|
|
||||||
|
await page.getByTestId('files-pane-button').click()
|
||||||
|
})
|
||||||
|
|
||||||
|
await test.step('check the last file is out of view initially, and can be scrolled to', async () => {
|
||||||
|
const element = page.getByText('tangential_arc.kcl')
|
||||||
|
const container = page.getByTestId('file-pane-scroll-container')
|
||||||
|
|
||||||
|
await expect(await isOutOfViewInScrollContainer(element, container)).toBe(
|
||||||
|
true
|
||||||
|
)
|
||||||
|
await element.scrollIntoViewIfNeeded()
|
||||||
|
await expect(await isOutOfViewInScrollContainer(element, container)).toBe(
|
||||||
|
false
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
await electronApp.close()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
test(
|
test(
|
||||||
'Settings persist across restarts',
|
'Settings persist across restarts',
|
||||||
{ tag: '@electron' },
|
{ tag: '@electron' },
|
||||||
|
@ -5,6 +5,7 @@ import {
|
|||||||
TestInfo,
|
TestInfo,
|
||||||
BrowserContext,
|
BrowserContext,
|
||||||
_electron as electron,
|
_electron as electron,
|
||||||
|
Locator,
|
||||||
} from '@playwright/test'
|
} from '@playwright/test'
|
||||||
import { EngineCommand } from 'lang/std/artifactGraph'
|
import { EngineCommand } from 'lang/std/artifactGraph'
|
||||||
import os from 'os'
|
import os from 'os'
|
||||||
@ -745,3 +746,22 @@ export async function setupElectron({
|
|||||||
|
|
||||||
return { electronApp, page }
|
return { electronApp, page }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function isOutOfViewInScrollContainer(
|
||||||
|
element: Locator,
|
||||||
|
container: Locator
|
||||||
|
): Promise<boolean> {
|
||||||
|
const elementBox = await element.boundingBox({ timeout: 5_000 })
|
||||||
|
const containerBox = await container.boundingBox({ timeout: 5_000 })
|
||||||
|
|
||||||
|
let isOutOfView = false
|
||||||
|
if (elementBox && containerBox)
|
||||||
|
return (
|
||||||
|
elementBox.y + elementBox.height > containerBox.y + containerBox.height ||
|
||||||
|
elementBox.y < containerBox.y ||
|
||||||
|
elementBox.x + elementBox.width > containerBox.x + containerBox.width ||
|
||||||
|
elementBox.x < containerBox.x
|
||||||
|
)
|
||||||
|
|
||||||
|
return isOutOfView
|
||||||
|
}
|
||||||
|
@ -464,7 +464,10 @@ export const FileTreeInner = ({
|
|||||||
}, [documentHasFocus])
|
}, [documentHasFocus])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="overflow-auto pb-12 absolute inset-0">
|
<div
|
||||||
|
className="overflow-auto pb-12 absolute inset-0"
|
||||||
|
data-testid="file-pane-scroll-container"
|
||||||
|
>
|
||||||
<ul
|
<ul
|
||||||
className="m-0 p-0 text-sm"
|
className="m-0 p-0 text-sm"
|
||||||
onClickCapture={(e) => {
|
onClickCapture={(e) => {
|
||||||
|
Reference in New Issue
Block a user