Files
modeling-app/src/lib/selections.test.ts
Jess Frazelle 343f6572a2 circle moved to kw args (#5560)
* rust side of circle args

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* change circle in all test js files

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* more js side

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* fix

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* fixes

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* updates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* fix

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* ud[ates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* ud[ates

Signed-off-by: Jess Frazelle <github@jessfraz.com>

* A snapshot a day keeps the bugs away! 📷🐛 (OS: namespace-profile-ubuntu-8-cores)

---------

Signed-off-by: Jess Frazelle <github@jessfraz.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2025-02-28 20:40:01 -05:00

1299 lines
37 KiB
TypeScript

import { expect } from 'vitest'
import { assertParse, initPromise, ArtifactGraph, SourceRange } from 'lang/wasm'
import { getNodePathFromSourceRange } from 'lang/queryAstNodePathUtils'
import {
codeToIdSelections,
Selection,
findLastRangeStartingBefore,
} from './selections'
import { buildArtifactIndex, ArtifactIndex } from './artifactIndex'
import { Artifact } from 'lang/std/artifactGraph'
beforeAll(async () => {
await initPromise
})
describe('testing source range to artifact conversion', () => {
const MY_CODE = `sketch001 = startSketchOn('XZ')
profile001 = startProfileAt([105.55, 105.55], sketch001)
|> xLine(332.55, %, $seg01)
|> yLine(-310.12, %, $seg02)
|> xLine(-373.65, %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude001 = extrude(profile001, length = 500)
sketch002 = startSketchOn(extrude001, seg01)
profile002 = startProfileAt([-321.34, 361.76], sketch002)
|> line(end = [109.03, -61.79])
|> line(end = [-124.48, -132.65])
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
extrude002 = extrude(profile002, length = 500)
sketch005 = startSketchOn(extrude002, 'END')
profile006 = circle(sketch005,
center = [-292.57, 302.55],
radius = 25.89
)
sketch004 = startSketchOn(extrude001, seg02)
profile005 = startProfileAt([36.1, 174.49], sketch004)
|> angledLine([0, 22.33], %, $rectangleSegmentA003)
|> angledLine([
segAng(rectangleSegmentA003) - 90,
155.27
], %)
|> angledLine([
segAng(rectangleSegmentA003),
-segLen(rectangleSegmentA003)
], %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
sketch003 = startSketchOn(extrude001, seg02)
profile003 = startProfileAt([-115.59, 439.4], sketch003)
|> angledLine([0, 130.08], %, $rectangleSegmentA002)
|> angledLine([
segAng(rectangleSegmentA002) - 90,
123.84
], %)
|> angledLine([
segAng(rectangleSegmentA002),
-segLen(rectangleSegmentA002)
], %)
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
|> close()
profile004 = circle(sketch003,
center = [-88.54, 209.41],
radius = 42.72
)
`
const ___artifactGraph = new Map([
[
'c25d213e-0d04-4ec0-85f9-21deb17a9eca',
{
type: 'plane',
id: 'c25d213e-0d04-4ec0-85f9-21deb17a9eca',
pathIds: ['8b84b28e-b521-45e6-bea0-2b57e5dc2064'],
codeRef: {
range: [12, 31, 0],
pathToNode: [
['body', ''],
[0, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'8b84b28e-b521-45e6-bea0-2b57e5dc2064',
{
type: 'path',
id: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
planeId: 'c25d213e-0d04-4ec0-85f9-21deb17a9eca',
segIds: [
'0ac92ce1-384d-42c2-93ee-d6073cb6301c',
'a19c04df-107c-4744-b575-d76957eed2de',
'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
'631d0a75-05da-48be-9ad5-ea0bfa7efc12',
'e211240e-c634-43e2-a502-41dc9c291708',
],
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
solid2dId: '5289aace-0493-4238-a32e-1c61b3e10b9e',
codeRef: {
range: [45, 88, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[0, 'index'],
],
},
},
],
[
'0ac92ce1-384d-42c2-93ee-d6073cb6301c',
{
type: 'segment',
id: '0ac92ce1-384d-42c2-93ee-d6073cb6301c',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
surfaceId: '08c1481a-9c17-41df-baf9-8ef253cb8c83',
edgeIds: [
'447ea755-6f79-40de-8cf5-17685a0b039d',
'24ae3c52-3bd2-4a21-b48a-37439375cd5f',
],
codeRef: {
range: [94, 118, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[1, 'index'],
],
},
},
],
[
'a19c04df-107c-4744-b575-d76957eed2de',
{
type: 'segment',
id: 'a19c04df-107c-4744-b575-d76957eed2de',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
surfaceId: '9314d48d-5963-492e-8bda-2acbe5df29e9',
edgeIds: [
'32079948-0977-42be-95c3-662cc455d9ff',
'9c7b1d9b-fd4d-4c58-a7e9-262627ba0fdd',
],
codeRef: {
range: [124, 149, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[2, 'index'],
],
},
},
],
[
'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
{
type: 'segment',
id: 'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
surfaceId: 'ab90c913-ed62-4802-a5a6-0082789a97e3',
edgeIds: [
'89acf940-0d8b-4eea-bc42-f0536b8da366',
'05a4f54b-3fd6-4842-b871-fff7379fef33',
],
codeRef: {
range: [155, 172, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[3, 'index'],
],
},
},
],
[
'631d0a75-05da-48be-9ad5-ea0bfa7efc12',
{
type: 'segment',
id: '631d0a75-05da-48be-9ad5-ea0bfa7efc12',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
surfaceId: '793445be-45df-4126-aa57-3260984b1a3a',
edgeIds: [
'22245d83-6502-4d39-a665-86cf44a3aeb0',
'f870f7d8-35cb-4190-a46b-0154b01f5b7e',
],
codeRef: {
range: [178, 234, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[4, 'index'],
],
},
},
],
[
'e211240e-c634-43e2-a502-41dc9c291708',
{
type: 'segment',
id: 'e211240e-c634-43e2-a502-41dc9c291708',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
codeRef: {
range: [240, 247, 0],
pathToNode: [
['body', ''],
[1, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[5, 'index'],
],
},
},
],
[
'5289aace-0493-4238-a32e-1c61b3e10b9e',
{
type: 'solid2d',
id: '5289aace-0493-4238-a32e-1c61b3e10b9e',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
},
],
[
'07cade68-136c-4ba9-8e69-87e56998d264',
{
type: 'sweep',
id: '07cade68-136c-4ba9-8e69-87e56998d264',
subType: 'extrusion',
pathId: '8b84b28e-b521-45e6-bea0-2b57e5dc2064',
surfaceIds: [
'793445be-45df-4126-aa57-3260984b1a3a',
'ab90c913-ed62-4802-a5a6-0082789a97e3',
'9314d48d-5963-492e-8bda-2acbe5df29e9',
'08c1481a-9c17-41df-baf9-8ef253cb8c83',
'169e55f4-8439-4040-b531-e6e63c7a22f1',
'9f50004b-2015-4e6f-b79a-652ea66ad229',
],
edgeIds: [
'22245d83-6502-4d39-a665-86cf44a3aeb0',
'f870f7d8-35cb-4190-a46b-0154b01f5b7e',
'89acf940-0d8b-4eea-bc42-f0536b8da366',
'05a4f54b-3fd6-4842-b871-fff7379fef33',
'32079948-0977-42be-95c3-662cc455d9ff',
'9c7b1d9b-fd4d-4c58-a7e9-262627ba0fdd',
'447ea755-6f79-40de-8cf5-17685a0b039d',
'24ae3c52-3bd2-4a21-b48a-37439375cd5f',
],
codeRef: {
range: [261, 294, 0],
pathToNode: [
['body', ''],
[2, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'793445be-45df-4126-aa57-3260984b1a3a',
{
type: 'wall',
id: '793445be-45df-4126-aa57-3260984b1a3a',
segId: '631d0a75-05da-48be-9ad5-ea0bfa7efc12',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'ab90c913-ed62-4802-a5a6-0082789a97e3',
{
type: 'wall',
id: 'ab90c913-ed62-4802-a5a6-0082789a97e3',
segId: 'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'9314d48d-5963-492e-8bda-2acbe5df29e9',
{
type: 'wall',
id: '9314d48d-5963-492e-8bda-2acbe5df29e9',
segId: 'a19c04df-107c-4744-b575-d76957eed2de',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
pathIds: [
'8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
'04a1735a-3ce9-476f-b35f-e4e9439485ea',
'64c477ee-6206-424f-98e2-baecc387de86',
],
faceCodeRef: { range: [853, 885, 0], pathToNode: [] },
},
],
[
'08c1481a-9c17-41df-baf9-8ef253cb8c83',
{
type: 'wall',
id: '08c1481a-9c17-41df-baf9-8ef253cb8c83',
segId: '0ac92ce1-384d-42c2-93ee-d6073cb6301c',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
pathIds: ['9c837ce4-a600-43e8-a799-496016816409'],
faceCodeRef: { range: [308, 340, 0], pathToNode: [] },
},
],
[
'169e55f4-8439-4040-b531-e6e63c7a22f1',
{
type: 'cap',
id: '169e55f4-8439-4040-b531-e6e63c7a22f1',
subType: 'start',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'9f50004b-2015-4e6f-b79a-652ea66ad229',
{
type: 'cap',
id: '9f50004b-2015-4e6f-b79a-652ea66ad229',
subType: 'end',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'22245d83-6502-4d39-a665-86cf44a3aeb0',
{
type: 'sweepEdge',
id: '22245d83-6502-4d39-a665-86cf44a3aeb0',
subType: 'opposite',
segId: '631d0a75-05da-48be-9ad5-ea0bfa7efc12',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'f870f7d8-35cb-4190-a46b-0154b01f5b7e',
{
type: 'sweepEdge',
id: 'f870f7d8-35cb-4190-a46b-0154b01f5b7e',
subType: 'adjacent',
segId: '631d0a75-05da-48be-9ad5-ea0bfa7efc12',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'89acf940-0d8b-4eea-bc42-f0536b8da366',
{
type: 'sweepEdge',
id: '89acf940-0d8b-4eea-bc42-f0536b8da366',
subType: 'opposite',
segId: 'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'05a4f54b-3fd6-4842-b871-fff7379fef33',
{
type: 'sweepEdge',
id: '05a4f54b-3fd6-4842-b871-fff7379fef33',
subType: 'adjacent',
segId: 'bbba630d-3b40-4c18-b9ce-97e2c63c4198',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'32079948-0977-42be-95c3-662cc455d9ff',
{
type: 'sweepEdge',
id: '32079948-0977-42be-95c3-662cc455d9ff',
subType: 'opposite',
segId: 'a19c04df-107c-4744-b575-d76957eed2de',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'9c7b1d9b-fd4d-4c58-a7e9-262627ba0fdd',
{
type: 'sweepEdge',
id: '9c7b1d9b-fd4d-4c58-a7e9-262627ba0fdd',
subType: 'adjacent',
segId: 'a19c04df-107c-4744-b575-d76957eed2de',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'447ea755-6f79-40de-8cf5-17685a0b039d',
{
type: 'sweepEdge',
id: '447ea755-6f79-40de-8cf5-17685a0b039d',
subType: 'opposite',
segId: '0ac92ce1-384d-42c2-93ee-d6073cb6301c',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'24ae3c52-3bd2-4a21-b48a-37439375cd5f',
{
type: 'sweepEdge',
id: '24ae3c52-3bd2-4a21-b48a-37439375cd5f',
subType: 'adjacent',
segId: '0ac92ce1-384d-42c2-93ee-d6073cb6301c',
sweepId: '07cade68-136c-4ba9-8e69-87e56998d264',
},
],
[
'9c837ce4-a600-43e8-a799-496016816409',
{
type: 'path',
id: '9c837ce4-a600-43e8-a799-496016816409',
planeId: '08c1481a-9c17-41df-baf9-8ef253cb8c83',
segIds: [
'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
'83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
'500f8da6-c0b0-4953-87e7-67e6615094b7',
'567628ff-0f5c-4cab-aaa2-3e5812c23f55',
],
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
solid2dId: 'f614b055-bd1c-422c-9f97-6ddf59138a2b',
codeRef: {
range: [354, 398, 0],
pathToNode: [
['body', ''],
[4, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[0, 'index'],
],
},
},
],
[
'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
{
type: 'segment',
id: 'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
surfaceId: '04f5614d-9558-4ec4-9374-d6cf1513ee49',
edgeIds: [
'20a8f3a1-6628-4484-9aa6-eec15044eecd',
'49113603-5e8c-49f8-a371-d68ee32b72fa',
],
codeRef: {
range: [404, 432, 0],
pathToNode: [
['body', ''],
[4, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[1, 'index'],
],
},
},
],
[
'83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
{
type: 'segment',
id: '83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
surfaceId: '96766e17-a80b-42d1-a3e2-a3d8d53a6a2c',
edgeIds: [
'd06ed974-d3d9-4374-b5ee-9778877d4c4e',
'240d085b-4e1a-4838-9457-cae006c5f3cd',
],
codeRef: {
range: [438, 468, 0],
pathToNode: [
['body', ''],
[4, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[2, 'index'],
],
},
},
],
[
'500f8da6-c0b0-4953-87e7-67e6615094b7',
{
type: 'segment',
id: '500f8da6-c0b0-4953-87e7-67e6615094b7',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
surfaceId: '93c02952-c588-49d6-8df4-c666cdfae566',
edgeIds: [
'd8acb73e-0856-419e-8f0c-08ca5a50248e',
'05d17802-82a2-4c9b-bb3f-6ee8b0deeefa',
],
codeRef: {
range: [474, 530, 0],
pathToNode: [
['body', ''],
[4, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[3, 'index'],
],
},
},
],
[
'567628ff-0f5c-4cab-aaa2-3e5812c23f55',
{
type: 'segment',
id: '567628ff-0f5c-4cab-aaa2-3e5812c23f55',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
codeRef: {
range: [536, 543, 0],
pathToNode: [
['body', ''],
[4, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[4, 'index'],
],
},
},
],
[
'f614b055-bd1c-422c-9f97-6ddf59138a2b',
{
type: 'solid2d',
id: 'f614b055-bd1c-422c-9f97-6ddf59138a2b',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
},
],
[
'1c8e1237-9df0-407a-8278-84f634f1a88f',
{
type: 'sweep',
id: '1c8e1237-9df0-407a-8278-84f634f1a88f',
subType: 'extrusion',
pathId: '9c837ce4-a600-43e8-a799-496016816409',
surfaceIds: [
'93c02952-c588-49d6-8df4-c666cdfae566',
'96766e17-a80b-42d1-a3e2-a3d8d53a6a2c',
'04f5614d-9558-4ec4-9374-d6cf1513ee49',
'88f83820-9c86-4c62-9f5f-0c48db2bb055',
],
edgeIds: [
'd8acb73e-0856-419e-8f0c-08ca5a50248e',
'05d17802-82a2-4c9b-bb3f-6ee8b0deeefa',
'd06ed974-d3d9-4374-b5ee-9778877d4c4e',
'240d085b-4e1a-4838-9457-cae006c5f3cd',
'20a8f3a1-6628-4484-9aa6-eec15044eecd',
'49113603-5e8c-49f8-a371-d68ee32b72fa',
],
codeRef: {
range: [557, 590, 0],
pathToNode: [
['body', ''],
[5, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'93c02952-c588-49d6-8df4-c666cdfae566',
{
type: 'wall',
id: '93c02952-c588-49d6-8df4-c666cdfae566',
segId: '500f8da6-c0b0-4953-87e7-67e6615094b7',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'96766e17-a80b-42d1-a3e2-a3d8d53a6a2c',
{
type: 'wall',
id: '96766e17-a80b-42d1-a3e2-a3d8d53a6a2c',
segId: '83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'04f5614d-9558-4ec4-9374-d6cf1513ee49',
{
type: 'wall',
id: '04f5614d-9558-4ec4-9374-d6cf1513ee49',
segId: 'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
faceCodeRef: { range: [0, 0, 0], pathToNode: [] },
},
],
[
'88f83820-9c86-4c62-9f5f-0c48db2bb055',
{
type: 'cap',
id: '88f83820-9c86-4c62-9f5f-0c48db2bb055',
subType: 'end',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
pathIds: [
'4316b730-b653-422c-b7ca-cc1591870de5',
'0e1815f5-a128-4323-9d5d-c1c17642ef74',
],
faceCodeRef: { range: [603, 635, 0], pathToNode: [] },
},
],
[
'd8acb73e-0856-419e-8f0c-08ca5a50248e',
{
type: 'sweepEdge',
id: 'd8acb73e-0856-419e-8f0c-08ca5a50248e',
subType: 'opposite',
segId: '500f8da6-c0b0-4953-87e7-67e6615094b7',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'05d17802-82a2-4c9b-bb3f-6ee8b0deeefa',
{
type: 'sweepEdge',
id: '05d17802-82a2-4c9b-bb3f-6ee8b0deeefa',
subType: 'adjacent',
segId: '500f8da6-c0b0-4953-87e7-67e6615094b7',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'd06ed974-d3d9-4374-b5ee-9778877d4c4e',
{
type: 'sweepEdge',
id: 'd06ed974-d3d9-4374-b5ee-9778877d4c4e',
subType: 'opposite',
segId: '83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'240d085b-4e1a-4838-9457-cae006c5f3cd',
{
type: 'sweepEdge',
id: '240d085b-4e1a-4838-9457-cae006c5f3cd',
subType: 'adjacent',
segId: '83921e4a-fd8b-4b91-a38e-42b10bd0f1d6',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'20a8f3a1-6628-4484-9aa6-eec15044eecd',
{
type: 'sweepEdge',
id: '20a8f3a1-6628-4484-9aa6-eec15044eecd',
subType: 'opposite',
segId: 'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'49113603-5e8c-49f8-a371-d68ee32b72fa',
{
type: 'sweepEdge',
id: '49113603-5e8c-49f8-a371-d68ee32b72fa',
subType: 'adjacent',
segId: 'c7620b36-0eee-42dd-89dd-8b49a808d9fa',
sweepId: '1c8e1237-9df0-407a-8278-84f634f1a88f',
},
],
[
'4316b730-b653-422c-b7ca-cc1591870de5',
{
type: 'path',
id: '4316b730-b653-422c-b7ca-cc1591870de5',
planeId: '88f83820-9c86-4c62-9f5f-0c48db2bb055',
segIds: ['7e23a6a6-4a90-43a5-8a86-78ba915ad489'],
solid2dId: 'db576b79-8e6d-443e-9cb7-64022e2cf4be',
codeRef: {
range: [649, 718, 0],
pathToNode: [
['body', ''],
[7, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'7e23a6a6-4a90-43a5-8a86-78ba915ad489',
{
type: 'segment',
id: '7e23a6a6-4a90-43a5-8a86-78ba915ad489',
pathId: '4316b730-b653-422c-b7ca-cc1591870de5',
codeRef: {
range: [649, 718, 0],
pathToNode: [
['body', ''],
[7, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'db576b79-8e6d-443e-9cb7-64022e2cf4be',
{
type: 'solid2d',
id: 'db576b79-8e6d-443e-9cb7-64022e2cf4be',
pathId: '4316b730-b653-422c-b7ca-cc1591870de5',
},
],
[
'0e1815f5-a128-4323-9d5d-c1c17642ef74',
{
type: 'path',
id: '0e1815f5-a128-4323-9d5d-c1c17642ef74',
planeId: '88f83820-9c86-4c62-9f5f-0c48db2bb055',
segIds: [
'5b2448be-ae92-41cc-a9ac-e96393c79b9c',
'27effd70-97fd-4057-ad5b-041eb3e2998b',
],
codeRef: {
range: [732, 776, 0],
pathToNode: [
['body', ''],
[8, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[0, 'index'],
],
},
},
],
[
'5b2448be-ae92-41cc-a9ac-e96393c79b9c',
{
type: 'segment',
id: '5b2448be-ae92-41cc-a9ac-e96393c79b9c',
pathId: '0e1815f5-a128-4323-9d5d-c1c17642ef74',
codeRef: {
range: [782, 808, 0],
pathToNode: [
['body', ''],
[8, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[1, 'index'],
],
},
},
],
[
'27effd70-97fd-4057-ad5b-041eb3e2998b',
{
type: 'segment',
id: '27effd70-97fd-4057-ad5b-041eb3e2998b',
pathId: '0e1815f5-a128-4323-9d5d-c1c17642ef74',
codeRef: {
range: [814, 840, 0],
pathToNode: [
['body', ''],
[8, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[2, 'index'],
],
},
},
],
[
'8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
{
type: 'path',
id: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
planeId: '9314d48d-5963-492e-8bda-2acbe5df29e9',
segIds: [
'f149263c-1e58-40e0-b5a3-3cb87fa75d8c',
'f26505c7-4d98-4f88-af22-d257deac07be',
'c77ff330-afbc-4709-b735-b651ea034866',
'fbba311f-ecc9-4a3e-bca3-3c66878978c0',
'fc85af86-cfed-4c2c-bc66-e67d208b9385',
],
solid2dId: '6d78b893-6a95-432c-b342-bdb14a012833',
codeRef: {
range: [899, 940, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[0, 'index'],
],
},
},
],
[
'f149263c-1e58-40e0-b5a3-3cb87fa75d8c',
{
type: 'segment',
id: 'f149263c-1e58-40e0-b5a3-3cb87fa75d8c',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
codeRef: {
range: [946, 994, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[1, 'index'],
],
},
},
],
[
'f26505c7-4d98-4f88-af22-d257deac07be',
{
type: 'segment',
id: 'f26505c7-4d98-4f88-af22-d257deac07be',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
codeRef: {
range: [1000, 1079, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[2, 'index'],
],
},
},
],
[
'c77ff330-afbc-4709-b735-b651ea034866',
{
type: 'segment',
id: 'c77ff330-afbc-4709-b735-b651ea034866',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
codeRef: {
range: [1085, 1182, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[3, 'index'],
],
},
},
],
[
'fbba311f-ecc9-4a3e-bca3-3c66878978c0',
{
type: 'segment',
id: 'fbba311f-ecc9-4a3e-bca3-3c66878978c0',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
codeRef: {
range: [1188, 1244, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[4, 'index'],
],
},
},
],
[
'fc85af86-cfed-4c2c-bc66-e67d208b9385',
{
type: 'segment',
id: 'fc85af86-cfed-4c2c-bc66-e67d208b9385',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
codeRef: {
range: [1250, 1257, 0],
pathToNode: [
['body', ''],
[10, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[5, 'index'],
],
},
},
],
[
'6d78b893-6a95-432c-b342-bdb14a012833',
{
type: 'solid2d',
id: '6d78b893-6a95-432c-b342-bdb14a012833',
pathId: '8a98773e-d965-4ef8-b7a0-784cd0e05fcb',
},
],
[
'04a1735a-3ce9-476f-b35f-e4e9439485ea',
{
type: 'path',
id: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
planeId: '9314d48d-5963-492e-8bda-2acbe5df29e9',
segIds: [
'ca369e71-6d1b-483c-a9c4-f5ebdef24479',
'5a3ebb81-8050-4ad1-a668-0882f005a4a8',
'c9cf1dfa-1c3a-490f-9d26-071ea3c38e30',
'a0e58546-572d-41f1-99dd-5d18db18cb00',
'870eb08f-cef2-4fd3-8f7e-f5ef52fd7867',
],
solid2dId: 'c3b75c5f-6976-4054-a7f1-8f5a5191771c',
codeRef: {
range: [1316, 1359, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[0, 'index'],
],
},
},
],
[
'ca369e71-6d1b-483c-a9c4-f5ebdef24479',
{
type: 'segment',
id: 'ca369e71-6d1b-483c-a9c4-f5ebdef24479',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
codeRef: {
range: [1365, 1414, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[1, 'index'],
],
},
},
],
[
'5a3ebb81-8050-4ad1-a668-0882f005a4a8',
{
type: 'segment',
id: '5a3ebb81-8050-4ad1-a668-0882f005a4a8',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
codeRef: {
range: [1420, 1499, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[2, 'index'],
],
},
},
],
[
'c9cf1dfa-1c3a-490f-9d26-071ea3c38e30',
{
type: 'segment',
id: 'c9cf1dfa-1c3a-490f-9d26-071ea3c38e30',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
codeRef: {
range: [1505, 1602, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[3, 'index'],
],
},
},
],
[
'a0e58546-572d-41f1-99dd-5d18db18cb00',
{
type: 'segment',
id: 'a0e58546-572d-41f1-99dd-5d18db18cb00',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
codeRef: {
range: [1608, 1664, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[4, 'index'],
],
},
},
],
[
'870eb08f-cef2-4fd3-8f7e-f5ef52fd7867',
{
type: 'segment',
id: '870eb08f-cef2-4fd3-8f7e-f5ef52fd7867',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
codeRef: {
range: [1670, 1677, 0],
pathToNode: [
['body', ''],
[12, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
['body', 'PipeExpression'],
[5, 'index'],
],
},
},
],
[
'c3b75c5f-6976-4054-a7f1-8f5a5191771c',
{
type: 'solid2d',
id: 'c3b75c5f-6976-4054-a7f1-8f5a5191771c',
pathId: '04a1735a-3ce9-476f-b35f-e4e9439485ea',
},
],
[
'64c477ee-6206-424f-98e2-baecc387de86',
{
type: 'path',
id: '64c477ee-6206-424f-98e2-baecc387de86',
planeId: '9314d48d-5963-492e-8bda-2acbe5df29e9',
segIds: ['daa846da-c2f4-40ea-9c89-24c0ce558a10'],
solid2dId: 'd7f1c4f1-1095-4a23-878d-723a0dadfc18',
codeRef: {
range: [1691, 1759, 0],
pathToNode: [
['body', ''],
[13, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'daa846da-c2f4-40ea-9c89-24c0ce558a10',
{
type: 'segment',
id: 'daa846da-c2f4-40ea-9c89-24c0ce558a10',
pathId: '64c477ee-6206-424f-98e2-baecc387de86',
codeRef: {
range: [1691, 1759, 0],
pathToNode: [
['body', ''],
[13, 'index'],
['declaration', 'VariableDeclaration'],
['init', ''],
],
},
},
],
[
'd7f1c4f1-1095-4a23-878d-723a0dadfc18',
{
type: 'solid2d',
id: 'd7f1c4f1-1095-4a23-878d-723a0dadfc18',
pathId: '64c477ee-6206-424f-98e2-baecc387de86',
},
],
]) as ArtifactGraph
// Build the index locally instead of using engineCommandManager
const artifactIndex = buildArtifactIndex(___artifactGraph)
const cases = [
[
'basic segment selection',
{
snippet: `line(end = [109.03, -61.79])`,
artifactDetails: {
type: 'segment',
range: [432, 432, 0],
singleIdsKeys: ['id', 'pathId', 'surfaceId'],
arrayIdsKeys: [
{
key: 'edgeIds',
length: 2,
},
],
},
},
],
[
'default plane selection',
{
snippet: "sketch001 = startSketchOn('XZ')",
artifactDetails: {
type: 'plane',
range: [31, 31, 0],
singleIdsKeys: ['id'],
arrayIdsKeys: [{ key: 'pathIds', length: 1 }],
},
},
],
[
'segment 2',
{
snippet: 'yLine(-310.12, %, $seg02)',
artifactDetails: {
type: 'segment',
range: [149, 149, 0],
singleIdsKeys: ['id', 'pathId', 'surfaceId'],
arrayIdsKeys: [{ key: 'edgeIds', length: 2 }],
},
},
],
[
'sketch on face plane selection',
{
snippet: 'sketch002 = startSketchOn(extrude001, seg01)',
artifactDetails: {
type: 'wall',
range: [340, 340, 0],
singleIdsKeys: ['id', 'segId', 'sweepId'],
arrayIdsKeys: [{ key: 'pathIds', length: 1 }],
},
},
],
[
'extrude/sweep selection',
{
snippet: 'extrude001 = extrude(profile001, length = 500)',
artifactDetails: {
type: 'sweep',
subType: 'extrusion',
range: [294, 294, 0],
singleIdsKeys: ['id', 'pathId'],
arrayIdsKeys: [
{ key: 'surfaceIds', length: 6 },
{ key: 'edgeIds', length: 8 },
],
},
},
],
[
'path selection for a sketch on face',
{
snippet: 'profile002 = startProfileAt([-321.34, 361.76], sketch002)',
artifactDetails: {
type: 'solid2d',
range: [398, 398, 0],
singleIdsKeys: ['id', 'pathId'],
arrayIdsKeys: [],
},
},
],
[
'startSketch on for a end cap that is also sketch on face on face',
{
snippet: "sketch005 = startSketchOn(extrude002, 'END')",
artifactDetails: {
type: 'cap',
subType: 'end',
range: [635, 635, 0],
singleIdsKeys: ['id', 'sweepId'],
arrayIdsKeys: [{ key: 'pathIds', length: 2 }],
},
},
],
] as const
test.each(cases)(
`testing source range to artifact %s`,
async (_name, { snippet, artifactDetails }) => {
const ast = assertParse(MY_CODE)
const lineIndex = MY_CODE.indexOf(snippet)
const path = getNodePathFromSourceRange(ast, [
lineIndex,
lineIndex + snippet.length,
0,
])
const selections: Selection[] = [
{
codeRef: {
range: [lineIndex + snippet.length, lineIndex + snippet.length, 0],
pathToNode: path,
},
},
]
const [artifactSelection] = codeToIdSelections(
selections,
___artifactGraph,
artifactIndex
)
expect(artifactSelection.id).toBeTruthy()
if (!artifactSelection.id) {
throw new Error('id is falsy')
}
const artifact = ___artifactGraph.get(artifactSelection.id)
expect(artifact).toBeTruthy()
if (!artifact) {
throw new Error('artifact is falsy')
}
expect(artifact.type).toBe(artifactDetails.type)
if ('subType' in artifactDetails) {
expect((artifact as any).subType).toBe(artifactDetails.subType)
}
for (const key of artifactDetails.singleIdsKeys) {
expect((artifact as any)[key]).toBeTruthy()
}
for (const { key, length } of artifactDetails.arrayIdsKeys) {
expect((artifact as any)[key]).toHaveLength(length)
}
}
)
})
describe('findLastRangeStartingBefore', () => {
test('finds last range starting before target even if no overlap', () => {
const mockIndex = [
{
range: [1, 2, 0] as SourceRange,
entry: { id: '1', artifact: { id: '1', type: 'segment' } as Artifact },
},
{
range: [35, 43, 0] as SourceRange,
entry: { id: '2', artifact: { id: '2', type: 'segment' } as Artifact },
},
{
range: [46, 70, 0] as SourceRange,
entry: { id: '3', artifact: { id: '3', type: 'segment' } as Artifact },
},
] as ArtifactIndex
const result = findLastRangeStartingBefore(mockIndex, 45)
expect(result).toBe(1) // Should return index 1 ([35, 43])
})
test('handles empty index', () => {
const result = findLastRangeStartingBefore([] as ArtifactIndex, 45)
// fine to return 0 in this case because the linear search section will sort out the lack of overlap
expect(result).toBe(0)
})
test('handles target before all ranges', () => {
const mockIndex = [
{
range: [10, 20, 0] as SourceRange,
entry: { id: '1', artifact: { id: '1', type: 'segment' } as Artifact },
},
{
range: [30, 40, 0] as SourceRange,
entry: { id: '2', artifact: { id: '2', type: 'segment' } as Artifact },
},
] as ArtifactIndex
const result = findLastRangeStartingBefore(mockIndex, 5)
// fine to return 0 in this case because the linear search section will sort out the lack of overlap
expect(result).toBe(0)
})
test('handles target after all ranges', () => {
const mockIndex = [
{
range: [10, 20, 0] as SourceRange,
entry: { id: '1', artifact: { id: '1', type: 'segment' } as Artifact },
},
{
range: [30, 40, 0] as SourceRange,
entry: { id: '2', artifact: { id: '2', type: 'segment' } as Artifact },
},
] as ArtifactIndex
const result = findLastRangeStartingBefore(mockIndex, 50)
expect(result).toBe(1)
})
})