blob: a2def5e09b856036a9d76e268ab8f6f0337d79f4 [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]
16 public void TestEmptyMessage()
17 {
18 TestXmlChild message = TestXmlChild.CreateBuilder()
19 .Build();
20
21 StringWriter sw = new StringWriter();
22 XmlTextWriter xw = new XmlTextWriter(sw);
23
24 //When we call message.WriteTo, we are responsible for the root element
25 xw.WriteStartElement("root");
26 message.WriteTo(new XmlFormatWriter(xw));
27 xw.WriteEndElement();
28 xw.Flush();
29
30 string xml = sw.ToString();
31 XmlFormatReader rdr = new XmlFormatReader(xml);
32 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
33 Assert.AreEqual(message, copy);
34 }
35 [Test]
36 public void TestRepeatedField()
37 {
38 TestXmlChild message = TestXmlChild.CreateBuilder()
39 .AddOptions(EnumOptions.ONE)
40 .AddOptions(EnumOptions.TWO)
41 .Build();
42
43 //Allow the writer to write the root element
44 StringWriter sw = new StringWriter();
45 new XmlFormatWriter(sw).WriteMessage("root", message);
46
47 string xml = sw.ToString();
48 XmlFormatReader rdr = new XmlFormatReader(xml);
49 TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build();
50 Assert.AreEqual(message, copy);
51 }
52 [Test]
53 public void TestNestedEmptyMessage()
54 {
55 TestXmlMessage message = TestXmlMessage.CreateBuilder()
56 .SetChild(TestXmlChild.CreateBuilder().Build())
57 .Build();
58
59 StringWriter sw = new StringWriter();
60 new XmlFormatWriter(sw).WriteMessage("root", message);
61
62 string xml = sw.ToString();
63 XmlFormatReader rdr = new XmlFormatReader(xml);
64 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
65 Assert.AreEqual(message, copy);
66 }
67 [Test]
68 public void TestNestedMessage()
69 {
70 TestXmlMessage message = TestXmlMessage.CreateBuilder()
71 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build())
72 .Build();
73
74 StringWriter sw = new StringWriter();
75 new XmlFormatWriter(sw).WriteMessage("root", message);
76
77 string xml = sw.ToString();
78 XmlFormatReader rdr = new XmlFormatReader(xml);
79 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
80 Assert.AreEqual(message, copy);
81 }
82 [Test]
83 public void TestBooleanTypes()
84 {
85 TestXmlMessage message = TestXmlMessage.CreateBuilder()
86 .SetValid(true)
87 .Build();
88
89 StringWriter sw = new StringWriter();
90 new XmlFormatWriter(sw).WriteMessage("root", message);
91
92 string xml = sw.ToString();
93 XmlFormatReader rdr = new XmlFormatReader(xml);
94 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
95 Assert.AreEqual(message, copy);
96 }
97 [Test]
98 public void TestFullMessage()
99 {
100 TestXmlMessage message = TestXmlMessage.CreateBuilder()
101 .SetValid(true)
102 .SetText("text")
103 .AddTextlines("a")
104 .AddTextlines("b")
105 .AddTextlines("c")
106 .SetNumber(0x1010101010)
107 .AddNumbers(1)
108 .AddNumbers(2)
109 .AddNumbers(3)
110 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
111 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
112 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
113 .Build();
114
115 StringWriter sw = new StringWriter();
116 new XmlFormatWriter(sw).WriteMessage("root", message);
117
118 string xml = sw.ToString();
119
120 XmlFormatReader rdr = new XmlFormatReader(xml);
121 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
122 Assert.AreEqual(message, copy);
123 }
124 [Test]
125 public void TestFullMessageWithRichTypes()
126 {
127 TestXmlMessage message = TestXmlMessage.CreateBuilder()
128 .SetValid(true)
129 .SetText("text")
130 .AddTextlines("a")
131 .AddTextlines("b")
132 .AddTextlines("c")
133 .SetNumber(0x1010101010)
134 .AddNumbers(1)
135 .AddNumbers(2)
136 .AddNumbers(3)
137 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
138 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
139 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
140 .Build();
141
142 StringWriter sw = new StringWriter();
143 new XmlFormatWriter(sw)
144 {
145 Options = XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues
146 }.WriteMessage("root", message);
147
148 string xml = sw.ToString();
149
150 XmlFormatReader rdr = new XmlFormatReader(xml);
151 rdr.Options = XmlReaderOptions.ReadNestedArrays;
152 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
153 Assert.AreEqual(message, copy);
154 }
155 [Test]
156 public void TestFullMessageWithUnknownFields()
157 {
158 TestXmlMessage origial = TestXmlMessage.CreateBuilder()
159 .SetValid(true)
160 .SetText("text")
161 .AddTextlines("a")
162 .AddTextlines("b")
163 .AddTextlines("c")
164 .SetNumber(0x1010101010)
165 .AddNumbers(1)
166 .AddNumbers(2)
167 .AddNumbers(3)
168 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
169 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
170 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
171 .Build();
172 TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build();
173
174 Assert.AreEqual(0, message.AllFields.Count);
175
176 StringWriter sw = new StringWriter();
177 new XmlFormatWriter(sw)
178 {
179 Options = XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues
180 }.WriteMessage("root", message);
181
182 string xml = sw.ToString();
183
184 using (XmlReader x = XmlReader.Create(new StringReader(xml)))
185 {
186 x.MoveToContent();
187 Assert.AreEqual(XmlNodeType.Element, x.NodeType);
188 //should always be empty
189 Assert.IsTrue(x.IsEmptyElement ||
190 (x.Read() && x.NodeType == XmlNodeType.EndElement)
191 );
192 }
193
194 XmlFormatReader rdr = new XmlFormatReader(xml);
195 rdr.Options = XmlReaderOptions.ReadNestedArrays;
196 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
197 Assert.AreEqual(TestXmlMessage.DefaultInstance, copy);
198 }
199 [Test]
200 public void TestMessageWithXmlText()
201 {
202 TestXmlMessage message = TestXmlMessage.CreateBuilder()
203 .SetText("<text>").Build();
204
205 StringWriter sw = new StringWriter();
206 new XmlFormatWriter(sw).WriteMessage("root", message);
207
208 string xml = sw.ToString();
209
210 XmlFormatReader rdr = new XmlFormatReader(xml);
211 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
212 Assert.AreEqual(message, copy);
213 }
214 [Test]
215 public void TestXmlWithWhitespace()
216 {
217 TestXmlMessage message = TestXmlMessage.CreateBuilder()
218 .SetText(" \t <- leading space and trailing -> \r\n\t").Build();
219
220 StringWriter sw = new StringWriter();
221 new XmlFormatWriter(sw).WriteMessage("root", message);
222
223 string xml = sw.ToString();
224
225 XmlFormatReader rdr = new XmlFormatReader(xml);
226 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
227 Assert.AreEqual(message, copy);
228 }
229 [Test]
230 public void TestXmlWithExtensionText()
231 {
232 TestXmlMessage message = TestXmlMessage.CreateBuilder()
233 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
234 .Build();
235
236 StringWriter sw = new StringWriter();
237 new XmlFormatWriter(sw).WriteMessage("root", message);
238
239 string xml = sw.ToString();
240
241 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
242 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
243
244 XmlFormatReader rdr = new XmlFormatReader(xml);
245 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
246 Assert.AreEqual(message, copy);
247 }
248 [Test]
249 public void TestXmlWithExtensionMessage()
250 {
251 TestXmlMessage message = TestXmlMessage.CreateBuilder()
252 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
253 new TestXmlExtension.Builder().SetNumber(42).Build()).Build();
254
255 StringWriter sw = new StringWriter();
256 new XmlFormatWriter(sw).WriteMessage("root", message);
257
258 string xml = sw.ToString();
259
260 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
261 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
262
263 XmlFormatReader rdr = new XmlFormatReader(xml);
264 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
265 Assert.AreEqual(message, copy);
266 }
267 [Test]
268 public void TestXmlWithExtensionArray()
269 {
270 TestXmlMessage message = TestXmlMessage.CreateBuilder()
271 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
272 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
273 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
274 .Build();
275
276 StringWriter sw = new StringWriter();
277 new XmlFormatWriter(sw).WriteMessage("root", message);
278
279 string xml = sw.ToString();
280
281 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
282 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
283
284 XmlFormatReader rdr = new XmlFormatReader(xml);
285 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
286 Assert.AreEqual(message, copy);
287 }
288 [Test]
289 public void TestXmlWithExtensionEnum()
290 {
291 TestXmlMessage message = TestXmlMessage.CreateBuilder()
292 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
293 .Build();
294
295 StringWriter sw = new StringWriter();
296 new XmlFormatWriter(sw).WriteMessage("root", message);
297
298 string xml = sw.ToString();
299
300 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
301 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
302
303 XmlFormatReader rdr = new XmlFormatReader(xml);
304 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
305 Assert.AreEqual(message, copy);
306 }
307 }
308}