param(
[Int[]] $DumpTest,
[Switch] $DumpAll
)
. ./Compiler.ps1
$OPEN_ELEMENT_START = [Token]::new( [TokenType]::OPEN_ELEMENT_START, '<' )
$EQUALS = [Token]::new( [TokenType]::EQUAL, '=' )
$CLOSE_ELEMENT = [Token]::new( [TokenType]::CLOSE_ELEMENT, '>' )
$VOID_ELEMENT_CLOSE = [Token]::new( [TokenType]::VOID_ELEMENT_CLOSE, '/>' )
$OPEN_ELEMENT_END = [Token]::new( [TokenType]::OPEN_ELEMENT_END, '' )
$EOF = [Token]::new( [TokenType]::EOF, '' )
function _tag_token($tag) {
return [Token]::new( [TokenType]::TAG_NAME, $tag )
}
$Tests = @(
@{
Name = "OPEN_ELEMENT_START"
Input = '<'
Expect = @(
$OPEN_ELEMENT_START,
$EOF
)
},
@{
Name = "Opener and tag name"
Input = "
"
Expect = @(
$OPEN_ELEMENT_START,
(_tag_token span),
[Token]::new(
[TokenType]::ATTR_NAME,
'attr1'
),
$EQUALS,
[Token]::new(
[TokenType]::ATTR_VALUE,
'bau bau'
),
[Token]::new(
[TokenType]::ATTR_NAME,
'attr2'
),
$EQUALS,
[Token]::new(
[TokenType]::ATTR_VALUE,
'awa'
),
$CLOSE_ELEMENT,
$OPEN_ELEMENT_END,
(_tag_token span),
$CLOSE_ELEMENT,
$EOF
)
},
@{
Name = "Attribute with pure scriptblock"
Input = '
![]()
" } />'
Expect = @(
$OPEN_ELEMENT_START,
(_tag_token img),
[Token]::new(
[TokenType]::ATTR_NAME,
'attrx'
),
$EQUALS,
[Token]::new(
[TokenType]::ATTR_VALUE_SCRIPTBLOCK,
' $_ ; ''hello'' "there" """wao"""; return "
" '
),
$VOID_ELEMENT_CLOSE,
$EOF
)
},
@{
Name = "Attribute with embedded scriptblock"
Input = '
'
Expect = @(
$OPEN_ELEMENT_START,
(_tag_token img),
[Token]::new(
[TokenType]::ATTR_NAME,
'attrx'
),
$EQUALS,
[Token]::new(
[TokenType]::ATTR_VALUE,
'bau $( $_ )$(gci Function: )uab'
),
$VOID_ELEMENT_CLOSE,
$EOF
)
},
@{
Name = "Splat"
Input = ''
Expect = @(
$OPEN_ELEMENT_START
(_tag_token div)
[Token]::new(
[TokenType]::ATTR_NAME,
'attr1'
),
$EQUALS
[Token]::new(
[TokenType]::ATTR_VALUE,
'one two'
),
[Token]::new(
[TokenType]::ATTR_SPLAT,
'Splat_Me'
),
[Token]::new(
[TokenType]::ATTR_NAME,
'three'
),
$CLOSE_ELEMENT,
$OPEN_ELEMENT_END,
(_tag_token div),
$CLOSE_ELEMENT,
$EOF
)
}
)
$t=0
$Tests | % {
$Lexer = [Lexer]::new($_.Input)
$i=0
if ($t -in $DumpTest -or $DumpAll) {
Write-Host "Dumping for test $t ""$($_.Name)"""
Write-Host "Input: $($_.Input)"
}
for ($i = 0; $i -lt $_.Expect.Count; $i++) {
$Case = $_.Expect[$i]
$PrePos = $Lexer.Pos
$PreState = $Lexer.State
$Next = $Lexer.NextToken()
if ($t -in $DumpTest -or $DumpAll) {
Write-Host (@"
{0}
[ pre-pos: {2}, pre-state: {1} ]
[ pst-pos: {3}, pst-state: {4} ]
-> {5}
<- {6}
"@ -f (
$i,
$PreState,
$PrePos,
$Lexer.Pos,
$Lexer.State,
$Case,
$Next
))
}
if ($Case -ne $Next) {
throw ("Test ""{0}"" case {1} failed: expected {2}, got {3}" -f `
$_.Name,
$i,
"[ $Case ]",
"[ $Next ]"
)
}
}
$t++
}
Write-Host "All $($Tests.Count) test(s) passed"