Start changing JS codemods

This commit is contained in:
Adam Chalmers
2025-03-19 11:28:26 -05:00
parent e13ee69c40
commit 1125a6a1e6
5 changed files with 1321 additions and 1595 deletions

View File

@ -1,20 +1,17 @@
import type { Page } from '@playwright/test' import { Page } from '@playwright/test'
import type { LineInputsType } from '@src/lang/std/sketchcombos' import { test, expect } from './zoo-test'
import { uuidv4 } from '@src/lib/utils'
import type { EditorFixture } from '@e2e/playwright/fixtures/editorFixture' import { deg, getUtils, wiggleMove } from './test-utils'
import { import { LineInputsType } from 'lang/std/sketchcombos'
deg, import { uuidv4 } from 'lib/utils'
getUtils, import { EditorFixture } from './fixtures/editorFixture'
orRunWhenFullSuiteEnabled,
wiggleMove,
} from '@e2e/playwright/test-utils'
import { expect, test } from '@e2e/playwright/zoo-test'
test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => { test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
test('Hover over a segment should show its overlay, hovering over the input overlays should show its popover, clicking the input overlay should constrain/unconstrain it:\nfor the following segments', () => { test.fixme(
'Hover over a segment should show its overlay, hovering over the input overlays should show its popover, clicking the input overlay should constrain/unconstrain it:\nfor the following segments',
() => {
// TODO: fix this test on mac after the electron migration // TODO: fix this test on mac after the electron migration
test.fixme(orRunWhenFullSuiteEnabled()) test.skip(process.platform === 'darwin', 'Skip on mac')
/** /**
* Clicks on an constrained element * Clicks on an constrained element
* @param {Page} page - The page to perform the action on * @param {Page} page - The page to perform the action on
@ -162,6 +159,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
const unconstrainedLocator = page.locator( const unconstrainedLocator = page.locator(
`[data-constraint-type="${constraintType}"][data-is-constrained="false"]` `[data-constraint-type="${constraintType}"][data-is-constrained="false"]`
) )
await expect(unconstrainedLocator).toBeVisible()
await unconstrainedLocator.hover() await unconstrainedLocator.hover()
await expect( await expect(
await page.getByTestId('constraint-symbol-popover').count() await page.getByTestId('constraint-symbol-popover').count()
@ -210,8 +208,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([5 + 0, 20 + 0], %) |> startProfileAt([5 + 0, 20 + 0], %)
|> line(end = [0.5, -14 + 0]) |> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 ) |> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -220,8 +217,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
|> yLine(endAbsolute = 20 + -10.77, tag = $a) |> yLine(endAbsolute = 20 + -10.77, tag = $a)
|> xLine(length = 26.04) |> xLine(length = 26.04)
|> yLine(length = 21.14 + 0) |> yLine(length = 21.14 + 0)
|> angledLine(angle = 181 + 0, xLength = 23.14) |> angledLine(angle = 181 + 0, lengthX = 23.14)
|> angledLine(angle = -91, yLength = 19 + 0) |> angledLine(angle = -91, lengthX = 19 + 0)
|> angledLine(angle = 3 + 0, endAbsoluteX = 5 + 26) |> angledLine(angle = 3 + 0, endAbsoluteX = 5 + 26)
|> angledLine(angle = 89, endAbsoluteY = 20 + 9.14 + 0) |> angledLine(angle = 89, endAbsoluteY = 20 + 9.14 + 0)
|> angledLineThatIntersects({ |> angledLineThatIntersects({
@ -277,8 +274,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
let ang = 0 let ang = 0
const line = await u.getBoundingBox('[data-overlay-index="0"]') const line = await u.getBoundingBox(`[data-overlay-index="${0}"]`)
ang = await u.getAngle('[data-overlay-index="0"]') ang = await u.getAngle(`[data-overlay-index="${0}"]`)
console.log('line1', line, ang) console.log('line1', line, ang)
await clickConstrained({ await clickConstrained({
hoverPos: { x: line.x, y: line.y }, hoverPos: { x: line.x, y: line.y },
@ -300,17 +297,16 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-index="0"]', locator: '[data-overlay-index="0"]',
}) })
const angledLine = await u.getBoundingBox('[data-overlay-index="1"]') const angledLine = await u.getBoundingBox(`[data-overlay-index="1"]`)
ang = await u.getAngle('[data-overlay-index="1"]') ang = await u.getAngle(`[data-overlay-index="1"]`)
console.log('angledLine1') console.log('angledLine1')
await clickConstrained({ await clickConstrained({
hoverPos: { x: angledLine.x, y: angledLine.y }, hoverPos: { x: angledLine.x, y: angledLine.y },
constraintType: 'angle', constraintType: 'angle',
expectBeforeUnconstrained: expectBeforeUnconstrained:
'angledLine(angle = 3 + 0, length = 32 + 0)', 'angledLine(angle = 3 + 0, length = 32 + 0 )',
expectAfterUnconstrained: expectAfterUnconstrained: 'angledLine(angle = 3, length = 32 + 0 )',
'angledLine(angle = 3, length = 32 + 0)', expectFinal: 'angledLine(angle = angle001, length = 32 + 0 )',
expectFinal: 'angledLine(angle = angle001, length = 32 + 0)',
ang: ang + 180, ang: ang + 180,
locator: '[data-overlay-toolbar-index="1"]', locator: '[data-overlay-toolbar-index="1"]',
}) })
@ -319,10 +315,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
hoverPos: { x: angledLine.x, y: angledLine.y }, hoverPos: { x: angledLine.x, y: angledLine.y },
constraintType: 'length', constraintType: 'length',
expectBeforeUnconstrained: expectBeforeUnconstrained:
'angledLine(angle = angle001, length = 32 + 0)', 'angledLine(angle = angle001, length = 32 + 0 )',
expectAfterUnconstrained: expectAfterUnconstrained:
'angledLine(angle = angle001, length = 32)', 'angledLine(angle = angle001, length = 32 )',
expectFinal: 'angledLine(angle = angle001, length = len001)', expectFinal: 'angledLine(angle = angle001, length = len001 )',
ang: ang + 180, ang: ang + 180,
locator: '[data-overlay-toolbar-index="1"]', locator: '[data-overlay-toolbar-index="1"]',
}) })
@ -330,8 +326,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.mouse.move(700, 250) await page.mouse.move(700, 250)
await page.waitForTimeout(100) await page.waitForTimeout(100)
let lineTo = await u.getBoundingBox('[data-overlay-index="2"]') let lineTo = await u.getBoundingBox(`[data-overlay-index="2"]`)
ang = await u.getAngle('[data-overlay-index="2"]') ang = await u.getAngle(`[data-overlay-index="2"]`)
console.log('lineTo1') console.log('lineTo1')
await clickConstrained({ await clickConstrained({
hoverPos: { x: lineTo.x, y: lineTo.y }, hoverPos: { x: lineTo.x, y: lineTo.y },
@ -356,8 +352,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="2"]', locator: '[data-overlay-toolbar-index="2"]',
}) })
const xLineTo = await u.getBoundingBox('[data-overlay-index="3"]') const xLineTo = await u.getBoundingBox(`[data-overlay-index="3"]`)
ang = await u.getAngle('[data-overlay-index="3"]') ang = await u.getAngle(`[data-overlay-index="3"]`)
console.log('xlineTo1') console.log('xlineTo1')
await clickConstrained({ await clickConstrained({
hoverPos: { x: xLineTo.x, y: xLineTo.y }, hoverPos: { x: xLineTo.x, y: xLineTo.y },
@ -372,24 +368,20 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
}) })
// Broken on main at time of writing! // Broken on main at time of writing!
test('for segments [yLineTo, xLine]', async ({ test.fixme(
page, 'for segments [yLineTo, xLine]',
editor, async ({ page, editor, homePage }) => {
homePage,
}) => {
test.fixme(orRunWhenFullSuiteEnabled())
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `yRel001 = -14
yRel001 = -14
xRel001 = 0.5 xRel001 = 0.5
angle001 = 3 angle001 = 3
len001 = 32 len001 = 32
yAbs001 = 11.5 yAbs001 = 11.5
xAbs001 = 33 xAbs001 = 33
xAbs002 = 4 xAbs002 = 4
part001 = startSketchOn(XZ) part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0.5, yRel001]) |> line(end = [0.5, yRel001])
|> angledLine(angle = angle001, length = len001 ) |> angledLine(angle = angle001, length = len001 )
@ -426,8 +418,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
let ang = 0 let ang = 0
const yLineTo = await u.getBoundingBox('[data-overlay-index="4"]') const yLineTo = await u.getBoundingBox(`[data-overlay-index="4"]`)
ang = await u.getAngle('[data-overlay-index="4"]') ang = await u.getAngle(`[data-overlay-index="4"]`)
console.log('ylineTo1') console.log('ylineTo1')
await clickUnconstrained({ await clickUnconstrained({
hoverPos: { x: yLineTo.x, y: yLineTo.y - 200 }, hoverPos: { x: yLineTo.x, y: yLineTo.y - 200 },
@ -439,8 +431,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="4"]', locator: '[data-overlay-toolbar-index="4"]',
}) })
const xLine = await u.getBoundingBox('[data-overlay-index="5"]') const xLine = await u.getBoundingBox(`[data-overlay-index="5"]`)
ang = await u.getAngle('[data-overlay-index="5"]') ang = await u.getAngle(`[data-overlay-index="5"]`)
console.log('xline') console.log('xline')
await clickUnconstrained({ await clickUnconstrained({
hoverPos: { x: xLine.x, y: xLine.y }, hoverPos: { x: xLine.x, y: xLine.y },
@ -452,7 +444,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
ang: ang + 180, ang: ang + 180,
locator: '[data-overlay-toolbar-index="5"]', locator: '[data-overlay-toolbar-index="5"]',
}) })
}) }
)
test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({ test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({
page, page,
editor, editor,
@ -461,8 +454,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0]) |> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 ) |> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -508,8 +500,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
let ang = 0 let ang = 0
const yLine = await u.getBoundingBox('[data-overlay-index="6"]') const yLine = await u.getBoundingBox(`[data-overlay-index="6"]`)
ang = await u.getAngle('[data-overlay-index="6"]') ang = await u.getAngle(`[data-overlay-index="6"]`)
console.log('yline1') console.log('yline1')
await clickConstrained({ await clickConstrained({
hoverPos: { x: yLine.x, y: yLine.y }, hoverPos: { x: yLine.x, y: yLine.y },
@ -522,9 +514,9 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
}) })
const angledLineOfXLength = await u.getBoundingBox( const angledLineOfXLength = await u.getBoundingBox(
'[data-overlay-index="7"]' `[data-overlay-index="7"]`
) )
ang = await u.getAngle('[data-overlay-index="7"]') ang = await u.getAngle(`[data-overlay-index="7"]`)
console.log('angledLineOfXLength1') console.log('angledLineOfXLength1')
await clickConstrained({ await clickConstrained({
hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y }, hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y },
@ -554,9 +546,9 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
}) })
const angledLineOfYLength = await u.getBoundingBox( const angledLineOfYLength = await u.getBoundingBox(
'[data-overlay-index="8"]' `[data-overlay-index="8"]`
) )
ang = await u.getAngle('[data-overlay-index="8"]') ang = await u.getAngle(`[data-overlay-index="8"]`)
console.log('angledLineOfYLength1') console.log('angledLineOfYLength1')
await clickUnconstrained({ await clickUnconstrained({
hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y }, hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y },
@ -565,7 +557,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)',
expectAfterUnconstrained: expectAfterUnconstrained:
'angledLineOfYLength({ angle = angle002, length = 19 + 0 }, %)', 'angledLineOfYLength({ angle = angle002, length = 19 + 0 }, %)',
expectFinal: 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)', expectFinal:
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)',
ang: ang + 180, ang: ang + 180,
steps: 6, steps: 6,
locator: '[data-overlay-toolbar-index="8"]', locator: '[data-overlay-toolbar-index="8"]',
@ -593,8 +586,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0]) |> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 ) |> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -614,62 +606,6 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
}, %) }, %)
|> tangentialArcTo([3.14 + 13, 1.14], %) |> tangentialArcTo([3.14 + 13, 1.14], %)
` `
<<<<<<< HEAD
||||||| parent of bcbec9f87 (Update KCL in JS project)
)
localStorage.setItem('disableAxis', 'true')
})
const u = await getUtils(page)
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()
await page.getByText('xLine(endAbsolute = 9 - 5)').click()
await page.waitForTimeout(100)
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(500)
await expect(page.getByTestId('segment-overlay')).toHaveCount(13)
const clickUnconstrained = _clickUnconstrained(page, editor)
const clickConstrained = _clickConstrained(page, editor)
let ang = 0
const angledLineToX = await u.getBoundingBox(`[data-overlay-index="9"]`)
ang = await u.getAngle(`[data-overlay-index="9"]`)
console.log('angledLineToX')
await clickConstrained({
hoverPos: { x: angledLineToX.x, y: angledLineToX.y },
constraintType: 'angle',
expectBeforeUnconstrained:
'angledLineToX({ angle = 3 + 0, to = 26 }, %)',
expectAfterUnconstrained: 'angledLineToX({ angle = 3, to = 26 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="9"]',
})
console.log('angledLineToX2')
await clickUnconstrained({
hoverPos: { x: angledLineToX.x, y: angledLineToX.y },
constraintType: 'xAbsolute',
expectBeforeUnconstrained:
'angledLineToX({ angle = angle001, to = 26 }, %)',
expectAfterUnconstrained:
'angledLineToX({ angle = angle001, to = xAbs001 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="9"]',
})
const angledLineToY = await u.getBoundingBox(
`[data-overlay-index="10"]`
=======
) )
localStorage.setItem('disableAxis', 'true') localStorage.setItem('disableAxis', 'true')
}) })
@ -723,41 +659,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
const angledLineToY = await u.getBoundingBox( const angledLineToY = await u.getBoundingBox(
`[data-overlay-index="10"]` `[data-overlay-index="10"]`
>>>>>>> bcbec9f87 (Update KCL in JS project)
) )
<<<<<<< HEAD
localStorage.setItem('disableAxis', 'true')
})
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
||||||| parent of bcbec9f87 (Update KCL in JS project)
ang = await u.getAngle(`[data-overlay-index="10"]`)
console.log('angledLineToY')
await clickUnconstrained({
hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
constraintType: 'angle',
expectBeforeUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
steps: process.platform === 'darwin' ? 8 : 9,
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
console.log('angledLineToY2')
await clickConstrained({
hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
constraintType: 'yAbsolute',
expectBeforeUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = yAbs001 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
=======
ang = await u.getAngle(`[data-overlay-index="10"]`) ang = await u.getAngle(`[data-overlay-index="10"]`)
console.log('angledLineToY') console.log('angledLineToY')
await clickUnconstrained({ await clickUnconstrained({
@ -784,84 +686,11 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
ang: ang + 180, ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]', locator: '[data-overlay-toolbar-index="10"]',
}) })
>>>>>>> bcbec9f87 (Update KCL in JS project)
await homePage.goToModelingScene()
// wait for execution done
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
await page.getByText('xLine(endAbsolute = 9 - 5)').click()
await page.waitForTimeout(100)
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(500)
await expect(page.getByTestId('segment-overlay')).toHaveCount(13)
const clickUnconstrained = _clickUnconstrained(page, editor)
const clickConstrained = _clickConstrained(page, editor)
let ang = 0
const angledLineToX = await u.getBoundingBox('[data-overlay-index="9"]')
ang = await u.getAngle('[data-overlay-index="9"]')
console.log('angledLineToX')
await clickConstrained({
hoverPos: { x: angledLineToX.x, y: angledLineToX.y },
constraintType: 'angle',
expectBeforeUnconstrained:
'angledLineToX({ angle = 3 + 0, to = 26 }, %)',
expectAfterUnconstrained: 'angledLineToX({ angle = 3, to = 26 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="9"]',
})
console.log('angledLineToX2')
await clickUnconstrained({
hoverPos: { x: angledLineToX.x, y: angledLineToX.y },
constraintType: 'xAbsolute',
expectBeforeUnconstrained:
'angledLineToX({ angle = angle001, to = 26 }, %)',
expectAfterUnconstrained:
'angledLineToX({ angle = angle001, to = xAbs001 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="9"]',
})
const angledLineToY = await u.getBoundingBox('[data-overlay-index="10"]')
ang = await u.getAngle('[data-overlay-index="10"]')
console.log('angledLineToY')
await clickUnconstrained({
hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
constraintType: 'angle',
expectBeforeUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
steps: process.platform === 'darwin' ? 8 : 9,
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
console.log('angledLineToY2')
await clickConstrained({
hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
constraintType: 'yAbsolute',
expectBeforeUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained: 'angledLineToY({ angle = 89, to = 9.14 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = yAbs001 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
const angledLineThatIntersects = await u.getBoundingBox( const angledLineThatIntersects = await u.getBoundingBox(
'[data-overlay-index="11"]' `[data-overlay-index="11"]`
) )
ang = await u.getAngle('[data-overlay-index="11"]') ang = await u.getAngle(`[data-overlay-index="11"]`)
console.log('angledLineThatIntersects') console.log('angledLineThatIntersects')
await clickUnconstrained({ await clickUnconstrained({
hoverPos: { hoverPos: {
@ -921,8 +750,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0]) |> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 ) |> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -992,145 +820,11 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="12"]', locator: '[data-overlay-toolbar-index="12"]',
}) })
}) })
test('for segment [arcTo]', async ({
page,
editor,
homePage,
scene,
cmdBar,
}) => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
sketch001 = startSketchOn(XZ)
profile001 = startProfileAt([56.37, 120.33], sketch001)
|> line(end = [162.86, 106.48])
|> arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)
|> yLine(-131.54, %)
|> arc({
radius = 126.46,
angleStart = 33.53,
angleEnd = -141.07
}, %)
`
)
localStorage.setItem('disableAxis', 'true')
})
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await scene.connectionEstablished()
await scene.settled(cmdBar)
// wait for execution done
await page.getByText('line(end = [162.86, 106.48])').click()
await page.waitForTimeout(100)
await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(500)
await expect(page.getByTestId('segment-overlay')).toHaveCount(5)
const clickUnconstrained = _clickUnconstrained(page, editor)
const clickConstrained = _clickConstrained(page, editor)
const arcTo = await u.getBoundingBox('[data-overlay-index="1"]')
let ang = await u.getAngle('[data-overlay-index="1"]')
console.log('arcTo interior x')
await clickUnconstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'xAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
ang: ang,
steps: 6,
locator: '[data-overlay-toolbar-index="1"]',
})
console.log('arcTo interior y')
await clickUnconstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'yAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, yAbs001],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
ang: ang,
steps: 10,
locator: '[data-overlay-toolbar-index="1"]',
})
console.log('arcTo end x')
await clickConstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'xAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, 131.54]
}, %)`,
ang: ang + 180,
steps: 6,
locator: '[data-overlay-toolbar-index="1"]',
})
console.log('arcTo end y')
await clickUnconstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'yAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, yAbs002]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, 131.54]
}, %)`,
ang: ang + 180,
steps: 10,
locator: '[data-overlay-toolbar-index="1"]',
})
})
test('for segment [circle]', async ({ page, editor, homePage }) => { test('for segment [circle]', async ({ page, editor, homePage }) => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> circle(center = [1 + 0, 0], radius = 8) |> circle(center = [1 + 0, 0], radius = 8)
` `
) )
@ -1174,7 +868,8 @@ part001 = startSketchOn(XZ)
await clickUnconstrained({ await clickUnconstrained({
hoverPos, hoverPos,
constraintType: 'yAbsolute', constraintType: 'yAbsolute',
expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)', expectBeforeUnconstrained:
'circle(center = [xAbs001, 0], radius = 8)',
expectAfterUnconstrained: expectAfterUnconstrained:
'circle(center = [xAbs001, yAbs001], radius = 8)', 'circle(center = [xAbs001, yAbs001], radius = 8)',
expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', expectFinal: 'circle(center = [xAbs001, 0], radius = 8)',
@ -1186,7 +881,8 @@ part001 = startSketchOn(XZ)
await clickUnconstrained({ await clickUnconstrained({
hoverPos, hoverPos,
constraintType: 'radius', constraintType: 'radius',
expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)', expectBeforeUnconstrained:
'circle(center = [xAbs001, 0], radius = 8)',
expectAfterUnconstrained: expectAfterUnconstrained:
'circle(center = [xAbs001, 0], radius = radius001)', 'circle(center = [xAbs001, 0], radius = radius001)',
expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', expectFinal: 'circle(center = [xAbs001, 0], radius = 8)',
@ -1195,7 +891,8 @@ part001 = startSketchOn(XZ)
locator: '[data-overlay-toolbar-index="0"]', locator: '[data-overlay-toolbar-index="0"]',
}) })
}) })
}) }
)
test.describe('Testing deleting a segment', () => { test.describe('Testing deleting a segment', () => {
const _deleteSegmentSequence = const _deleteSegmentSequence =
(page: Page, editor: EditorFixture) => (page: Page, editor: EditorFixture) =>
@ -1230,78 +927,17 @@ part001 = startSketchOn(XZ)
shouldNormalise: true, shouldNormalise: true,
}) })
await page await page.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`).click()
.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`)
.first()
.click()
await page.getByText('Delete Segment').click() await page.getByText('Delete Segment').click()
await editor.expectEditor.not.toContain(codeToBeDeleted, { await editor.expectEditor.not.toContain(codeToBeDeleted, {
shouldNormalise: true, shouldNormalise: true,
}) })
} }
test('all segment types', async ({ test('all segment types', async ({ page, editor, homePage }) => {
page,
editor,
homePage,
scene,
cmdBar,
}) => {
await page.addInitScript(async () => { await page.addInitScript(async () => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
<<<<<<< HEAD
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
|>startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
|> line(endAbsolute = [33, 11.5 + 0])
|> xLine(endAbsolute = 9 - 5)
|> yLine(endAbsolute = -10.77, tag = $a)
|> xLine(length = 26.04)
|> yLine(length = 21.14 + 0)
|> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)
|> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)
|> angledLineToX({ angle = 3 + 0, to = 26 }, %)
|> angledLineToY({ angle = 89, to = 9.14 + 0 }, %)
|> angledLineThatIntersects({
angle = 4.14,
intersectTag = a,
offset = 9
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
|> arcTo({
interior = [16.25, 5.12],
end = [21.61, 4.15]
}, %)
|> arc({
radius = 9.03,
angleStart = 40.27,
angleEnd = -38.05
}, %)
||||||| parent of bcbec9f87 (Update KCL in JS project)
`part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
|> line(endAbsolute = [33, 11.5 + 0])
|> xLine(endAbsolute = 9 - 5)
|> yLine(endAbsolute = -10.77, tag = $a)
|> xLine(length = 26.04)
|> yLine(length = 21.14 + 0)
|> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)
|> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)
|> angledLineToX({ angle = 3 + 0, to = 26 }, %)
|> angledLineToY({ angle = 89, to = 9.14 + 0 }, %)
|> angledLineThatIntersects({
angle = 4.14,
intersectTag = a,
offset = 9
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
=======
`part001 = startSketchOn('XZ') `part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %) |> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0]) |> line(end = [0.5, -14 + 0])
@ -1321,7 +957,6 @@ part001 = startSketchOn(XZ)
offset = 9 offset = 9
}, %) }, %)
|> tangentialArcTo([3.14 + 13, 1.14], %) |> tangentialArcTo([3.14 + 13, 1.14], %)
>>>>>>> bcbec9f87 (Update KCL in JS project)
` `
) )
localStorage.setItem('disableAxis', 'true') localStorage.setItem('disableAxis', 'true')
@ -1330,55 +965,27 @@ part001 = startSketchOn(XZ)
await page.setBodyDimensions({ width: 1200, height: 500 }) await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene() await homePage.goToModelingScene()
await scene.connectionEstablished()
await scene.settled(cmdBar)
await u.waitForPageLoad() await u.waitForPageLoad()
// wait for execution done
await u.openDebugPanel()
await u.expectCmdLog('[data-message-type="execution-done"]')
await u.closeDebugPanel()
await page.getByText('xLine(endAbsolute = 9 - 5)').click() await page.getByText('xLine(endAbsolute = 9 - 5)').click()
await page.waitForTimeout(100) await page.waitForTimeout(100)
await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.getByRole('button', { name: 'Edit Sketch' }).click()
await page.waitForTimeout(500) await page.waitForTimeout(500)
await expect(page.getByTestId('segment-overlay')).toHaveCount(16) await expect(page.getByTestId('segment-overlay')).toHaveCount(13)
const deleteSegmentSequence = _deleteSegmentSequence(page, editor) const deleteSegmentSequence = _deleteSegmentSequence(page, editor)
let segmentToDelete let segmentToDelete
const getOverlayByIndex = (index: number) => const getOverlayByIndex = (index: number) =>
u.getBoundingBox(`[data - overlay - index="${index}"]`) u.getBoundingBox(`[data-overlay-index="${index}"]`)
segmentToDelete = await getOverlayByIndex(14)
let ang = await u.getAngle('[data-overlay-index="14"]')
await editor.scrollToText('angleEnd')
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `arc({
radius = 9.03,
angleStart = 40.27,
angleEnd = -38.05
}, %)`,
stdLibFnName: 'arc',
ang: ang + 180,
steps: 6,
locator: '[data-overlay-toolbar-index="14"]',
})
segmentToDelete = await getOverlayByIndex(13)
ang = await u.getAngle('[data-overlay-index="13"]')
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `arcTo({
interior =[16.25, 5.12],
end =[21.61, 4.15]
}, %)`,
stdLibFnName: 'arcTo',
ang: ang,
steps: 6,
locator: '[data-overlay-toolbar-index="13"]',
})
segmentToDelete = await getOverlayByIndex(12) segmentToDelete = await getOverlayByIndex(12)
ang = await u.getAngle('[data-overlay-index="12"]') let ang = await u.getAngle(`[data-overlay-index="${12}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'tangentialArcTo([3.14 + 13, 1.14], %)', codeToBeDeleted: 'tangentialArcTo([3.14 + 13, 1.14], %)',
@ -1389,7 +996,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(11) segmentToDelete = await getOverlayByIndex(11)
ang = await u.getAngle('[data-overlay-index="11"]') ang = await u.getAngle(`[data-overlay-index="${11}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `angledLineThatIntersects({ codeToBeDeleted: `angledLineThatIntersects({
@ -1404,7 +1011,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(10) segmentToDelete = await getOverlayByIndex(10)
ang = await u.getAngle('[data-overlay-index="10"]') ang = await u.getAngle(`[data-overlay-index="${10}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 89, endAbsoluteY = 9.14 + 0)', codeToBeDeleted: 'angledLine(angle = 89, endAbsoluteY = 9.14 + 0)',
@ -1414,7 +1021,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(9) segmentToDelete = await getOverlayByIndex(9)
ang = await u.getAngle('[data-overlay-index="9"]') ang = await u.getAngle(`[data-overlay-index="${9}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 3 + 0, endAbsoluteX = 26)', codeToBeDeleted: 'angledLine(angle = 3 + 0, endAbsoluteX = 26)',
@ -1424,7 +1031,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(8) segmentToDelete = await getOverlayByIndex(8)
ang = await u.getAngle('[data-overlay-index="8"]') ang = await u.getAngle(`[data-overlay-index="${8}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: codeToBeDeleted:
@ -1435,7 +1042,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(7) segmentToDelete = await getOverlayByIndex(7)
ang = await u.getAngle('[data-overlay-index="7"]') ang = await u.getAngle(`[data-overlay-index="${7}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: codeToBeDeleted:
@ -1446,7 +1053,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(6) segmentToDelete = await getOverlayByIndex(6)
ang = await u.getAngle('[data-overlay-index="6"]') ang = await u.getAngle(`[data-overlay-index="${6}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'yLine(length = 21.14 + 0)', codeToBeDeleted: 'yLine(length = 21.14 + 0)',
@ -1456,7 +1063,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(5) segmentToDelete = await getOverlayByIndex(5)
ang = await u.getAngle('[data-overlay-index="5"]') ang = await u.getAngle(`[data-overlay-index="${5}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'xLine(length = 26.04)', codeToBeDeleted: 'xLine(length = 26.04)',
@ -1466,7 +1073,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(4) segmentToDelete = await getOverlayByIndex(4)
ang = await u.getAngle('[data-overlay-index="4"]') ang = await u.getAngle(`[data-overlay-index="${4}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'yLine(endAbsolute = -10.77, tag = $a)', codeToBeDeleted: 'yLine(endAbsolute = -10.77, tag = $a)',
@ -1476,7 +1083,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(3) segmentToDelete = await getOverlayByIndex(3)
ang = await u.getAngle('[data-overlay-index="3"]') ang = await u.getAngle(`[data-overlay-index="${3}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'xLine(endAbsolute = 9 - 5)', codeToBeDeleted: 'xLine(endAbsolute = 9 - 5)',
@ -1486,7 +1093,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(2) segmentToDelete = await getOverlayByIndex(2)
ang = await u.getAngle('[data-overlay-index="2"]') ang = await u.getAngle(`[data-overlay-index="${2}"]`)
await expect(page.getByText('Added variable')).not.toBeVisible() await expect(page.getByText('Added variable')).not.toBeVisible()
const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y } const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y }
@ -1519,7 +1126,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(1) segmentToDelete = await getOverlayByIndex(1)
ang = await u.getAngle('[data-overlay-index="1"]') ang = await u.getAngle(`[data-overlay-index="${1}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 3 + 0, length = 32 + 0 )', codeToBeDeleted: 'angledLine(angle = 3 + 0, length = 32 + 0 )',
@ -1529,7 +1136,7 @@ part001 = startSketchOn(XZ)
}) })
segmentToDelete = await getOverlayByIndex(0) segmentToDelete = await getOverlayByIndex(0)
ang = await u.getAngle('[data-overlay-index="0"]') ang = await u.getAngle(`[data-overlay-index="${0}"]`)
await deleteSegmentSequence({ await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'line(end = [0.5, -14 + 0])', codeToBeDeleted: 'line(end = [0.5, -14 + 0])',
@ -1560,26 +1167,18 @@ part001 = startSketchOn(XZ)
for (const doesHaveTagOutsideSketch of [true, false]) { for (const doesHaveTagOutsideSketch of [true, false]) {
for (const lineOfInterest of cases) { for (const lineOfInterest of cases) {
const isObj = lineOfInterest.includes('{ angle = 3,') const isObj = lineOfInterest.includes('{ angle = 3,')
test(`${ lineOfInterest.split('=')[0] }${ isObj? '-[obj-input]': '' }${ test(`${lineOfInterest.split('=')[0]}${isObj ? '-[obj-input]' : ''}${doesHaveTagOutsideSketch ? '-[tagOutsideSketch]' : ''
doesHaveTagOutsideSketch? '-[tagOutsideSketch]': ''
}`, async ({ page, editor, homePage }) => { }`, async ({ page, editor, homePage }) => {
await page.addInitScript( await page.addInitScript(
async ({ lineToBeDeleted, extraLine }) => { async ({ lineToBeDeleted, extraLine }) => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([5, 6], %) |> startProfileAt([5, 6], %)
|> ${ lineToBeDeleted } |> ${lineToBeDeleted}
|> line(end = [-10, -15]) |> line(end = [-10, -15])
<<<<<<< HEAD
|> angledLine([-176, segLen(seg01)], %)
||||||| parent of bcbec9f87 (Update KCL in JS project)
|> angledLine([-176, segLen(seg01)], %)
=======
|> angledLine(angle = -176, length = segLen(seg01)) |> angledLine(angle = -176, length = segLen(seg01))
>>>>>>> bcbec9f87 (Update KCL in JS project) ${extraLine ? 'myVar = segLen(seg01)' : ''}`
${ extraLine? 'myVar = segLen(seg01)': '' }`
) )
}, },
{ {
@ -1607,8 +1206,7 @@ part001 = startSketchOn(XZ)
page.getByRole('button', { name: 'Edit Sketch' }) page.getByRole('button', { name: 'Edit Sketch' })
).toBeVisible() ).toBeVisible()
return true return true
// eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (_) {
} catch (_e) {
return false return false
} }
}) })
@ -1617,7 +1215,7 @@ part001 = startSketchOn(XZ)
await expect(page.getByTestId('segment-overlay')).toHaveCount(3) await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
const segmentToDelete = await u.getBoundingBox( const segmentToDelete = await u.getBoundingBox(
`[data - overlay - index= "0"]` `[data-overlay-index="0"]`
) )
const isYLine = lineOfInterest.toLowerCase().includes('yline') const isYLine = lineOfInterest.toLowerCase().includes('yline')
@ -1730,7 +1328,7 @@ part001 = startSketchOn(XZ)
for (const { before, after } of cases) { for (const { before, after } of cases) {
const isObj = before.includes('{ angle = 3') const isObj = before.includes('{ angle = 3')
test(`${ before.split('=')[0] }${ isObj? '-[obj-input]': '' }`, async ({ test(`${before.split('=')[0]}${isObj ? '-[obj-input]' : ''}`, async ({
page, page,
editor, editor,
homePage, homePage,
@ -1739,10 +1337,9 @@ part001 = startSketchOn(XZ)
async ({ lineToBeDeleted }) => { async ({ lineToBeDeleted }) => {
localStorage.setItem( localStorage.setItem(
'persistCode', 'persistCode',
`@settings(defaultLengthUnit = in) `part001 = startSketchOn('XZ')
part001 = startSketchOn(XZ)
|> startProfileAt([5, 6], %) |> startProfileAt([5, 6], %)
|> ${ lineToBeDeleted } |> ${lineToBeDeleted}
|> line(end = [-10, -15]) |> line(end = [-10, -15])
|> angledLine(angle = -176, length = segLen(seg01))` |> angledLine(angle = -176, length = segLen(seg01))`
) )
@ -1766,8 +1363,8 @@ part001 = startSketchOn(XZ)
await expect(page.getByTestId('segment-overlay')).toHaveCount(3) await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
await expect(page.getByText('Added variable')).not.toBeVisible() await expect(page.getByText('Added variable')).not.toBeVisible()
const hoverPos = await u.getBoundingBox(`[data - overlay - index="0"]`) const hoverPos = await u.getBoundingBox(`[data-overlay-index="0"]`)
let ang = await u.getAngle('[data-overlay-index="0"]') let ang = await u.getAngle(`[data-overlay-index="${0}"]`)
ang += 180 ang += 180
await page.mouse.move(0, 0) await page.mouse.move(0, 0)

View File

@ -5,3 +5,8 @@ export const ARG_END_ABSOLUTE = 'endAbsolute'
export const ARG_CIRCLE_CENTER = 'center' export const ARG_CIRCLE_CENTER = 'center'
export const ARG_CIRCLE_RADIUS = 'radius' export const ARG_CIRCLE_RADIUS = 'radius'
export const DETERMINING_ARGS = [ARG_LENGTH, ARG_END, ARG_END_ABSOLUTE] export const DETERMINING_ARGS = [ARG_LENGTH, ARG_END, ARG_END_ABSOLUTE]
export const ARG_LENGTH_X = 'lengthX'
export const ARG_LENGTH_Y = 'lengthY'
export const ARG_ANGLE = 'angle'
export const ARG_END_ABSOLUTE_X = 'endAbsoluteX'
export const ARG_END_ABSOLUTE_Y = 'endAbsoluteY'

View File

@ -182,6 +182,7 @@ const commonConstraintInfoHelper = (
pathToNode: PathToNode, pathToNode: PathToNode,
filterValue?: string filterValue?: string
) => { ) => {
console.warn('ADAM: Must be updated to handle angled line kw args')
if (callExp.type !== 'CallExpression' && callExp.type !== 'CallExpressionKw') if (callExp.type !== 'CallExpression' && callExp.type !== 'CallExpressionKw')
return [] return []
const firstArg = (() => { const firstArg = (() => {
@ -2169,7 +2170,7 @@ export const circleThreePoint: SketchLineHelperKw = {
return finalConstraints return finalConstraints
}, },
} }
export const angledLine: SketchLineHelper = { export const angledLine: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput const { from, to } = segmentInput
@ -2181,12 +2182,13 @@ export const angledLine: SketchLineHelper = {
const newAngleVal = createLiteral(roundOff(getAngle(from, to), 0)) const newAngleVal = createLiteral(roundOff(getAngle(from, to), 0))
const newLengthVal = createLiteral(roundOff(getLength(from, to), 2)) const newLengthVal = createLiteral(roundOff(getLength(from, to), 2))
const newLine = createCallExpression('angledLine', [ const newLine = createCallExpressionStdLibKw('angledLine', null, [
createArrayExpression([newAngleVal, newLengthVal]), createLabeledArg('angle', newAngleVal),
createPipeSubstitution(), createLabeledArg('length', newLengthVal),
]) ])
if (replaceExistingCallback) { if (replaceExistingCallback) {
console.warn('ADAM: Probably needs to be adjusted for kw args')
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
const result = replaceExistingCallback([ const result = replaceExistingCallback([
{ {
@ -2224,7 +2226,7 @@ export const angledLine: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input const { to, from } = input
const _node = { ...node } const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode) const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0) const angle = roundOff(getAngle(from, to), 0)
@ -2234,18 +2236,17 @@ export const angledLine: SketchLineHelper = {
const lengthLit = createLiteral(lineLength) const lengthLit = createLiteral(lineLength)
const firstArg = callExpression.arguments?.[0] const firstArg = callExpression.arguments?.[0]
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) { removeDeterminingArgs(callExpression)
mutateObjExpProp(firstArg, angleLit, 'angle') mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateObjExpProp(firstArg, lengthLit, 'length') mutateKwArg(ARG_LENGTH, callExpression, lengthLit)
}
return { return {
modifiedAst: _node, modifiedAst: _node,
pathToNode, pathToNode,
} }
}, },
getTag: getTag(), getTag: getTagKwArg(),
addTag: addTag(), addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) => getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper( commonConstraintInfoHelper(
callExp, callExp,
@ -2259,7 +2260,7 @@ export const angledLine: SketchLineHelper = {
), ),
} }
export const angledLineOfXLength: SketchLineHelper = { export const angledLineOfXLength: SketchLineHelperKw = {
add: ({ add: ({
node, node,
variables, variables,
@ -2313,9 +2314,9 @@ export const angledLineOfXLength: SketchLineHelper = {
if (err(result)) return result if (err(result)) return result
newLine = result.callExp newLine = result.callExp
} else { } else {
newLine = createCallExpression('angledLineOfXLength', [ newLine = createCallExpressionStdLibKw('angledLineOfXLength', null, [
createArrayExpression([angle, xLength]), createLabeledArg(ARG_ANGLE, angle),
createPipeSubstitution(), createLabeledArg(ARG_LENGTH_X, xLength),
]) ])
} }
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
@ -2333,32 +2334,38 @@ export const angledLineOfXLength: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input const { to, from } = input
const _node = { ...node } const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode) const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0) const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(Math.abs(to[0] - from[0]), 2) const xLength = roundOff(Math.abs(to[0] - from[0]), 2)
const firstArg = callExpression.arguments?.[0] const oldAngle = findKwArg(ARG_ANGLE, callExpression)
const adjustedXLength = isAngleLiteral(firstArg) if (oldAngle === undefined) {
return new Error(
`expected an angle arg, but it was not found. Args were ${allLabels(
callExpression
)}`
)
}
const adjustedXLength = isAngleLiteral(oldAngle)
? Math.abs(xLength) ? Math.abs(xLength)
: xLength // todo make work for variable angle > 180 : xLength // todo make work for variable angle > 180
const angleLit = createLiteral(angle) const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength) const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) { removeDeterminingArgs(callExpression)
mutateObjExpProp(firstArg, angleLit, 'angle') mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateObjExpProp(firstArg, lengthLit, 'length') mutateKwArg(ARG_LENGTH_X, callExpression, lengthLit)
}
return { return {
modifiedAst: _node, modifiedAst: _node,
pathToNode, pathToNode,
} }
}, },
getTag: getTag(), getTag: getTagKwArg(),
addTag: addTag(), addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) => getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper( commonConstraintInfoHelper(
callExp, callExp,
@ -2372,7 +2379,7 @@ export const angledLineOfXLength: SketchLineHelper = {
), ),
} }
export const angledLineOfYLength: SketchLineHelper = { export const angledLineOfYLength: SketchLineHelperKw = {
add: ({ add: ({
node, node,
variables, variables,
@ -2424,9 +2431,9 @@ export const angledLineOfYLength: SketchLineHelper = {
if (err(result)) return result if (err(result)) return result
newLine = result.callExp newLine = result.callExp
} else { } else {
newLine = createCallExpression('angledLineOfYLength', [ newLine = createCallExpressionStdLibKw('angledLine', null, [
createArrayExpression([angle, yLength]), createLabeledArg(ARG_ANGLE, angle),
createPipeSubstitution(), createLabeledArg(ARG_LENGTH_Y, yLength),
]) ])
} }
const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
@ -2444,32 +2451,38 @@ export const angledLineOfYLength: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input const { to, from } = input
const _node = { ...node } const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode) const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0) const angle = roundOff(getAngle(from, to), 0)
const yLength = roundOff(to[1] - from[1], 2) const yLength = roundOff(to[1] - from[1], 2)
const firstArg = callExpression.arguments?.[0] const oldAngle = findKwArg(ARG_ANGLE, callExpression)
const adjustedYLength = isAngleLiteral(firstArg) if (oldAngle === undefined) {
return new Error(
`expected an angle arg, but it was not found. Args were ${allLabels(
callExpression
)}`
)
}
const adjustedYLength = isAngleLiteral(oldAngle)
? Math.abs(yLength) ? Math.abs(yLength)
: yLength // todo make work for variable angle > 180 : yLength // todo make work for variable angle > 180
const angleLit = createLiteral(angle) const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedYLength) const lengthLit = createLiteral(adjustedYLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) { removeDeterminingArgs(callExpression)
mutateObjExpProp(firstArg, angleLit, 'angle') mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateObjExpProp(firstArg, lengthLit, 'length') mutateKwArg(ARG_LENGTH_Y, callExpression, lengthLit)
}
return { return {
modifiedAst: _node, modifiedAst: _node,
pathToNode, pathToNode,
} }
}, },
getTag: getTag(), getTag: getTagKwArg(),
addTag: addTag(), addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) => getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper( commonConstraintInfoHelper(
callExp, callExp,
@ -2483,7 +2496,7 @@ export const angledLineOfYLength: SketchLineHelper = {
), ),
} }
export const angledLineToX: SketchLineHelper = { export const angledLineToX: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput const { from, to } = segmentInput
@ -2526,9 +2539,9 @@ export const angledLineToX: SketchLineHelper = {
} }
} }
const callExp = createCallExpression('angledLineToX', [ const callExp = createCallExpressionStdLibKw('angledLineToX', null, [
createArrayExpression([angle, xArg]), createLabeledArg(ARG_ANGLE, angle),
createPipeSubstitution(), createLabeledArg(ARG_END_ABSOLUTE_X, xArg),
]) ])
pipe.body = [...pipe.body, callExp] pipe.body = [...pipe.body, callExp]
return { return {
@ -2540,30 +2553,28 @@ export const angledLineToX: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input const { to, from } = input
const _node = { ...node } const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode) const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0) const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(to[0], 2) const xLength = roundOff(to[0], 2)
const firstArg = callExpression.arguments?.[0]
const adjustedXLength = xLength const adjustedXLength = xLength
const angleLit = createLiteral(angle) const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength) const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) { removeDeterminingArgs(callExpression)
mutateObjExpProp(firstArg, angleLit, 'angle') mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateObjExpProp(firstArg, lengthLit, 'to') mutateKwArg(ARG_END_ABSOLUTE_X, callExpression, lengthLit)
}
return { return {
modifiedAst: _node, modifiedAst: _node,
pathToNode, pathToNode,
} }
}, },
getTag: getTag(), getTag: getTagKwArg(),
addTag: addTag(), addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) => getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper( commonConstraintInfoHelper(
callExp, callExp,
@ -2577,7 +2588,7 @@ export const angledLineToX: SketchLineHelper = {
), ),
} }
export const angledLineToY: SketchLineHelper = { export const angledLineToY: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput const { from, to } = segmentInput
@ -2622,9 +2633,9 @@ export const angledLineToY: SketchLineHelper = {
} }
} }
const newLine = createCallExpression('angledLineToY', [ const newLine = createCallExpressionStdLibKw('angledLine', null, [
createArrayExpression([angle, yArg]), createLabeledArg(ARG_ANGLE, angle),
createPipeSubstitution(), createLabeledArg(ARG_END_ABSOLUTE_Y, yArg),
]) ])
pipe.body = [...pipe.body, newLine] pipe.body = [...pipe.body, newLine]
return { return {
@ -2636,30 +2647,28 @@ export const angledLineToY: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input const { to, from } = input
const _node = { ...node } const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode) const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0) const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(to[1], 2) const xLength = roundOff(to[1], 2)
const firstArg = callExpression.arguments?.[0]
const adjustedXLength = xLength const adjustedXLength = xLength
const angleLit = createLiteral(angle) const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength) const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) { removeDeterminingArgs(callExpression)
mutateObjExpProp(firstArg, angleLit, 'angle') mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateObjExpProp(firstArg, lengthLit, 'to') mutateKwArg(ARG_END_ABSOLUTE_Y, callExpression, lengthLit)
}
return { return {
modifiedAst: _node, modifiedAst: _node,
pathToNode, pathToNode,
} }
}, },
getTag: getTag(), getTag: getTagKwArg(),
addTag: addTag(), addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) => getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper( commonConstraintInfoHelper(
callExp, callExp,
@ -2918,11 +2927,6 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({
} }
export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = { export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = {
angledLine,
angledLineOfXLength,
angledLineOfYLength,
angledLineToX,
angledLineToY,
angledLineThatIntersects, angledLineThatIntersects,
tangentialArcTo, tangentialArcTo,
arc, arc,
@ -2938,6 +2942,11 @@ export const sketchLineHelperMapKw: { [key: string]: SketchLineHelperKw } = {
yLine, yLine,
xLineTo, xLineTo,
yLineTo, yLineTo,
angledLine,
angledLineOfXLength,
angledLineOfYLength,
angledLineToX,
angledLineToY,
} as const } as const
export function changeSketchArguments( export function changeSketchArguments(
@ -2983,10 +2992,10 @@ export function changeSketchArguments(
}) })
} }
if (fnName in sketchLineHelperMapKw) { if (fnName in sketchLineHelperMapKw) {
const isAbsolute = const correctFnName =
callExpression.type === 'CallExpressionKw' && callExpression.type === 'CallExpressionKw'
findKwArg(ARG_END_ABSOLUTE, callExpression) !== undefined ? fnNameToTooltip(allLabels(callExpression), fnName)
const correctFnName = fnNameToTooltip(isAbsolute, fnName) : fnName
if (err(correctFnName)) { if (err(correctFnName)) {
return correctFnName return correctFnName
} }
@ -3015,9 +3024,11 @@ export function changeSketchArguments(
* To put it another way, function names don't map cleanly to tooltips, but function names + arguments do. * To put it another way, function names don't map cleanly to tooltips, but function names + arguments do.
*/ */
export function fnNameToTooltip( export function fnNameToTooltip(
isAbsolute: boolean, argLabels: string[],
fnName: string fnName: string
): ToolTip | Error { ): ToolTip | Error {
const isAbsolute =
argLabels.findIndex((label) => label === ARG_END_ABSOLUTE) >= 0
switch (fnName) { switch (fnName) {
case 'line': case 'line':
return isAbsolute ? 'lineTo' : 'line' return isAbsolute ? 'lineTo' : 'line'
@ -3028,6 +3039,23 @@ export function fnNameToTooltip(
case 'circleThreePoint': case 'circleThreePoint':
case 'circle': case 'circle':
return fnName return fnName
case 'angledLine': {
const argmap: Record<string, ToolTip> = {
ARG_LENGTH_X: 'angledLineOfXLength',
ARG_LENGTH_Y: 'angledLineOfYLength',
ARG_END_ABSOLUTE_X: 'angledLineToX',
ARG_END_ABSOLUTE_Y: 'angledLineToY',
ARG_LENGTH: 'angledLine',
}
for (const [arg, tooltip] of Object.entries(argmap)) {
if (argLabels.findIndex((label) => label === arg) >= 0) {
return tooltip
}
}
const err = `Unknown angledline arguments, could not map to tooltip. Args were ${argLabels}`
console.error(err)
return new Error(err)
}
default: default:
const err = `Unknown sketch line function ${fnName}` const err = `Unknown sketch line function ${fnName}`
console.error(err) console.error(err)
@ -3055,6 +3083,12 @@ export function tooltipToFnName(tooltip: ToolTip): string | Error {
return 'xLine' return 'xLine'
case 'yLineTo': case 'yLineTo':
return 'yLine' return 'yLine'
case 'angledLine':
case 'angledLineToX':
case 'angledLineToY':
case 'angledLineOfXLength':
case 'angledLineOfYLength':
return 'angledLine'
default: default:
return new Error(`Unknown tooltip function ${tooltip}`) return new Error(`Unknown tooltip function ${tooltip}`)
} }
@ -3092,7 +3126,7 @@ export function getConstraintInfoKw(
return [] return []
} }
if (!(fnName in sketchLineHelperMapKw)) return [] if (!(fnName in sketchLineHelperMapKw)) return []
const correctFnName = fnNameToTooltip(isAbsolute, fnName) const correctFnName = fnNameToTooltip(allLabels(callExpression), fnName)
if (err(correctFnName)) { if (err(correctFnName)) {
console.error(correctFnName) console.error(correctFnName)
return [] return []
@ -3453,6 +3487,7 @@ export function getTagFromCallExpression(
return new Error(`"${callExp.callee.name.name}" is not a sketch line helper`) return new Error(`"${callExp.callee.name.name}" is not a sketch line helper`)
} }
<<<<<<< HEAD
function isAngleLiteral(lineArugement: Expr): boolean { function isAngleLiteral(lineArugement: Expr): boolean {
return lineArugement?.type === 'ArrayExpression' return lineArugement?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArugement.elements[0]) ? isLiteralArrayOrStatic(lineArugement.elements[0])
@ -3462,6 +3497,25 @@ function isAngleLiteral(lineArugement: Expr): boolean {
?.value ?.value
) )
: false : false
||||||| parent of 27a8a2a50 (Start changing JS codemods)
function isAngleLiteral(lineArugement: Expr): boolean {
return lineArugement?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArugement.elements[0])
: lineArugement?.type === 'ObjectExpression'
? isLiteralArrayOrStatic(
lineArugement.properties.find(({ key }) => key.name === 'angle')?.value
)
: false
=======
function isAngleLiteral(lineArgument: Expr): boolean {
return lineArgument?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArgument.elements[0])
: lineArgument?.type === 'ObjectExpression'
? isLiteralArrayOrStatic(
lineArgument.properties.find(({ key }) => key.name === 'angle')?.value
)
: lineArgument?.type === 'Literal'
>>>>>>> 27a8a2a50 (Start changing JS codemods)
} }
type addTagFn = ( type addTagFn = (
@ -3782,7 +3836,7 @@ export function getArgForEnd(lineCall: CallExpressionKw):
return getValuesForXYFns(arg) return getValuesForXYFns(arg)
} }
case 'yLine': case 'yLine':
case 'xLine': case 'xLine': {
const arg = findKwArgAny(DETERMINING_ARGS, lineCall) const arg = findKwArgAny(DETERMINING_ARGS, lineCall)
const tag = findKwArg(ARG_TAG, lineCall) const tag = findKwArg(ARG_TAG, lineCall)
if (arg === undefined) { if (arg === undefined) {
@ -3790,6 +3844,30 @@ export function getArgForEnd(lineCall: CallExpressionKw):
} else { } else {
return { val: arg, tag } return { val: arg, tag }
} }
}
case 'angledLine': {
const angle = findKwArg(ARG_ANGLE, lineCall)
if (angle === undefined) {
return new Error(`call to ${name} needs an ${ARG_ANGLE} arg`)
}
const length = findKwArgAny(
[
ARG_LENGTH,
ARG_LENGTH_X,
ARG_LENGTH_Y,
ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y,
],
lineCall
)
if (length === undefined) {
return new Error(
`call to ${name} needs an arg like ${ARG_LENGTH}, or ${ARG_END_ABSOLUTE_X} or something`
)
}
const tag = findKwArg(ARG_TAG, lineCall)
return { val: [angle, length], tag }
}
default: default:
return new Error(`unknown function ${name}`) return new Error(`unknown function ${name}`)
} }

View File

@ -5,7 +5,12 @@ import {
ARG_END_ABSOLUTE, ARG_END_ABSOLUTE,
ARG_LENGTH, ARG_LENGTH,
ARG_TAG, ARG_TAG,
ARG_ANGLE,
DETERMINING_ARGS, DETERMINING_ARGS,
ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y,
ARG_LENGTH_X,
ARG_LENGTH_Y,
} from '@src/lang/constants' } from '@src/lang/constants'
import { import {
createArrayExpression, createArrayExpression,
@ -162,6 +167,43 @@ function createCallWrapper(
valueUsedInTransform, valueUsedInTransform,
} }
} }
if (
tooltip === 'angledLine' ||
tooltip === 'angledLineToX' ||
tooltip === 'angledLineToY' ||
tooltip === 'angledLineOfXLength' ||
tooltip === 'angledLineOfYLength'
) {
const args = [createLabeledArg(ARG_ANGLE, val[0])]
const v = val[1]
args.push(
(() => {
switch (tooltip) {
case 'angledLine':
return createLabeledArg(ARG_LENGTH, v)
case 'angledLineToX':
return createLabeledArg(ARG_END_ABSOLUTE_X, v)
case 'angledLineToY':
return createLabeledArg(ARG_END_ABSOLUTE_Y, v)
case 'angledLineOfXLength':
return createLabeledArg(ARG_LENGTH_X, v)
case 'angledLineOfYLength':
return createLabeledArg(ARG_LENGTH_Y, v)
}
})()
)
if (tag) {
args.push(createLabeledArg(ARG_TAG, tag))
}
return {
callExp: createCallExpressionStdLibKw(
'angledLine',
null, // Assumes this is being called in a pipeline, so the first arg is optional and if not given, will become pipeline substitution.
args
),
valueUsedInTransform,
}
}
} else { } else {
// In this branch, `val` is an expression. // In this branch, `val` is an expression.
const arg = (() => { const arg = (() => {
@ -1685,8 +1727,7 @@ function getTransformMapPathKw(
} }
return false return false
} }
const isAbsolute = findKwArg(ARG_END_ABSOLUTE, sketchFnExp) !== undefined const tooltip = fnNameToTooltip(allLabels(sketchFnExp), name)
const tooltip = fnNameToTooltip(isAbsolute, name)
if (err(tooltip)) { if (err(tooltip)) {
return false return false
} }
@ -1717,6 +1758,7 @@ function getTransformMapPathKw(
} }
// check what constraints the function has // check what constraints the function has
const isAbsolute = findKwArg(ARG_END_ABSOLUTE, sketchFnExp) !== undefined
const lineInputType = getConstraintType(argForEnd.val, name, isAbsolute) const lineInputType = getConstraintType(argForEnd.val, name, isAbsolute)
if (lineInputType) { if (lineInputType) {
const info = transformMap?.[tooltip]?.[lineInputType]?.[constraintType] const info = transformMap?.[tooltip]?.[lineInputType]?.[constraintType]

View File

@ -2,7 +2,7 @@ import type { Binary as BSONBinary } from 'bson'
import { v4 } from 'uuid' import { v4 } from 'uuid'
import type { AnyMachineSnapshot } from 'xstate' import type { AnyMachineSnapshot } from 'xstate'
import type { SourceRange } from '@src/lang/wasm' import type { CallExpressionKw, SourceRange } from '@src/lang/wasm'
import { isDesktop } from '@src/lib/isDesktop' import { isDesktop } from '@src/lib/isDesktop'
import type { AsyncFn } from '@src/lib/types' import type { AsyncFn } from '@src/lib/types'
@ -469,3 +469,7 @@ export function binaryToUuid(
hexValues.slice(10, 16).join(''), hexValues.slice(10, 16).join(''),
].join('-') ].join('-')
} }
export function allLabels(callExpression: CallExpressionKw): string[] {
return callExpression.arguments.map((a) => a.label.name)
}