blob: f401481eecdbf9335df3decd9a83546fb9a5493e [file] [log] [blame]
csharptest2b868842011-06-10 14:41:47 -05001using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Text;
5using System.Xml;
6using Google.ProtocolBuffers.Serialization;
7using NUnit.Framework;
8using Google.ProtocolBuffers.TestProtos;
9
10namespace Google.ProtocolBuffers
11{
12 [TestFixture]
13 public class TestWriterFormatXml
14 {
15 [Test]
csharptestc2d2c1a2011-09-08 20:02:11 -050016 public void Example_FromXml()
17 {
18 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
19
20 XmlReader rdr = XmlReader.Create(new StringReader(@"<root><valid>true</valid></root>"));
21 builder.MergeFromXml(rdr);
22
23 TestXmlMessage message = builder.Build();
24 Assert.AreEqual(true, message.Valid);
25 }
26
27 [Test]
28 public void Example_ToXml()
29 {
30 TestXmlMessage message =
31 TestXmlMessage.CreateBuilder()
32 .SetValid(true)
33 .Build();
34
35 string Xml = message.ToXml();
36
37 Assert.AreEqual(@"<root><valid>true</valid></root>", Xml);
38 }
39
40 [Test]
41 public void Example_WriteXmlUsingICodedOutputStream()
42 {
43 TestXmlMessage message =
44 TestXmlMessage.CreateBuilder()
45 .SetValid(true)
46 .Build();
47
48 using (TextWriter output = new StringWriter())
49 using (AbstractWriter writer = XmlFormatWriter.CreateInstance(output))
50 {
csharptest60fd7732011-09-09 12:18:16 -050051 writer.WriteMessageStart(); //manually begin the message, output is '{'
csharptestc2d2c1a2011-09-08 20:02:11 -050052
53 ICodedOutputStream stream = writer;
csharptest60fd7732011-09-09 12:18:16 -050054 message.WriteTo(stream); //write the message normally
csharptestc2d2c1a2011-09-08 20:02:11 -050055
csharptest60fd7732011-09-09 12:18:16 -050056 writer.WriteMessageEnd(); //manually write the end message '}'
csharptestc2d2c1a2011-09-08 20:02:11 -050057 Assert.AreEqual(@"<root><valid>true</valid></root>", output.ToString());
58 }
59 }
60
61 [Test]
62 public void Example_ReadXmlUsingICodedInputStream()
63 {
64 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
csharptest60fd7732011-09-09 12:18:16 -050065 ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root><valid>true</valid></root>");
csharptestc2d2c1a2011-09-08 20:02:11 -050066
csharptest60fd7732011-09-09 12:18:16 -050067 reader.ReadMessageStart(); //manually read the begin the message '{'
csharptestc2d2c1a2011-09-08 20:02:11 -050068
csharptest60fd7732011-09-09 12:18:16 -050069 builder.MergeFrom(reader); //read the message normally
csharptestc2d2c1a2011-09-08 20:02:11 -050070
csharptest60fd7732011-09-09 12:18:16 -050071 reader.ReadMessageEnd(); //manually read the end message '}'
csharptestc2d2c1a2011-09-08 20:02:11 -050072 }
73
74 [Test]
csharptestf2925232011-06-11 10:41:57 -050075 public void TestToXmlParseFromXml()
76 {
77 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
78 string xml = msg.ToXml();
79 Assert.AreEqual("<root><default_bool>true</default_bool></root>", xml);
csharptest0f3540e2011-08-05 20:40:14 -050080 TestAllTypes copy = new TestAllTypes.Builder().MergeFromXml(XmlReader.Create(new StringReader(xml))).Build();
csharptestf2925232011-06-11 10:41:57 -050081 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
82 Assert.AreEqual(msg, copy);
83 }
84
85 [Test]
86 public void TestToXmlParseFromXmlWithRootName()
87 {
88 TestAllTypes msg = new TestAllTypes.Builder().SetDefaultBool(true).Build();
89 string xml = msg.ToXml("message");
90 Assert.AreEqual("<message><default_bool>true</default_bool></message>", xml);
csharptest0f3540e2011-08-05 20:40:14 -050091 TestAllTypes copy = new TestAllTypes.Builder().MergeFromXml("message", XmlReader.Create(new StringReader(xml))).Build();
csharptestf2925232011-06-11 10:41:57 -050092 Assert.IsTrue(copy.HasDefaultBool && copy.DefaultBool);
93 Assert.AreEqual(msg, copy);
94 }
95
96 [Test]
csharptest2b868842011-06-10 14:41:47 -050097 public void TestEmptyMessage()
98 {
99 TestXmlChild message = TestXmlChild.CreateBuilder()
100 .Build();
101
102 StringWriter sw = new StringWriter();
103 XmlTextWriter xw = new XmlTextWriter(sw);
104
105 //When we call message.WriteTo, we are responsible for the root element
106 xw.WriteStartElement("root");
csharptest7fc785c2011-06-10 23:54:53 -0500107 message.WriteTo(XmlFormatWriter.CreateInstance(xw));
csharptest2b868842011-06-10 14:41:47 -0500108 xw.WriteEndElement();
109 xw.Flush();
110
111 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500112 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500113 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
114 Assert.AreEqual(message, copy);
115 }
116 [Test]
117 public void TestRepeatedField()
118 {
119 TestXmlChild message = TestXmlChild.CreateBuilder()
120 .AddOptions(EnumOptions.ONE)
121 .AddOptions(EnumOptions.TWO)
122 .Build();
123
124 //Allow the writer to write the root element
125 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500126 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500127
128 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500129 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500130 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
131 Assert.AreEqual(message, copy);
132 }
133 [Test]
134 public void TestNestedEmptyMessage()
135 {
136 TestXmlMessage message = TestXmlMessage.CreateBuilder()
137 .SetChild(TestXmlChild.CreateBuilder().Build())
138 .Build();
139
140 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500141 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500142
143 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500144 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500145 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
146 Assert.AreEqual(message, copy);
147 }
148 [Test]
149 public void TestNestedMessage()
150 {
151 TestXmlMessage message = TestXmlMessage.CreateBuilder()
152 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
153 .Build();
154
155 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500156 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500157
158 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500159 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500160 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
161 Assert.AreEqual(message, copy);
162 }
163 [Test]
164 public void TestBooleanTypes()
165 {
166 TestXmlMessage message = TestXmlMessage.CreateBuilder()
167 .SetValid(true)
168 .Build();
169
170 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500171 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500172
173 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -0500174 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500175 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
176 Assert.AreEqual(message, copy);
177 }
178 [Test]
179 public void TestFullMessage()
180 {
181 TestXmlMessage message = TestXmlMessage.CreateBuilder()
182 .SetValid(true)
183 .SetText("text")
184 .AddTextlines("a")
185 .AddTextlines("b")
186 .AddTextlines("c")
187 .SetNumber(0x1010101010)
188 .AddNumbers(1)
189 .AddNumbers(2)
190 .AddNumbers(3)
191 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
192 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
193 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
194 .Build();
195
196 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500197 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500198
199 string xml = sw.ToString();
200
csharptest7fc785c2011-06-10 23:54:53 -0500201 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500202 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
203 Assert.AreEqual(message, copy);
204 }
205 [Test]
206 public void TestFullMessageWithRichTypes()
207 {
208 TestXmlMessage message = TestXmlMessage.CreateBuilder()
209 .SetValid(true)
210 .SetText("text")
211 .AddTextlines("a")
212 .AddTextlines("b")
213 .AddTextlines("c")
214 .SetNumber(0x1010101010)
215 .AddNumbers(1)
216 .AddNumbers(2)
217 .AddNumbers(3)
218 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
219 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
220 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
221 .Build();
222
223 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500224 XmlFormatWriter.CreateInstance(sw)
225 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
226 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500227
228 string xml = sw.ToString();
229
csharptest7fc785c2011-06-10 23:54:53 -0500230 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500231 rdr.Options = XmlReaderOptions.ReadNestedArrays;
232 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
233 Assert.AreEqual(message, copy);
234 }
235 [Test]
236 public void TestFullMessageWithUnknownFields()
237 {
238 TestXmlMessage origial = TestXmlMessage.CreateBuilder()
239 .SetValid(true)
240 .SetText("text")
241 .AddTextlines("a")
242 .AddTextlines("b")
243 .AddTextlines("c")
244 .SetNumber(0x1010101010)
245 .AddNumbers(1)
246 .AddNumbers(2)
247 .AddNumbers(3)
248 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
249 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
250 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
251 .Build();
252 TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build();
253
254 Assert.AreEqual(0, message.AllFields.Count);
255
256 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500257 XmlFormatWriter.CreateInstance(sw)
258 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
259 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500260
261 string xml = sw.ToString();
262
263 using (XmlReader x = XmlReader.Create(new StringReader(xml)))
264 {
265 x.MoveToContent();
266 Assert.AreEqual(XmlNodeType.Element, x.NodeType);
267 //should always be empty
268 Assert.IsTrue(x.IsEmptyElement ||
269 (x.Read() && x.NodeType == XmlNodeType.EndElement)
270 );
271 }
272
csharptest7fc785c2011-06-10 23:54:53 -0500273 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500274 rdr.Options = XmlReaderOptions.ReadNestedArrays;
275 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
276 Assert.AreEqual(TestXmlMessage.DefaultInstance, copy);
277 }
278 [Test]
279 public void TestMessageWithXmlText()
280 {
281 TestXmlMessage message = TestXmlMessage.CreateBuilder()
282 .SetText("<text>").Build();
283
284 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500285 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500286
287 string xml = sw.ToString();
288
csharptest7fc785c2011-06-10 23:54:53 -0500289 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500290 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
291 Assert.AreEqual(message, copy);
292 }
293 [Test]
294 public void TestXmlWithWhitespace()
295 {
296 TestXmlMessage message = TestXmlMessage.CreateBuilder()
297 .SetText(" \t <- leading space and trailing -> \r\n\t").Build();
298
299 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500300 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500301
302 string xml = sw.ToString();
303
csharptest7fc785c2011-06-10 23:54:53 -0500304 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500305 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
306 Assert.AreEqual(message, copy);
307 }
308 [Test]
309 public void TestXmlWithExtensionText()
310 {
311 TestXmlMessage message = TestXmlMessage.CreateBuilder()
312 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
313 .Build();
314
315 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500316 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500317
318 string xml = sw.ToString();
319
320 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
321 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
322
csharptest7fc785c2011-06-10 23:54:53 -0500323 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500324 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
325 Assert.AreEqual(message, copy);
326 }
327 [Test]
328 public void TestXmlWithExtensionMessage()
329 {
330 TestXmlMessage message = TestXmlMessage.CreateBuilder()
331 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
332 new TestXmlExtension.Builder().SetNumber(42).Build()).Build();
333
334 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500335 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500336
337 string xml = sw.ToString();
338
339 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
340 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
341
csharptest7fc785c2011-06-10 23:54:53 -0500342 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500343 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
344 Assert.AreEqual(message, copy);
345 }
346 [Test]
347 public void TestXmlWithExtensionArray()
348 {
349 TestXmlMessage message = TestXmlMessage.CreateBuilder()
350 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
351 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
352 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
353 .Build();
354
355 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500356 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500357
358 string xml = sw.ToString();
359
360 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
361 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
362
csharptest7fc785c2011-06-10 23:54:53 -0500363 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500364 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
365 Assert.AreEqual(message, copy);
366 }
367 [Test]
368 public void TestXmlWithExtensionEnum()
369 {
370 TestXmlMessage message = TestXmlMessage.CreateBuilder()
371 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
372 .Build();
373
374 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500375 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500376
377 string xml = sw.ToString();
378
379 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
380 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
381
csharptest7fc785c2011-06-10 23:54:53 -0500382 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500383 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
384 Assert.AreEqual(message, copy);
385 }
csharptestc2d2c1a2011-09-08 20:02:11 -0500386 [Test]
387 public void TestXmlReadEmptyRoot()
388 {
389 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
csharptest60fd7732011-09-09 12:18:16 -0500390 ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root/>");
csharptestc2d2c1a2011-09-08 20:02:11 -0500391
csharptest60fd7732011-09-09 12:18:16 -0500392 reader.ReadMessageStart(); //manually read the begin the message '{'
csharptestc2d2c1a2011-09-08 20:02:11 -0500393
csharptest60fd7732011-09-09 12:18:16 -0500394 builder.MergeFrom(reader); //write the message normally
csharptestc2d2c1a2011-09-08 20:02:11 -0500395
csharptest60fd7732011-09-09 12:18:16 -0500396 reader.ReadMessageEnd(); //manually read the end message '}'
397 }
398
399 [Test]
400 public void TestXmlReadEmptyChild()
401 {
402 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
403 ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root><text /></root>");
404
405 reader.ReadMessageStart(); //manually read the begin the message '{'
406
407 builder.MergeFrom(reader); //write the message normally
408 Assert.IsTrue(builder.HasText);
409 Assert.AreEqual(String.Empty, builder.Text);
410 }
411
412 [Test]
413 public void TestXmlReadWriteWithoutRoot()
414 {
415 TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder();
416 TestXmlMessage message = builder.SetText("abc").SetNumber(123).Build();
417
418 string xml;
419 using (StringWriter sw = new StringWriter())
420 {
421 ICodedOutputStream output = XmlFormatWriter.CreateInstance(
422 XmlWriter.Create(sw, new XmlWriterSettings() { ConformanceLevel = ConformanceLevel.Fragment }));
423
424 message.WriteTo(output);
425 output.Flush();
426 xml = sw.ToString();
427 }
428 Assert.AreEqual("<text>abc</text><number>123</number>", xml);
429
430 TestXmlMessage copy;
431 using (XmlReader xr = XmlReader.Create(new StringReader(xml), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment }))
432 {
433 ICodedInputStream input = XmlFormatReader.CreateInstance(xr);
434 copy = TestXmlMessage.CreateBuilder().MergeFrom(input).Build();
435 }
436
437 Assert.AreEqual(message, copy);
csharptestc2d2c1a2011-09-08 20:02:11 -0500438 }
439
csharptest0f3540e2011-08-05 20:40:14 -0500440 [Test, ExpectedException(typeof(RecursionLimitExceededException))]
csharptest3b70dd72011-06-11 12:22:17 -0500441 public void TestRecursiveLimit()
442 {
443 StringBuilder sb = new StringBuilder(8192);
444 for (int i = 0; i < 80; i++)
445 sb.Append("<child>");
csharptest0f3540e2011-08-05 20:40:14 -0500446 TestXmlRescursive msg = new TestXmlRescursive.Builder().MergeFromXml("child", XmlReader.Create(new StringReader(sb.ToString()))).Build();
csharptest3b70dd72011-06-11 12:22:17 -0500447 }
csharptest2b868842011-06-10 14:41:47 -0500448 }
449}