.NET Decompiler with support for PDB generation, ReadyToRun, Metadata (&more) - cross-platform!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

993 lines
38 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.IO;
using ICSharpCode.NRefactory.VB;
using ICSharpCode.NRefactory.VB.Parser;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.VB.Tests.Lexer
{
[TestFixture]
public class XmlModeLexerTests
{
#region Xml Tests
[Test]
public void TagWithContent()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <Test>Hello World</Test>")));
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
CheckFoot(lexer);
}
[Test]
public void HtmlText()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <div><h1>Title</h1>" +
"<p>test test <br /> test</p></div>")));
CheckHead(lexer);
Assert.AreEqual(Tokens.Dim, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Assign, lexer.NextToken().Kind);
// <div>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// <h1>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// Title
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </h1>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// <p>
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// test test
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// <br />
Assert.AreEqual(Tokens.XmlOpenTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTagEmptyElement, lexer.NextToken().Kind);
// test
Assert.AreEqual(Tokens.XmlContent, lexer.NextToken().Kind);
// </p>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
// </div>
Assert.AreEqual(Tokens.XmlOpenEndTag, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.Identifier, lexer.NextToken().Kind);
Assert.AreEqual(Tokens.XmlCloseTag, lexer.NextToken().Kind);
CheckFoot(lexer);
}
[Test]
public void XmlLiteralsExample1()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim xml = <menu>\n" +
" <course name=\"appetizer\">\n" +
" <dish>Shrimp Cocktail</dish>\n" +
" <dish>Escargot</dish>\n" +
" </course>\n" +
" <course name=\"main\">\n" +
" <dish>Filet Mignon</dish>\n" +
" <dish>Garlic Potatoes</dish>\n" +
" <dish>Broccoli</dish>\n" +
" </course>\n" +
" <course name=\"dessert\">\n" +
" <dish>Chocolate Cheesecake</dish>\n" +
" </course>\n" +
" </menu>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
// <menu>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <course name=\"appetizer\">
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Shrimp Cocktail</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Escargot</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// </course>
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <course name=\"main\">
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Filet Mignon</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Garlic Potatoes</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Broccoli</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// </course>
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <course name=\"dessert\">
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// <dish>Chocolate Cheesecake</dish>
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// </course>
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
// whitespaces
Tokens.XmlContent,
// </menu>
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
[Test]
public void SimpleXmlWithComments()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(@"Dim x = <?xml version=""1.0""?> <!-- Test file -->
<Test>
<!-- Test data -->
<Data />
</Test>
<!-- eof -->
<!-- hey, wait! -->
<?target some data?>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.XmlProcessingInstruction, Tokens.XmlContent, Tokens.XmlComment, Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlComment, Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlComment, Tokens.XmlComment, Tokens.XmlProcessingInstruction);
CheckFoot(lexer);
}
[Test]
public void SimpleEmptyTag()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <Test />")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement);
CheckFoot(lexer);
}
[Test]
public void SimpleTag()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim x = <Test></Test>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlOpenEndTag,
Tokens.Identifier, Tokens.XmlCloseTag);
CheckFoot(lexer);
}
[Test]
public void XmlImport()
{
string code = @"Imports System
Imports System.Linq
Imports <xmlns='http://icsharpcode.net/sharpdevelop/avalonedit'>
Imports <xmlns:h='http://www.w3.org/TR/html4/'>
Class TestClass
Sub TestSub()
Dim xml = <h:table>
<h:tr>
<h:td>1. Cell</h:td>
</h:tr>
</h:table>
End Sub
End Class";
VBLexer lexer = GenerateLexer(new StringReader(code));
CheckTokens(lexer, Tokens.Imports, Tokens.Identifier, Tokens.EOL,
Tokens.Imports, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.EOL,
Tokens.Imports, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, Tokens.EOL,
Tokens.Imports, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, Tokens.EOL,
Tokens.Class, Tokens.Identifier, Tokens.EOL, Tokens.Sub, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.CloseParenthesis, Tokens.EOL,
Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Class
);
}
[Test]
public void CDataSection()
{
string xml = @"Dim xml = <template>
<name>test</name>
<language>VB</languge>
<file language='XAML'>
<![CDATA[<Window x:Class='DefaultNamespace.Window1'
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
Title='DefaultNamespace' Height='300' Width='300'>
<Grid>
</Grid>
</Window>]]>
</file>
<file language='CSharp'>
<![CDATA[using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace DefaultNamespace
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
}]]>
</file>
</template>
";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(xml)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, // 2
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, // 6
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, // 10
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, // 14
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, // 18
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, // 22
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, // 28
Tokens.XmlContent, Tokens.XmlCData, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, // 34
Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlCData, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
[Test]
public void InlineVB()
{
string code = @"Dim xml = <?xml version='1.0'?>
<menu>
<course name=""appetizer"">
<%= From m In menu _
Where m.Course = ""appetizer"" _
Select <dish><%= m.Food %></dish> _
%>
</course>
<course name=""main"">
<%= From m In menu _
Where m.Course = ""main"" _
Select <dish><%= m.Food %></dish> _
%>
</course>
<course name=""dessert"">
<%= From m In menu _
Where m.Course = ""dessert"" _
Select <dish><%= m.Food %></dish> _
%>
</course>
</menu>";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(code)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.XmlProcessingInstruction, Tokens.XmlContent,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlStartInlineVB,
Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Where, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.Select, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.XmlCloseTag, Tokens.XmlStartInlineVB, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.XmlEndInlineVB,
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlEndInlineVB, Tokens.XmlContent, Tokens.XmlOpenEndTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlStartInlineVB,
Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Where, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.Select, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.XmlCloseTag, Tokens.XmlStartInlineVB, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.XmlEndInlineVB,
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlEndInlineVB, Tokens.XmlContent, Tokens.XmlOpenEndTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlStartInlineVB,
Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Where, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Assign, Tokens.LiteralString, Tokens.Select, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.XmlCloseTag, Tokens.XmlStartInlineVB, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.XmlEndInlineVB,
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlEndInlineVB, Tokens.XmlContent, Tokens.XmlOpenEndTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
[Test]
public void InlineVB2()
{
string code = @"Dim contact As XElement = <<%=elementName %>>
<name><%= MyName %></name>
</>";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(code)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.As, Tokens.Identifier, Tokens.Assign, Tokens.XmlOpenTag,
Tokens.XmlStartInlineVB, Tokens.Identifier, Tokens.XmlEndInlineVB, Tokens.XmlCloseTag, Tokens.XmlContent,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlStartInlineVB, Tokens.Identifier, Tokens.XmlEndInlineVB,
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag, Tokens.XmlCloseTag);
CheckFoot(lexer);
}
[Test]
public void XmlAccessOperators()
{
string code = @"Dim childAxis = xml.<menu>.<course>
Dim course3 = xml...<course>(2)
Dim childAxis = xml...<course>
For Each item In childAxis
Console.WriteLine(item.@name)
Next";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(code)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.Identifier, Tokens.Dot, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.Dot, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag,
Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.Identifier, Tokens.TripleDot, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.OpenParenthesis, Tokens.LiteralInteger, Tokens.CloseParenthesis,
Tokens.EOL, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.Identifier, Tokens.TripleDot, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTag, Tokens.EOL, Tokens.For, Tokens.Each, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.EOL,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.DotAt, Tokens.Identifier, Tokens.CloseParenthesis, Tokens.EOL,
Tokens.Next);
CheckFoot(lexer);
}
[Test]
public void GetXmlNamespace()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim name = GetXmlNamespace(x)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.GetXmlNamespace, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void GetXmlNamespace2()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim name = GetXmlNamespace(db-name)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.GetXmlNamespace, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void XmlInSelect()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim data = From x In list Select <test>x</test>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.From, Tokens.Identifier, Tokens.In, Tokens.Identifier, Tokens.Select,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent, Tokens.XmlOpenEndTag,
Tokens.Identifier, Tokens.XmlCloseTag);
CheckFoot(lexer);
}
[Test]
public void IfExpressionTest()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Dim name = If(a <> 2, 4, 8)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.If, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.NotEqual, Tokens.LiteralInteger,
Tokens.Comma, Tokens.LiteralInteger, Tokens.Comma, Tokens.LiteralInteger, Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void IfStatementTest()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("If a <> 2 Then Return")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.If, Tokens.Identifier, Tokens.NotEqual, Tokens.LiteralInteger,
Tokens.Then, Tokens.Return);
CheckFoot(lexer);
}
[Test]
public void Bug1()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(@"Dim xml = <!-- test -->")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.XmlComment);
CheckFoot(lexer);
}
[Test]
public void Bug2()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(@"Dim xml = <?xml?><Data /><!-- test -->")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.XmlProcessingInstruction, Tokens.XmlOpenTag, Tokens.Identifier,
Tokens.XmlCloseTagEmptyElement, Tokens.XmlComment);
CheckFoot(lexer);
}
[Test]
public void Bug3()
{
VBLexer lexer = GenerateLexerForSnippet(new StringReader("New String() {}"), SnippetType.Expression);
CheckTokens(lexer, Tokens.New, Tokens.String, Tokens.OpenParenthesis,
Tokens.CloseParenthesis, Tokens.OpenCurlyBrace, Tokens.CloseCurlyBrace);
}
[Test]
public void Bug4()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(@"Dim x = From kvp As KeyValuePair(Of String, DataGridViewCellStyle) In styleCache.CellStyleCache _
Select includeStyle(kvp.Key, kvp.Value)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign, Tokens.From, Tokens.Identifier, Tokens.As, Tokens.Identifier,
Tokens.OpenParenthesis, Tokens.Of, Tokens.String, Tokens.Comma, Tokens.Identifier, Tokens.CloseParenthesis,
Tokens.In, Tokens.Identifier, Tokens.Dot, Tokens.Identifier,
Tokens.Select, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.Identifier, Tokens.Dot, Tokens.Key, Tokens.Comma,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void LessThanCheck()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(@"Dim xml = <!-- test --><Data")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Dim, Tokens.Identifier, Tokens.Assign,
Tokens.XmlComment, Tokens.LessThan, Tokens.Identifier);
CheckFoot(lexer);
}
#endregion
#region Context Tests
[Test]
public void MethodInvocation()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("DoSomething(<Test />, True)")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma, Tokens.True,
Tokens.CloseParenthesis);
CheckFoot(lexer);
}
[Test]
public void AddHandlerStatement()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("AddHandler <Test />, True")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.AddHandler, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma, Tokens.True);
CheckFoot(lexer);
}
[Test]
public void AddHandlerStatement2()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("AddHandler <x />, <y />")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.AddHandler, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement);
CheckFoot(lexer);
}
[Test]
public void RemoveHandlerStatement()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("RemoveHandler <x />, <Data>5</Data>")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.RemoveHandler, Tokens.XmlOpenTag,
Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlContent,
Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag
);
CheckFoot(lexer);
}
[Test]
public void ErrorHandlingStatement()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("On Error Resume Next\n" +
"On Error GoTo -1\n" +
"On Error GoTo 0\n" +
"On Error GoTo Test\n" +
"Error 5\n" +
"Error <Test />\n" +
"Resume Next\n" +
"Resume Label\n" +
"Resume 4")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.On, Tokens.Error, Tokens.Resume, Tokens.Next, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.Minus, Tokens.LiteralInteger, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.LiteralInteger, Tokens.EOL,
Tokens.On, Tokens.Error, Tokens.GoTo, Tokens.Identifier, Tokens.EOL,
Tokens.Error, Tokens.LiteralInteger, Tokens.EOL,
Tokens.Error, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Resume, Tokens.Next, Tokens.EOL,
Tokens.Resume, Tokens.Identifier, Tokens.EOL,
Tokens.Resume, Tokens.LiteralInteger
);
CheckFoot(lexer);
}
[Test]
public void ForLoopStatement()
{
string statement = @"For <Test /> = <Test /> To <Test /> Step <Test />
Next <Test />, <Test />
For Each <Test /> In <Test />
Next <Test />";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.For, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.Assign, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.To, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.Step, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Next, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.For, Tokens.Each, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement,
Tokens.In, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Next, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement()
{
string statement = @"While <Test />
End While";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.End, Tokens.While
);
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement2()
{
string statement = @"Do While <Test />
Loop";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Loop
);
CheckFoot(lexer);
}
[Test]
public void WhileLoopStatement3()
{
string statement = @"Do
Loop While <Test />";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.EOL,
Tokens.Loop, Tokens.While, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void UntilLoopStatement()
{
string statement = @"Do Until <Test />
Loop";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.Until, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Loop
);
CheckFoot(lexer);
}
[Test]
public void UntilLoopStatement2()
{
string statement = @"Do
Loop Until <Test />";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Do, Tokens.EOL,
Tokens.Loop, Tokens.Until, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void IfStatementLarge()
{
string statement = @"If <Test /> Then
Else If <Test /> Then
ElseIf <Test></Test> Then
Else
End If";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.If, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Then, Tokens.EOL,
Tokens.Else, Tokens.If, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Then, Tokens.EOL,
Tokens.ElseIf, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.XmlOpenEndTag, Tokens.Identifier, Tokens.XmlCloseTag, Tokens.Then, Tokens.EOL,
Tokens.Else, Tokens.EOL,
Tokens.End, Tokens.If
);
CheckFoot(lexer);
}
[Test]
public void SelectStatement()
{
string statement = @"Select Case <Test />
Case <Test />, <Test />
Case Else
End Select";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Select, Tokens.Case, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Case, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Case, Tokens.Else, Tokens.EOL,
Tokens.End, Tokens.Select
);
CheckFoot(lexer);
}
[Test]
public void TryStatement()
{
string statement = @"Try
Catch x
Catch y As Exception
Catch When <Test />
Finally
End Try";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Try, Tokens.EOL,
Tokens.Catch, Tokens.Identifier, Tokens.EOL,
Tokens.Catch, Tokens.Identifier, Tokens.As, Tokens.Identifier, Tokens.EOL,
Tokens.Catch, Tokens.When, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Finally, Tokens.EOL,
Tokens.End, Tokens.Try
);
CheckFoot(lexer);
}
[Test]
public void ThrowStatement()
{
VBLexer lexer = GenerateLexer(new StringReader(TestStatement("Throw <Test />")));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Throw, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement);
CheckFoot(lexer);
}
[Test]
public void BranchStatements()
{
string statement = @"GoTo 5
GoTo LabelName
Exit Do
Exit For
Exit While
Exit Select
Exit Sub
Exit Function
Exit Property
Exit Try
Continue Do
Continue For
Continue While
Stop
End
Return
Return 5
Return <Test />";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.GoTo, Tokens.LiteralInteger, Tokens.EOL,
Tokens.GoTo, Tokens.Identifier, Tokens.EOL,
Tokens.Exit, Tokens.Do, Tokens.EOL,
Tokens.Exit, Tokens.For, Tokens.EOL,
Tokens.Exit, Tokens.While, Tokens.EOL,
Tokens.Exit, Tokens.Select, Tokens.EOL,
Tokens.Exit, Tokens.Sub, Tokens.EOL,
Tokens.Exit, Tokens.Function, Tokens.EOL,
Tokens.Exit, Tokens.Property, Tokens.EOL,
Tokens.Exit, Tokens.Try, Tokens.EOL,
Tokens.Continue, Tokens.Do, Tokens.EOL,
Tokens.Continue, Tokens.For, Tokens.EOL,
Tokens.Continue, Tokens.While, Tokens.EOL,
Tokens.Stop, Tokens.EOL,
Tokens.End, Tokens.EOL,
Tokens.Return, Tokens.EOL,
Tokens.Return, Tokens.LiteralInteger, Tokens.EOL,
Tokens.Return, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void ArrayHandlingStatements()
{
string statement = @"Erase <Test />
Erase <Test />, <Test />
ReDim Preserve <Test />";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Erase, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.Erase, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.Comma,
Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.ReDim, Tokens.Preserve, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement
);
CheckFoot(lexer);
}
[Test]
public void UsingStatement()
{
string statement = @"Using <Test />
End Using";
VBLexer lexer = GenerateLexer(new StringReader(TestStatement(statement)));
CheckHead(lexer);
CheckTokens(lexer, Tokens.Using, Tokens.XmlOpenTag, Tokens.Identifier, Tokens.XmlCloseTagEmptyElement, Tokens.EOL,
Tokens.End, Tokens.Using
);
CheckFoot(lexer);
}
[Test]
public void NewExpressionWithObjectInitializer()
{
string code = @"New Common.ComboBoxItem With {.Item = _
Localizer.GetString(""Month"" & initParameters.SelectedDate.FirstDayOfPreviousMonth.Month) & "" "" &
initParameters.SelectedDate.FirstDayOfPreviousMonth.Year, .Value = New Date(2010, initParameters.SelectedDate.FirstDayOfPreviousMonth.Month, 1)}";
VBLexer lexer = GenerateLexerForSnippet(new StringReader(code), SnippetType.Expression);
CheckTokens(lexer, Tokens.New, Tokens.Identifier, Tokens.Dot, Tokens.Identifier,
Tokens.With, Tokens.OpenCurlyBrace, Tokens.Dot, Tokens.Identifier, Tokens.Assign,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.OpenParenthesis, Tokens.LiteralString,
Tokens.ConcatString, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.CloseParenthesis, Tokens.ConcatString,
Tokens.LiteralString, Tokens.ConcatString, Tokens.Identifier, Tokens.Dot, Tokens.Identifier,
Tokens.Dot, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Comma, Tokens.Dot,
Tokens.Identifier, Tokens.Assign, Tokens.New, Tokens.Date, Tokens.OpenParenthesis, Tokens.LiteralInteger,
Tokens.Comma, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot, Tokens.Identifier, Tokens.Dot,
Tokens.Identifier, Tokens.Comma, Tokens.LiteralInteger, Tokens.CloseParenthesis, Tokens.CloseCurlyBrace);
}
#endregion
#region Helpers
VBLexer GenerateLexer(StringReader sr)
{
return new VBLexer(sr);
}
VBLexer GenerateLexerForSnippet(StringReader sr, SnippetType type)
{
var lexer = new VBLexer(sr);
lexer.SetInitialContext(type);
return lexer;
}
string TestStatement(string stmt)
{
return "Class Test\n" +
"Sub A\n" +
stmt + "\n" +
"End Sub\n" +
"End Class";
}
void CheckFoot(VBLexer lexer)
{
CheckTokens(lexer, Tokens.EOL, Tokens.End, Tokens.Sub, Tokens.EOL, Tokens.End, Tokens.Class);
}
void CheckHead(VBLexer lexer)
{
CheckTokens(lexer, Tokens.Class, Tokens.Identifier, Tokens.EOL,
Tokens.Sub, Tokens.Identifier, Tokens.EOL);
}
void CheckTokens(VBLexer lexer, params int[] tokens)
{
for (int i = 0; i < tokens.Length; i++) {
int token = tokens[i];
Token t = lexer.NextToken();
int next = t.Kind;
Assert.IsEmpty(lexer.Errors.ErrorOutput);
Assert.AreEqual(token, next, "{2} of {3}: expected: \"{0}\", was: \"{1}\"; at {4}", Tokens.GetTokenString(token), Tokens.GetTokenString(next), i + 1, tokens.Length, t.Location);
}
}
#endregion
}
}