99 using ApprovalTests . Core . Exceptions ;
1010 using TestStack . ConventionTests . Conventions ;
1111 using TestStack . ConventionTests . Internal ;
12+ using TestStack . ConventionTests . Reporting ;
1213
1314 public static class Convention
1415 {
1516 static readonly HtmlReportRenderer HtmlRenderer = new HtmlReportRenderer ( AssemblyDirectory ) ;
16- static readonly List < ConventionReport > Reports = new List < ConventionReport > ( ) ;
17+ static readonly List < ResultInfo > Reports = new List < ResultInfo > ( ) ;
1718
18- public static IEnumerable < ConventionReport > ConventionReports { get { return Reports ; } }
19+ static Convention ( )
20+ {
21+ Formatters = new List < IReportDataFormatter >
22+ {
23+ new TypeDataFormatter ( ) ,
24+ new ProjectReferenceFormatter ( ) ,
25+ new ProjectFileFormatter ( ) ,
26+ new MethodInfoDataFormatter ( ) ,
27+ new StringDataFormatter ( )
28+ } ;
29+ }
30+
31+ public static IEnumerable < ResultInfo > ConventionReports { get { return Reports ; } }
32+ public static IList < IReportDataFormatter > Formatters { get ; private set ; }
1933
2034 public static void Is < TDataSource , TDataType > ( IConvention < TDataSource , TDataType > convention , TDataSource data )
21- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
35+ where TDataSource : IConventionData
2236 {
2337 Is ( convention , data , new ConventionResultExceptionReporter ( ) ) ;
2438 }
2539
2640 public static void Is < TDataSource , TDataType > ( IConvention < TDataSource , TDataType > convention , TDataSource data , IConventionReportRenderer reporter )
27- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
41+ where TDataSource : IConventionData
2842 {
2943 try
3044 {
@@ -42,7 +56,7 @@ public static void Is<TDataSource, TDataType>(IConvention<TDataSource, TDataType
4256 }
4357
4458 public static void IsWithApprovedExeptions < TDataSource , TDataType > ( IConvention < TDataSource , TDataType > convention , TDataSource data )
45- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
59+ where TDataSource : IConventionData
4660 {
4761 var conventionResult = GetConventionReport ( convention . ConventionTitle , convention . GetFailingData ( data ) . ToArray ( ) , data ) ;
4862 Reports . Add ( conventionResult ) ;
@@ -69,13 +83,13 @@ public static void IsWithApprovedExeptions<TDataSource, TDataType>(IConvention<T
6983 }
7084
7185 public static void Is < TDataSource , TDataType > ( ISymmetricConvention < TDataSource , TDataType > convention , TDataSource data )
72- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
86+ where TDataSource : IConventionData
7387 {
7488 Is ( convention , data , new ConventionResultExceptionReporter ( ) ) ;
7589 }
7690
7791 public static void Is < TDataSource , TDataType > ( ISymmetricConvention < TDataSource , TDataType > convention , TDataSource data , IConventionReportRenderer reporter )
78- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
92+ where TDataSource : IConventionData
7993 {
8094 try
8195 {
@@ -95,7 +109,7 @@ public static void Is<TDataSource, TDataType>(ISymmetricConvention<TDataSource,
95109 }
96110
97111 public static void IsWithApprovedExeptions < TDataSource , TDataType > ( ISymmetricConvention < TDataSource , TDataType > convention , TDataSource data )
98- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
112+ where TDataSource : IConventionData
99113 {
100114 var conventionResult = GetConventionReport ( convention . ConventionTitle , convention . GetFailingData ( data ) . ToArray ( ) , data ) ;
101115 var inverseConventionResult = GetConventionReport ( convention . InverseTitle , convention . GetFailingInverseData ( data ) . ToArray ( ) , data ) ;
@@ -130,20 +144,30 @@ public static void IsWithApprovedExeptions<TDataSource, TDataType>(ISymmetricCon
130144 }
131145 }
132146
133- static ConventionReport GetConventionReport < TDataSource , TDataType > ( string conventionTitle , TDataType [ ] failingData , TDataSource data )
134- where TDataSource : IConventionData , ICreateReportLineFor < TDataType >
147+ static ResultInfo GetConventionReport < TDataSource , TDataType > ( string conventionTitle , TDataType [ ] failingData , TDataSource data )
148+ where TDataSource : IConventionData
135149 {
136150 data . EnsureHasNonEmptySource ( ) ;
137151 var passed = failingData . None ( ) ;
138152
139- var conventionResult = new ConventionReport (
140- passed ? Result . Passed : Result . Failed ,
153+ var conventionResult = new ResultInfo (
154+ passed ? TestResult . Passed : TestResult . Failed ,
141155 conventionTitle ,
142156 data . Description ,
143- failingData . Select ( data . CreateReportLine ) ) ;
157+ failingData . Select ( FormatData ) . ToArray ( ) ) ;
144158 return conventionResult ;
145159 }
146160
161+ static ConventionReportFailure FormatData < T > ( T failingData )
162+ {
163+ var formatter = Formatters . FirstOrDefault ( f => f . CanFormat ( failingData ) ) ;
164+
165+ if ( formatter == null )
166+ throw new NoDataFormatterFoundException ( typeof ( T ) . Name + " has no formatter, add one with `Convention.Formatters.Add(new MyDataFormatter());`" ) ;
167+
168+ return formatter . Format ( failingData ) ;
169+ }
170+
147171 // http://stackoverflow.com/questions/52797/c-how-do-i-get-the-path-of-the-assembly-the-code-is-in#answer-283917
148172 static string AssemblyDirectory
149173 {
0 commit comments