Mercurial > pub > bltoolkit
diff UnitTests/CS/Aspects/OverloadAspectTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/CS/Aspects/OverloadAspectTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,267 @@ +using System; + +using NUnit.Framework; + +using BLToolkit.Aspects; +using BLToolkit.Reflection; +using BLToolkit.TypeBuilder; + +namespace Aspects +{ + [TestFixture] + public class OverloadAspectTest + { + public abstract class TestObject<T> + { + public T Test(T inVal, out T outVal) + { + outVal = inVal; + return inVal; + } + + public string Test(DateTime dateVal, string inVal) + { + return inVal.ToUpper(); + } + + [Overload] abstract public T Test(T inVal); + [Overload] abstract public T Test(T inVal, out T outVal, ref T refVal); + [Overload] abstract public T Test(T inVal, DateTime dateVal); + } + + public abstract class TestObject + { + public int IntValue; + public string StrValue; + public Guid GuidValue; + + public void Test(int intVal, Guid guidVal) + { + IntValue = intVal; + GuidValue = guidVal; + StrValue = "(default)"; + } + + public void Test(int intVal, string strVal) + { + IntValue = intVal; + StrValue = strVal; + GuidValue = Guid.Empty; + } + + public void OutRefTest(int inVal, out int outVal, ref int refVal) + { + outVal = inVal; + refVal += inVal; + } + + public void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal) + { + outVal = inVal; + refVal += inVal; + } + + protected static int StaticMethod(int intVal, ref Guid guidVal) + { + return intVal; + } + + public T Generic<T>(T inVal, out T outVal) + { + outVal = inVal; + return inVal; + } + + // Becomes + // public override void Test(Guid guidVal) + // { + // Test(default(int), guidVal); + // } + // + [Overload] public abstract void Test(Guid guidVal); + + // Becomes + // public override void Test(Guid guidVal, int intVal) + // { + // Test(intVal, guidVal); + // } + // + [Overload] public abstract void Test(Guid guidVal, int intVal); + + // Becomes + // public override void Test(string strVal) + // { + // Test(default(int), strVal); + // } + // + [Overload] + public abstract void Test(string strVal); + + // Overload method name may be altered. + // + [Overload("Test")] + public abstract void GuidTest(Guid guidVal, DateTime dateVal); + + // Parameter types of the method to overload. + // + [Overload(typeof(int), typeof(Guid))] + public abstract void Test(DateTime strVal); + + // There may be more or less parameters in the overloaded method. + // + [Overload] public abstract void OutRefTest(int inVal, out int outVal, ref int refVal, out string strVal); + [Overload] public abstract void OutRefTest(int inVal); + + // Value types and ref value types also works. + // + [Overload] public abstract void OutRefStructTest(int? inVal, out int? outVal, ref int? refVal, out Guid guidVal); + [Overload] public abstract void OutRefStructTest(int? inVal); + + // We can overload static methods. + // + [Overload] public abstract int StaticMethod(int intVal); + + // We can overload methods declared in a base type. + // + [Overload] public abstract string ToString(int intVal); + + // A generic method can be overloaded by an other generic method. + // + [Overload] public abstract T Generic<T>(T inVal); + } + + [Test] + public void OverloadTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + o.Test(12345, "str"); + + Assert.AreEqual(12345, o.IntValue); + Assert.AreEqual("str", o.StrValue); + Assert.AreEqual(Guid.Empty, o.GuidValue); + + o.Test(Guid.NewGuid(), 123); + + Assert.AreEqual(123, o.IntValue); + Assert.AreEqual("(default)", o.StrValue); + Assert.AreNotEqual(Guid.Empty, o.GuidValue); + + o.Test("foo"); + + Assert.AreEqual(0, o.IntValue); + Assert.AreEqual("foo", o.StrValue); + Assert.AreEqual(Guid.Empty, o.GuidValue); + + o.Test(Guid.NewGuid()); + + Assert.AreEqual(0, o.IntValue); + Assert.AreEqual("(default)", o.StrValue); + Assert.AreNotEqual(Guid.Empty, o.GuidValue); + + Assert.AreEqual(1, o.Generic(1)); + } + + [Test] + public void AnyNameTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + o.GuidTest(Guid.NewGuid(), DateTime.Now); + + Assert.AreEqual(0, o.IntValue); + Assert.AreEqual("(default)", o.StrValue); + Assert.AreNotEqual(Guid.Empty, o.GuidValue); + } + + [Test] + public void ExplicitParameterTypesTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + o.Test(DateTime.Now); + + Assert.AreEqual(0, o.IntValue); + Assert.AreEqual("(default)", o.StrValue); + Assert.AreEqual(Guid.Empty, o.GuidValue); + } + + [Test] + public void StaticMethodTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + int intVal = o.StaticMethod(123); + + Assert.AreEqual(123, intVal); + } + + [Test] + public void BaseTypeMethodTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + Assert.AreEqual(o.ToString(), o.ToString(123)); + } + + [Test] + public void OutRefTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + const int inVal = 123; + int refVal = 99; + int outVal; + string strVal; + o.OutRefTest(inVal, out outVal, ref refVal, out strVal); + + Assert.AreEqual(inVal, outVal); + Assert.AreEqual(222, refVal); + Assert.AreEqual(string.Empty, strVal); + + o.OutRefTest(inVal); + } + + [Test] + public void OutRefStructTest() + { + TestObject o = TypeAccessor<TestObject>.CreateInstance(); + + int? inVal = 123; + int? refVal = 99; + int? outVal; + Guid guidVal; + o.OutRefStructTest(inVal, out outVal, ref refVal, out guidVal); + + Assert.AreEqual(inVal, outVal); + Assert.AreEqual(222, refVal); + Assert.AreEqual(Guid.Empty, guidVal); + + o.OutRefStructTest(inVal); + } + + [Test] + public void GenericTypeTest() + { + TestObject<int?> o = TypeAccessor<TestObject<int?>>.CreateInstance(); + + int? inVal = 123; + int? refVal = 99; + int? outVal; + o.Test(inVal, out outVal, ref refVal); + + Assert.AreEqual(inVal, outVal); + Assert.AreEqual(refVal, 99); + + Assert.AreEqual(inVal, o.Test(inVal)); + Assert.AreEqual(12, o.Test(12, DateTime.Now)); + + TestObject<string> o2 = TypeAccessor<TestObject<string>>.CreateInstance(); + + // When T is a string, method Test(DateTime, string) becomes the best match. + // + Assert.AreEqual("STR", o2.Test("str", DateTime.Now)); + } + + } +} \ No newline at end of file