#develop (short for SharpDevelop) is a free IDE for .NET programming languages.
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.
 
 
 
 
 
 

155 lines
4.8 KiB

// Copyright (c) AlphaSierraPapa for the SharpDevelop Team
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
// software and associated documentation files (the "Software"), to deal in the Software
// without restriction, including without limitation the rights to use, copy, modify, merge,
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
// to whom the Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or
// substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
using System;
using NUnit.Framework;
namespace ICSharpCode.NRefactory.CSharp.Parser.Expression
{
[TestFixture]
public class UnaryOperatorExpressionTests
{
void TestUnaryOperatorExpressionTest(string program, UnaryOperatorType op)
{
UnaryOperatorExpression uoe = ParseUtilCSharp.ParseExpression<UnaryOperatorExpression>(program);
Assert.AreEqual(op, uoe.Operator);
Assert.IsTrue(uoe.Expression is IdentifierExpression);
Assert.AreEqual(new TextLocation(1, 1), uoe.StartLocation);
Assert.AreEqual(new TextLocation(1, program.Length + 1), uoe.EndLocation);
}
[Test]
public void NotTest()
{
TestUnaryOperatorExpressionTest("!a", UnaryOperatorType.Not);
}
[Test]
public void BitNotTest()
{
TestUnaryOperatorExpressionTest("~a", UnaryOperatorType.BitNot);
}
[Test]
public void MinusTest()
{
TestUnaryOperatorExpressionTest("-a", UnaryOperatorType.Minus);
}
[Test]
public void PlusTest()
{
TestUnaryOperatorExpressionTest("+a", UnaryOperatorType.Plus);
}
[Test]
public void IncrementTest()
{
TestUnaryOperatorExpressionTest("++a", UnaryOperatorType.Increment);
}
[Test]
public void DecrementTest()
{
TestUnaryOperatorExpressionTest("--a", UnaryOperatorType.Decrement);
}
[Test]
public void PostIncrementTest()
{
TestUnaryOperatorExpressionTest("a++", UnaryOperatorType.PostIncrement);
}
[Test]
public void PostDecrementTest()
{
TestUnaryOperatorExpressionTest("a--", UnaryOperatorType.PostDecrement);
}
[Test]
public void Dereference()
{
TestUnaryOperatorExpressionTest("*a", UnaryOperatorType.Dereference);
}
[Test]
public void AddressOf()
{
TestUnaryOperatorExpressionTest("&a", UnaryOperatorType.AddressOf);
}
[Test]
public void Await()
{
ParseUtilCSharp.AssertExpression(
"async a => await a",
new LambdaExpression {
IsAsync = true,
Parameters = { new ParameterDeclaration { Name = "a" } },
Body = new UnaryOperatorExpression(UnaryOperatorType.Await, new IdentifierExpression("a"))
});
}
[Test]
public void AwaitAwait()
{
ParseUtilCSharp.AssertExpression(
"async a => await await a",
new LambdaExpression {
IsAsync = true,
Parameters = { new ParameterDeclaration { Name = "a" } },
Body = new UnaryOperatorExpression(
UnaryOperatorType.Await,
new UnaryOperatorExpression(UnaryOperatorType.Await, new IdentifierExpression("a")))
});
}
[Test]
public void DereferenceAfterCast()
{
UnaryOperatorExpression uoe = ParseUtilCSharp.ParseExpression<UnaryOperatorExpression>("*((SomeType*) &w)");
Assert.AreEqual(UnaryOperatorType.Dereference, uoe.Operator);
ParenthesizedExpression pe = (ParenthesizedExpression)uoe.Expression;
CastExpression ce = (CastExpression)pe.Expression;
ComposedType type = (ComposedType)ce.Type;
Assert.AreEqual("SomeType", ((SimpleType)type.BaseType).Identifier);
Assert.AreEqual(1, type.PointerRank);
UnaryOperatorExpression adrOf = (UnaryOperatorExpression)ce.Expression;
Assert.AreEqual(UnaryOperatorType.AddressOf, adrOf.Operator);
}
[Test]
public void AwaitStaticMethodCall()
{
var uoe = ParseUtilCSharp.ParseExpression<UnaryOperatorExpression>("await Task.WhenAll(a, b)");
Assert.AreEqual(UnaryOperatorType.Await, uoe.Operator);
Assert.IsInstanceOf<InvocationExpression>(uoe.Expression);
}
[Test]
public void AwaitStaticMethodCallStatement()
{
var es = ParseUtilCSharp.ParseStatement<ExpressionStatement>("await Task.WhenAll(a, b);");
UnaryOperatorExpression uoe = (UnaryOperatorExpression)es.Expression;
Assert.AreEqual(UnaryOperatorType.Await, uoe.Operator);
Assert.IsInstanceOf<InvocationExpression>(uoe.Expression);
}
}
}