Xamarin Public Jenkins (auto-signing) 94b2861243 Imported Upstream version 4.8.0.309
Former-commit-id: 5f9c6ae75f295e057a7d2971f3a6df4656fa8850
2016-11-10 13:04:39 +00:00

429 lines
12 KiB
C#

//
// TestCCRewrite.cs
//
// Authors:
// Chris Bacon (chrisbacon76@gmail.com)
//
// Copyright (C) 2010 Chris Bacon
//
// 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.
//
#define CONTRACTS_FULL
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using System.Diagnostics.Contracts;
using System.Linq.Expressions;
namespace MonoTests.Mono.CodeContracts {
[TestFixture]
public class TestCCRewrite {
private RewriteAndLoad ral = null;
[TestFixtureSetUp]
public void FixtureSetup ()
{
this.ral = new RewriteAndLoad ();
this.ral.Load ();
}
[TestFixtureTearDown]
public void FixtureTearDown ()
{
if (this.ral != null) {
this.ral.Dispose ();
}
}
// ==
private static void TestEqualsByte (byte value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsSByte (sbyte value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsUShort (ushort value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsShort (short value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsUInt (uint value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsInt (int value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsULong (ulong value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsLong (long value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsFloat (float value)
{
Contract.Requires (value == 0);
}
private static void TestEqualsDouble (double value)
{
Contract.Requires (value == 0);
}
// !=
private static void TestNotEqualsByte (byte value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsSByte (sbyte value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsUShort (ushort value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsShort (short value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsUInt (uint value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsInt (int value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsULong (ulong value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsLong (long value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsFloat (float value)
{
Contract.Requires (value != 0);
}
private static void TestNotEqualsDouble (double value)
{
Contract.Requires (value != 0);
}
// <
private static void TestLessThanInt (int value)
{
Contract.Requires (value < 10);
}
private static void TestLessThanUInt (uint value)
{
Contract.Requires (value < 10);
}
private static void TestLessThanLong (long value)
{
Contract.Requires (value < 10);
}
private static void TestLessThanULong (ulong value)
{
Contract.Requires (value < 10);
}
private static void TestLessThanFloat (float value)
{
Contract.Requires (value < 10);
}
private static void TestLessThanDouble (double value)
{
Contract.Requires (value < 10);
}
// <=
private static void TestLessThanOrEqualInt (int value)
{
Contract.Requires (value <= 10);
}
private static void TestLessThanOrEqualUInt (uint value)
{
Contract.Requires (value <= 10);
}
private static void TestLessThanOrEqualLong (long value)
{
Contract.Requires (value <= 10);
}
private static void TestLessThanOrEqualULong (ulong value)
{
Contract.Requires (value <= 10);
}
private static void TestLessThanOrEqualFloat (float value)
{
Contract.Requires (value <= 10);
}
private static void TestLessThanOrEqualDouble (double value)
{
Contract.Requires (value <= 10);
}
// >
private static void TestGreaterThanInt (int value)
{
Contract.Requires (value > 10);
}
private static void TestGreaterThanUInt (uint value)
{
Contract.Requires (value > 10);
}
private static void TestGreaterThanLong (long value)
{
Contract.Requires (value > 10);
}
private static void TestGreaterThanULong (ulong value)
{
Contract.Requires (value > 10);
}
private static void TestGreaterThanFloat (float value)
{
Contract.Requires (value > 10);
}
private static void TestGreaterThanDouble (double value)
{
Contract.Requires (value > 10);
}
// >=
private static void TestGreaterThanOrEqualInt (int value)
{
Contract.Requires (value >= 10);
}
private static void TestGreaterThanOrEqualUInt (uint value)
{
Contract.Requires (value >= 10);
}
private static void TestGreaterThanOrEqualLong (long value)
{
Contract.Requires (value >= 10);
}
private static void TestGreaterThanOrEqualULong (ulong value)
{
Contract.Requires (value >= 10);
}
private static void TestGreaterThanOrEqualFloat (float value)
{
Contract.Requires (value >= 10);
}
private static void TestGreaterThanOrEqualDouble (double value)
{
Contract.Requires (value >= 10);
}
// object ==
private static void TestObjectEquals (object value)
{
Contract.Requires (value == null);
}
// object !=
private static void TestObjectNotEquals (object value)
{
Contract.Requires (value != null);
}
private void CheckException (Expression<Action> fnExpr, params string [] messageContains)
{
try {
this.ral.Call (fnExpr);
} catch (Exception e) {
string m = e.Message.Split ('\n', '\r') [0].Trim ();
foreach (var contains in messageContains) {
StringAssert.Contains (contains, m);
}
return;
}
Assert.Fail ("Contract should have thrown an exception");
}
private void CheckTwice (Expression<Action> fnGood, Expression<Action> fnBad, string condition)
{
const string PreFail = "Precondition failed";
this.ral.Call (fnGood);
// FIXME:
// this.CheckException (fnBad, PreFail, condition);
}
[Test]
public void TestTrivial_Equals ()
{
const string CondEquals = "value == 0";
this.CheckTwice (() => TestEqualsByte (0), () => TestEqualsByte (1), CondEquals);
this.CheckTwice (() => TestEqualsSByte (0), () => TestEqualsSByte (1), CondEquals);
this.CheckTwice (() => TestEqualsUShort (0), () => TestEqualsUShort (1), CondEquals);
this.CheckTwice (() => TestEqualsShort (0), () => TestEqualsShort (1), CondEquals);
this.CheckTwice (() => TestEqualsUInt (0), () => TestEqualsUInt (1), CondEquals);
this.CheckTwice (() => TestEqualsInt (0), () => TestEqualsInt (1), CondEquals);
this.CheckTwice (() => TestEqualsULong (0), () => TestEqualsULong (1), CondEquals);
this.CheckTwice (() => TestEqualsLong (0), () => TestEqualsLong (1), CondEquals);
this.CheckTwice (() => TestEqualsDouble (0), () => TestEqualsDouble (1), CondEquals);
this.CheckTwice (() => TestEqualsFloat (0), () => TestEqualsFloat (1), CondEquals);
}
[Test]
public void TestTrivial_NotEquals()
{
const string CondNotEquals = "value != 0";
this.CheckTwice (() => TestNotEqualsByte (1), () => TestNotEqualsByte (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsSByte (1), () => TestNotEqualsSByte (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsUShort (1), () => TestNotEqualsUShort (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsShort (1), () => TestNotEqualsShort (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsUInt (1), () => TestNotEqualsUInt (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsInt (1), () => TestNotEqualsInt (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsULong (1), () => TestNotEqualsULong (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsLong (1), () => TestNotEqualsLong (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsDouble (1), () => TestNotEqualsDouble (0), CondNotEquals);
this.CheckTwice (() => TestNotEqualsFloat (1), () => TestNotEqualsFloat (0), CondNotEquals);
}
[Test]
public void TestTrivial_LessThan()
{
const string CondLessThan = "value < 10";
this.CheckTwice (() => TestLessThanInt (9), () => TestLessThanInt (10), CondLessThan);
this.CheckTwice (() => TestLessThanUInt (9), () => TestLessThanUInt (10), CondLessThan);
this.CheckTwice (() => TestLessThanLong (9), () => TestLessThanLong (10), CondLessThan);
this.CheckTwice (() => TestLessThanULong (9), () => TestLessThanULong (10), CondLessThan);
this.CheckTwice (() => TestLessThanFloat (9.9f), () => TestLessThanFloat (10), CondLessThan);
this.CheckTwice (() => TestLessThanDouble (9.9), () => TestLessThanDouble (10), CondLessThan);
}
[Test]
public void TestTrivial_LessThanOrEqual()
{
const string CondLessThanOrEqual = "value <= 10";
this.CheckTwice (() => TestLessThanOrEqualInt (10), () => TestLessThanOrEqualInt (11), CondLessThanOrEqual);
this.CheckTwice (() => TestLessThanOrEqualUInt (10), () => TestLessThanOrEqualUInt (11), CondLessThanOrEqual);
this.CheckTwice (() => TestLessThanOrEqualLong (10), () => TestLessThanOrEqualLong (11), CondLessThanOrEqual);
this.CheckTwice (() => TestLessThanOrEqualULong (10), () => TestLessThanOrEqualULong (11), CondLessThanOrEqual);
this.CheckTwice (() => TestLessThanOrEqualFloat (10.0f), () => TestLessThanOrEqualFloat (10.1f), CondLessThanOrEqual);
this.CheckTwice (() => TestLessThanOrEqualDouble (10.0), () => TestLessThanOrEqualDouble (10.1), CondLessThanOrEqual);
}
[Test]
public void TestTrivial_GreaterThan()
{
const string CondGreaterThan = "value > 10";
this.CheckTwice (() => TestGreaterThanInt (11), () => TestGreaterThanInt (10), CondGreaterThan);
this.CheckTwice (() => TestGreaterThanUInt (11), () => TestGreaterThanUInt (10), CondGreaterThan);
this.CheckTwice (() => TestGreaterThanLong (11), () => TestGreaterThanLong (10), CondGreaterThan);
this.CheckTwice (() => TestGreaterThanULong (11), () => TestGreaterThanULong (10), CondGreaterThan);
this.CheckTwice (() => TestGreaterThanFloat (10.1f), () => TestGreaterThanFloat (10), CondGreaterThan);
this.CheckTwice (() => TestGreaterThanDouble (10.1), () => TestGreaterThanDouble (10), CondGreaterThan);
}
[Test]
public void TestTrivial_GreaterThanOrEqual()
{
const string CondGreaterThanOrEqual = "value >= 10";
this.CheckTwice (() => TestGreaterThanOrEqualInt (10), () => TestGreaterThanOrEqualInt (9), CondGreaterThanOrEqual);
this.CheckTwice (() => TestGreaterThanOrEqualUInt (10), () => TestGreaterThanOrEqualUInt (9), CondGreaterThanOrEqual);
this.CheckTwice (() => TestGreaterThanOrEqualLong (10), () => TestGreaterThanOrEqualLong (9), CondGreaterThanOrEqual);
this.CheckTwice (() => TestGreaterThanOrEqualULong (10), () => TestGreaterThanOrEqualULong (9), CondGreaterThanOrEqual);
this.CheckTwice (() => TestGreaterThanOrEqualFloat (10.0f), () => TestGreaterThanOrEqualFloat (9.9f), CondGreaterThanOrEqual);
this.CheckTwice (() => TestGreaterThanOrEqualDouble (10.0), () => TestGreaterThanOrEqualDouble (9.9), CondGreaterThanOrEqual);
}
[Test]
public void TestTrivial_ObjectEquality()
{
object o = new object ();
this.CheckTwice (() => TestObjectEquals (null), () => TestObjectEquals (o), "value == null");
this.CheckTwice (() => TestObjectNotEquals (o), () => TestObjectNotEquals (null), "value != null");
}
}
}