Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

133 lines
2.7 KiB
C#

// MulticastDelegate.cs - NUnit Test Cases for MulticastDelegates (C# delegates)
//
// Daniel Stodden (stodden@in.tum.de)
//
// (C) Daniel Stodden
//
using NUnit.Framework;
using System;
namespace MonoTests.System
{
[TestFixture]
public class MulticastDelegateTest {
public MulticastDelegateTest() {}
private delegate char MyDelegate( ref string s );
private char MethodA( ref string s )
{
s += "a";
return 'a';
}
private char MethodB( ref string s )
{
s += "b";
return 'b';
}
private char MethodC( ref string s )
{
s += "c";
return 'c';
}
private char MethodD( ref string s )
{
s += "d";
return 'd';
}
[Test]
public void TestEquals()
{
MyDelegate dela = new MyDelegate( MethodA );
MyDelegate delb = new MyDelegate( MethodB );
MyDelegate delc = new MyDelegate( MethodC );
Assert.AreEqual(false, dela == delb , "#A01");
MyDelegate del1, del2;
del1 = dela + delb;
del2 = delb + delc;
Assert.AreEqual(false, del1 == del2 , "#A02");
del1 += delc;
del2 = dela + del2;
Assert.AreEqual(true, del1 == del2 , "#A03");
object o = new object ();
Assert.AreEqual (false, dela.Equals (o), "#A04");
}
[Test]
public void TestCombineRemove()
{
MyDelegate dela = new MyDelegate( MethodA );
MyDelegate delb = new MyDelegate( MethodB );
MyDelegate delc = new MyDelegate( MethodC );
MyDelegate deld = new MyDelegate( MethodD );
string val;
char res;
// test combine
MyDelegate del1, del2;
del1 = dela + delb + delb + delc + delb + delb + deld;
val = "";
res = del1( ref val );
Assert.AreEqual("abbcbbd", val , "#A01");
Assert.AreEqual('d', res , "#A02");
// test remove
del2 = del1 - ( delb + delb );
val = "";
res = del2( ref val );
Assert.AreEqual("abbcd", val , "#A03");
Assert.AreEqual('d', res , "#A04");
// we did not affect del1, did we?
val = "";
res = del1( ref val );
Assert.AreEqual("abbcbbd", val , "#A05");
}
[Test] //Bug #12536
public void TestCombineBothDirections ()
{
MyDelegate dela = new MyDelegate( MethodA );
MyDelegate delb = new MyDelegate( MethodB );
MyDelegate delc = new MyDelegate( MethodC );
MyDelegate deld = new MyDelegate( MethodD );
string val;
char res;
MyDelegate a = dela + delb;
val = "";
res = a (ref val);
Assert.AreEqual ("ab", val, "#1");
Assert.AreEqual ('b', res, "#2");
MyDelegate b = delc + deld;
val = "";
res = b (ref val);
Assert.AreEqual ("cd", val, "#3");
Assert.AreEqual ('d', res, "#4");
MyDelegate c = a + b;
val = "";
res = c (ref val);
Assert.AreEqual ("abcd", val, "#5");
Assert.AreEqual ('d', res, "#6");
}
}
}