Skip to content

Commit e26c93b

Browse files
author
Jake Ginnivan
committed
Introduced ITestResultProcessor because there can only be one of those and it simplifies a few things
1 parent 6c3a40f commit e26c93b

11 files changed

+65
-62
lines changed

TestStack.ConventionTests/Convention.cs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,38 +41,37 @@ static string AssemblyDirectory
4141
}
4242

4343
public static void Is<TDataSource>(IConvention<TDataSource> convention, TDataSource data,
44-
params IResultsProcessor[] extraResultProcessors)
44+
ITestResultProcessor resultProcessor = null)
4545
where TDataSource : IConventionData
4646
{
47-
var processors = new List<IResultsProcessor>(extraResultProcessors)
47+
var processors = new List<IResultsProcessor>
4848
{
49-
new ConventionReportTextRenderer(),
5049
HtmlRenderer,
5150
new ConventionReportTraceRenderer(),
5251
new ThrowOnFailureResultsProcessor()
5352
};
54-
Execute(convention, data, processors.ToArray());
53+
Execute(convention, data, processors.ToArray(), resultProcessor ?? new ConventionReportTextRenderer());
5554
}
5655

5756
public static void IsWithApprovedExeptions<TDataSource>(IConvention<TDataSource> convention, TDataSource data,
58-
params IResultsProcessor[] extraResultProcessors)
57+
ITestResultProcessor resultProcessor = null)
5958
where TDataSource : IConventionData
6059
{
61-
var processors = new List<IResultsProcessor>(extraResultProcessors)
60+
var processors = new List<IResultsProcessor>
6261
{
63-
new ConventionReportTextRenderer(),
6462
HtmlRenderer,
6563
new ConventionReportTraceRenderer(),
6664
new ApproveResultsProcessor()
6765
};
68-
Execute(convention, data, processors.ToArray());
66+
Execute(convention, data, processors.ToArray(), resultProcessor ?? new ConventionReportTextRenderer());
6967
}
7068

7169
static void Execute<TDataSource>(IConvention<TDataSource> convention, TDataSource data,
72-
IResultsProcessor[] processors)
70+
IResultsProcessor[] processors, ITestResultProcessor resultProcessor)
7371
where TDataSource : IConventionData
7472
{
75-
var context = new ConventionContext(string.Format("{0} in {1}", ToSentenceCase(data.GetType().Name), data.Description), Formatters, processors);
73+
var dataDescription = string.Format("{0} in {1}", ToSentenceCase(data.GetType().Name), data.Description);
74+
var context = new ConventionContext(dataDescription, Formatters, processors, resultProcessor);
7675
context.Execute(convention, data);
7776
}
7877

TestStack.ConventionTests/Internal/ConventionContext.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ public class ConventionContext : IConventionResultContext, IConventionFormatCont
1111
readonly string dataDescription;
1212
readonly IList<IReportDataFormatter> formatters;
1313
readonly IList<IResultsProcessor> processors;
14+
readonly ITestResultProcessor testResultProcessor;
1415
readonly IList<ConventionResult> results = new List<ConventionResult>();
1516

1617
public ConventionContext(string dataDescription, IList<IReportDataFormatter> formatters,
17-
IList<IResultsProcessor> processors)
18+
IList<IResultsProcessor> processors, ITestResultProcessor testResultProcessor)
1819
{
1920
this.formatters = formatters;
2021
this.processors = processors;
22+
this.testResultProcessor = testResultProcessor;
2123
this.dataDescription = dataDescription;
2224
}
2325

@@ -26,9 +28,14 @@ public ConventionResult[] ConventionResults
2628
get { return results.ToArray(); }
2729
}
2830

31+
ITestResultProcessor IConventionFormatContext.TestResultProcessor
32+
{
33+
get { return testResultProcessor; }
34+
}
35+
2936
ConventionReportFailure IConventionFormatContext.FormatData(object failingData)
3037
{
31-
var formatter = formatters.FirstOrDefault(f => f.CanFormat(failingData));
38+
IReportDataFormatter formatter = formatters.FirstOrDefault(f => f.CanFormat(failingData));
3239
if (formatter == null)
3340
{
3441
throw new NoDataFormatterFoundException(
@@ -43,7 +50,7 @@ void IConventionResultContext.Is<TResult>(string resultTitle, IEnumerable<TResul
4350
{
4451
// ReSharper disable PossibleMultipleEnumeration
4552
results.Add(new ConventionResult(
46-
typeof(TResult),
53+
typeof (TResult),
4754
resultTitle,
4855
dataDescription,
4956
failingData.ToObjectArray()));
@@ -54,11 +61,11 @@ void IConventionResultContext.IsSymmetric<TResult>(
5461
string secondSetFailureTitle, IEnumerable<TResult> secondSetFailureData)
5562
{
5663
results.Add(new ConventionResult(
57-
typeof(TResult), firstSetFailureTitle,
64+
typeof (TResult), firstSetFailureTitle,
5865
dataDescription,
5966
firstSetFailureData.ToObjectArray()));
6067
results.Add(new ConventionResult(
61-
typeof(TResult), secondSetFailureTitle,
68+
typeof (TResult), secondSetFailureTitle,
6269
dataDescription,
6370
secondSetFailureData.ToObjectArray()));
6471
}
@@ -70,8 +77,8 @@ void IConventionResultContext.IsSymmetric<TResult>(
7077
Func<TResult, bool> isPartOfSecondSet,
7178
IEnumerable<TResult> allData)
7279
{
73-
var firstSetFailingData = allData.Where(isPartOfFirstSet).Unless(isPartOfSecondSet);
74-
var secondSetFailingData = allData.Where(isPartOfSecondSet).Unless(isPartOfFirstSet);
80+
IEnumerable<TResult> firstSetFailingData = allData.Where(isPartOfFirstSet).Unless(isPartOfSecondSet);
81+
IEnumerable<TResult> secondSetFailingData = allData.Where(isPartOfSecondSet).Unless(isPartOfFirstSet);
7582

7683
(this as IConventionResultContext).IsSymmetric(
7784
firstSetFailureTitle, firstSetFailingData,
@@ -85,7 +92,7 @@ public void Execute<TDataSource>(IConvention<TDataSource> convention, TDataSourc
8592
throw new ConventionSourceInvalidException(String.Format("{0} has no data", data.Description));
8693
convention.Execute(data, this);
8794

88-
foreach (var resultsProcessor in processors)
95+
foreach (IResultsProcessor resultsProcessor in processors)
8996
{
9097
resultsProcessor.Process(this, ConventionResults);
9198
}

TestStack.ConventionTests/Internal/ConventionResult.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ public ConventionResult(Type dataType, string conventionTitle, string dataDescri
1313
Data = data;
1414
}
1515

16-
public string RecommendedFileExtension { get; private set; }
1716
public Type DataType { get; private set; }
1817
public string ConventionTitle { get; private set; }
1918
public string DataDescription { get; private set; }
@@ -24,14 +23,6 @@ public bool HasData
2423
get { return Data.Any(); }
2524
}
2625

27-
public string FormattedResult { get; private set; }
28-
29-
public void WithFormattedResult(string formattedResult, string recommendedFileExtension = "txt")
30-
{
31-
FormattedResult = formattedResult;
32-
RecommendedFileExtension = recommendedFileExtension;
33-
}
34-
3526
protected bool Equals(ConventionResult other)
3627
{
3728
return DataType == other.DataType && string.Equals(ConventionTitle, other.ConventionTitle) && string.Equals(DataDescription, other.DataDescription);
@@ -41,7 +32,7 @@ public override bool Equals(object obj)
4132
{
4233
if (ReferenceEquals(null, obj)) return false;
4334
if (ReferenceEquals(this, obj)) return true;
44-
if (obj.GetType() != this.GetType()) return false;
35+
if (obj.GetType() != GetType()) return false;
4536
return Equals((ConventionResult) obj);
4637
}
4738

@@ -68,7 +59,7 @@ public override int GetHashCode()
6859

6960
public override string ToString()
7061
{
71-
return string.Format("FormattedResult: {0}, DataDescription: {1}, ConventionTitle: {2}, DataType: {3}, HasData: {4}, RecommendedFileExtension: {5}", FormattedResult, DataDescription, ConventionTitle, DataType, HasData, RecommendedFileExtension);
62+
return string.Format("DataType: {0}, ConventionTitle: {1}, DataDescription: {2}, HasData: {3}", DataType, ConventionTitle, DataDescription, HasData);
7263
}
7364
}
7465
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
namespace TestStack.ConventionTests.Internal
2-
{
2+
{
3+
using TestStack.ConventionTests.Reporting;
4+
35
public interface IConventionFormatContext
4-
{
5-
ConventionReportFailure FormatData(object failingData);
6+
{
7+
ConventionReportFailure FormatData(object failingData);
8+
ITestResultProcessor TestResultProcessor { get; }
69
}
710
}

TestStack.ConventionTests/Reporting/ApproveResultsProcessor.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ public void Process(IConventionFormatContext context, params ConventionResult[]
1717
var result = results[count];
1818
try
1919
{
20-
Approvals.Verify(new ConventionTestsApprovalTextWriter(result.FormattedResult, count,result.RecommendedFileExtension));
20+
//TODO Law of Demeter
21+
var formattedResult = context.TestResultProcessor.Process(context, result);
22+
var recommendedFileExtension = context.TestResultProcessor.RecommendedFileExtension;
23+
Approvals.Verify(new ConventionTestsApprovalTextWriter(formattedResult, count, recommendedFileExtension));
2124
}
2225
catch (ApprovalException ex)
2326
{

TestStack.ConventionTests/Reporting/ConventionReportTextRenderer.cs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,21 @@
33
using System.Text;
44
using TestStack.ConventionTests.Internal;
55

6-
public class ConventionReportTextRenderer : IResultsProcessor
6+
public class ConventionReportTextRenderer : ITestResultProcessor
77
{
8-
public void Process(IConventionFormatContext context, params ConventionResult[] results)
8+
public string RecommendedFileExtension { get { return "txt"; } }
9+
10+
public string Process(IConventionFormatContext context, ConventionResult result)
911
{
10-
foreach (var result in results)
11-
{
12-
if (result.FormattedResult != null)
13-
{
14-
continue;
15-
}
16-
var description = new StringBuilder();
17-
var title = string.Format("'{0}' for '{1}'", result.ConventionTitle,
18-
result.DataDescription);
19-
description.AppendLine(title);
20-
description.AppendLine(string.Empty.PadRight(title.Length, '-'));
21-
description.AppendLine();
12+
var description = new StringBuilder();
13+
var title = string.Format("'{0}' for '{1}'", result.ConventionTitle, result.DataDescription);
14+
description.AppendLine(title);
15+
description.AppendLine(string.Empty.PadRight(title.Length, '-'));
16+
description.AppendLine();
2217

23-
RenderItems(result, description, context);
24-
result.WithFormattedResult(description.ToString());
25-
}
18+
RenderItems(result, description, context);
19+
20+
return description.ToString();
2621
}
2722

2823
static void RenderItems(ConventionResult resultInfo, StringBuilder stringBuilder, IConventionFormatContext context)

TestStack.ConventionTests/Reporting/ConventionReportTraceRenderer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ public void Process(IConventionFormatContext context, params ConventionResult[]
99
{
1010
foreach (var conventionResult in results)
1111
{
12-
Trace.WriteLine(conventionResult.FormattedResult);
12+
Trace.WriteLine(context.TestResultProcessor.Process(context, conventionResult));
1313
}
1414
}
1515
}

TestStack.ConventionTests/Reporting/CsvReporter.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,9 @@
33
using System.Text;
44
using TestStack.ConventionTests.Internal;
55

6-
public class CsvReporter : IResultsProcessor
6+
public class CsvReporter : ITestResultProcessor
77
{
8-
public void Process(IConventionFormatContext context, params ConventionResult[] results)
9-
{
10-
foreach (var result in results)
11-
{
12-
result.WithFormattedResult(Process(context, result), "csv");
13-
}
14-
}
15-
16-
string Process(IConventionFormatContext context, ConventionResult result)
8+
public string Process(IConventionFormatContext context, ConventionResult result)
179
{
1810
var formatter = new DefaultFormatter(result.DataType);
1911
var message = new StringBuilder();
@@ -24,5 +16,7 @@ string Process(IConventionFormatContext context, ConventionResult result)
2416
}
2517
return message.ToString();
2618
}
19+
20+
public string RecommendedFileExtension { get { return "csv"; } }
2721
}
2822
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace TestStack.ConventionTests.Reporting
2+
{
3+
using TestStack.ConventionTests.Internal;
4+
5+
public interface ITestResultProcessor
6+
{
7+
string Process(IConventionFormatContext context, ConventionResult result);
8+
string RecommendedFileExtension { get; }
9+
}
10+
}

TestStack.ConventionTests/Reporting/ThrowOnFailureResultsProcessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public class ThrowOnFailureResultsProcessor : IResultsProcessor
88
{
99
public void Process(IConventionFormatContext context, params ConventionResult[] results)
1010
{
11-
var invalidResults = results.Where(r => r.HasData).Select(r => r.FormattedResult).ToArray();
11+
var invalidResults = results.Where(r => r.HasData).Select(r => context.TestResultProcessor.Process(context, r)).ToArray();
1212
if (invalidResults.None())
1313
{
1414
return;

0 commit comments

Comments
 (0)