shrimp/src/compiler/tests/pipe.test.ts
2025-11-06 21:34:35 -08:00

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)
})
})