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("<text>").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); | |
} | |
} | |
} |