22using System . Collections ;
33using System . Collections . Generic ;
44using System . Linq ;
5+ using System . Text ;
56
67namespace TestStack . BDDfy
78{
@@ -17,6 +18,7 @@ public ExampleTable(params string[] headers)
1718 public string [ ] Headers { get ; private set ; }
1819
1920 public int Count { get { return _rows . Count ; } }
21+
2022 public bool IsReadOnly { get { return false ; } }
2123
2224 public void Add ( params object [ ] items )
@@ -96,5 +98,68 @@ private static string Sanitise(string value)
9698 {
9799 return value . Replace ( " " , string . Empty ) . Replace ( "_" , string . Empty ) ;
98100 }
101+
102+ public string ToString ( string [ ] additionalHeaders , string [ ] [ ] additionalData )
103+ {
104+ var numberColumns = Headers . Length + additionalHeaders . Length ;
105+ var maxWidth = new int [ numberColumns ] ;
106+
107+ var rows = new List < string [ ] > ( ) ;
108+
109+ Action < IEnumerable < string > > addRow = cells =>
110+ {
111+ var row = new string [ numberColumns ] ;
112+ var index = 0 ;
113+
114+ foreach ( var cellText in cells )
115+ {
116+ row [ index ++ ] = cellText ;
117+ }
118+
119+ for ( var i = 0 ; i < numberColumns ; i ++ )
120+ {
121+ var rowValue = row [ i ] ;
122+ if ( rowValue != null && rowValue . Length > maxWidth [ i ] )
123+ {
124+ maxWidth [ i ] = rowValue . Length ;
125+ }
126+ }
127+
128+ rows . Add ( row ) ;
129+ } ;
130+
131+ addRow ( Headers . Concat ( additionalHeaders ) ) ;
132+ var rowIndex = 0 ;
133+ foreach ( var row in this )
134+ {
135+ var additionalValues = additionalData . Length > rowIndex ? additionalData [ rowIndex ] : Enumerable . Empty < string > ( ) ;
136+ addRow ( row . Values . Select ( v => v . GetValueAsString ( ) ) . Concat ( additionalValues ) ) ;
137+ rowIndex ++ ;
138+ }
139+
140+ var stringBuilder = new StringBuilder ( ) . AppendLine ( ) ;
141+ foreach ( var row in rows )
142+ {
143+ WriteExampleRow ( row , maxWidth , stringBuilder ) ;
144+ }
145+
146+ return stringBuilder . ToString ( ) ;
147+ }
148+
149+ public override string ToString ( )
150+ {
151+ return ToString ( new string [ 0 ] , new string [ 0 ] [ ] ) ;
152+ }
153+
154+ private void WriteExampleRow ( string [ ] row , int [ ] maxWidth , StringBuilder stringBuilder )
155+ {
156+ for ( var index = 0 ; index < row . Length ; index ++ )
157+ {
158+ var col = row [ index ] ;
159+ stringBuilder . AppendFormat ( "| {0} " , ( col ?? string . Empty ) . Trim ( ) . PadRight ( maxWidth [ index ] ) ) ;
160+ }
161+
162+ stringBuilder . AppendLine ( "|" ) ;
163+ }
99164 }
100165}
0 commit comments