96 lines
2.4 KiB
TypeScript
96 lines
2.4 KiB
TypeScript
import { describe, test, expect } from 'bun:test'
|
|
|
|
describe('pipe expressions', () => {
|
|
test('simple pipe passes result as first argument', () => {
|
|
const code = `
|
|
double = do x: x * 2 end
|
|
double 2 | double`
|
|
|
|
expect(code).toEvaluateTo(8)
|
|
})
|
|
|
|
test('pipe chain with three stages', () => {
|
|
const code = `
|
|
add-one = do x: x + 1 end
|
|
double = do x: x * 2 end
|
|
minus-point-one = do x: x - 0.1 end
|
|
add-one 3 | double | minus-point-one`
|
|
// 4 8 7.9
|
|
expect(code).toEvaluateTo(7.9)
|
|
})
|
|
|
|
test('pipe with function that has additional arguments', () => {
|
|
const code = `
|
|
multiply = do a b: a * b end
|
|
get-five = do: 5 end
|
|
get-five | multiply 3`
|
|
|
|
expect(code).toEvaluateTo(15)
|
|
})
|
|
|
|
test('pipe with bare identifier', () => {
|
|
const code = `
|
|
get-value = 42
|
|
process = do x: x + 10 end
|
|
get-value | process`
|
|
|
|
expect(code).toEvaluateTo(52)
|
|
})
|
|
|
|
test('pipe in assignment', () => {
|
|
const code = `
|
|
add-ten = do x: x + 10 end
|
|
result = add-ten 5 | add-ten
|
|
result`
|
|
|
|
// 5 + 10 = 15, then 15 + 10 = 25
|
|
expect(code).toEvaluateTo(25)
|
|
})
|
|
|
|
test('pipe with named underscore arg', () => {
|
|
expect(`
|
|
divide = do a b: a / b end
|
|
get-ten = do: 10 end
|
|
get-ten | divide 2 b=_`).toEvaluateTo(0.2)
|
|
|
|
expect(`
|
|
divide = do a b: a / b end
|
|
get-ten = do: 10 end
|
|
get-ten | divide b=_ 2`).toEvaluateTo(0.2)
|
|
|
|
expect(`
|
|
divide = do a b: a / b end
|
|
get-ten = do: 10 end
|
|
get-ten | divide 2 a=_`).toEvaluateTo(5)
|
|
|
|
expect(`
|
|
divide = do a b: a / b end
|
|
get-ten = do: 10 end
|
|
get-ten | divide a=_ 2`).toEvaluateTo(5)
|
|
})
|
|
|
|
test('nested pipes', () => {
|
|
// This is complicated, but the idea is to make sure the underscore
|
|
// handling logic works correctly when there are multiple pipe stages
|
|
// in a single expression.
|
|
expect(`
|
|
sub = do a b: a - b end
|
|
div = do a b: a / b end
|
|
sub 3 1 | div (sub 110 9 | sub 1) _ | div 5`).toEvaluateTo(10)
|
|
})
|
|
|
|
test('pipe with prelude functions (list.reverse and list.map)', () => {
|
|
expect(`
|
|
double = do x: x * 2 end
|
|
range 1 3 | list.reverse | list.map double
|
|
`).toEvaluateTo([6, 4, 2])
|
|
})
|
|
|
|
test('pipe with prelude function (echo)', () => {
|
|
expect(`
|
|
get-msg = do: 'hello' end
|
|
get-msg | length
|
|
`).toEvaluateTo(5)
|
|
})
|
|
})
|