133 lines
2.7 KiB
C#
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");
|
||
|
}
|
||
|
}
|
||
|
}
|