11namespace TestStack . ConventionTests . Internal
22{
3+ using System ;
34 using System . Collections . Generic ;
45 using System . Linq ;
56 using TestStack . ConventionTests . Reporting ;
67
78 public class ConventionResult : IConventionResult
89 {
9- readonly string dataDescription ;
1010 readonly List < ResultInfo > conventionResults ;
11+ readonly string dataDescription ;
1112
1213 public ConventionResult ( string dataDescription )
1314 {
@@ -30,28 +31,44 @@ public void Is<T>(string resultTitle, IEnumerable<T> failingData)
3031 failingData . Select ( FormatData ) . ToArray ( ) ) ) ;
3132 }
3233
33- public void IsSymmetric < T > (
34- string firstResultTitle , IEnumerable < T > firstFailingData ,
35- string secondResultTitle , IEnumerable < T > secondFailingData )
34+ public void IsSymmetric < TResult > (
35+ string conventionResultTitle , IEnumerable < TResult > conventionFailingData ,
36+ string inverseResultTitle , IEnumerable < TResult > inverseFailingData )
3637 {
3738 conventionResults . Add ( new ResultInfo (
38- firstFailingData . None ( ) ? TestResult . Passed : TestResult . Failed ,
39- firstResultTitle ,
39+ conventionFailingData . None ( ) ? TestResult . Passed : TestResult . Failed ,
40+ conventionResultTitle ,
4041 dataDescription ,
41- firstFailingData . Select ( FormatData ) . ToArray ( ) ) ) ;
42+ conventionFailingData . Select ( FormatData ) . ToArray ( ) ) ) ;
4243 conventionResults . Add ( new ResultInfo (
43- secondFailingData . None ( ) ? TestResult . Passed : TestResult . Failed ,
44- secondResultTitle ,
44+ inverseFailingData . None ( ) ? TestResult . Passed : TestResult . Failed ,
45+ inverseResultTitle ,
4546 dataDescription ,
46- secondFailingData . Select ( FormatData ) . ToArray ( ) ) ) ;
47+ inverseFailingData . Select ( FormatData ) . ToArray ( ) ) ) ;
48+ }
49+
50+ public void IsSymmetric < TResult > ( string conventionResultTitle , string inverseResultTitle ,
51+ Func < TResult , bool > isInclusiveData , Func < TResult , bool > dataConformsToConvention ,
52+ IEnumerable < TResult > allData )
53+ {
54+ var conventionFailingData = allData . Where ( isInclusiveData ) . Where ( d => ! dataConformsToConvention ( d ) ) ;
55+ var inverseFailingData = allData . Where ( d => ! isInclusiveData ( d ) ) . Where ( dataConformsToConvention ) ;
56+
57+ IsSymmetric (
58+ conventionResultTitle , conventionFailingData ,
59+ inverseResultTitle , inverseFailingData ) ;
4760 }
4861
4962 static ConventionReportFailure FormatData < T > ( T failingData )
5063 {
5164 var formatter = Convention . Formatters . FirstOrDefault ( f => f . CanFormat ( failingData ) ) ;
5265
5366 if ( formatter == null )
54- throw new NoDataFormatterFoundException ( typeof ( T ) . Name + " has no formatter, add one with `Convention.Formatters.Add(new MyDataFormatter());`" ) ;
67+ {
68+ throw new NoDataFormatterFoundException (
69+ typeof ( T ) . Name +
70+ " has no formatter, add one with `Convention.Formatters.Add(new MyDataFormatter());`" ) ;
71+ }
5572
5673 return formatter . Format ( failingData ) ;
5774 }
0 commit comments