adding the new files is important
[mono.git] / mcs / nunit20 / framework / StringTextWriter.cs
1 #region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
2 /************************************************************************************
3 '
4 ' Copyright © 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
5 ' Copyright © 2000-2003 Philip A. Craig
6 '
7 ' This software is provided 'as-is', without any express or implied warranty. In no 
8 ' event will the authors be held liable for any damages arising from the use of this 
9 ' software.
10
11 ' Permission is granted to anyone to use this software for any purpose, including 
12 ' commercial applications, and to alter it and redistribute it freely, subject to the 
13 ' following restrictions:
14 '
15 ' 1. The origin of this software must not be misrepresented; you must not claim that 
16 ' you wrote the original software. If you use this software in a product, an 
17 ' acknowledgment (see the following) in the product documentation is required.
18 '
19 ' Portions Copyright © 2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
20 ' or Copyright © 2000-2003 Philip A. Craig
21 '
22 ' 2. Altered source versions must be plainly marked as such, and must not be 
23 ' misrepresented as being the original software.
24 '
25 ' 3. This notice may not be removed or altered from any source distribution.
26 '
27 '***********************************************************************************/
28 #endregion
29
30 using System;
31 using System.IO;
32 using System.Text;
33
34 namespace NUnit.Core
35 {
36         #region StringTextWriter
37
38         /// <summary>
39         /// Use this wrapper to ensure that only strings get passed accross the AppDomain
40         /// boundary.  Otherwise tests will break when non-remotable objects are passed to
41         /// Console.Write/WriteLine.
42         /// </summary>
43         public class StringTextWriter : TextWriter
44         {
45                 public StringTextWriter( TextWriter aTextWriter )
46                 {
47                         theTextWriter = aTextWriter;
48                 }
49
50                 protected TextWriter theTextWriter;
51
52                 override public void Write(char aChar)
53                 {
54                         theTextWriter.Write(aChar);
55                 }
56
57                 override public void Write(string aString)
58                 {
59                         theTextWriter.Write(aString);
60                 }
61
62                 override public void WriteLine(string aString)
63                 {
64                         theTextWriter.WriteLine(aString);
65                 }
66
67                 override public System.Text.Encoding Encoding
68                 {
69                         get { return theTextWriter.Encoding; }
70                 }
71         }
72
73         #endregion
74
75         #region BufferedStringTextWriter
76
77         /// <summary>
78         /// This wrapper derives from StringTextWriter and adds buffering
79         /// to improve cross-domain performance. The buffer is flushed whenever
80         /// it reaches or exceeds a maximum size or when WriteLine is called.
81         /// </summary>
82         public class BufferedStringTextWriter : StringTextWriter
83         {
84                 public BufferedStringTextWriter( TextWriter aTextWriter ) : base( aTextWriter ){ }
85         
86                 private static readonly int MAX_BUFFER = 1000;
87                 private StringBuilder sb = new StringBuilder( MAX_BUFFER );
88
89                 override public void Write(char aChar)
90                 {
91                         lock( sb )
92                         {
93                                 sb.Append( aChar );
94                                 this.CheckBuffer();
95                         }
96                 }
97
98                 override public void Write(string aString)
99                 {
100                         lock( sb )
101                         {
102                                 sb.Append( aString );
103                                 this.CheckBuffer();
104                         }
105                 }
106
107                 override public void WriteLine(string aString)
108                 {
109                         lock( sb )
110                         {
111                                 sb.Append( aString );
112                                 sb.Append( '\n' );
113                                 this.CheckBuffer();
114                         }
115                 }
116
117                 override public void Flush()
118                 {
119                         if ( sb.Length > 0 )
120                         {
121                                 lock( sb )
122                                 {
123                                         theTextWriter.Write( sb.ToString() );
124                                         sb.Length = 0;
125                                 }
126                         }
127                 }
128
129                 private void CheckBuffer()
130                 {
131                         if ( sb.Length >= MAX_BUFFER )
132                                 this.Flush();
133                 }
134         
135                 override public void Close()
136                 {
137                         this.Flush();
138                         theTextWriter.Close();
139                 }
140         }
141
142         #endregion
143 }