303 lines
6.1 KiB
TypeScript
303 lines
6.1 KiB
TypeScript
import { expect, describe, test } from 'bun:test'
|
|
|
|
import '../shrimp.grammar' // Importing this so changes cause it to retest!
|
|
|
|
describe('single line function blocks', () => {
|
|
test('work with no args', () => {
|
|
expect(`trap: echo bye bye end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCallOrIdentifier
|
|
Identifier trap
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
test('work with one arg', () => {
|
|
expect(`trap EXIT: echo bye bye end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
Identifier trap
|
|
PositionalArg
|
|
Word EXIT
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
test('work with named args', () => {
|
|
expect(`attach signal='exit': echo bye bye end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
Identifier attach
|
|
NamedArg
|
|
NamedArgPrefix signal=
|
|
String
|
|
StringFragment exit
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
|
|
test('work with dot-get', () => {
|
|
expect(`signals = [=]; signals.trap 'EXIT': echo bye bye end`).toMatchTree(`
|
|
Assign
|
|
AssignableIdentifier signals
|
|
Eq =
|
|
Dict [=]
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
DotGet
|
|
IdentifierBeforeDot signals
|
|
Identifier trap
|
|
PositionalArg
|
|
String
|
|
StringFragment EXIT
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('multi line function blocks', () => {
|
|
test('work with no args', () => {
|
|
expect(`
|
|
trap:
|
|
echo bye bye
|
|
end
|
|
`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCallOrIdentifier
|
|
Identifier trap
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
test('work with one arg', () => {
|
|
expect(`
|
|
trap EXIT:
|
|
echo bye bye
|
|
end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
Identifier trap
|
|
PositionalArg
|
|
Word EXIT
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
test('work with named args', () => {
|
|
expect(`
|
|
attach signal='exit' code=1:
|
|
echo bye bye
|
|
end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
Identifier attach
|
|
NamedArg
|
|
NamedArgPrefix signal=
|
|
String
|
|
StringFragment exit
|
|
NamedArg
|
|
NamedArgPrefix code=
|
|
Number 1
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
|
|
|
|
test('work with dot-get', () => {
|
|
expect(`
|
|
signals = [=]
|
|
signals.trap 'EXIT':
|
|
echo bye bye
|
|
end`).toMatchTree(`
|
|
Assign
|
|
AssignableIdentifier signals
|
|
Eq =
|
|
Dict [=]
|
|
FunctionCallWithBlock
|
|
FunctionCall
|
|
DotGet
|
|
IdentifierBeforeDot signals
|
|
Identifier trap
|
|
PositionalArg
|
|
String
|
|
StringFragment EXIT
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier echo
|
|
PositionalArg
|
|
Identifier bye
|
|
PositionalArg
|
|
Identifier bye
|
|
keyword end`
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('ribbit', () => {
|
|
test('head tag', () => {
|
|
expect(`
|
|
head:
|
|
title What up
|
|
meta charSet=UTF-8
|
|
meta name='viewport' content='width=device-width, initial-scale=1, viewport-fit=cover'
|
|
end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCallOrIdentifier
|
|
Identifier head
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier title
|
|
PositionalArg
|
|
Word What
|
|
PositionalArg
|
|
Identifier up
|
|
FunctionCall
|
|
Identifier meta
|
|
PositionalArg
|
|
Word charSet=UTF-8
|
|
FunctionCall
|
|
Identifier meta
|
|
NamedArg
|
|
NamedArgPrefix name=
|
|
String
|
|
StringFragment viewport
|
|
NamedArg
|
|
NamedArgPrefix content=
|
|
String
|
|
StringFragment width=device-width, initial-scale=1, viewport-fit=cover
|
|
keyword end
|
|
`)
|
|
})
|
|
|
|
test('li', () => {
|
|
expect(`
|
|
list:
|
|
li border-bottom='1px solid black' one
|
|
li two
|
|
li three
|
|
end`).toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCallOrIdentifier
|
|
Identifier list
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier li
|
|
NamedArg
|
|
NamedArgPrefix border-bottom=
|
|
String
|
|
StringFragment 1px solid black
|
|
PositionalArg
|
|
Identifier one
|
|
FunctionCall
|
|
Identifier li
|
|
PositionalArg
|
|
Identifier two
|
|
FunctionCall
|
|
Identifier li
|
|
PositionalArg
|
|
Identifier three
|
|
keyword end`)
|
|
})
|
|
|
|
test('inline expressions', () => {
|
|
expect(`
|
|
p:
|
|
h1 class=bright style='font-family: helvetica' Heya
|
|
h2 man that is (b wild)!
|
|
end`)
|
|
.toMatchTree(`
|
|
FunctionCallWithBlock
|
|
FunctionCallOrIdentifier
|
|
Identifier p
|
|
colon :
|
|
Block
|
|
FunctionCall
|
|
Identifier h1
|
|
NamedArg
|
|
NamedArgPrefix class=
|
|
Identifier bright
|
|
NamedArg
|
|
NamedArgPrefix style=
|
|
String
|
|
StringFragment font-family: helvetica
|
|
PositionalArg
|
|
Word Heya
|
|
FunctionCall
|
|
Identifier h2
|
|
PositionalArg
|
|
Identifier man
|
|
PositionalArg
|
|
Identifier that
|
|
PositionalArg
|
|
Identifier is
|
|
PositionalArg
|
|
ParenExpr
|
|
FunctionCall
|
|
Identifier b
|
|
PositionalArg
|
|
Identifier wild
|
|
PositionalArg
|
|
Word !
|
|
keyword end`)
|
|
})
|
|
}) |