.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.
 
 
 
 

255 lines
12 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 NUnit.Framework;
using ICSharpCode.NRefactory.VB.Parser;
using ICSharpCode.NRefactory.VB.Ast;
namespace ICSharpCode.NRefactory.VB.Tests.Ast
{
[TestFixture]
public class XmlExpressionTests
{
#region VB.NET
[Test]
public void VBNetSimpleCommentTest()
{
XmlContentExpression content = ParseUtil.ParseExpression<XmlContentExpression>("<!-- test -->");
Assert.AreEqual(XmlContentType.Comment, content.Type);
Assert.AreEqual(" test ", content.Content);
Assert.AreEqual(new Location(1,1), content.StartLocation);
Assert.AreEqual(new Location(14,1), content.EndLocation);
}
[Test]
public void VBNetSimplePreprocessingInstructionTest()
{
XmlContentExpression content = ParseUtil.ParseExpression<XmlContentExpression>("<?xml version='1.0'?>");
Assert.AreEqual(XmlContentType.ProcessingInstruction, content.Type);
Assert.AreEqual("xml version='1.0'", content.Content);
Assert.AreEqual(new Location(1,1), content.StartLocation);
Assert.AreEqual(new Location(22,1), content.EndLocation);
}
[Test]
public void VBNetSimpleCDataTest()
{
XmlContentExpression content = ParseUtil.ParseExpression<XmlContentExpression>("<![CDATA[<simple> <cdata>]]>");
Assert.AreEqual(XmlContentType.CData, content.Type);
Assert.AreEqual("<simple> <cdata>", content.Content);
Assert.AreEqual(new Location(1,1), content.StartLocation);
Assert.AreEqual(new Location(29,1), content.EndLocation);
}
[Test]
public void VBNetSimpleEmptyElementTest()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test />");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsEmpty(element.Attributes);
Assert.IsEmpty(element.Children);
Assert.AreEqual(new Location(1,1), element.StartLocation);
Assert.AreEqual(new Location(9,1), element.EndLocation);
}
[Test]
public void VBNetSimpleEmptyElementWithAttributeTest()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test id='0' />");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
Assert.AreEqual("0", attribute.LiteralValue);
Assert.AreEqual(new Location(7,1), attribute.StartLocation);
Assert.AreEqual(new Location(13,1), attribute.EndLocation);
Assert.IsEmpty(element.Children);
Assert.AreEqual(new Location(1,1), element.StartLocation);
Assert.AreEqual(new Location(16,1), element.EndLocation);
}
[Test]
public void VBNetSimpleEmptyElementWithAttributesTest()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test id='0' name=<%= name %> <%= contentData %> />"); Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(3, element.Attributes.Count);
Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
Assert.AreEqual("0", attribute.LiteralValue);
Assert.AreEqual(new Location(7,1), attribute.StartLocation);
Assert.AreEqual(new Location(13,1), attribute.EndLocation);
Assert.IsTrue(element.Attributes[1] is XmlAttributeExpression);
XmlAttributeExpression attribute2 = element.Attributes[1] as XmlAttributeExpression;
Assert.AreEqual("name", attribute2.Name);
Assert.IsFalse(attribute2.IsLiteralValue);
Assert.IsFalse(attribute2.ExpressionValue.IsNull);
Assert.IsTrue(attribute2.ExpressionValue is IdentifierExpression);
IdentifierExpression identifier = attribute2.ExpressionValue as IdentifierExpression;
Assert.AreEqual("name", identifier.Identifier);
Assert.AreEqual(new Location(23,1), identifier.StartLocation);
Assert.AreEqual(new Location(27,1), identifier.EndLocation);
Assert.AreEqual(new Location(14,1), attribute2.StartLocation);
Assert.AreEqual(new Location(30,1), attribute2.EndLocation);
Assert.IsTrue(element.Attributes[2] is XmlEmbeddedExpression);
XmlEmbeddedExpression attribute3 = element.Attributes[2] as XmlEmbeddedExpression;
Assert.IsTrue(attribute3.InlineVBExpression is IdentifierExpression);
IdentifierExpression identifier2 = attribute3.InlineVBExpression as IdentifierExpression;
Assert.AreEqual("contentData", identifier2.Identifier);
Assert.AreEqual(new Location(35,1), identifier2.StartLocation);
Assert.AreEqual(new Location(46,1), identifier2.EndLocation);
Assert.AreEqual(new Location(31,1), attribute3.StartLocation);
Assert.AreEqual(new Location(49,1), attribute3.EndLocation);
Assert.IsEmpty(element.Children);
Assert.AreEqual(new Location(1,1), element.StartLocation);
Assert.AreEqual(new Location(52,1), element.EndLocation);
}
[Test]
public void VBNetElementWithAttributeTest()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test id='0'>\n" +
" <Item />\n" +
" <Item />\n" +
"</Test>");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
Assert.AreEqual("0", attribute.LiteralValue);
Assert.AreEqual(new Location(7,1), attribute.StartLocation);
Assert.AreEqual(new Location(13,1), attribute.EndLocation);
Assert.IsNotEmpty(element.Children);
Assert.AreEqual(5, element.Children.Count);
CheckContent(element.Children[0], "\n\t", XmlContentType.Text, new Location(14,1), new Location(2,2));
CheckContent(element.Children[2], "\n\t", XmlContentType.Text, new Location(10,2), new Location(2,3));
CheckContent(element.Children[4], "\n", XmlContentType.Text, new Location(10,3), new Location(1,4));
CheckElement(element.Children[1], "Item", new Location(2,2), new Location(10,2));
CheckElement(element.Children[3], "Item", new Location(2,3), new Location(10,3));
Assert.AreEqual(new Location(1,1), element.StartLocation);
Assert.AreEqual(new Location(8,4), element.EndLocation);
}
[Test]
public void VBNetElementWithMixedContentTest()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test id='0'>\n" +
" <!-- test -->\n" +
" <Item />\n" +
" <Item />\n" +
" <![CDATA[<cdata> section]]>\n" +
"</Test>");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Attributes);
Assert.AreEqual(1, element.Attributes.Count);
Assert.IsTrue(element.Attributes[0] is XmlAttributeExpression);
XmlAttributeExpression attribute = element.Attributes[0] as XmlAttributeExpression;
Assert.AreEqual("id", attribute.Name);
Assert.IsTrue(attribute.IsLiteralValue);
Assert.IsTrue(attribute.ExpressionValue.IsNull);
Assert.AreEqual("0", attribute.LiteralValue);
Assert.AreEqual(new Location(7,1), attribute.StartLocation);
Assert.AreEqual(new Location(13,1), attribute.EndLocation);
Assert.IsNotEmpty(element.Children);
Assert.AreEqual(9, element.Children.Count);
CheckContent(element.Children[0], "\n\t", XmlContentType.Text, new Location(14,1), new Location(2,2));
CheckContent(element.Children[2], "\n\t", XmlContentType.Text, new Location(15,2), new Location(2,3));
CheckContent(element.Children[4], "\n\t", XmlContentType.Text, new Location(10,3), new Location(2,4));
CheckContent(element.Children[6], "\n\t", XmlContentType.Text, new Location(10,4), new Location(2,5));
CheckContent(element.Children[7], "<cdata> section", XmlContentType.CData, new Location(2,5), new Location(29,5));
CheckContent(element.Children[8], "\n", XmlContentType.Text, new Location(29,5), new Location(1,6));
CheckContent(element.Children[1], " test ", XmlContentType.Comment, new Location(2,2), new Location(15,2));
CheckElement(element.Children[3], "Item", new Location(2,3), new Location(10,3));
CheckElement(element.Children[5], "Item", new Location(2,4), new Location(10,4));
Assert.AreEqual(new Location(1,1), element.StartLocation);
Assert.AreEqual(new Location(8,6), element.EndLocation);
}
[Test]
public void VBNetElementWithMixedContentTest2()
{
XmlElementExpression element = ParseUtil.ParseExpression<XmlElementExpression>("<Test> aaaa </Test>");
Assert.IsFalse(element.NameIsExpression);
Assert.AreEqual("Test", element.XmlName);
Assert.IsNotEmpty(element.Children);
Assert.AreEqual(1, element.Children.Count);
CheckContent(element.Children[0], " aaaa ", XmlContentType.Text, new Location(7,1), new Location(14,1));
}
[Test]
public void VBNetProcessingInstructionAndCommentAtEndTest()
{
XmlDocumentExpression document = ParseUtil.ParseExpression<XmlDocumentExpression>("<Test />\n" +
"<!-- test -->\n" +
"<?target some text?>");
Assert.IsNotEmpty(document.Expressions);
Assert.AreEqual(3, document.Expressions.Count);
CheckElement(document.Expressions[0], "Test", new Location(1,1), new Location(9,1));
CheckContent(document.Expressions[1], " test ", XmlContentType.Comment, new Location(1,2), new Location(14,2));
CheckContent(document.Expressions[2], "target some text", XmlContentType.ProcessingInstruction, new Location(1,3), new Location(21,3));
}
#endregion
void CheckElement(AstNode node, string name, AstLocation start, AstLocation end)
{
Assert.IsTrue(node is XmlElementExpression);
XmlElementExpression expr = node as XmlElementExpression;
Assert.IsEmpty(expr.Attributes);
Assert.IsEmpty(expr.Children);
Assert.IsFalse(expr.NameIsExpression);
Assert.AreEqual(name, expr.XmlName);
Assert.AreEqual(start, expr.StartLocation);
Assert.AreEqual(end, expr.EndLocation);
}
void CheckContent(AstNode node, string content, XmlContentType type, AstLocation start, AstLocation end)
{
Assert.IsTrue(node is XmlContentExpression);
XmlContentExpression expr = node as XmlContentExpression;
Assert.AreEqual(type, expr.Type);
Assert.AreEqual(content, expr.Content);
Assert.AreEqual(start, expr.StartLocation);
Assert.AreEqual(end, expr.EndLocation);
}
}
}