using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml; using Google.ProtocolBuffers.Serialization; using NUnit.Framework; using Google.ProtocolBuffers.TestProtos; namespace Google.ProtocolBuffers { [TestFixture] public class TestWriterFormatXml { [Test] public void TestEmptyMessage() { TestXmlChild message = TestXmlChild.CreateBuilder() .Build(); StringWriter sw = new StringWriter(); XmlTextWriter xw = new XmlTextWriter(sw); //When we call message.WriteTo, we are responsible for the root element xw.WriteStartElement("root"); message.WriteTo(new XmlFormatWriter(xw)); xw.WriteEndElement(); xw.Flush(); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestRepeatedField() { TestXmlChild message = TestXmlChild.CreateBuilder() .AddOptions(EnumOptions.ONE) .AddOptions(EnumOptions.TWO) .Build(); //Allow the writer to write the root element StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestNestedEmptyMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetChild(TestXmlChild.CreateBuilder().Build()) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestNestedMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build()) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestBooleanTypes() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetValid(true) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestFullMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetValid(true) .SetText("text") .AddTextlines("a") .AddTextlines("b") .AddTextlines("c") .SetNumber(0x1010101010) .AddNumbers(1) .AddNumbers(2) .AddNumbers(3) .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3]))) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestFullMessageWithRichTypes() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetValid(true) .SetText("text") .AddTextlines("a") .AddTextlines("b") .AddTextlines("c") .SetNumber(0x1010101010) .AddNumbers(1) .AddNumbers(2) .AddNumbers(3) .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3]))) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw) { Options = XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues }.WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); rdr.Options = XmlReaderOptions.ReadNestedArrays; TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestFullMessageWithUnknownFields() { TestXmlMessage origial = TestXmlMessage.CreateBuilder() .SetValid(true) .SetText("text") .AddTextlines("a") .AddTextlines("b") .AddTextlines("c") .SetNumber(0x1010101010) .AddNumbers(1) .AddNumbers(2) .AddNumbers(3) .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.ONE).SetBinary(ByteString.CopyFrom(new byte[1]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.TWO).SetBinary(ByteString.CopyFrom(new byte[2]))) .AddChildren(TestXmlMessage.Types.Children.CreateBuilder().AddOptions(EnumOptions.THREE).SetBinary(ByteString.CopyFrom(new byte[3]))) .Build(); TestXmlNoFields message = TestXmlNoFields.CreateBuilder().MergeFrom(origial.ToByteArray()).Build(); Assert.AreEqual(0, message.AllFields.Count); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw) { Options = XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues }.WriteMessage("root", message); string xml = sw.ToString(); using (XmlReader x = XmlReader.Create(new StringReader(xml))) { x.MoveToContent(); Assert.AreEqual(XmlNodeType.Element, x.NodeType); //should always be empty Assert.IsTrue(x.IsEmptyElement || (x.Read() && x.NodeType == XmlNodeType.EndElement) ); } XmlFormatReader rdr = new XmlFormatReader(xml); rdr.Options = XmlReaderOptions.ReadNestedArrays; TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(TestXmlMessage.DefaultInstance, copy); } [Test] public void TestMessageWithXmlText() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetText("").Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestXmlWithWhitespace() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetText(" \t <- leading space and trailing -> \r\n\t").Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); } [Test] public void TestXmlWithExtensionText() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionText, " extension text value ! ") .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); } [Test] public void TestXmlWithExtensionMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build()).Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); } [Test] public void TestXmlWithExtensionArray() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 100) .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 101) .AddExtension(UnitTestXmlSerializerTestProtoFile.ExtensionNumber, 102) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); } [Test] public void TestXmlWithExtensionEnum() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionEnum, EnumOptions.ONE) .Build(); StringWriter sw = new StringWriter(); new XmlFormatWriter(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry); XmlFormatReader rdr = new XmlFormatReader(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); } } }