Add equal-length constraints & implement UnaryExpressions (#35)
* add segLen help to lang std * adding helpers functions to sketchConstraints * update tokeniser tests because they were annoying me not being 100% * compare async lexer with sync lexer instead * add helper functions * remove unneeded nesting * update add ast modifier function for angledLine * initial equal ast modification It adds a tag to the primary line, and converts any secondary lines to angledLine, but doesn't reference the taged/primary line yet * Update fn call with refernce to previous line using segLen * add test for giveSketchFnCallTag * fix excutor bug, executing call expression in array expression * fix small issue in executor * add CallExpressions to BinaryExpressions * add unary Expressions * tweaks to unaryExpression logic * add recasting for unaryExpressions and CallExpressions in BinaryExpressions * ensure pipe substitution info is passed down to unary expressions and others * allow binary expressions in function argumentns * inital setup, new way of organising sketch fn transforms Starting with equal length * overhaul equalLength button * add equal length support for angledLine * line with one variable supports signed legLength * fix indentation when recasting long arrayExpressions in a pipeExpression * improve modifyAst consision * further modify ast tidy * equalLength transfroms far angledLineOfXLength * add transforms for line-yRelative * add equal constraint for angledLineOfYLength * quick test fix * add equal length constrain transforms for lineTo * add equal length constraints for angledLineToX * add equalLength constraints for angledLineToY * test tidy * setup new vertical-horizontal constraints * Add equal Length constraints for vertical/horizontal lines * migrate old tests, and refactor callback tag * tweaks and refactor horzVert component * fix leg len with small negative leg length
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
import { abstractSyntaxTree } from './abstractSyntaxTree'
|
||||
import {
|
||||
createLiteral,
|
||||
createIdentifier,
|
||||
@ -9,8 +10,13 @@ import {
|
||||
createPipeExpression,
|
||||
findUniqueName,
|
||||
addSketchTo,
|
||||
giveSketchFnCallTag,
|
||||
} from './modifyAst'
|
||||
import { recast } from './recast'
|
||||
import { lexer } from './tokeniser'
|
||||
import { initPromise } from './rust'
|
||||
|
||||
beforeAll(() => initPromise)
|
||||
|
||||
describe('Testing createLiteral', () => {
|
||||
it('should create a literal', () => {
|
||||
@ -111,3 +117,56 @@ describe('Testing addSketchTo', () => {
|
||||
show(part001)`)
|
||||
})
|
||||
})
|
||||
|
||||
function giveSketchFnCallTagTestHelper(
|
||||
code: string,
|
||||
searchStr: string
|
||||
): { tag: string; newCode: string } {
|
||||
// giveSketchFnCallTag inputs and outputs an ast, which is very verbose for testing
|
||||
// this wrapper changes the input and output to code
|
||||
// making it more of an integration test, but easier to read the test intention is the goal
|
||||
const ast = abstractSyntaxTree(lexer(code))
|
||||
const start = code.indexOf(searchStr)
|
||||
const range: [number, number] = [start, start + searchStr.length]
|
||||
const { modifiedAst, tag } = giveSketchFnCallTag(ast, range)
|
||||
const newCode = recast(modifiedAst)
|
||||
return { tag, newCode }
|
||||
}
|
||||
|
||||
describe('Testing giveSketchFnCallTag', () => {
|
||||
const code = `const part001 = startSketchAt([0, 0])
|
||||
|> line([-2.57, -0.13], %)
|
||||
|> line([0, 0.83], %)
|
||||
|> line([0.82, 0.34], %)
|
||||
show(part001)`
|
||||
it('Should add tag to a sketch function call', () => {
|
||||
const { newCode, tag } = giveSketchFnCallTagTestHelper(
|
||||
code,
|
||||
'line([0, 0.83], %)'
|
||||
)
|
||||
expect(newCode).toContain("line({ to: [0, 0.83], tag: 'seg01' }, %)")
|
||||
expect(tag).toBe('seg01')
|
||||
})
|
||||
it('Should create a unique tag if seg01 already exists', () => {
|
||||
let _code = code.replace(
|
||||
'line([-2.57, -0.13], %)',
|
||||
"line({ to: [-2.57, -0.13], tag: 'seg01' }, %)"
|
||||
)
|
||||
const { newCode, tag } = giveSketchFnCallTagTestHelper(
|
||||
_code,
|
||||
'line([0, 0.83], %)'
|
||||
)
|
||||
expect(newCode).toContain("line({ to: [0, 0.83], tag: 'seg02' }, %)")
|
||||
expect(tag).toBe('seg02')
|
||||
})
|
||||
it('Should return existing tag if it already exists', () => {
|
||||
const lineButWithTag = "line({ to: [-2.57, -0.13], tag: 'butts' }, %)"
|
||||
let _code = code.replace('line([-2.57, -0.13], %)', lineButWithTag)
|
||||
const { newCode, tag } = giveSketchFnCallTagTestHelper(
|
||||
_code,
|
||||
lineButWithTag
|
||||
)
|
||||
expect(newCode).toContain(lineButWithTag) // no change
|
||||
expect(tag).toBe('butts')
|
||||
})
|
||||
})
|
||||
|
Reference in New Issue
Block a user