public void Aspects06Test()
        {
            // Testing interception of methods on classes, implicite interface methods
            // and explicit interface methods.

            TestableAdviceAttribute.ResetCalls();

            Sample2.SampleClass     instance = new Sample2.SampleClass(76);
            Sample2.SampleInterface iface    = instance;

            instance.InterfaceMethodA();
            iface.InterfaceMethodA();
            iface.InterfaceMethodB();
            instance.InterfaceMethodC();

            foreach (ICallContext cc in TestableAdviceAttribute.Calls)
            {
                Console.WriteLine(
                    "\r\n{0}_{1}\r\n  => {2}_{3} ({4})",
                    cc.MethodCall.MethodBase.DeclaringType,
                    cc.MethodCall.MethodBase.Name,
                    cc.Method.DeclaringType,
                    cc.Method.Name,
                    cc.GetProperty("Name")
                    );

                // Assert only advices on class operated:
                Assert.IsTrue(cc.GetProperty("Name").ToString().StartsWith("Class."));

                // Assert
                Assert.AreEqual(instance.Id, ((Sample2.SampleClass)cc.Instance).Id);
            }

            // All method calls except constructor intercepted:
            Assert.AreEqual(4, TestableAdviceAttribute.Calls.Count);

            // MethodCall.MethodBase of explicit interface implementation is interface's:
            Assert.AreEqual(typeof(Sample2.SampleInterface), TestableAdviceAttribute.Calls[2].MethodCall.MethodBase.DeclaringType);
            Assert.AreEqual("InterfaceMethodB", TestableAdviceAttribute.Calls[2].MethodCall.MethodBase.Name);

            // While Method of explicit interface implementation is classe's:
            Assert.AreEqual(typeof(Sample2.SampleClass), TestableAdviceAttribute.Calls[2].Method.DeclaringType);

            // So ALL Methods are classe's:
            Assert.AreEqual(typeof(Sample2.SampleClass), TestableAdviceAttribute.Calls[0].Method.DeclaringType);
            Assert.AreEqual(typeof(Sample2.SampleClass), TestableAdviceAttribute.Calls[1].Method.DeclaringType);
            Assert.AreEqual(typeof(Sample2.SampleClass), TestableAdviceAttribute.Calls[2].Method.DeclaringType);
            Assert.AreEqual(typeof(Sample2.SampleClass), TestableAdviceAttribute.Calls[3].Method.DeclaringType);

            // Also check methodnames:
            Assert.AreEqual("InterfaceMethodA", TestableAdviceAttribute.Calls[0].Method.Name);
            Assert.AreEqual("InterfaceMethodA", TestableAdviceAttribute.Calls[1].Method.Name);
            Assert.AreEqual(typeof(Sample2.SampleInterface).ToString() + ".InterfaceMethodB", TestableAdviceAttribute.Calls[2].Method.Name);
            Assert.AreEqual("InterfaceMethodC", TestableAdviceAttribute.Calls[3].Method.Name);
        }
        public void Aspects05Test()
        {
            TestableAdviceAttribute.ResetCalls();

            Sample1.MyFooBar instance = new Sample1.MyFooBar();
            instance.Tag = "helloTag";

            DateTime t = (instance.GetCurrentDateTime(3));

            Assert.AreEqual(new DateTime(2009, 1, 4), t);
            Assert.AreEqual(3, TestableAdviceAttribute.Calls.Count);

            // Check object instance:
            Assert.AreEqual("helloTag", ((Sample1.MyFoo)TestableAdviceAttribute.Calls[1].Instance).Tag);
        }
        public void Aspects01Test()
        {
            TestableAdviceAttribute.ResetCalls();

            DateTime t = (((Sample1.IFoo) new Sample1.YourFoo()).GetCurrentDateTime(3));

            Assert.AreEqual(new DateTime(2007, 1, 4), t);
            Assert.AreEqual(2, TestableAdviceAttribute.Calls.Count);

            // Check applied attributes:
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromIFooInterface"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromIFooMethod"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooClass"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooMethod"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooBarClass"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyGreatFooBarClass"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyGreatFooBarMethod"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromYourFooClass"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromYourFooMethod"));
        }
        public void Aspects04Test()
        {
            TestableAdviceAttribute.ResetCalls();

            DateTime t = (new Sample1.MyGreatFooBar().GetCurrentDateTime(3));

            Assert.AreEqual(new DateTime(2010, 1, 4), t);
            Assert.AreEqual(2, TestableAdviceAttribute.Calls.Count);

            // When calling an overriden (implicit interface) implementation,
            // the CallContexts' method is the overriden class-declared method:
            Assert.AreEqual(typeof(Sample1.MyGreatFooBar).GetMethod("GetCurrentDateTime"), TestableAdviceAttribute.Calls[1].Method);

            // Check applied attributes:
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromIFooInterface"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromIFooMethod"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooClass"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooMethod"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyFooBarClass"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyGreatFooBarClass"));
            Assert.IsTrue((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromMyGreatFooBarMethod"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromYourFooClass"));
            Assert.IsFalse((bool)((Sample1.BaseFoo)TestableAdviceAttribute.Calls[1].Instance).Markers.Contains("fromYourFooMethod"));
        }