mirror of https://github.com/icsharpcode/ILSpy.git
				
				
			
			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
						
					
					
				
			
		
		
	
	
							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 | 
						|
	} | 
						|
}
 | 
						|
 |