You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
6.1 KiB
201 lines
6.1 KiB
15 years ago
|
// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc.
|
||
|
//
|
||
|
// This program is free software; you can redistribute it and/or modify
|
||
|
// it under the terms of the GNU General Public License version 2 as published by
|
||
|
// the Free Software Foundation
|
||
|
//
|
||
|
// There are special exceptions to the terms and conditions of the GPL
|
||
|
// as it is applied to this software. View the full text of the
|
||
|
// exception in file EXCEPTIONS in the directory of this software
|
||
|
// distribution.
|
||
|
//
|
||
|
// This program is distributed in the hope that it will be useful,
|
||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
// GNU General Public License for more details.
|
||
|
//
|
||
|
// You should have received a copy of the GNU General Public License
|
||
|
// along with this program; if not, write to the Free Software
|
||
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
|
||
|
using System;
|
||
|
using System.Reflection;
|
||
|
using NUnit.Framework;
|
||
|
using System.Collections;
|
||
|
|
||
|
namespace MySql.Data.MySqlClient.Tests
|
||
|
{
|
||
|
public class TestRunner
|
||
|
{
|
||
|
private ArrayList tests = new ArrayList();
|
||
|
|
||
|
public event EventHandler FixtureStarted;
|
||
|
public event EventHandler FixtureDone;
|
||
|
public event EventHandler TestStarted;
|
||
|
public event EventHandler TestDone;
|
||
|
|
||
|
public ArrayList LoadTests()
|
||
|
{
|
||
|
Assembly me = Assembly.GetExecutingAssembly();
|
||
|
|
||
|
Type[] types = me.GetTypes();
|
||
|
|
||
|
foreach (Type t in types)
|
||
|
{
|
||
|
object[] o = t.GetCustomAttributes(typeof(TestFixtureAttribute), false);
|
||
|
if (o == null || o.Length == 0) continue;
|
||
|
|
||
|
TestCollection tc = new TestCollection();
|
||
|
tc.name = t.Name;
|
||
|
tc.fixtureType = t;
|
||
|
|
||
|
FindMethods(t, tc);
|
||
|
if (tc.testMethods.Count > 0)
|
||
|
tests.Add(tc);
|
||
|
}
|
||
|
return tests;
|
||
|
}
|
||
|
|
||
|
private void FindMethods(Type t, TestCollection tc)
|
||
|
{
|
||
|
// now get all the methods on the fixture
|
||
|
MethodInfo[] methods = t.GetMethods(
|
||
|
BindingFlags.Public | BindingFlags.NonPublic |
|
||
|
BindingFlags.Instance);
|
||
|
|
||
|
// if there is a fixture setup routine, invoke it
|
||
|
foreach (MethodInfo mi in methods)
|
||
|
{
|
||
|
if (mi.IsPrivate) continue;
|
||
|
|
||
|
object[] attr = mi.GetCustomAttributes(true);
|
||
|
|
||
|
foreach (Attribute a in attr)
|
||
|
{
|
||
|
if (a is TestFixtureSetUpAttribute)
|
||
|
tc.classSetup = mi;
|
||
|
else if (a is TestFixtureTearDownAttribute)
|
||
|
tc.classTeardown = mi;
|
||
|
else if (a is SetUpAttribute)
|
||
|
tc.setup = mi;
|
||
|
else if (a is TearDownAttribute)
|
||
|
tc.tearDown = mi;
|
||
|
else if (a is TestAttribute)
|
||
|
{
|
||
|
TestMethod tm = new TestMethod();
|
||
|
tm.member = mi;
|
||
|
tc.testMethods.Add(tm);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void StartFixture(TestCollection tc)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
if (tc.fixture == null)
|
||
|
tc.fixture = Activator.CreateInstance(tc.fixtureType);
|
||
|
|
||
|
if (tc.classSetup != null)
|
||
|
tc.classSetup.Invoke(tc.fixture, null);
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
tc.message = ex.Message;
|
||
|
tc.stack = ex.StackTrace;
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void EndFixture(TestCollection tc)
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
if (tc.classTeardown != null)
|
||
|
tc.classTeardown.Invoke(tc.fixture, null);
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
tc.message = ex.Message;
|
||
|
tc.stack = ex.StackTrace;
|
||
|
throw;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool RunTest(int fixtureIndex, int methodIndex)
|
||
|
{
|
||
|
TestCollection tc = (TestCollection)tests[fixtureIndex];
|
||
|
TestMethod tm = (TestMethod)tc.testMethods[methodIndex];
|
||
|
try
|
||
|
{
|
||
|
if (tc.setup != null)
|
||
|
tc.setup.Invoke(tc.fixture, null);
|
||
|
|
||
|
tm.member.Invoke(tc.fixture, null);
|
||
|
|
||
|
if (tc.tearDown != null)
|
||
|
tc.tearDown.Invoke(tc.fixture, null);
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
catch (Exception ex)
|
||
|
{
|
||
|
tm.message = ex.Message;
|
||
|
tm.stack = ex.StackTrace;
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private void OnTestDone()
|
||
|
{
|
||
|
if (TestDone != null)
|
||
|
TestDone(this, null);
|
||
|
}
|
||
|
|
||
|
private void OnTestStarted()
|
||
|
{
|
||
|
if (TestStarted != null)
|
||
|
TestStarted(this, null);
|
||
|
}
|
||
|
|
||
|
private void OnFixtureStated()
|
||
|
{
|
||
|
if (FixtureStarted != null)
|
||
|
FixtureStarted(this, null);
|
||
|
}
|
||
|
|
||
|
private void OnFixtureDone()
|
||
|
{
|
||
|
if (FixtureDone != null)
|
||
|
FixtureDone(this, null);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class TestCollection
|
||
|
{
|
||
|
public string name;
|
||
|
public ArrayList testMethods;
|
||
|
public MethodInfo classSetup;
|
||
|
public MethodInfo classTeardown;
|
||
|
public MethodInfo setup;
|
||
|
public MethodInfo tearDown;
|
||
|
public object fixture;
|
||
|
public Type fixtureType;
|
||
|
public string message;
|
||
|
public string stack;
|
||
|
|
||
|
public TestCollection()
|
||
|
{
|
||
|
testMethods = new ArrayList();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public class TestMethod
|
||
|
{
|
||
|
public MethodInfo member;
|
||
|
public string message;
|
||
|
public string stack;
|
||
|
}
|
||
|
}
|