2024-08-07 19:27:32 +10:00
import { test , expect , Page } from '@playwright/test'
import { deg , getUtils , setup , tearDown , wiggleMove } from './test-utils'
import { LineInputsType } from 'lang/std/sketchcombos'
import { uuidv4 } from 'lib/utils'
2024-09-16 07:32:33 +10:00
test . beforeEach ( async ( { context , page } , testInfo ) = > {
await setup ( context , page , testInfo )
2024-08-07 19:27:32 +10:00
} )
test . afterEach ( async ( { page } , testInfo ) = > {
await tearDown ( page , testInfo )
} )
test . describe ( 'Testing segment overlays' , ( ) = > {
test . describe ( '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' , ( ) = > {
/ * *
* Clicks on an constrained element
* @param { Page } page - The page to perform the action on
* @param { Object } options - The options for the action
* @param { Object } options . hoverPos - The position to hover over
* @param { Object } options . constraintType - The type of constraint
* @param { number } options . ang - The angle
* @param { number } options . steps - The number of steps to perform
* /
const _clickConstrained =
( page : Page ) = >
async ( {
hoverPos ,
constraintType ,
expectBeforeUnconstrained ,
expectAfterUnconstrained ,
expectFinal ,
ang = 45 ,
steps = 10 ,
locator ,
} : {
hoverPos : { x : number ; y : number }
constraintType :
| 'horizontal'
| 'vertical'
| 'tangentialWithPrevious'
| LineInputsType
expectBeforeUnconstrained : string
expectAfterUnconstrained : string
expectFinal : string
ang? : number
steps? : number
locator? : string
} ) = > {
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
let x = 0 ,
y = 0
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove ( page , x , y , 20 , 30 , ang , 10 , 5 , locator )
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
expectBeforeUnconstrained
)
const constrainedLocator = page . locator (
` [data-constraint-type=" ${ constraintType } "][data-is-constrained="true"] `
)
await expect ( constrainedLocator ) . toBeVisible ( )
await constrainedLocator . hover ( )
await expect (
await page . getByTestId ( 'constraint-symbol-popover' ) . count ( )
) . toBeGreaterThan ( 0 )
await constrainedLocator . click ( )
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
expectAfterUnconstrained
)
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove ( page , x , y , 20 , 30 , ang , 10 , 5 , locator )
const unconstrainedLocator = page . locator (
` [data-constraint-type=" ${ constraintType } "][data-is-constrained="false"] `
)
await expect ( unconstrainedLocator ) . toBeVisible ( )
await unconstrainedLocator . hover ( )
await expect (
await page . getByTestId ( 'constraint-symbol-popover' ) . count ( )
) . toBeGreaterThan ( 0 )
await unconstrainedLocator . click ( )
2024-12-09 16:43:58 -05:00
await expect (
page . getByTestId ( 'cmd-bar-arg-value' ) . getByRole ( 'textbox' )
) . toBeFocused ( )
await page
. getByRole ( 'button' , {
name : 'arrow right Continue' ,
} )
. click ( )
2024-08-07 19:27:32 +10:00
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( expectFinal )
}
/ * *
* Clicks on an unconstrained element
* @param { Page } page - The page to perform the action on
* @param { Object } options - The options for the action
* @param { Object } options . hoverPos - The position to hover over
* @param { Object } options . constraintType - The type of constraint
* @param { number } options . ang - The angle
* @param { number } options . steps - The number of steps to perform
* /
const _clickUnconstrained =
( page : Page ) = >
async ( {
hoverPos ,
constraintType ,
expectBeforeUnconstrained ,
expectAfterUnconstrained ,
expectFinal ,
ang = 45 ,
steps = 5 ,
locator ,
} : {
hoverPos : { x : number ; y : number }
constraintType :
| 'horizontal'
| 'vertical'
| 'tangentialWithPrevious'
| LineInputsType
expectBeforeUnconstrained : string
expectAfterUnconstrained : string
expectFinal : string
ang? : number
steps? : number
locator? : string
} ) = > {
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
let x = 0 ,
y = 0
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove ( page , x , y , 20 , 30 , ang , 10 , 5 , locator )
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
expectBeforeUnconstrained
)
const unconstrainedLocator = page . locator (
` [data-constraint-type=" ${ constraintType } "][data-is-constrained="false"] `
)
await expect ( unconstrainedLocator ) . toBeVisible ( )
await unconstrainedLocator . hover ( )
await expect (
await page . getByTestId ( 'constraint-symbol-popover' ) . count ( )
) . toBeGreaterThan ( 0 )
await unconstrainedLocator . click ( )
2024-12-09 16:43:58 -05:00
await expect (
page . getByTestId ( 'cmd-bar-arg-value' ) . getByRole ( 'textbox' )
) . toBeFocused ( )
await page
. getByRole ( 'button' , {
name : 'arrow right Continue' ,
} )
. click ( )
2024-08-07 19:27:32 +10:00
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
expectAfterUnconstrained
)
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove ( page , x , y , 20 , 30 , ang , 10 , 5 , locator )
const constrainedLocator = page . locator (
` [data-constraint-type=" ${ constraintType } "][data-is-constrained="true"] `
)
await expect ( constrainedLocator ) . toBeVisible ( )
await constrainedLocator . hover ( )
await expect (
await page . getByTestId ( 'constraint-symbol-popover' ) . count ( )
) . toBeGreaterThan ( 0 )
await constrainedLocator . click ( )
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( expectFinal )
}
test . setTimeout ( 120000 )
test ( 'for segments [line, angledLine, lineTo, xLineTo]' , async ( {
page ,
} ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 5 + 0 , 20 + 0 ] , % )
| > line ( [ 0.5 , - 14 + 0 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = 3 + 0 , length = 32 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 5 + 33 , 20 + 11.5 + 0 ] , % )
| > xLineTo ( 5 + 9 - 5 , % )
| > yLineTo ( 20 + - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > angledLineOfXLength ( { angle = 181 + 0 , length = 23.14 } , % )
| > angledLineOfYLength ( { angle = - 91 , length = 19 + 0 } , % )
| > angledLineToX ( { angle = 3 + 0 , to = 5 + 26 } , % )
| > angledLineToY ( { angle = 89 , to = 20 + 9.14 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > angledLineThatIntersects ( {
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % )
| > tangentialArcTo ( [ 5 + 3.14 + 13 , 20 + 3.14 ] , % )
`
)
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . getByText ( 'xLineTo(5 + 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 )
const clickConstrained = _clickConstrained ( page )
await u . openAndClearDebugPanel ( )
await u . sendCustomCmd ( {
type : 'modeling_cmd_req' ,
cmd_id : uuidv4 ( ) ,
cmd : {
type : 'default_camera_look_at' ,
vantage : { x : 80 , y : - 1350 , z : 510 } ,
center : { x : 80 , y : 0 , z : 510 } ,
up : { x : 0 , y : 0 , z : 1 } ,
} ,
} )
await page . waitForTimeout ( 100 )
await u . sendCustomCmd ( {
type : 'modeling_cmd_req' ,
cmd_id : uuidv4 ( ) ,
cmd : {
type : 'default_camera_get_settings' ,
} ,
} )
await page . waitForTimeout ( 100 )
await u . closeDebugPanel ( )
let ang = 0
const line = await u . getBoundingBox ( ` [data-overlay-index=" ${ 0 } "] ` )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 0 } "] ` )
console . log ( 'line1' , line , ang )
await clickConstrained ( {
hoverPos : { x : line.x , y : line.y } ,
constraintType : 'yRelative' ,
expectBeforeUnconstrained : '|> line([0.5, -14 + 0], %)' ,
expectAfterUnconstrained : '|> line([0.5, -14], %)' ,
expectFinal : '|> line([0.5, yRel001], %)' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="0"]' ,
} )
console . log ( 'line2' )
await clickUnconstrained ( {
hoverPos : { x : line.x , y : line.y } ,
constraintType : 'xRelative' ,
expectBeforeUnconstrained : '|> line([0.5, yRel001], %)' ,
expectAfterUnconstrained : 'line([xRel001, yRel001], %)' ,
expectFinal : '|> line([0.5, yRel001], %)' ,
ang : ang + 180 ,
locator : '[data-overlay-index="0"]' ,
} )
const angledLine = await u . getBoundingBox ( ` [data-overlay-index="1"] ` )
ang = await u . getAngle ( ` [data-overlay-index="1"] ` )
console . log ( 'angledLine1' )
await clickConstrained ( {
hoverPos : { x : angledLine.x , y : angledLine.y } ,
constraintType : 'angle' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLine({ angle = 3 + 0, length = 32 + 0 }, %)' ,
expectAfterUnconstrained :
'angledLine({ angle = 3, length = 32 + 0 }, %)' ,
expectFinal : 'angledLine({ angle = angle001, length = 32 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="1"]' ,
} )
console . log ( 'angledLine2' )
await clickConstrained ( {
hoverPos : { x : angledLine.x , y : angledLine.y } ,
constraintType : 'length' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLine({ angle = angle001, length = 32 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLine({ angle = angle001, length = 32 }, %)' ,
expectFinal : 'angledLine({ angle = angle001, length = len001 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="1"]' ,
} )
await page . mouse . move ( 700 , 250 )
await page . waitForTimeout ( 100 )
let lineTo = await u . getBoundingBox ( ` [data-overlay-index="2"] ` )
ang = await u . getAngle ( ` [data-overlay-index="2"] ` )
console . log ( 'lineTo1' )
await clickConstrained ( {
hoverPos : { x : lineTo.x , y : lineTo.y } ,
constraintType : 'yAbsolute' ,
expectBeforeUnconstrained : 'lineTo([5 + 33, 20 + 11.5 + 0], %)' ,
expectAfterUnconstrained : 'lineTo([5 + 33, 31.5], %)' ,
expectFinal : 'lineTo([5 + 33, yAbs001], %)' ,
steps : 8 ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="2"]' ,
} )
console . log ( 'lineTo2' )
await clickConstrained ( {
hoverPos : { x : lineTo.x , y : lineTo.y } ,
constraintType : 'xAbsolute' ,
expectBeforeUnconstrained : 'lineTo([5 + 33, yAbs001], %)' ,
expectAfterUnconstrained : 'lineTo([38, yAbs001], %)' ,
expectFinal : 'lineTo([xAbs001, yAbs001], %)' ,
steps : 8 ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="2"]' ,
} )
const xLineTo = await u . getBoundingBox ( ` [data-overlay-index="3"] ` )
ang = await u . getAngle ( ` [data-overlay-index="3"] ` )
console . log ( 'xlineTo1' )
await clickConstrained ( {
hoverPos : { x : xLineTo.x , y : xLineTo.y } ,
constraintType : 'xAbsolute' ,
expectBeforeUnconstrained : 'xLineTo(5 + 9 - 5, %)' ,
expectAfterUnconstrained : 'xLineTo(9, %)' ,
expectFinal : 'xLineTo(xAbs002, %)' ,
ang : ang + 180 ,
steps : 8 ,
locator : '[data-overlay-toolbar-index="3"]' ,
} )
} )
test ( 'for segments [yLineTo, xLine]' , async ( { page } ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` yRel001 = -14
xRel001 = 0.5
angle001 = 3
len001 = 32
yAbs001 = 11.5
xAbs001 = 33
xAbs002 = 4
part001 = startSketchOn ( 'XZ' )
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 0.5 , yRel001 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = angle001 , length = len001 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 33 , yAbs001 ] , % )
| > xLineTo ( xAbs002 , % )
| > yLineTo ( - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > angledLineOfXLength ( { angle = 181 + 0 , length = 23.14 } , % )
2024-08-07 19:27:32 +10:00
`
)
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . getByText ( 'xLine(26.04, %)' ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByRole ( 'button' , { name : 'Edit Sketch' } ) . click ( )
await page . waitForTimeout ( 500 )
await expect ( page . getByTestId ( 'segment-overlay' ) ) . toHaveCount ( 8 )
const clickUnconstrained = _clickUnconstrained ( page )
await page . mouse . move ( 700 , 250 )
await page . waitForTimeout ( 100 )
let ang = 0
const yLineTo = await u . getBoundingBox ( ` [data-overlay-index="4"] ` )
ang = await u . getAngle ( ` [data-overlay-index="4"] ` )
console . log ( 'ylineTo1' )
await clickUnconstrained ( {
hoverPos : { x : yLineTo.x , y : yLineTo.y } ,
constraintType : 'yAbsolute' ,
expectBeforeUnconstrained : 'yLineTo(-10.77, %, $a)' ,
expectAfterUnconstrained : 'yLineTo(yAbs002, %, $a)' ,
expectFinal : 'yLineTo(-10.77, %, $a)' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="4"]' ,
} )
const xLine = await u . getBoundingBox ( ` [data-overlay-index="5"] ` )
ang = await u . getAngle ( ` [data-overlay-index="5"] ` )
console . log ( 'xline' )
await clickUnconstrained ( {
hoverPos : { x : xLine.x , y : xLine.y } ,
constraintType : 'xRelative' ,
expectBeforeUnconstrained : 'xLine(26.04, %)' ,
expectAfterUnconstrained : 'xLine(xRel002, %)' ,
expectFinal : 'xLine(26.04, %)' ,
steps : 10 ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="5"]' ,
} )
} )
test ( 'for segments [yLine, angledLineOfXLength, angledLineOfYLength]' , async ( {
page ,
} ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 0.5 , - 14 + 0 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = 3 + 0 , length = 32 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 33 , 11.5 + 0 ] , % )
| > xLineTo ( 9 - 5 , % )
| > yLineTo ( - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > 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 } , % )
2024-08-07 19:27:32 +10:00
| > angledLineThatIntersects ( {
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % )
| > tangentialArcTo ( [ 3.14 + 13 , 3.14 ] , % )
`
)
localStorage . setItem ( 'disableAxis' , 'true' )
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . waitForTimeout ( 500 )
await page . getByText ( 'xLineTo(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 )
const clickConstrained = _clickConstrained ( page )
let ang = 0
const yLine = await u . getBoundingBox ( ` [data-overlay-index="6"] ` )
ang = await u . getAngle ( ` [data-overlay-index="6"] ` )
console . log ( 'yline1' )
await clickConstrained ( {
hoverPos : { x : yLine.x , y : yLine.y } ,
constraintType : 'yRelative' ,
expectBeforeUnconstrained : 'yLine(21.14 + 0, %)' ,
expectAfterUnconstrained : 'yLine(21.14, %)' ,
expectFinal : 'yLine(yRel001, %)' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="6"]' ,
} )
const angledLineOfXLength = await u . getBoundingBox (
` [data-overlay-index="7"] `
)
ang = await u . getAngle ( ` [data-overlay-index="7"] ` )
console . log ( 'angledLineOfXLength1' )
await clickConstrained ( {
hoverPos : { x : angledLineOfXLength.x , y : angledLineOfXLength.y } ,
constraintType : 'angle' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = -179, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
expectFinal :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="7"]' ,
} )
console . log ( 'angledLineOfXLength2' )
await clickUnconstrained ( {
hoverPos : { x : angledLineOfXLength.x , y : angledLineOfXLength.y } ,
constraintType : 'xRelative' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = angle001, length = xRel001 }, %)' ,
2024-08-07 19:27:32 +10:00
expectFinal :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = angle001, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
steps : 7 ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="7"]' ,
} )
const angledLineOfYLength = await u . getBoundingBox (
` [data-overlay-index="8"] `
)
ang = await u . getAngle ( ` [data-overlay-index="8"] ` )
console . log ( 'angledLineOfYLength1' )
await clickUnconstrained ( {
hoverPos : { x : angledLineOfYLength.x , y : angledLineOfYLength.y } ,
constraintType : 'angle' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = angle002, length = 19 + 0 }, %)' ,
expectFinal : 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
steps : 6 ,
locator : '[data-overlay-toolbar-index="8"]' ,
} )
console . log ( 'angledLineOfYLength2' )
await clickConstrained ( {
hoverPos : { x : angledLineOfYLength.x , y : angledLineOfYLength.y } ,
constraintType : 'yRelative' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = -91, length = 19 }, %)' ,
expectFinal :
'angledLineOfYLength({ angle = -91, length = yRel002 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
steps : 7 ,
locator : '[data-overlay-toolbar-index="8"]' ,
} )
} )
test ( 'for segments [angledLineToX, angledLineToY, angledLineThatIntersects]' , async ( {
page ,
} ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 0.5 , - 14 + 0 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = 3 + 0 , length = 32 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 33 , 11.5 + 0 ] , % )
| > xLineTo ( 9 - 5 , % )
| > yLineTo ( - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > 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 } , % )
2024-08-07 19:27:32 +10:00
| > angledLineThatIntersects ( {
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % )
| > tangentialArcTo ( [ 3.14 + 13 , 1.14 ] , % )
`
)
localStorage . setItem ( 'disableAxis' , 'true' )
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . getByText ( 'xLineTo(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 )
const clickConstrained = _clickConstrained ( page )
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' ,
2024-11-25 09:21:55 +13:00
expectBeforeUnconstrained :
'angledLineToX({ angle = 3 + 0, to = 26 }, %)' ,
expectAfterUnconstrained : 'angledLineToX({ angle = 3, to = 26 }, %)' ,
expectFinal : 'angledLineToX({ angle = angle001, to = 26 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="9"]' ,
} )
console . log ( 'angledLineToX2' )
await clickUnconstrained ( {
hoverPos : { x : angledLineToX.x , y : angledLineToX.y } ,
constraintType : 'xAbsolute' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineToX({ angle = angle001, to = 26 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineToX({ angle = angle001, to = xAbs001 }, %)' ,
expectFinal : 'angledLineToX({ angle = angle001, to = 26 }, %)' ,
2024-08-07 19:27:32 +10:00
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 :
2024-11-25 09:21:55 +13:00
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)' ,
expectFinal : 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
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 :
2024-11-25 09:21:55 +13:00
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)' ,
expectAfterUnconstrained : 'angledLineToY({ angle = 89, to = 9.14 }, %)' ,
expectFinal : 'angledLineToY({ angle = 89, to = yAbs001 }, %)' ,
2024-08-07 19:27:32 +10:00
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="10"]' ,
} )
const angledLineThatIntersects = await u . getBoundingBox (
` [data-overlay-index="11"] `
)
ang = await u . getAngle ( ` [data-overlay-index="11"] ` )
console . log ( 'angledLineThatIntersects' )
await clickUnconstrained ( {
hoverPos : {
x : angledLineThatIntersects.x ,
y : angledLineThatIntersects.y ,
} ,
constraintType : 'angle' ,
expectBeforeUnconstrained : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % ) ` ,
expectAfterUnconstrained : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = angle003 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % ) ` ,
expectFinal : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = - 176 ,
offset = 9 ,
intersectTag = a
2024-08-07 19:27:32 +10:00
} , % ) ` ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="11"]' ,
} )
console . log ( 'angledLineThatIntersects2' )
await clickUnconstrained ( {
hoverPos : {
x : angledLineThatIntersects.x ,
y : angledLineThatIntersects.y ,
} ,
constraintType : 'intersectionOffset' ,
expectBeforeUnconstrained : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = - 176 ,
offset = 9 ,
intersectTag = a
2024-08-07 19:27:32 +10:00
} , % ) ` ,
expectAfterUnconstrained : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = - 176 ,
offset = perpDist001 ,
intersectTag = a
2024-08-07 19:27:32 +10:00
} , % ) ` ,
expectFinal : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = - 176 ,
offset = 9 ,
intersectTag = a
2024-08-07 19:27:32 +10:00
} , % ) ` ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="11"]' ,
} )
} )
test ( 'for segment [tangentialArcTo]' , async ( { page } ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 0.5 , - 14 + 0 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = 3 + 0 , length = 32 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 33 , 11.5 + 0 ] , % )
| > xLineTo ( 9 - 5 , % )
| > yLineTo ( - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > 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 } , % )
2024-08-07 19:27:32 +10:00
| > angledLineThatIntersects ( {
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % )
| > tangentialArcTo ( [ 3.14 + 13 , - 3.14 ] , % )
`
)
localStorage . setItem ( 'disableAxis' , 'true' )
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . getByText ( 'xLineTo(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 )
const clickConstrained = _clickConstrained ( page )
const tangentialArcTo = await u . getBoundingBox (
'[data-overlay-index="12"]'
)
let ang = await u . getAngle ( '[data-overlay-index="12"]' )
console . log ( 'tangentialArcTo' )
await clickConstrained ( {
hoverPos : { x : tangentialArcTo.x , y : tangentialArcTo.y } ,
constraintType : 'xAbsolute' ,
expectBeforeUnconstrained : 'tangentialArcTo([3.14 + 13, -3.14], %)' ,
expectAfterUnconstrained : 'tangentialArcTo([16.14, -3.14], %)' ,
expectFinal : 'tangentialArcTo([xAbs001, -3.14], %)' ,
ang : ang + 180 ,
steps : 6 ,
locator : '[data-overlay-toolbar-index="12"]' ,
} )
console . log ( 'tangentialArcTo2' )
await clickUnconstrained ( {
hoverPos : { x : tangentialArcTo.x , y : tangentialArcTo.y } ,
constraintType : 'yAbsolute' ,
expectBeforeUnconstrained : 'tangentialArcTo([xAbs001, -3.14], %)' ,
expectAfterUnconstrained : 'tangentialArcTo([xAbs001, yAbs001], %)' ,
expectFinal : 'tangentialArcTo([xAbs001, -3.14], %)' ,
ang : ang + 180 ,
steps : 10 ,
locator : '[data-overlay-toolbar-index="12"]' ,
} )
} )
2024-09-23 22:42:51 +10:00
test ( 'for segment [circle]' , async ( { page } ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-11-25 09:21:55 +13:00
| > circle ( { center = [ 1 + 0 , 0 ] , radius = 8 } , % )
2024-09-23 22:42:51 +10:00
`
)
localStorage . setItem ( 'disableAxis' , 'true' )
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page
2024-11-25 09:21:55 +13:00
. getByText ( 'circle({ center = [1 + 0, 0], radius = 8 }, %)' )
2024-09-23 22:42:51 +10:00
. click ( )
await page . waitForTimeout ( 100 )
await page . getByRole ( 'button' , { name : 'Edit Sketch' } ) . click ( )
await page . waitForTimeout ( 500 )
await expect ( page . getByTestId ( 'segment-overlay' ) ) . toHaveCount ( 1 )
const clickUnconstrained = _clickUnconstrained ( page )
const clickConstrained = _clickConstrained ( page )
const hoverPos = { x : 789 , y : 114 } as const
let ang = await u . getAngle ( '[data-overlay-index="0"]' )
console . log ( 'angl' , ang )
console . log ( 'circle center x' )
await clickConstrained ( {
hoverPos ,
constraintType : 'xAbsolute' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'circle({ center = [1 + 0, 0], radius = 8 }, %)' ,
expectAfterUnconstrained : 'circle({ center = [1, 0], radius = 8 }, %)' ,
expectFinal : 'circle({ center = [xAbs001, 0], radius = 8 }, %)' ,
2024-09-23 22:42:51 +10:00
ang : ang + 105 ,
steps : 6 ,
locator : '[data-overlay-toolbar-index="0"]' ,
} )
console . log ( 'circle center y' )
await clickUnconstrained ( {
hoverPos ,
constraintType : 'yAbsolute' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'circle({ center = [xAbs001, 0], radius = 8 }, %)' ,
2024-09-23 22:42:51 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'circle({ center = [xAbs001, yAbs001], radius = 8 }, %)' ,
expectFinal : 'circle({ center = [xAbs001, 0], radius = 8 }, %)' ,
2024-09-23 22:42:51 +10:00
ang : ang + 105 ,
steps : 10 ,
locator : '[data-overlay-toolbar-index="0"]' ,
} )
console . log ( 'circle radius' )
await clickUnconstrained ( {
hoverPos ,
constraintType : 'radius' ,
expectBeforeUnconstrained :
2024-11-25 09:21:55 +13:00
'circle({ center = [xAbs001, 0], radius = 8 }, %)' ,
2024-09-23 22:42:51 +10:00
expectAfterUnconstrained :
2024-11-25 09:21:55 +13:00
'circle({ center = [xAbs001, 0], radius = radius001 }, %)' ,
expectFinal : 'circle({ center = [xAbs001, 0], radius = 8 }, %)' ,
2024-09-23 22:42:51 +10:00
ang : ang + 105 ,
steps : 10 ,
locator : '[data-overlay-toolbar-index="0"]' ,
} )
} )
2024-08-07 19:27:32 +10:00
} )
test . describe ( 'Testing deleting a segment' , ( ) = > {
const _deleteSegmentSequence =
( page : Page ) = >
async ( {
hoverPos ,
codeToBeDeleted ,
stdLibFnName ,
ang = 45 ,
steps = 6 ,
locator ,
} : {
hoverPos : { x : number ; y : number }
codeToBeDeleted : string
stdLibFnName : string
ang? : number
steps? : number
locator? : string
} ) = > {
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
let x = 0 ,
y = 0
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove ( page , x , y , 20 , 30 , ang , 10 , 5 , locator )
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( codeToBeDeleted )
await page . locator ( ` [data-stdlib-fn-name=" ${ stdLibFnName } "] ` ) . click ( )
await page . getByText ( 'Delete Segment' ) . click ( )
await expect ( page . locator ( '.cm-content' ) ) . not . toContainText (
codeToBeDeleted
)
}
test ( 'all segment types' , async ( { page } ) = > {
await page . addInitScript ( async ( ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 0 , 0 ] , % )
| > line ( [ 0.5 , - 14 + 0 ] , % )
2024-11-25 09:21:55 +13:00
| > angledLine ( { angle = 3 + 0 , length = 32 + 0 } , % )
2024-08-07 19:27:32 +10:00
| > lineTo ( [ 33 , 11.5 + 0 ] , % )
| > xLineTo ( 9 - 5 , % )
| > yLineTo ( - 10.77 , % , $a )
| > xLine ( 26.04 , % )
| > yLine ( 21.14 + 0 , % )
2024-11-25 09:21:55 +13:00
| > 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 } , % )
2024-08-07 19:27:32 +10:00
| > angledLineThatIntersects ( {
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % )
| > tangentialArcTo ( [ 3.14 + 13 , 1.14 ] , % )
`
)
localStorage . setItem ( 'disableAxis' , 'true' )
} )
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
// wait for execution done
await u . openDebugPanel ( )
await u . expectCmdLog ( '[data-message-type="execution-done"]' )
await u . closeDebugPanel ( )
await page . getByText ( 'xLineTo(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 deleteSegmentSequence = _deleteSegmentSequence ( page )
let segmentToDelete
const getOverlayByIndex = ( index : number ) = >
u . getBoundingBox ( ` [data-overlay-index=" ${ index } "] ` )
segmentToDelete = await getOverlayByIndex ( 12 )
let ang = await u . getAngle ( ` [data-overlay-index=" ${ 12 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'tangentialArcTo([3.14 + 13, 1.14], %)' ,
stdLibFnName : 'tangentialArcTo' ,
ang : ang + 180 ,
steps : 6 ,
locator : '[data-overlay-toolbar-index="12"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 11 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 11 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : ` angledLineThatIntersects({
2024-11-25 09:21:55 +13:00
angle = 4.14 ,
intersectTag = a ,
offset = 9
2024-08-07 19:27:32 +10:00
} , % ) ` ,
stdLibFnName : 'angledLineThatIntersects' ,
ang : ang + 180 ,
steps : 7 ,
locator : '[data-overlay-toolbar-index="11"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 10 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 10 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
2024-11-25 09:21:55 +13:00
codeToBeDeleted : 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
stdLibFnName : 'angledLineToY' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="10"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 9 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 9 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
2024-11-25 09:21:55 +13:00
codeToBeDeleted : 'angledLineToX({ angle = 3 + 0, to = 26 }, %)' ,
2024-08-07 19:27:32 +10:00
stdLibFnName : 'angledLineToX' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="9"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 8 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 8 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted :
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
stdLibFnName : 'angledLineOfYLength' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="8"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 7 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 7 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted :
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)' ,
2024-08-07 19:27:32 +10:00
stdLibFnName : 'angledLineOfXLength' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="7"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 6 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 6 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'yLine(21.14 + 0, %)' ,
stdLibFnName : 'yLine' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="6"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 5 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 5 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'xLine(26.04, %)' ,
stdLibFnName : 'xLine' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="5"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 4 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 4 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'yLineTo(-10.77, %, $a)' ,
stdLibFnName : 'yLineTo' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="4"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 3 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 3 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'xLineTo(9 - 5, %)' ,
stdLibFnName : 'xLineTo' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="3"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 2 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 2 } "] ` )
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
const hoverPos = { x : segmentToDelete.x , y : segmentToDelete.y }
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
await page . mouse . move ( hoverPos . x , hoverPos . y )
await wiggleMove (
page ,
hoverPos . x ,
hoverPos . y ,
20 ,
30 ,
ang ,
10 ,
5 ,
'[data-overlay-toolbar-index="2"]'
)
const codeToBeDeleted = 'lineTo([33, 11.5 + 0], %)'
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( codeToBeDeleted )
await page . getByTestId ( 'overlay-menu' ) . click ( )
await page . getByText ( 'Delete Segment' ) . click ( )
await expect ( page . locator ( '.cm-content' ) ) . not . toContainText (
codeToBeDeleted
)
segmentToDelete = await getOverlayByIndex ( 1 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 1 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
2024-11-25 09:21:55 +13:00
codeToBeDeleted : 'angledLine({ angle = 3 + 0, length = 32 + 0 }, %)' ,
2024-08-07 19:27:32 +10:00
stdLibFnName : 'angledLine' ,
ang : ang + 180 ,
locator : '[data-overlay-toolbar-index="1"]' ,
} )
segmentToDelete = await getOverlayByIndex ( 0 )
ang = await u . getAngle ( ` [data-overlay-index=" ${ 0 } "] ` )
await deleteSegmentSequence ( {
hoverPos : { x : segmentToDelete.x , y : segmentToDelete.y } ,
codeToBeDeleted : 'line([0.5, -14 + 0], %)' ,
stdLibFnName : 'line' ,
ang : ang + 180 ,
} )
await page . waitForTimeout ( 200 )
} )
} )
test . describe ( 'Testing delete with dependent segments' , ( ) = > {
const cases = [
'line([22, 2], %, $seg01)' ,
'angledLine([5, 23.03], %, $seg01)' ,
'xLine(23, %, $seg01)' ,
'yLine(-8, %, $seg01)' ,
'xLineTo(30, %, $seg01)' ,
'yLineTo(-4, %, $seg01)' ,
'angledLineOfXLength([3, 30], %, $seg01)' ,
2024-11-25 09:21:55 +13:00
'angledLineOfXLength({ angle = 3, length = 30 }, %, $seg01)' ,
2024-08-07 19:27:32 +10:00
'angledLineOfYLength([3, 1.5], %, $seg01)' ,
2024-11-25 09:21:55 +13:00
'angledLineOfYLength({ angle = 3, length = 1.5 }, %, $seg01)' ,
2024-08-07 19:27:32 +10:00
'angledLineToX([3, 30], %, $seg01)' ,
2024-11-25 09:21:55 +13:00
'angledLineToX({ angle = 3, to = 30 }, %, $seg01)' ,
2024-08-07 19:27:32 +10:00
'angledLineToY([3, 7], %, $seg01)' ,
2024-11-25 09:21:55 +13:00
'angledLineToY({ angle = 3, to = 7 }, %, $seg01)' ,
2024-08-07 19:27:32 +10:00
]
for ( const doesHaveTagOutsideSketch of [ true , false ] ) {
for ( const lineOfInterest of cases ) {
2024-11-25 09:21:55 +13:00
const isObj = lineOfInterest . includes ( '{ angle = 3,' )
2024-08-07 19:27:32 +10:00
test ( ` ${ lineOfInterest . split ( '(' ) [ 0 ] } ${ isObj ? '-[obj-input]' : '' } ${
doesHaveTagOutsideSketch ? '-[tagOutsideSketch]' : ''
} ` , async ({ page }) => {
await page . addInitScript (
async ( { lineToBeDeleted , extraLine } ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 5 , 6 ] , % )
| > $ { lineToBeDeleted }
| > line ( [ - 10 , - 15 ] , % )
| > angledLine ( [ - 176 , segLen ( seg01 ) ] , % )
2024-10-02 14:19:40 -05:00
$ { extraLine ? 'myVar = segLen(seg01)' : '' } `
2024-08-07 19:27:32 +10:00
)
} ,
{
lineToBeDeleted : lineOfInterest ,
extraLine : doesHaveTagOutsideSketch ,
}
)
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
await page . waitForTimeout ( 300 )
await page . getByText ( lineOfInterest ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByRole ( 'button' , { name : 'Edit Sketch' } ) . click ( )
await page . waitForTimeout ( 500 )
await expect ( page . getByTestId ( 'segment-overlay' ) ) . toHaveCount ( 3 )
const segmentToDelete = await u . getBoundingBox (
` [data-overlay-index="0"] `
)
const isYLine = lineOfInterest . toLowerCase ( ) . includes ( 'yline' )
const hoverPos = {
x : segmentToDelete.x + ( isYLine ? 0 : - 20 ) ,
y : segmentToDelete.y + ( isYLine ? - 20 : 0 ) ,
}
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
const ang = isYLine ? 45 : - 45
const [ x , y ] = [
Math . cos ( ( ang * Math . PI ) / 180 ) * 45 ,
Math . sin ( ( ang * Math . PI ) / 180 ) * 45 ,
]
await page . mouse . move ( hoverPos . x + x , hoverPos . y + y )
await page . mouse . move ( hoverPos . x , hoverPos . y , { steps : 5 } )
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
lineOfInterest
)
await page . getByTestId ( 'overlay-menu' ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByText ( 'Delete Segment' ) . click ( )
await page . getByText ( 'Cancel' ) . click ( )
await page . mouse . move ( hoverPos . x + x , hoverPos . y + y )
await page . mouse . move ( hoverPos . x , hoverPos . y , { steps : 5 } )
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
lineOfInterest
)
await page . getByTestId ( 'overlay-menu' ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByText ( 'Delete Segment' ) . click ( )
await page . getByText ( 'Continue and unconstrain' ) . last ( ) . click ( )
if ( doesHaveTagOutsideSketch ) {
// eslint-disable-next-line jest/no-conditional-expect
await expect (
page . getByText (
'Segment tag used outside of current Sketch. Could not delete.'
)
) . toBeTruthy ( )
// eslint-disable-next-line jest/no-conditional-expect
await expect ( page . locator ( '.cm-content' ) ) . toContainText (
lineOfInterest
)
} else {
// eslint-disable-next-line jest/no-conditional-expect
await expect ( page . locator ( '.cm-content' ) ) . not . toContainText (
lineOfInterest
)
// eslint-disable-next-line jest/no-conditional-expect
await expect ( page . locator ( '.cm-content' ) ) . not . toContainText ( 'seg01' )
}
} )
}
}
} )
test . describe ( 'Testing remove constraints segments' , ( ) = > {
const cases = [
{
before : ` line([22 + 0, 2 + 0], %, $ seg01) ` ,
after : ` line([22, 2], %, $ seg01) ` ,
} ,
{
before : ` angledLine([5 + 0, 23.03 + 0], %, $ seg01) ` ,
after : ` line([22.94, 2.01], %, $ seg01) ` ,
} ,
{
before : ` xLine(23 + 0, %, $ seg01) ` ,
after : ` line([23, 0], %, $ seg01) ` ,
} ,
{
before : ` yLine(-8 + 0, %, $ seg01) ` ,
after : ` line([0, -8], %, $ seg01) ` ,
} ,
{
before : ` xLineTo(30 + 0, %, $ seg01) ` ,
after : ` line([25, 0], %, $ seg01) ` ,
} ,
{
before : ` yLineTo(-4 + 0, %, $ seg01) ` ,
after : ` line([0, -10], %, $ seg01) ` ,
} ,
{
before : ` angledLineOfXLength([3 + 0, 30 + 0], %, $ seg01) ` ,
after : ` line([30, 1.57], %, $ seg01) ` ,
} ,
{
before : ` angledLineOfYLength([3 + 0, 1.5 + 0], %, $ seg01) ` ,
after : ` line([28.62, 1.5], %, $ seg01) ` ,
} ,
{
before : ` angledLineToX([3 + 0, 30 + 0], %, $ seg01) ` ,
after : ` line([25, 1.31], %, $ seg01) ` ,
} ,
{
before : ` angledLineToY([3 + 0, 7 + 0], %, $ seg01) ` ,
after : ` line([19.08, 1], %, $ seg01) ` ,
} ,
{
2024-11-25 09:21:55 +13:00
before : ` angledLineOfXLength({ angle = 3 + 0, length = 30 + 0 }, %, $ seg01) ` ,
2024-08-07 19:27:32 +10:00
after : ` line([30, 1.57], %, $ seg01) ` ,
} ,
{
2024-11-25 09:21:55 +13:00
before : ` angledLineOfYLength({ angle = 3 + 0, length = 1.5 + 0 }, %, $ seg01) ` ,
2024-08-07 19:27:32 +10:00
after : ` line([28.62, 1.5], %, $ seg01) ` ,
} ,
{
2024-11-25 09:21:55 +13:00
before : ` angledLineToX({ angle = 3 + 0, to = 30 + 0 }, %, $ seg01) ` ,
2024-08-07 19:27:32 +10:00
after : ` line([25, 1.31], %, $ seg01) ` ,
} ,
{
2024-11-25 09:21:55 +13:00
before : ` angledLineToY({ angle = 3 + 0, to = 7 + 0 }, %, $ seg01) ` ,
2024-08-07 19:27:32 +10:00
after : ` line([19.08, 1], %, $ seg01) ` ,
} ,
]
for ( const { before , after } of cases ) {
2024-11-25 09:21:55 +13:00
const isObj = before . includes ( '{ angle = 3' )
2024-08-07 19:27:32 +10:00
test ( ` ${ before . split ( '(' ) [ 0 ] } ${ isObj ? '-[obj-input]' : '' } ` , async ( {
page ,
} ) = > {
await page . addInitScript (
async ( { lineToBeDeleted } ) = > {
localStorage . setItem (
'persistCode' ,
2024-10-02 14:19:40 -05:00
` part001 = startSketchOn('XZ')
2024-08-07 19:27:32 +10:00
| > startProfileAt ( [ 5 , 6 ] , % )
| > $ { lineToBeDeleted }
| > line ( [ - 10 , - 15 ] , % )
| > angledLine ( [ - 176 , segLen ( seg01 ) ] , % ) `
)
} ,
{
lineToBeDeleted : before ,
}
)
const u = await getUtils ( page )
await page . setViewportSize ( { width : 1200 , height : 500 } )
await u . waitForAuthSkipAppStart ( )
await page . waitForTimeout ( 300 )
await page . getByText ( before ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByRole ( 'button' , { name : 'Edit Sketch' } ) . click ( )
await page . waitForTimeout ( 500 )
await expect ( page . getByTestId ( 'segment-overlay' ) ) . toHaveCount ( 3 )
await expect ( page . getByText ( 'Added variable' ) ) . not . toBeVisible ( )
const hoverPos = await u . getBoundingBox ( ` [data-overlay-index="0"] ` )
let ang = await u . getAngle ( ` [data-overlay-index=" ${ 0 } "] ` )
ang += 180
await page . mouse . move ( 0 , 0 )
await page . waitForTimeout ( 1000 )
let x = 0 ,
y = 0
x = hoverPos . x + Math . cos ( ang * deg ) * 32
y = hoverPos . y - Math . sin ( ang * deg ) * 32
await page . mouse . move ( x , y )
await wiggleMove (
page ,
x ,
y ,
20 ,
30 ,
ang ,
10 ,
5 ,
'[data-overlay-toolbar-index="0"]'
)
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( before )
await page . getByTestId ( 'overlay-menu' ) . click ( )
await page . waitForTimeout ( 100 )
await page . getByText ( 'Remove constraints' ) . click ( )
await expect ( page . locator ( '.cm-content' ) ) . toContainText ( after )
// check the cursor was left in the correct place after transform
await expect ( page . locator ( '.cm-activeLine' ) ) . toHaveText ( '|> ' + after )
await expect ( page . getByTestId ( 'segment-overlay' ) ) . toHaveCount ( 3 )
} )
}
} )
} )