165 lines
3.9 KiB
TypeScript
165 lines
3.9 KiB
TypeScript
import type { Operation } from '@rust/kcl-lib/bindings/Operation'
|
|
|
|
import { defaultSourceRange } from '@src/lang/wasm'
|
|
import { filterOperations } from '@src/lib/operations'
|
|
|
|
function stdlib(name: string): Operation {
|
|
return {
|
|
type: 'StdLibCall',
|
|
name,
|
|
unlabeledArg: null,
|
|
labeledArgs: {},
|
|
sourceRange: defaultSourceRange(),
|
|
isError: false,
|
|
}
|
|
}
|
|
|
|
function userCall(name: string): Operation {
|
|
return {
|
|
type: 'GroupBegin',
|
|
group: {
|
|
type: 'FunctionCall',
|
|
name,
|
|
functionSourceRange: defaultSourceRange(),
|
|
unlabeledArg: null,
|
|
labeledArgs: {},
|
|
},
|
|
sourceRange: defaultSourceRange(),
|
|
}
|
|
}
|
|
|
|
function userReturn(): Operation {
|
|
return {
|
|
type: 'GroupEnd',
|
|
}
|
|
}
|
|
|
|
function moduleBegin(name: string): Operation {
|
|
return {
|
|
type: 'GroupBegin',
|
|
group: {
|
|
type: 'ModuleInstance',
|
|
name,
|
|
moduleId: 0,
|
|
},
|
|
sourceRange: defaultSourceRange(),
|
|
}
|
|
}
|
|
|
|
function moduleEnd(): Operation {
|
|
return {
|
|
type: 'GroupEnd',
|
|
}
|
|
}
|
|
|
|
describe('operations filtering', () => {
|
|
it('drops stdlib operations inside a user-defined function call', async () => {
|
|
const operations = [
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std2'),
|
|
stdlib('std3'),
|
|
userReturn(),
|
|
stdlib('std4'),
|
|
stdlib('std5'),
|
|
]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std4'),
|
|
stdlib('std5'),
|
|
])
|
|
})
|
|
it('drops user-defined function calls that contain no stdlib operations', async () => {
|
|
const operations = [
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
userReturn(),
|
|
stdlib('std2'),
|
|
userCall('bar'),
|
|
userReturn(),
|
|
stdlib('std3'),
|
|
]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([stdlib('std1'), stdlib('std2'), stdlib('std3')])
|
|
})
|
|
it('does not drop module instances that contain no operations', async () => {
|
|
const operations = [
|
|
stdlib('std1'),
|
|
moduleBegin('foo'),
|
|
moduleEnd(),
|
|
stdlib('std2'),
|
|
moduleBegin('bar'),
|
|
moduleEnd(),
|
|
stdlib('std3'),
|
|
]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([
|
|
stdlib('std1'),
|
|
moduleBegin('foo'),
|
|
stdlib('std2'),
|
|
moduleBegin('bar'),
|
|
stdlib('std3'),
|
|
])
|
|
})
|
|
it('preserves user-defined function calls at the end of the list', async () => {
|
|
const operations = [stdlib('std1'), userCall('foo')]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([stdlib('std1'), userCall('foo')])
|
|
})
|
|
it('drops all user-defined function return operations', async () => {
|
|
// The returns allow us to group operations with the call, but we never
|
|
// display the returns.
|
|
const operations = [
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std2'),
|
|
userReturn(),
|
|
stdlib('std3'),
|
|
stdlib('std4'),
|
|
userCall('foo2'),
|
|
stdlib('std5'),
|
|
stdlib('std6'),
|
|
userReturn(),
|
|
stdlib('std7'),
|
|
]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std3'),
|
|
stdlib('std4'),
|
|
userCall('foo2'),
|
|
stdlib('std7'),
|
|
])
|
|
})
|
|
it('correctly filters with nested function calls', async () => {
|
|
const operations = [
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std2'),
|
|
userReturn(),
|
|
stdlib('std3'),
|
|
stdlib('std4'),
|
|
userCall('foo2'),
|
|
stdlib('std5'),
|
|
userCall('foo3-nested'),
|
|
stdlib('std6'),
|
|
userReturn(),
|
|
stdlib('std7'),
|
|
userReturn(),
|
|
stdlib('std8'),
|
|
]
|
|
const actual = filterOperations(operations)
|
|
expect(actual).toEqual([
|
|
stdlib('std1'),
|
|
userCall('foo'),
|
|
stdlib('std3'),
|
|
stdlib('std4'),
|
|
userCall('foo2'),
|
|
stdlib('std8'),
|
|
])
|
|
})
|
|
})
|