* Add HammerJS * Fmt and little type cleanup * Implement multi-touch through HammerJS * Add velocity-decay "flick" behavior for orbit * Update src/clientSideScene/CameraControls.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * tsc fix * Update src/clientSideScene/CameraControls.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> * Release KCL 80 (#7391) * Check for updates button in moar menus & toasts (#7369) * Check for update button in more menus Fixes #7368 * Add menubar item * Another one * Add Checking for updates... and No new update toasts * Lint * Trigger CI * Update src/main.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update electron-builder.yml Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Update electron-builder.yml * Moar clean up --------- Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> * Format examples in docs (#7378) Signed-off-by: Nick Cameron <nrc@ncameron.org> * Fix some typos in previous PR (#7392) Signed-off-by: Nick Cameron <nrc@ncameron.org> * Remove the untyped getters from std::args (#7377) * Move last uses of untypeed arg getters Signed-off-by: Nick Cameron <nrc@ncameron.org> * Rename _typed functions Signed-off-by: Nick Cameron <nrc@ncameron.org> --------- Signed-off-by: Nick Cameron <nrc@ncameron.org> * WIP #7226 Fix remove constraints (#7304) * handle if graphSelections is empty * fix removeConstrainingValuesInfo by using pathToNodes if available instead of selectionRanges: current selection should not be required to remove constraints * selectionRanges not needed for removeConstrainingValuesInfo anymore * fix remove constraint unit test: pass line's pathToNode instead of argument to remove constraint * Change to use artifact pathToNode (#7361) * Change to use artifact pathToNode * Fix to do bounds checking * move TTC capture to unit test (#7268) * move TTC capture to unit test * progress with artifact * fmt * abstract cases * add another case * add another test * update snapshots with proper file names * force to JSON * fmt * make jest happy * add another example and other tweaks * fix * tweak * add logs * more logs * strip out kcl version * remove logs * add comment explainer * more comments * more comment * remove package-lock line * Add support for tag on close segment when the last sketch edge is missing (#7375) * add test * fix * Update snapshots * Update snapshots --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Use namespace for windows e2e tests (#7398) * Use namespace for windows e2e tests * Change to the new profile * Remove TODO * Commit new snapshots even if some tests failed (#7399) * Commit new snapshots even if some tests failed * Update snapshots --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> * Clean up share link tests (#7372) * pierremtb/adhoc/clean-up-share-link-tests * Lint * WIP labels * Trigger CI * Change to skips * Remove old docs files (#7381) * Remove old files; no longer generated. * Update snapshots * Update snapshots --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Jace Browning <jacebrowning@gmail.com> * #7199 Fix broken links in docs (#7397) * update broken links * update github discussion links, fmt * update comment --------- Co-authored-by: Jace Browning <jacebrowning@gmail.com> * Inline engine issue from @Irev-Dev * Add commented-out test to be implemented later https://github.com/KittyCAD/modeling-app/issues/7403 * Update e2e/playwright/test-utils.ts Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> --------- Signed-off-by: Nick Cameron <nrc@ncameron.org> Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com> Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Co-authored-by: Jonathan Tran <jonnytran@gmail.com> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: Nick Cameron <nrc@ncameron.org> Co-authored-by: Andrew Varga <grizzly33@gmail.com> Co-authored-by: max <margorskyi@gmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Jace Browning <jacebrowning@gmail.com> Co-authored-by: Nick McCleery <34814836+nickmccleery@users.noreply.github.com>
147 lines
4.4 KiB
TypeScript
147 lines
4.4 KiB
TypeScript
import { getUtils } from '@e2e/playwright/test-utils'
|
|
import { expect, test } from '@e2e/playwright/zoo-test'
|
|
import { type Page } from '@playwright/test'
|
|
import type { SceneFixture } from '@e2e/playwright/fixtures/sceneFixture'
|
|
|
|
test.use({
|
|
hasTouch: true,
|
|
})
|
|
test.describe('Testing Camera Movement (Touch Only)', () => {
|
|
/**
|
|
* DUPLICATED FROM `testing-camera-movement.spec.ts`, might need to become a util.
|
|
*
|
|
* hack that we're implemented our own retry instead of using retries built into playwright.
|
|
* however each of these camera drags can be flaky, because of udp
|
|
* and so putting them together means only one needs to fail to make this test extra flaky.
|
|
* this way we can retry within the test
|
|
* We could break them out into separate tests, but the longest past of the test is waiting
|
|
* for the stream to start, so it can be good to bundle related things together.
|
|
*/
|
|
const _bakeInRetries = async ({
|
|
mouseActions,
|
|
afterPosition,
|
|
beforePosition,
|
|
retryCount = 0,
|
|
page,
|
|
scene,
|
|
}: {
|
|
mouseActions: () => Promise<void>
|
|
beforePosition: [number, number, number]
|
|
afterPosition: [number, number, number]
|
|
retryCount?: number
|
|
page: Page
|
|
scene: SceneFixture
|
|
}) => {
|
|
const acceptableCamError = 5
|
|
const u = await getUtils(page)
|
|
|
|
await test.step('Set up initial camera position', async () =>
|
|
await scene.moveCameraTo({
|
|
x: beforePosition[0],
|
|
y: beforePosition[1],
|
|
z: beforePosition[2],
|
|
}))
|
|
|
|
await test.step('Do actions and watch for changes', async () =>
|
|
u.doAndWaitForImageDiff(async () => {
|
|
await mouseActions()
|
|
|
|
await u.openAndClearDebugPanel()
|
|
await u.closeDebugPanel()
|
|
await page.waitForTimeout(100)
|
|
}, 300))
|
|
|
|
await u.openAndClearDebugPanel()
|
|
await expect(page.getByTestId('cam-x-position')).toBeAttached()
|
|
|
|
const vals = await Promise.all([
|
|
page.getByTestId('cam-x-position').inputValue(),
|
|
page.getByTestId('cam-y-position').inputValue(),
|
|
page.getByTestId('cam-z-position').inputValue(),
|
|
])
|
|
const errors = vals.map((v, i) => Math.abs(Number(v) - afterPosition[i]))
|
|
let shouldRetry = false
|
|
|
|
if (errors.some((e) => e > acceptableCamError)) {
|
|
if (retryCount > 2) {
|
|
console.log('xVal', vals[0], 'xError', errors[0])
|
|
console.log('yVal', vals[1], 'yError', errors[1])
|
|
console.log('zVal', vals[2], 'zError', errors[2])
|
|
|
|
throw new Error('Camera position not as expected', {
|
|
cause: {
|
|
vals,
|
|
errors,
|
|
},
|
|
})
|
|
}
|
|
shouldRetry = true
|
|
}
|
|
if (shouldRetry) {
|
|
await _bakeInRetries({
|
|
mouseActions,
|
|
afterPosition: afterPosition,
|
|
beforePosition: beforePosition,
|
|
retryCount: retryCount + 1,
|
|
page,
|
|
scene,
|
|
})
|
|
}
|
|
}
|
|
// test(
|
|
// 'Touch camera controls',
|
|
// {
|
|
// tag: '@web',
|
|
// },
|
|
// async ({ page, homePage, scene, cmdBar }) => {
|
|
// const u = await getUtils(page)
|
|
// const camInitialPosition: [number, number, number] = [0, 85, 85]
|
|
//
|
|
// await homePage.goToModelingScene()
|
|
// await scene.settled(cmdBar)
|
|
// const stream = page.getByTestId('stream')
|
|
//
|
|
// await u.openAndClearDebugPanel()
|
|
// await u.closeKclCodePanel()
|
|
//
|
|
// await test.step('Orbit', async () => {
|
|
// await bakeInRetries({
|
|
// mouseActions: async () => {
|
|
// await panFromCenter(stream, 200, 200)
|
|
// await page.waitForTimeout(200)
|
|
// },
|
|
// afterPosition: [19, 85, 85],
|
|
// beforePosition: camInitialPosition,
|
|
// page,
|
|
// scene,
|
|
// })
|
|
// })
|
|
//
|
|
// await test.step('Pan', async () => {
|
|
// await bakeInRetries({
|
|
// mouseActions: async () => {
|
|
// await panTwoFingerFromCenter(stream, 200, 200)
|
|
// await page.waitForTimeout(200)
|
|
// },
|
|
// afterPosition: [19, 85, 85],
|
|
// beforePosition: camInitialPosition,
|
|
// page,
|
|
// scene,
|
|
// })
|
|
// })
|
|
//
|
|
// await test.step('Zoom', async () => {
|
|
// await bakeInRetries({
|
|
// mouseActions: async () => {
|
|
// await pinchFromCenter(stream, 300, -100, 5)
|
|
// },
|
|
// afterPosition: [0, 118, 118],
|
|
// beforePosition: camInitialPosition,
|
|
// page,
|
|
// scene,
|
|
// })
|
|
// })
|
|
// }
|
|
// )
|
|
})
|