blob: 2ddf39e57cf6ba4ddd8f5a0392898f31058e0655 [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");
csharptest7fc785c2011-06-10 23:54:53 -050026 message.WriteTo(XmlFormatWriter.CreateInstance(xw));
csharptest2b868842011-06-10 14:41:47 -050027 xw.WriteEndElement();
28 xw.Flush();
29
30 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050031 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050032 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();
csharptest7fc785c2011-06-10 23:54:53 -050045 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050046
47 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050048 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050049 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();
csharptest7fc785c2011-06-10 23:54:53 -050060 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050061
62 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050063 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050064 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();
csharptest7fc785c2011-06-10 23:54:53 -050075 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050076
77 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050078 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050079 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();
csharptest7fc785c2011-06-10 23:54:53 -050090 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -050091
92 string xml = sw.ToString();
csharptest7fc785c2011-06-10 23:54:53 -050093 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -050094 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();
csharptest7fc785c2011-06-10 23:54:53 -0500116 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500117
118 string xml = sw.ToString();
119
csharptest7fc785c2011-06-10 23:54:53 -0500120 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500121 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();
csharptest7fc785c2011-06-10 23:54:53 -0500143 XmlFormatWriter.CreateInstance(sw)
144 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
145 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500146
147 string xml = sw.ToString();
148
csharptest7fc785c2011-06-10 23:54:53 -0500149 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500150 rdr.Options = XmlReaderOptions.ReadNestedArrays;
151 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
152 Assert.AreEqual(message, copy);
153 }
154 [Test]
155 public void TestFullMessageWithUnknownFields()
156 {
157 TestXmlMessage origial = TestXmlMessage.CreateBuilder()
158 .SetValid(true)
159 .SetText("text")
160 .AddTextlines("a")
161 .AddTextlines("b")
162 .AddTextlines("c")
163 .SetNumber(0x1010101010)
164 .AddNumbers(1)
165 .AddNumbers(2)
166 .AddNumbers(3)
167 .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1])))
168 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2])))
169 .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3])))
170 .Build();
171 TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build();
172
173 Assert.AreEqual(0, message.AllFields.Count);
174
175 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500176 XmlFormatWriter.CreateInstance(sw)
177 .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues)
178 .WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500179
180 string xml = sw.ToString();
181
182 using (XmlReader x = XmlReader.Create(new StringReader(xml)))
183 {
184 x.MoveToContent();
185 Assert.AreEqual(XmlNodeType.Element, x.NodeType);
186 //should always be empty
187 Assert.IsTrue(x.IsEmptyElement ||
188 (x.Read() && x.NodeType == XmlNodeType.EndElement)
189 );
190 }
191
csharptest7fc785c2011-06-10 23:54:53 -0500192 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500193 rdr.Options = XmlReaderOptions.ReadNestedArrays;
194 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
195 Assert.AreEqual(TestXmlMessage.DefaultInstance, copy);
196 }
197 [Test]
198 public void TestMessageWithXmlText()
199 {
200 TestXmlMessage message = TestXmlMessage.CreateBuilder()
201 .SetText("<text>").Build();
202
203 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500204 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500205
206 string xml = sw.ToString();
207
csharptest7fc785c2011-06-10 23:54:53 -0500208 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500209 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
210 Assert.AreEqual(message, copy);
211 }
212 [Test]
213 public void TestXmlWithWhitespace()
214 {
215 TestXmlMessage message = TestXmlMessage.CreateBuilder()
216 .SetText(" \t <- leading space and trailing -> \r\n\t").Build();
217
218 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500219 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500220
221 string xml = sw.ToString();
222
csharptest7fc785c2011-06-10 23:54:53 -0500223 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500224 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build();
225 Assert.AreEqual(message, copy);
226 }
227 [Test]
228 public void TestXmlWithExtensionText()
229 {
230 TestXmlMessage message = TestXmlMessage.CreateBuilder()
231 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ")
232 .Build();
233
234 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500235 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500236
237 string xml = sw.ToString();
238
239 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
240 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
241
csharptest7fc785c2011-06-10 23:54:53 -0500242 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500243 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
244 Assert.AreEqual(message, copy);
245 }
246 [Test]
247 public void TestXmlWithExtensionMessage()
248 {
249 TestXmlMessage message = TestXmlMessage.CreateBuilder()
250 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage,
251 new TestXmlExtension.Builder().SetNumber(42).Build()).Build();
252
253 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500254 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500255
256 string xml = sw.ToString();
257
258 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
259 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
260
csharptest7fc785c2011-06-10 23:54:53 -0500261 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500262 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
263 Assert.AreEqual(message, copy);
264 }
265 [Test]
266 public void TestXmlWithExtensionArray()
267 {
268 TestXmlMessage message = TestXmlMessage.CreateBuilder()
269 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100)
270 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101)
271 .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102)
272 .Build();
273
274 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500275 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500276
277 string xml = sw.ToString();
278
279 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
280 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
281
csharptest7fc785c2011-06-10 23:54:53 -0500282 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500283 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
284 Assert.AreEqual(message, copy);
285 }
286 [Test]
287 public void TestXmlWithExtensionEnum()
288 {
289 TestXmlMessage message = TestXmlMessage.CreateBuilder()
290 .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE)
291 .Build();
292
293 StringWriter sw = new StringWriter();
csharptest7fc785c2011-06-10 23:54:53 -0500294 XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message);
csharptest2b868842011-06-10 14:41:47 -0500295
296 string xml = sw.ToString();
297
298 ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
299 UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry);
300
csharptest7fc785c2011-06-10 23:54:53 -0500301 XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml);
csharptest2b868842011-06-10 14:41:47 -0500302 TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build();
303 Assert.AreEqual(message, copy);
304 }
305 }
306}