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, '" Expect = @( $OPEN_ELEMENT_START, (_tag_token div), $CLOSE_ELEMENT, $OPEN_ELEMENT_END, (_tag_token div), $CLOSE_ELEMENT, $EOF ) }, @{ Name = "Empty void element" Input = "" Expect = @( $OPEN_ELEMENT_START, [Token]::new( [TokenType]::TAG_NAME, 'img' ), $VOID_ELEMENT_CLOSE, $EOF ) } @{ Name = "Ignore extra whitespace (empty element)" Input = "<`n`n div `t`n >" Expect = @( $OPEN_ELEMENT_START, [Token]::new( [TokenType]::TAG_NAME, 'div' ), $CLOSE_ELEMENT, $OPEN_ELEMENT_END, [Token]::new( [TokenType]::TAG_NAME, 'div' ), $CLOSE_ELEMENT, $EOF ) }, @{ Name = "Empty element with attributes" 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"