#region License
/*
* Copyright 2004 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#endregion
#region Imports
using System;
using System.Collections;
using System.Diagnostics;
using System.Reflection;
using NUnit.Framework;
using Spring.Context.Support;
#endregion
namespace Spring.Reflection.Dynamic{
/// <summary>
/// Unit tests for the DynamicIndexer class.
/// </summary>
/// <author>Aleksandar Seovic</author>
[TestFixture]
public sealed class DynamicIndexerTests
{
private Inventor tesla;
private Inventor pupin;
private Society ieee;
#region SetUp and TearDown
/// <summary>
/// The setup logic executed before the execution of each individual test.
/// </summary>
[SetUp]
public void SetUp()
{
ContextRegistry.Clear();
tesla = new Inventor("Nikola Tesla", new DateTime(1856, 7, 9), "Serbian");
tesla.Inventions = new string[]
{
"Telephone repeater", "Rotating magnetic field principle",
"Polyphase alternating-current system", "Induction motor",
"Alternating-current power transmission", "Tesla coil transformer",
"Wireless communication", "Radio", "Fluorescent lights"
};
tesla.PlaceOfBirth.City = "Smiljan";
pupin = new Inventor("Mihajlo Pupin", new DateTime(1854, 10, 9), "Serbian");
pupin.Inventions = new string[] { "Long distance telephony & telegraphy", "Secondary X-Ray radiation", "Sonar" };
pupin.PlaceOfBirth.City = "Idvor";
pupin.PlaceOfBirth.Country = "Serbia";
ieee = new Society();
ieee.Members.Add(tesla);
ieee.Members.Add(pupin);
ieee.Officers["president"] = pupin;
ieee.Officers["advisors"] = new Inventor[] { tesla, pupin }; // not historically accurate, but I need an array in the map ;-)
}
[TestFixtureTearDown]
public void TearDown()
{
//DynamicReflectionManager.SaveAssembly();
}
#endregion
[Test]
public void TestIndexers()
{
IDynamicIndexer members = DynamicIndexer.Create(typeof(ArrayList).GetProperty("Item"));
Inventor nikola = (Inventor) members.GetValue(ieee.Members, new object[] { 0 });
Assert.AreEqual(tesla, nikola);
members.SetValue(ieee.Members, new object[] { 0 }, new Inventor("Ana Maria Seovic", new DateTime(2004, 8, 14), "Serbian"));
Assert.AreEqual("Ana Maria Seovic", ((Inventor) members.GetValue(ieee.Members, 0)).Name);
members.SetValue(ieee.Members, 1, tesla);
Assert.AreEqual("Nikola Tesla", ((Inventor) members.GetValue(ieee.Members, 1)).Name);
IDynamicIndexer officers = DynamicIndexer.Create(typeof(Hashtable).GetProperty("Item"));
Assert.AreEqual(pupin, officers.GetValue(ieee.Officers, new object[] {"president"}));
officers.SetValue(ieee.Officers, "president",
new Inventor("Aleksandar Seovic", new DateTime(1974, 8, 24), "Serbian"));
Assert.AreEqual("Aleksandar Seovic", ((Inventor)officers.GetValue(ieee.Officers, "president")).Name);
}
#region Performance tests
private DateTime start, stop;
//[Test]
public void PerformanceTests()
{
int n = 10000000;
object x = null;
// ieee.Members[0]
start = DateTime.Now;
for (int i = 0; i < n; i++)
{
x = ieee.Members[0];
}
stop = DateTime.Now;
PrintTest("ieee.Members[0] (direct)", n, Elapsed);
start = DateTime.Now;
IDynamicIndexer members = DynamicIndexer.Create(typeof(ArrayList).GetProperty("Item"));
for (int i = 0; i < n; i++)
{
x = members.GetValue(ieee.Members, 0);
}
stop = DateTime.Now;
PrintTest("ieee.Members[0] (dynamic reflection)", n, Elapsed);
start = DateTime.Now;
PropertyInfo membersPi = typeof(ArrayList).GetProperty("Item");
object[] indexArgs = new object[] { 0 };
for (int i = 0; i < n; i++)
{
x = membersPi.GetValue(ieee.Members, indexArgs);
}
stop = DateTime.Now;
PrintTest("ieee.Members[0] (standard reflection)", n, Elapsed);
}
private double Elapsed
{
get { return (stop.Ticks - start.Ticks) / 10000000f; }
}
private void PrintTest(string name, int iterations, double duration)
{
Debug.WriteLine(String.Format("{0,-60} {1,12:#,###} {2,12:##0.000} {3,12:#,###}", name, iterations, duration, iterations / duration));
}
#endregion
}
}
|