* Add basic Popover functionality * Fix up light mode of basic bar * Add support for 2D and 3D mode styling * Turn toolbar buttons back on * Remove ActionButton until after tool logic refactor * Add transitions * Add initial modeling machine This is not a full description of how the modelingMachine should work, but begins to replicate all of the features of our useStore in XState instead of zustand. * Add fillet tool flow * Refactor: break out engine manager setup into hook Preparing for making a wrapper component around the App that will manage the engine manager at the same level as the modelingMachine. * Create modeling provider, move engine management to it * Refactor: move other engine-related useEffect into hook * Add TS schema, selection actions to modelingMachine * Add barebones modeling machine to app Only implementing adding to code-based selections in the text editor so far * Update moved useEffect hook after merge * give myself reminder TODO * fix engineCommandManager waitForReady Promise * enable devtools * make utility class for handling default planes * progresson startNewSketch and EditSketch * add provider to tests * too large of a commit put all of the lang state into another singleton, but did lots of work on xstate too * fix edit sketch ast issue * re-execute on sketch exit * prettierignore xstate typegen file * add move tool button back in * handle mouse commands with xState states * fix move * remove old imports * big useStore delete * fix some destructuring bugs * start of constraint actions * add horizontal/vertical distance constraints * fix more destructuring errors * fix * add angle constaints * add align vertically/horizontally constraints * add length and equal length constraints * rename modal states to be more cmd bar friendly * add doesPipeHave query * add another query * add extrude states * state machine clean up * xstate layout tweak * make xstate types happy * Revamp cursor logic and place curors after ast mod * Xstate merge (#796) * turning back on all planes (#720) * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix more tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix stdlib Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> compile Signed-off-by: Jess Frazelle <github@jessfraz.com> update sample code Signed-off-by: Jess Frazelle <github@jessfraz.com> re-enable the planes Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fix all tests Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> boilerplate Signed-off-by: Jess Frazelle <github@jessfraz.com> Cut release v0.9.2 (#714) rust make default planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> use the planes from engine Signed-off-by: Jess Frazelle <github@jessfraz.com> fixups Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> negative args Signed-off-by: Jess Frazelle <github@jessfraz.com> diable camera Signed-off-by: Jess Frazelle <github@jessfraz.com> hide planes Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updatress Signed-off-by: Jess Frazelle <github@jessfraz.com> fmt Signed-off-by: Jess Frazelle <github@jessfraz.com> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> Update src/hooks/useAppMode.ts Co-authored-by: Kurt Hutten <k.hutten@protonmail.ch> cleanups Signed-off-by: Jess Frazelle <github@jessfraz.com> Bump kittycad from 0.2.26 to 0.2.27 in /src-tauri (#726) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump tauri-plugin-fs-extra from `b04bde3` to `6c7a4c0` in /src-tauri (#725) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `b04bde3` to `6c7a4c0`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](b04bde3461...6c7a4c0984
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump toml from 0.8.0 to 0.8.1 in /src-tauri (#724) Bumps [toml](https://github.com/toml-rs/toml) from 0.8.0 to 0.8.1. - [Commits](https://github.com/toml-rs/toml/compare/toml-v0.8.0...toml-v0.8.1) --- updated-dependencies: - dependency-name: toml dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump openapitor from `61a1605` to `d3e98c4` in /src/wasm-lib (#723) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `61a1605` to `d3e98c4`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](61a16059b3...d3e98c4ec0
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump kittycad from 0.2.26 to 0.2.27 in /src/wasm-lib (#722) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.26 to 0.2.27. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.26...v0.2.27) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump thiserror from 1.0.48 to 1.0.49 in /src/wasm-lib (#721) Bumps [thiserror](https://github.com/dtolnay/thiserror) from 1.0.48 to 1.0.49. - [Release notes](https://github.com/dtolnay/thiserror/releases) - [Commits](https://github.com/dtolnay/thiserror/compare/1.0.48...1.0.49) --- updated-dependencies: - dependency-name: thiserror dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump expectorate from 1.0.7 to 1.1.0 in /src/wasm-lib (#712) Bumps [expectorate](https://github.com/oxidecomputer/expectorate) from 1.0.7 to 1.1.0. - [Release notes](https://github.com/oxidecomputer/expectorate/releases) - [Commits](https://github.com/oxidecomputer/expectorate/compare/v1.0.7...v1.1.0) --- updated-dependencies: - dependency-name: expectorate dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump clap from 4.4.4 to 4.4.5 in /src/wasm-lib (#711) Bumps [clap](https://github.com/clap-rs/clap) from 4.4.4 to 4.4.5. - [Release notes](https://github.com/clap-rs/clap/releases) - [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md) - [Commits](https://github.com/clap-rs/clap/compare/v4.4.4...v4.4.5) --- updated-dependencies: - dependency-name: clap dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> refactor cleanup Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> updates Signed-off-by: Jess Frazelle <github@jessfraz.com> type improvements * use new sketchmode no camera Signed-off-by: Jess Frazelle <github@jessfraz.com> * js working better Signed-off-by: Jess Frazelle <github@jessfraz.com> * start of negative planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * tests and neg Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * images Signed-off-by: Jess Frazelle <github@jessfraz.com> * norma;s Signed-off-by: Jess Frazelle <github@jessfraz.com> * better initial load of planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * ts Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tsc Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix edit sketch Signed-off-by: Jess Frazelle <github@jessfraz.com> * add regression test for 2d solid issue Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * show planes Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix clippy Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix tests Signed-off-by: Jess Frazelle <github@jessfraz.com> * canecel in progress Signed-off-by: Jess Frazelle <github@jessfraz.com> * fix ci as well Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * stopping point Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> * refactor Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * it works Signed-off-by: Jess Frazelle <github@jessfraz.com> * updates Signed-off-by: Jess Frazelle <github@jessfraz.com> * Hide planes (#797) * hide planes in one go Signed-off-by: Jess Frazelle <github@jessfraz.com> * update hide; Signed-off-by: Jess Frazelle <github@jessfraz.com> * fixes Signed-off-by: Jess Frazelle <github@jessfraz.com> --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> * make tsc happy * Make "Replay Onboarding" button available on home settings page (#804) * Fix unrelated bug, settings button in the home sidebar doesn't go to the home settings after my previous fixes to routes * Turn on "Replay Onboarding" button in home settings * Use ONBOARDING_PROJECT_NAME in both places * Fix formatting * Cut release v0.10.0 (#803) Co-authored-by: Frank Noirot <frank@kittycad.io> * Bump kittycad from 0.2.28 to 0.2.31 in /src-tauri (#798) Bumps [kittycad](https://github.com/KittyCAD/kittycad.rs) from 0.2.28 to 0.2.31. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](https://github.com/KittyCAD/kittycad.rs/compare/v0.2.28...v0.2.31) --- updated-dependencies: - dependency-name: kittycad dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump openapitor from `fa0345c` to `c122a9b` in /src/wasm-lib (#800) Bumps [openapitor](https://github.com/KittyCAD/kittycad.rs) from `fa0345c` to `c122a9b`. - [Release notes](https://github.com/KittyCAD/kittycad.rs/releases) - [Commits](fa0345c514...c122a9b1d6
) --- updated-dependencies: - dependency-name: openapitor dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump syn from 2.0.37 to 2.0.38 in /src/wasm-lib (#801) Bumps [syn](https://github.com/dtolnay/syn) from 2.0.37 to 2.0.38. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/2.0.37...2.0.38) --- updated-dependencies: - dependency-name: syn dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump winnow from 0.5.15 to 0.5.16 in /src/wasm-lib (#799) Bumps [winnow](https://github.com/winnow-rs/winnow) from 0.5.15 to 0.5.16. - [Changelog](https://github.com/winnow-rs/winnow/blob/main/CHANGELOG.md) - [Commits](https://github.com/winnow-rs/winnow/compare/v0.5.15...v0.5.16) --- updated-dependencies: - dependency-name: winnow dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump tauri-plugin-fs-extra from `fa32d1a` to `9f27e6e` in /src-tauri (#802) Bumps [tauri-plugin-fs-extra](https://github.com/tauri-apps/plugins-workspace) from `fa32d1a` to `9f27e6e`. - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](fa32d1afa9...9f27e6e441
) --- updated-dependencies: - dependency-name: tauri-plugin-fs-extra dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * better plane selection Signed-off-by: Jess Frazelle <github@jessfraz.com> * use the sketch plane id Signed-off-by: Jess Frazelle <github@jessfraz.com> * add todo w bug Signed-off-by: Jess Frazelle <github@jessfraz.com> * Improve Prop Typings for Modals. Remove instances of `any`. (#792) * Update typings for modals. Remove instances of `any` * Fix generic type for creating modals * cleanup other stuffs Signed-off-by: Jess Frazelle <github@jessfraz.com> * make plane id available when selecting default plane * few clean up things * change enter sketch action order to make sure plane id is available to 'enter edit mode' * Revert "Improve Prop Typings for Modals. Remove instances of `any`. (… (#813) Revert "Improve Prop Typings for Modals. Remove instances of `any`. (#792)" This reverts commit629f326f4c
. * ffmpeg instructions (#814) * fix some tsc stuff * small tweak --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Kurt Hutten Irev-Dev <k.hutten@protonmail.ch> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com> * clean up * fix test and tsc * remove one more thing from useStore * tweak state digrame layout * fmt --------- Signed-off-by: Jess Frazelle <github@jessfraz.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Frank Johnson <frankjohnson1993@gmail.com> Co-authored-by: Frank Noirot <frank@kittycad.io> Co-authored-by: Jess Frazelle <jessfraz@users.noreply.github.com> Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jason Rametta <rametta@outlook.com>
362 lines
12 KiB
TypeScript
362 lines
12 KiB
TypeScript
import { parse, recast, initPromise } from './wasm'
|
|
import {
|
|
findAllPreviousVariables,
|
|
isNodeSafeToReplace,
|
|
isTypeInValue,
|
|
getNodePathFromSourceRange,
|
|
doesPipeHaveCallExp,
|
|
hasExtrudeSketchGroup,
|
|
} from './queryAst'
|
|
import { enginelessExecutor } from '../lib/testHelpers'
|
|
import {
|
|
createArrayExpression,
|
|
createCallExpression,
|
|
createLiteral,
|
|
createPipeSubstitution,
|
|
} from './modifyAst'
|
|
|
|
beforeAll(() => initPromise)
|
|
|
|
describe('findAllPreviousVariables', () => {
|
|
it('should find all previous variables', async () => {
|
|
const code = `const baseThick = 1
|
|
const armAngle = 60
|
|
|
|
const baseThickHalf = baseThick / 2
|
|
const halfArmAngle = armAngle / 2
|
|
|
|
const arrExpShouldNotBeIncluded = [1, 2, 3]
|
|
const objExpShouldNotBeIncluded = { a: 1, b: 2, c: 3 }
|
|
|
|
const part001 = startSketchOn('XY')
|
|
|> startProfileAt([0, 0], %)
|
|
|> yLineTo(1, %)
|
|
|> xLine(3.84, %) // selection-range-7ish-before-this
|
|
|
|
const variableBelowShouldNotBeIncluded = 3
|
|
|
|
show(part001)`
|
|
const rangeStart = code.indexOf('// selection-range-7ish-before-this') - 7
|
|
const ast = parse(code)
|
|
const programMemory = await enginelessExecutor(ast)
|
|
|
|
const { variables, bodyPath, insertIndex } = findAllPreviousVariables(
|
|
ast,
|
|
programMemory,
|
|
[rangeStart, rangeStart]
|
|
)
|
|
expect(variables).toEqual([
|
|
{ key: 'baseThick', value: 1 },
|
|
{ key: 'armAngle', value: 60 },
|
|
{ key: 'baseThickHalf', value: 0.5 },
|
|
{ key: 'halfArmAngle', value: 30 },
|
|
// no arrExpShouldNotBeIncluded, variableBelowShouldNotBeIncluded etc
|
|
])
|
|
// there are 4 number variables and 2 non-number variables before the sketch var
|
|
// ∴ the insert index should be 6
|
|
expect(insertIndex).toEqual(6)
|
|
expect(bodyPath).toEqual([['body', '']])
|
|
})
|
|
})
|
|
|
|
describe('testing argIsNotIdentifier', () => {
|
|
const code = `const part001 = startSketchOn('XY')
|
|
|> startProfileAt([-1.2, 4.83], %)
|
|
|> line([2.8, 0], %)
|
|
|> angledLine([100 + 100, 3.09], %)
|
|
|> angledLine([abc, 3.09], %)
|
|
|> angledLine([def('yo'), 3.09], %)
|
|
|> angledLine([ghi(%), 3.09], %)
|
|
|> angledLine([jkl('yo') + 2, 3.09], %)
|
|
const yo = 5 + 6
|
|
const yo2 = hmm([identifierGuy + 5])
|
|
show(part001)`
|
|
it('find a safe binaryExpression', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('100 + 100') + 2
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('BinaryExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe('100 + 100')
|
|
const { modifiedAst } = result.replacer(
|
|
JSON.parse(JSON.stringify(ast)),
|
|
'replaceName'
|
|
)
|
|
const outCode = recast(modifiedAst)
|
|
expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
|
|
})
|
|
it('find a safe Identifier', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('abc')
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('Identifier')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe('abc')
|
|
})
|
|
it('find a safe CallExpression', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('def')
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('CallExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe("def('yo')")
|
|
const { modifiedAst } = result.replacer(
|
|
JSON.parse(JSON.stringify(ast)),
|
|
'replaceName'
|
|
)
|
|
const outCode = recast(modifiedAst)
|
|
expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
|
|
})
|
|
it('find an UNsafe CallExpression, as it has a PipeSubstitution', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('ghi')
|
|
const range: [number, number] = [rangeStart, rangeStart]
|
|
const result = isNodeSafeToReplace(ast, range)
|
|
expect(result.isSafe).toBe(false)
|
|
expect(result.value?.type).toBe('CallExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe('ghi(%)')
|
|
})
|
|
it('find an UNsafe Identifier, as it is a callee', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('ine([2.8,')
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(false)
|
|
expect(result.value?.type).toBe('CallExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe(
|
|
'line([2.8, 0], %)'
|
|
)
|
|
})
|
|
it("find a safe BinaryExpression that's assigned to a variable", () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('5 + 6') + 1
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('BinaryExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe('5 + 6')
|
|
const { modifiedAst } = result.replacer(
|
|
JSON.parse(JSON.stringify(ast)),
|
|
'replaceName'
|
|
)
|
|
const outCode = recast(modifiedAst)
|
|
expect(outCode).toContain(`const yo = replaceName`)
|
|
})
|
|
it('find a safe BinaryExpression that has a CallExpression within', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('jkl') + 1
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('BinaryExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe(
|
|
"jkl('yo') + 2"
|
|
)
|
|
const { modifiedAst } = result.replacer(
|
|
JSON.parse(JSON.stringify(ast)),
|
|
'replaceName'
|
|
)
|
|
const outCode = recast(modifiedAst)
|
|
expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
|
|
})
|
|
it('find a safe BinaryExpression within a CallExpression', () => {
|
|
const ast = parse(code)
|
|
const rangeStart = code.indexOf('identifierGuy') + 1
|
|
const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart])
|
|
expect(result.isSafe).toBe(true)
|
|
expect(result.value?.type).toBe('BinaryExpression')
|
|
expect(code.slice(result.value.start, result.value.end)).toBe(
|
|
'identifierGuy + 5'
|
|
)
|
|
const { modifiedAst } = result.replacer(
|
|
JSON.parse(JSON.stringify(ast)),
|
|
'replaceName'
|
|
)
|
|
const outCode = recast(modifiedAst)
|
|
expect(outCode).toContain(`const yo2 = hmm([replaceName])`)
|
|
})
|
|
|
|
describe('testing isTypeInValue', () => {
|
|
it('finds the pipeSubstituion', () => {
|
|
const val = createCallExpression('yoyo', [
|
|
createArrayExpression([
|
|
createLiteral(1),
|
|
createCallExpression('yoyo2', [createPipeSubstitution()]),
|
|
createLiteral('hey'),
|
|
]),
|
|
])
|
|
expect(isTypeInValue(val, 'PipeSubstitution')).toBe(true)
|
|
})
|
|
it('There is no pipeSubstituion', () => {
|
|
const val = createCallExpression('yoyo', [
|
|
createArrayExpression([
|
|
createLiteral(1),
|
|
createCallExpression('yoyo2', [createLiteral(5)]),
|
|
createLiteral('hey'),
|
|
]),
|
|
])
|
|
expect(isTypeInValue(val, 'PipeSubstitution')).toBe(false)
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('testing getNodePathFromSourceRange', () => {
|
|
const code = `const part001 = startSketchOn('XY')
|
|
|> startProfileAt([0.39, -0.05], %)
|
|
|> line([0.94, 2.61], %)
|
|
|> line([-0.21, -1.4], %)
|
|
show(part001)`
|
|
it('finds the second line when cursor is put at the end', () => {
|
|
const searchLn = `line([0.94, 2.61], %)`
|
|
const sourceIndex = code.indexOf(searchLn) + searchLn.length
|
|
const ast = parse(code)
|
|
const result = getNodePathFromSourceRange(ast, [sourceIndex, sourceIndex])
|
|
expect(result).toEqual([
|
|
['body', ''],
|
|
[0, 'index'],
|
|
['declarations', 'VariableDeclaration'],
|
|
[0, 'index'],
|
|
['init', ''],
|
|
['body', 'PipeExpression'],
|
|
[2, 'index'],
|
|
])
|
|
})
|
|
it('finds the last line when cursor is put at the end', () => {
|
|
const searchLn = `line([-0.21, -1.4], %)`
|
|
const sourceIndex = code.indexOf(searchLn) + searchLn.length
|
|
const ast = parse(code)
|
|
const result = getNodePathFromSourceRange(ast, [sourceIndex, sourceIndex])
|
|
const expected = [
|
|
['body', ''],
|
|
[0, 'index'],
|
|
['declarations', 'VariableDeclaration'],
|
|
[0, 'index'],
|
|
['init', ''],
|
|
['body', 'PipeExpression'],
|
|
[3, 'index'],
|
|
]
|
|
expect(result).toEqual(expected)
|
|
// expect similar result for start of line
|
|
const startSourceIndex = code.indexOf(searchLn)
|
|
const startResult = getNodePathFromSourceRange(ast, [
|
|
startSourceIndex,
|
|
startSourceIndex,
|
|
])
|
|
expect(startResult).toEqual([...expected, ['callee', 'CallExpression']])
|
|
// expect similar result when whole line is selected
|
|
const selectWholeThing = getNodePathFromSourceRange(ast, [
|
|
startSourceIndex,
|
|
sourceIndex,
|
|
])
|
|
expect(selectWholeThing).toEqual(expected)
|
|
})
|
|
})
|
|
|
|
describe('testing doesPipeHave', () => {
|
|
it('finds close', () => {
|
|
const exampleCode = `const length001 = 2
|
|
const part001 = startSketchAt([-1.41, 3.46])
|
|
|> line({ to: [19.49, 1.16], tag: 'seg01' }, %)
|
|
|> angledLine([-35, length001], %)
|
|
|> line([-3.22, -7.36], %)
|
|
|> angledLine([-175, segLen('seg01', %)], %)
|
|
|> close(%)
|
|
`
|
|
const ast = parse(exampleCode)
|
|
const result = doesPipeHaveCallExp({
|
|
calleeName: 'close',
|
|
ast,
|
|
selection: { type: 'default', range: [100, 101] },
|
|
})
|
|
expect(result).toEqual(true)
|
|
})
|
|
it('finds extrude', () => {
|
|
const exampleCode = `const length001 = 2
|
|
const part001 = startSketchAt([-1.41, 3.46])
|
|
|> line({ to: [19.49, 1.16], tag: 'seg01' }, %)
|
|
|> angledLine([-35, length001], %)
|
|
|> line([-3.22, -7.36], %)
|
|
|> angledLine([-175, segLen('seg01', %)], %)
|
|
|> close(%)
|
|
|> extrude(1, %)
|
|
`
|
|
const ast = parse(exampleCode)
|
|
const result = doesPipeHaveCallExp({
|
|
calleeName: 'extrude',
|
|
ast,
|
|
selection: { type: 'default', range: [100, 101] },
|
|
})
|
|
expect(result).toEqual(true)
|
|
})
|
|
it('does NOT find close', () => {
|
|
const exampleCode = `const length001 = 2
|
|
const part001 = startSketchAt([-1.41, 3.46])
|
|
|> line({ to: [19.49, 1.16], tag: 'seg01' }, %)
|
|
|> angledLine([-35, length001], %)
|
|
|> line([-3.22, -7.36], %)
|
|
|> angledLine([-175, segLen('seg01', %)], %)
|
|
`
|
|
const ast = parse(exampleCode)
|
|
const result = doesPipeHaveCallExp({
|
|
calleeName: 'close',
|
|
ast,
|
|
selection: { type: 'default', range: [100, 101] },
|
|
})
|
|
expect(result).toEqual(false)
|
|
})
|
|
it('returns false if not a pipe', () => {
|
|
const exampleCode = `const length001 = 2`
|
|
const ast = parse(exampleCode)
|
|
const result = doesPipeHaveCallExp({
|
|
calleeName: 'close',
|
|
ast,
|
|
selection: { type: 'default', range: [9, 10] },
|
|
})
|
|
expect(result).toEqual(false)
|
|
})
|
|
})
|
|
|
|
describe('testing hasExtrudeSketchGroup', () => {
|
|
it('find sketch group', async () => {
|
|
const exampleCode = `const length001 = 2
|
|
const part001 = startSketchAt([-1.41, 3.46])
|
|
|> line({ to: [19.49, 1.16], tag: 'seg01' }, %)
|
|
|> angledLine([-35, length001], %)
|
|
|> line([-3.22, -7.36], %)
|
|
|> angledLine([-175, segLen('seg01', %)], %)`
|
|
const ast = parse(exampleCode)
|
|
const programMemory = await enginelessExecutor(ast)
|
|
const result = hasExtrudeSketchGroup({
|
|
ast,
|
|
selection: { type: 'default', range: [100, 101] },
|
|
programMemory,
|
|
})
|
|
expect(result).toEqual(true)
|
|
})
|
|
it('find extrude group', async () => {
|
|
const exampleCode = `const length001 = 2
|
|
const part001 = startSketchAt([-1.41, 3.46])
|
|
|> line({ to: [19.49, 1.16], tag: 'seg01' }, %)
|
|
|> angledLine([-35, length001], %)
|
|
|> line([-3.22, -7.36], %)
|
|
|> angledLine([-175, segLen('seg01', %)], %)
|
|
|> extrude(1, %)`
|
|
const ast = parse(exampleCode)
|
|
const programMemory = await enginelessExecutor(ast)
|
|
const result = hasExtrudeSketchGroup({
|
|
ast,
|
|
selection: { type: 'default', range: [100, 101] },
|
|
programMemory,
|
|
})
|
|
expect(result).toEqual(true)
|
|
})
|
|
it('finds nothing', async () => {
|
|
const exampleCode = `const length001 = 2`
|
|
const ast = parse(exampleCode)
|
|
const programMemory = await enginelessExecutor(ast)
|
|
const result = hasExtrudeSketchGroup({
|
|
ast,
|
|
selection: { type: 'default', range: [10, 11] },
|
|
programMemory,
|
|
})
|
|
expect(result).toEqual(false)
|
|
})
|
|
})
|