Files
OpenRA/OpenRA.Test/OpenRA.Game/ConditionExpressionTest.cs
2017-02-22 08:54:50 -06:00

151 lines
3.9 KiB
C#

#region Copyright & License Information
/*
* Copyright 2007-2017 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using NUnit.Framework;
using OpenRA.Support;
namespace OpenRA.Test
{
[TestFixture]
public class ConditionExpressionTest
{
IReadOnlyDictionary<string, int> testValues = new ReadOnlyDictionary<string, int>(new Dictionary<string, int>()
{
{ "true", 1 },
{ "false", 0 }
});
void AssertFalse(string expression)
{
Assert.False(new ConditionExpression(expression).Evaluate(testValues) > 0, expression);
}
void AssertTrue(string expression)
{
Assert.True(new ConditionExpression(expression).Evaluate(testValues) > 0, expression);
}
void AssertParseFailure(string expression)
{
Assert.Throws(typeof(InvalidDataException), () => new ConditionExpression(expression).Evaluate(testValues), expression);
}
[TestCase(TestName = "AND operation")]
public void TestAnd()
{
AssertTrue("true && true");
AssertFalse("false && false");
AssertFalse("true && false");
AssertFalse("false && true");
}
[TestCase(TestName = "OR operation")]
public void TestOR()
{
AssertTrue("true || true");
AssertFalse("false || false");
AssertTrue("true || false");
AssertTrue("false || true");
}
[TestCase(TestName = "Equals operation")]
public void TestEquals()
{
AssertTrue("true == true");
AssertTrue("false == false");
AssertFalse("true == false");
AssertFalse("false == true");
}
[TestCase(TestName = "Not-equals operation")]
public void TestNotEquals()
{
AssertFalse("true != true");
AssertFalse("false != false");
AssertTrue("true != false");
AssertTrue("false != true");
}
[TestCase(TestName = "NOT operation")]
public void TestNOT()
{
AssertFalse("!true");
AssertTrue("!false");
AssertTrue("!!true");
AssertFalse("!!false");
}
[TestCase(TestName = "Precedence")]
public void TestPrecedence()
{
AssertTrue("true && false || true");
AssertFalse("false || false && true");
AssertTrue("true && !true || !false");
AssertFalse("false || !true && !false");
}
[TestCase(TestName = "Parenthesis")]
public void TestParens()
{
AssertTrue("(true)");
AssertTrue("((true))");
AssertFalse("(false)");
AssertFalse("((false))");
}
[TestCase(TestName = "Parenthesis and mixed operations")]
public void TestMixedParens()
{
AssertTrue("(!false)");
AssertTrue("!(false)");
AssertFalse("!(!false)");
AssertTrue("(true) || (false)");
AssertTrue("true && (false || true)");
AssertTrue("(true && false) || true");
AssertTrue("!(true && false) || false");
AssertTrue("((true != true) == false) && true");
AssertFalse("(true != false) == false && true");
AssertTrue("true || ((true != false) != !(false && true))");
AssertFalse("((true != false) != !(false && true))");
}
[TestCase(TestName = "Test parser errors")]
public void TestParseErrors()
{
AssertParseFailure("()");
AssertParseFailure("! && true");
AssertParseFailure("(true");
AssertParseFailure(")true");
AssertParseFailure("false)");
AssertParseFailure("false(");
AssertParseFailure("false!");
AssertParseFailure("true false");
AssertParseFailure("true & false");
AssertParseFailure("true | false");
AssertParseFailure("true / false");
AssertParseFailure("true & false && !");
AssertParseFailure("(true && !)");
AssertParseFailure("&& false");
AssertParseFailure("false ||");
}
[TestCase(TestName = "Undefined symbols are treated as `false` (0) values")]
public void TestUndefinedSymbols()
{
AssertFalse("undef1 || undef2");
}
}
}