2
// AsyncTests.Framework.TestCase
5
// Martin Baulig (martin.baulig@gmail.com)
7
// Copyright 2012 Xamarin Inc. (http://www.xamarin.com)
10
// Permission is hereby granted, free of charge, to any person obtaining
11
// a copy of this software and associated documentation files (the
12
// "Software"), to deal in the Software without restriction, including
13
// without limitation the rights to use, copy, modify, merge, publish,
14
// distribute, sublicense, and/or sell copies of the Software, and to
15
// permit persons to whom the Software is furnished to do so, subject to
16
// the following conditions:
18
// The above copyright notice and this permission notice shall be
19
// included in all copies or substantial portions of the Software.
21
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
using System.Collections.Generic;
32
using System.Reflection;
33
using System.Threading;
34
using System.Threading.Tasks;
35
using NUnit.Framework;
37
namespace AsyncTests.Framework {
39
public sealed class TestCase {
40
public TestFixture Fixture {
45
public AsyncTestAttribute Attribute {
50
public IList<TestCategoryAttribute> Categories {
55
public IList<TestWarning> Warnings {
60
public TestConfiguration Configuration {
61
get { return config; }
64
public MethodInfo Method {
74
public bool IsEnabled {
75
get { return !disabled; }
78
TestConfiguration config;
81
public TestCase (TestFixture fixture, AsyncTestAttribute attr, MethodInfo method)
83
this.Fixture = fixture;
84
this.Attribute = attr;
86
this.Name = method.Name;
88
IDictionary<Type, TestCategoryAttribute> categories;
89
IList<TestWarning> warnings;
92
fixture.Suite, fixture, method, out categories,
93
out warnings, out config, out disabled);
95
Categories = categories.Values.ToList ().AsReadOnly ();
100
internal void Log (string message, params object[] args)
102
Fixture.Log (message, args);
105
public async Task<TestResult> Run (TestContext context, CancellationToken cancellationToken)
107
var cts = CancellationTokenSource.CreateLinkedTokenSource (cancellationToken);
108
if (Attribute.Timeout > 0)
109
cts.CancelAfter (Attribute.Timeout);
111
var oldConfig = context.Configuration;
114
context.Configuration = Configuration;
116
var attr = Method.GetCustomAttribute<ExpectedExceptionAttribute> ();
119
result = await ExpectingException (context, attr.ExceptionType, cts.Token);
121
result = await ExpectingSuccess (context, cts.Token);
122
if (!context.HasWarnings)
124
var collection = new TestResultCollection (result.Name);
125
collection.AddChild (result);
126
collection.AddWarnings (context.Warnings);
128
} catch (Exception ex) {
129
Log ("Test {0} failed: {1}", Name, ex);
130
return new TestError (Name, null, ex);
132
context.Configuration = oldConfig;
136
async Task<TestResult> ExpectingSuccess (TestContext context,
137
CancellationToken cancellationToken)
139
await context.Invoke (this, cancellationToken);
140
return new TestSuccess (Name);
143
async Task<TestResult> ExpectingException (TestContext context, Type type,
144
CancellationToken cancellationToken)
147
await context.Invoke (this, cancellationToken);
148
var message = string.Format ("Expected an exception of type {0}", type);
149
return new TestError (Name, message, new AssertionException (message));
150
} catch (Exception ex) {
151
if (ex is TargetInvocationException)
152
ex = ((TargetInvocationException)ex).InnerException;
153
if (type.IsAssignableFrom (ex.GetType ()))
154
return new TestSuccess (Name);
155
var message = string.Format ("Expected an exception of type {0}, but got {1}",
156
type, ex.GetType ());
157
return new TestError (Name, message, new AssertionException (message, ex));