1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
4
+ using System . Text ;
5
+ using Xunit ;
6
+
7
+ namespace Wrapper
8
+ {
9
+ public class WrapperTests : IDisposable
10
+ {
11
+ private string original ;
12
+ private string result ;
13
+
14
+ [ Fact ]
15
+ public void Test_Column_72 ( )
16
+ {
17
+ string expected =
18
+ "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy\n " +
19
+ "eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam\n " +
20
+ "voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet\n " +
21
+ "clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit\n " +
22
+ "amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam\n " +
23
+ "nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat,\n " +
24
+ "sed diam voluptua. At vero eos et accusam et justo duo dolores et ea\n " +
25
+ "rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem\n " +
26
+ "ipsum dolor sit amet." ;
27
+ original = Text . LoremIpsum ;
28
+ result = LineWrapper . Wrap ( Text . LoremIpsum , 72 ) ;
29
+ Assert . Equal ( expected , result ) ;
30
+ }
31
+
32
+ [ Fact ]
33
+ public void Can_Break_Two_Words_with_Column_2 ( )
34
+ {
35
+ original = "aa aa" ;
36
+ result = LineWrapper . Wrap ( original , 2 ) ;
37
+ Assert . Equal ( "aa\n aa" , result ) ;
38
+ }
39
+
40
+ [ Fact ]
41
+ public void Dont_Break_One_Word_with_Column_2 ( )
42
+ {
43
+ original = "aaaa" ;
44
+ result = LineWrapper . Wrap ( original , 2 ) ;
45
+ Assert . Equal ( "aaaa" , result ) ;
46
+ }
47
+
48
+ [ Fact ]
49
+ public void Can_Break_Three_Words_with_Column_2 ( )
50
+ {
51
+ original = "aaa bb ccc" ;
52
+ result = LineWrapper . Wrap ( original , 2 ) ;
53
+ Assert . Equal ( "aaa\n bb\n ccc" , result ) ;
54
+ }
55
+
56
+ [ Fact ]
57
+ public void Can_Break_Five_Words_with_Column_2 ( )
58
+ {
59
+ original = "aaa b c d eee" ;
60
+ result = LineWrapper . Wrap ( original , 2 ) ;
61
+ Assert . Equal ( "aaa\n b\n c\n d\n eee" , result ) ;
62
+ }
63
+
64
+ [ Fact ]
65
+ public void Can_Break_Three_Small_Words_with_Column_3 ( )
66
+ {
67
+ original = "a b c" ;
68
+ result = LineWrapper . Wrap ( original , 3 ) ;
69
+ Assert . Equal ( "a b\n c" , result ) ;
70
+ }
71
+
72
+ [ Fact ]
73
+ public void Dont_Break_DoubleSpaces_in_Line ( )
74
+ {
75
+ original = "aa bb cc c" ;
76
+ result = LineWrapper . Wrap ( original , 6 ) ;
77
+ Assert . Equal ( "aa bb\n cc c" , result ) ;
78
+ }
79
+
80
+ [ Fact ]
81
+ public void Empy_String_result_in_Empty_String ( )
82
+ {
83
+ original = "" ;
84
+ result = LineWrapper . Wrap ( original , 6 ) ;
85
+ Assert . Equal ( "" , result ) ;
86
+ }
87
+
88
+ [ Fact ]
89
+ public void Lots_of_Spaces_at_EndOf_Line_should_removed ( )
90
+ {
91
+ original = "a " ;
92
+ result = LineWrapper . Wrap ( original , 4 ) ;
93
+ Assert . Equal ( "a" , result ) ;
94
+ }
95
+
96
+ [ Fact ]
97
+ public void Multiple_Lines_with_Lots_of_Spaces__at_EndOf_Line_should_removed ( )
98
+ {
99
+ original = "a b c d e " ;
100
+ result = LineWrapper . Wrap ( original , 4 ) ;
101
+ Assert . Equal ( "a\n b\n c\n d\n e" , result ) ;
102
+ }
103
+
104
+ [ Fact ]
105
+ public void Lots_of_Spaces_at_Start_of_Line_should_removed ( )
106
+ {
107
+ original = " e" ;
108
+ result = LineWrapper . Wrap ( original , 4 ) ;
109
+ Assert . Equal ( "e" , result ) ;
110
+ }
111
+ public void Dispose ( )
112
+ {
113
+ DebugWrite ( original ) ;
114
+ DebugWrite ( result ) ;
115
+ }
116
+
117
+ private void DebugWrite ( string text )
118
+ {
119
+ Console . WriteLine ( "!" + text . Replace ( "\n " , "\\ n" ) + "!" ) ;
120
+ }
121
+ }
122
+
123
+ public class LineWrapper
124
+ {
125
+ public static string Wrap ( string text , int columns )
126
+ {
127
+ var words = SplitWords ( text ) ;
128
+ return string . Join ( "\n " , WrapWords ( words , columns ) ) ;
129
+ }
130
+
131
+ private static IEnumerable < string > WrapWords ( IEnumerable < string > words , int columns )
132
+ {
133
+ var sb = new StringBuilder ( ) ;
134
+ foreach ( var word in words ) {
135
+ if ( WordExceedsLine ( sb , word , columns ) ) {
136
+ yield return sb . ToString ( ) . Trim ( ) ;
137
+ sb . Clear ( ) ;
138
+ }
139
+ if ( sb . Length != 0 )
140
+ sb . Append ( ' ' ) ;
141
+ sb . Append ( word ) ;
142
+ }
143
+ if ( sb . Length == 0 )
144
+ yield break ;
145
+ yield return sb . ToString ( ) . Trim ( ) ;
146
+ }
147
+
148
+ private static bool WordExceedsLine ( StringBuilder sb , string word , int columns )
149
+ {
150
+ if ( sb . Length == 0 ) {
151
+ return false ;
152
+ }
153
+ return ( sb . Length + word . Length + 1 ) > columns ;
154
+ }
155
+
156
+ private static IEnumerable < string > SplitWords ( string text )
157
+ {
158
+ return text . Split ( new [ ] { ' ' } ) ;
159
+ }
160
+ }
161
+ }
0 commit comments