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