2023-09-29 11:11:01 -07:00
|
|
|
import { parse, SketchGroup, recast, initPromise } from '../wasm'
|
2023-03-02 21:19:11 +11:00
|
|
|
import {
|
|
|
|
ConstraintType,
|
|
|
|
getTransformInfos,
|
2023-03-07 15:45:59 +11:00
|
|
|
transformAstSketchLines,
|
2023-03-02 21:19:11 +11:00
|
|
|
} from './sketchcombos'
|
2023-03-20 07:09:19 +11:00
|
|
|
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
|
2023-10-16 21:20:05 +11:00
|
|
|
import { Selection } from 'lib/selections'
|
2023-07-10 15:15:07 +10:00
|
|
|
import { enginelessExecutor } from '../../lib/testHelpers'
|
2023-02-21 10:50:45 +11:00
|
|
|
|
|
|
|
beforeAll(() => initPromise)
|
|
|
|
|
|
|
|
// testing helper function
|
2023-06-22 16:43:33 +10:00
|
|
|
async function testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode,
|
|
|
|
callToSwap,
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType,
|
2023-02-21 10:50:45 +11:00
|
|
|
}: {
|
|
|
|
inputCode: string
|
|
|
|
callToSwap: string
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: ConstraintType
|
2023-06-22 16:43:33 +10:00
|
|
|
}): Promise<{
|
2023-02-21 10:50:45 +11:00
|
|
|
newCode: string
|
|
|
|
originalRange: [number, number]
|
2023-06-22 16:43:33 +10:00
|
|
|
}> {
|
2023-02-21 10:50:45 +11:00
|
|
|
const startIndex = inputCode.indexOf(callToSwap)
|
2023-04-03 16:05:25 +10:00
|
|
|
const range: Selection = {
|
|
|
|
type: 'default',
|
|
|
|
range: [startIndex, startIndex + callToSwap.length],
|
|
|
|
}
|
2023-09-29 11:11:01 -07:00
|
|
|
const ast = parse(inputCode)
|
2023-07-10 15:15:07 +10:00
|
|
|
const programMemory = await enginelessExecutor(ast)
|
2023-04-03 16:05:25 +10:00
|
|
|
const selections = {
|
|
|
|
codeBasedSelections: [range],
|
|
|
|
otherSelections: [],
|
|
|
|
}
|
|
|
|
const transformInfos = getTransformInfos(selections, ast, constraintType)
|
2023-03-02 21:19:11 +11:00
|
|
|
|
|
|
|
if (!transformInfos) throw new Error('nope')
|
2023-03-07 15:45:59 +11:00
|
|
|
const { modifiedAst } = transformAstSketchLines({
|
2023-02-21 10:50:45 +11:00
|
|
|
ast,
|
2023-03-02 21:19:11 +11:00
|
|
|
programMemory,
|
2023-04-03 16:05:25 +10:00
|
|
|
selectionRanges: selections,
|
2023-03-02 21:19:11 +11:00
|
|
|
transformInfos,
|
2023-03-07 15:45:59 +11:00
|
|
|
referenceSegName: '',
|
2023-03-02 21:19:11 +11:00
|
|
|
})
|
2023-02-21 10:50:45 +11:00
|
|
|
return {
|
|
|
|
newCode: recast(modifiedAst),
|
2023-04-03 16:05:25 +10:00
|
|
|
originalRange: range.range,
|
2023-02-21 10:50:45 +11:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-01 17:34:54 -05:00
|
|
|
describe('testing swapping out sketch calls with xLine/xLineTo', () => {
|
2023-02-21 10:50:45 +11:00
|
|
|
const bigExampleArr = [
|
2023-10-05 14:27:48 -07:00
|
|
|
`const part001 = startSketchOn('XY')`,
|
|
|
|
` |> startProfileAt([0, 0], %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
` |> lineTo({ to: [1, 1], tag: 'abc1' }, %)`,
|
|
|
|
` |> line({ to: [-2.04, -0.7], tag: 'abc2' }, %)`,
|
|
|
|
` |> angledLine({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 157,`,
|
|
|
|
` length: 1.69,`,
|
|
|
|
` tag: 'abc3'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
` |> angledLineOfXLength({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 217,`,
|
|
|
|
` length: 0.86,`,
|
|
|
|
` tag: 'abc4'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
` |> angledLineOfYLength({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 104,`,
|
|
|
|
` length: 1.58,`,
|
|
|
|
` tag: 'abc5'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
` |> angledLineToX({ angle: 55, to: -2.89, tag: 'abc6' }, %)`,
|
|
|
|
` |> angledLineToY({ angle: 330, to: 2.53, tag: 'abc7' }, %)`,
|
|
|
|
` |> xLine({ length: 1.47, tag: 'abc8' }, %)`,
|
|
|
|
` |> yLine({ length: 1.57, tag: 'abc9' }, %)`,
|
|
|
|
` |> xLineTo({ to: 1.49, tag: 'abc10' }, %)`,
|
|
|
|
` |> yLineTo({ to: 2.64, tag: 'abc11' }, %)`,
|
|
|
|
` |> lineTo([2.55, 3.58], %) // lineTo`,
|
|
|
|
` |> line([0.73, -0.75], %)`,
|
|
|
|
` |> angledLine([63, 1.38], %) // angledLine`,
|
|
|
|
` |> angledLineOfXLength([319, 1.15], %) // angledLineOfXLength`,
|
|
|
|
` |> angledLineOfYLength([50, 1.35], %) // angledLineOfYLength`,
|
|
|
|
` |> angledLineToX([291, 6.66], %) // angledLineToX`,
|
|
|
|
` |> angledLineToY([228, 2.14], %) // angledLineToY`,
|
|
|
|
` |> xLine(-1.33, %)`,
|
|
|
|
` |> yLine(-1.07, %)`,
|
|
|
|
` |> xLineTo(3.27, %)`,
|
|
|
|
` |> yLineTo(2.14, %)`,
|
|
|
|
]
|
|
|
|
const bigExample = bigExampleArr.join('\n')
|
2023-06-22 16:43:33 +10:00
|
|
|
it('line with tag converts to xLine', async () => {
|
2023-02-21 10:50:45 +11:00
|
|
|
const callToSwap = "line({ to: [-2.04, -0.7], tag: 'abc2' }, %)"
|
|
|
|
const expectedLine = "xLine({ length: -2.04, tag: 'abc2' }, %)"
|
2023-06-22 16:43:33 +10:00
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap,
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('line w/o tag converts to xLine', async () => {
|
2023-02-21 10:50:45 +11:00
|
|
|
const callToSwap = 'line([0.73, -0.75], %)'
|
|
|
|
const expectedLine = 'xLine(0.73, %)'
|
2023-06-22 16:43:33 +10:00
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap,
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('lineTo with tag converts to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: "lineTo({ to: [1, 1], tag: 'abc1' }, %)",
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "xLineTo({ to: 1, tag: 'abc1' }, %)"
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('lineTo w/o tag converts to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'lineTo([2.55, 3.58], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLineTo(2.55, %) // lineTo'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLine with tag converts to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: [
|
|
|
|
`angledLine({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 157,`,
|
|
|
|
` length: 1.69,`,
|
|
|
|
` tag: 'abc3'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
].join('\n'),
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "xLine({ length: -1.56, tag: 'abc3' }, %)"
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLine w/o tag converts to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'angledLine([63, 1.38], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLine(0.63, %) // angledLine'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfXLength with tag converts to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: [
|
|
|
|
`angledLineOfXLength({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 217,`,
|
|
|
|
` length: 0.86,`,
|
|
|
|
` tag: 'abc4'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
].join('\n'),
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "xLine({ length: -0.86, tag: 'abc4' }, %)"
|
2023-11-01 17:34:54 -05:00
|
|
|
// hmm "-0.86" is correct since the angle is 104, but need to make sure this is compatible `-myVar`
|
2023-02-21 10:50:45 +11:00
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfXLength w/o tag converts to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'angledLineOfXLength([319, 1.15], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLine(1.15, %) // angledLineOfXLength'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfYLength with tag converts to yLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: [
|
|
|
|
`angledLineOfYLength({`,
|
2023-09-06 10:36:03 -07:00
|
|
|
` angle: 104,`,
|
|
|
|
` length: 1.58,`,
|
|
|
|
` tag: 'abc5'`,
|
2023-09-05 16:02:27 -07:00
|
|
|
` }, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
].join('\n'),
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "yLine({ length: 1.58, tag: 'abc5' }, %)"
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfYLength w/o tag converts to yLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'angledLineOfYLength([50, 1.35], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'yLine(1.35, %) // angledLineOfYLength'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToX with tag converts to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: "angledLineToX({ angle: 55, to: -2.89, tag: 'abc6' }, %)",
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "xLineTo({ to: -2.89, tag: 'abc6' }, %)"
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToX w/o tag converts to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'angledLineToX([291, 6.66], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLineTo(6.66, %) // angledLineToX'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToY with tag converts to yLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: "angledLineToY({ angle: 330, to: 2.53, tag: 'abc7' }, %)",
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = "yLineTo({ to: 2.53, tag: 'abc7' }, %)"
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToY w/o tag converts to yLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: bigExample,
|
|
|
|
callToSwap: 'angledLineToY([228, 2.14], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'yLineTo(2.14, %) // angledLineToY'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2023-11-01 17:34:54 -05:00
|
|
|
describe('testing swapping out sketch calls with xLine/xLineTo while keeping variable/identifiers intact', () => {
|
2023-07-10 15:15:07 +10:00
|
|
|
// Enable rotations #152
|
2023-02-21 10:50:45 +11:00
|
|
|
const variablesExampleArr = [
|
|
|
|
`const lineX = -1`,
|
|
|
|
`const lineToX = -1.3`,
|
|
|
|
`const angledLineAngle = 207`,
|
|
|
|
`const angledLineOfXLengthX = 0.8`,
|
|
|
|
`const angledLineOfYLengthY = 0.89`,
|
|
|
|
`const angledLineToXx = -1.86`,
|
|
|
|
`const angledLineToYy = -0.76`,
|
2023-10-05 14:27:48 -07:00
|
|
|
`const part001 = startSketchOn('XY')`,
|
|
|
|
` |> startProfileAt([0, 0], %)`,
|
2023-07-10 15:15:07 +10:00
|
|
|
// ` |> rx(90, %)`,
|
2023-02-21 10:50:45 +11:00
|
|
|
` |> lineTo([1, 1], %)`,
|
|
|
|
` |> line([lineX, 2.13], %)`,
|
|
|
|
` |> lineTo([lineToX, 2.85], %)`,
|
|
|
|
` |> angledLine([angledLineAngle, 1.64], %)`,
|
|
|
|
` |> angledLineOfXLength([329, angledLineOfXLengthX], %)`,
|
|
|
|
` |> angledLineOfYLength([222, angledLineOfYLengthY], %)`,
|
|
|
|
` |> angledLineToX([330, angledLineToXx], %)`,
|
|
|
|
` |> angledLineToY([217, angledLineToYy], %)`,
|
|
|
|
` |> line([0.89, -0.1], %)`,
|
|
|
|
]
|
|
|
|
const varExample = variablesExampleArr.join('\n')
|
2023-06-22 16:43:33 +10:00
|
|
|
it('line keeps variable when converted to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'line([lineX, 2.13], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLine(lineX, %)'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('lineTo keeps variable when converted to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'lineTo([lineToX, 2.85], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLineTo(lineToX, %)'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfXLength keeps variable when converted to xLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'angledLineOfXLength([329, angledLineOfXLengthX], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLine(angledLineOfXLengthX, %)'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineOfYLength keeps variable when converted to yLine', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'angledLineOfYLength([222, angledLineOfYLengthY], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
2023-03-02 21:19:11 +11:00
|
|
|
const expectedLine = 'yLine(-angledLineOfYLengthY, %)'
|
2023-02-21 10:50:45 +11:00
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToX keeps variable when converted to xLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'angledLineToX([330, angledLineToXx], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'xLineTo(angledLineToXx, %)'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('angledLineToY keeps variable when converted to yLineTo', async () => {
|
|
|
|
const { newCode, originalRange } = await testingSwapSketchFnCall({
|
2023-02-21 10:50:45 +11:00
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'angledLineToY([217, angledLineToYy], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'vertical',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
const expectedLine = 'yLineTo(angledLineToYy, %)'
|
|
|
|
expect(newCode).toContain(expectedLine)
|
|
|
|
// new line should start at the same place as the old line
|
|
|
|
expect(originalRange[0]).toBe(newCode.indexOf(expectedLine))
|
|
|
|
})
|
|
|
|
|
2023-06-22 16:43:33 +10:00
|
|
|
it('trying to convert angledLineToY to xLineTo should not work because of the variable', async () => {
|
2023-02-21 10:50:45 +11:00
|
|
|
const illegalConvert = () =>
|
|
|
|
testingSwapSketchFnCall({
|
|
|
|
inputCode: varExample,
|
|
|
|
callToSwap: 'angledLineToY([217, angledLineToYy], %)',
|
2023-03-02 21:19:11 +11:00
|
|
|
constraintType: 'horizontal',
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
await expect(illegalConvert).rejects.toThrowError('no callback helper')
|
2023-02-21 10:50:45 +11:00
|
|
|
})
|
|
|
|
})
|
2023-03-20 07:09:19 +11:00
|
|
|
|
|
|
|
describe('testing getSketchSegmentIndexFromSourceRange', () => {
|
|
|
|
const code = `
|
2023-10-05 14:27:48 -07:00
|
|
|
const part001 = startSketchOn('XY')
|
|
|
|
|> startProfileAt([0, 0.04], %) // segment-in-start
|
2023-03-20 07:09:19 +11:00
|
|
|
|> line([0, 0.4], %)
|
|
|
|
|> xLine(3.48, %)
|
|
|
|
|> line([2.14, 1.35], %) // normal-segment
|
2024-03-01 17:16:18 -08:00
|
|
|
|> xLine(3.54, %)`
|
2023-06-22 16:43:33 +10:00
|
|
|
it('normal case works', async () => {
|
2023-09-29 11:11:01 -07:00
|
|
|
const programMemory = await enginelessExecutor(parse(code))
|
2023-03-20 07:09:19 +11:00
|
|
|
const index = code.indexOf('// normal-segment') - 7
|
|
|
|
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
|
|
|
|
programMemory.root['part001'] as SketchGroup,
|
|
|
|
[index, index]
|
2023-04-08 14:16:49 +10:00
|
|
|
).segment
|
2023-03-20 07:09:19 +11:00
|
|
|
expect(segment).toEqual({
|
2024-02-11 12:59:00 +11:00
|
|
|
type: 'ToPoint',
|
2023-03-20 07:09:19 +11:00
|
|
|
to: [5.62, 1.79],
|
|
|
|
from: [3.48, 0.44],
|
2023-08-24 15:34:51 -07:00
|
|
|
name: '',
|
2023-03-20 07:09:19 +11:00
|
|
|
})
|
|
|
|
})
|
2023-06-22 16:43:33 +10:00
|
|
|
it('verify it works when the segment is in the `start` property', async () => {
|
2023-09-29 11:11:01 -07:00
|
|
|
const programMemory = await enginelessExecutor(parse(code))
|
2023-03-20 07:09:19 +11:00
|
|
|
const index = code.indexOf('// segment-in-start') - 7
|
|
|
|
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
|
|
|
|
programMemory.root['part001'] as SketchGroup,
|
|
|
|
[index, index]
|
2023-04-08 14:16:49 +10:00
|
|
|
).segment
|
2023-09-12 18:10:27 -07:00
|
|
|
expect(segment).toEqual({
|
|
|
|
to: [0, 0.04],
|
|
|
|
from: [0, 0.04],
|
|
|
|
name: '',
|
2024-02-11 12:59:00 +11:00
|
|
|
type: 'Base',
|
2023-09-12 18:10:27 -07:00
|
|
|
})
|
2023-03-20 07:09:19 +11:00
|
|
|
})
|
|
|
|
})
|