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