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(); XmlWriter xwtr = XmlWriter.Create(sw, new XmlWriterSettings { Indent = true, IndentChars = " " }); XmlFormatWriter.CreateInstance(xwtr) .SetOptions(XmlWriterOptions.OutputNestedArrays | XmlWriterOptions.OutputEnumValues) .WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); rdr.Options = XmlReaderOptions.ReadNestedArrays; TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestXmlReadWriteWithoutRoot() { TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); TestXmlMessage message = builder.SetText("abc").SetNumber(123).Build(); string xml; using (StringWriter sw = new StringWriter()) { ICodedOutputStream output = XmlFormatWriter.CreateInstance( XmlWriter.Create(sw, new XmlWriterSettings() { ConformanceLevel = ConformanceLevel.Fragment })); message.WriteTo(output); output.Flush(); xml = sw.ToString(); } Assert.AreEqual("<text>abc</text><number>123</number>", xml); TestXmlMessage copy; using (XmlReader xr = XmlReader.Create(new StringReader(xml), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment })) { ICodedInputStream input = XmlFormatReader.CreateInstance(xr); copy = TestXmlMessage.CreateBuilder().MergeFrom(input).Build(); } Assert.AreEqual(message, copy); }
public void ShouldReadSimpleXml() { XmlReader reader = XmlReaderUtil.Read( "<r>" + " <o>" + " <i1>1</i1>" + " <i2>2</i2>" + " </o>" + " <o>" + " <i1>3</i1>" + " <i2>4</i2>" + " </o>" + "</r>" ); string recordName = "o"; XmlFormatReader xmlFormatReader = new XmlFormatReader(reader, recordName); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next().Should().Equal(new Dictionary <string, string> { { "i1", "1" }, { "i2", "2" } }); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next().Should().Equal(new Dictionary <string, string> { { "i1", "3" }, { "i2", "4" } }); xmlFormatReader.HasNext().Should().BeFalse(); }
/// <summary> /// Merges an XML object into this builder using the extensions provided and returns /// </summary> public static TBuilder MergeFromXml <TBuilder>( #if !NOEXTENSIONS this #endif TBuilder builder, string rootElementName, XmlReader reader, ExtensionRegistry extensionRegistry) where TBuilder : IBuilderLite { return(XmlFormatReader.CreateInstance(reader) .Merge(rootElementName, builder, extensionRegistry)); }
public void TestXmlReadEmptyRoot() { TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root/>"); reader.ReadMessageStart(); //manually read the begin the message '{' builder.MergeFrom(reader); //write the message normally reader.ReadMessageEnd(); //manually read the end message '}' }
public void TestXmlReadEmptyChild() { TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root><text /></root>"); reader.ReadMessageStart(); //manually read the begin the message '{' builder.MergeFrom(reader); //write the message normally Assert.IsTrue(builder.HasText); Assert.AreEqual(String.Empty, builder.Text); }
public void Example_ReadXmlUsingICodedInputStream() { TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); ICodedInputStream reader = XmlFormatReader.CreateInstance(@"<root><valid>true</valid></root>"); reader.ReadMessageStart(); //manually read the begin the message '{' builder.MergeFrom(reader); //read the message normally reader.ReadMessageEnd(); //manually read the end message '}' }
/// <summary> /// Constructs an ICodedInputStream from the input stream based on the contentType provided /// </summary> /// <param name="options">Options specific to reading this message and/or content type</param> /// <param name="contentType">The mime type of the input stream content</param> /// <param name="input">The stream to read the message from</param> /// <returns>The ICodedInputStream that can be given to the IBuilder.MergeFrom(...) method</returns> public static ICodedInputStream CreateInputStream(MessageFormatOptions options, string contentType, Stream input) { ICodedInputStream codedInput = ContentTypeToInputStream(contentType, options, input); if (codedInput is XmlFormatReader) { XmlFormatReader reader = (XmlFormatReader)codedInput; reader.RootElementName = options.XmlReaderRootElementName; reader.Options = options.XmlReaderOptions; } return(codedInput); }
public void TestMessageWithXmlText() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetText("<text>").Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestBooleanTypes() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetValid(true) .Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestNestedMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetChild(TestXmlChild.CreateBuilder().AddOptions(EnumOptions.TWO).Build()) .Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestXmlWithWhitespace() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetText(" \t <- leading space and trailing -> \r\n\t").Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
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(); XmlFormatWriter.CreateInstance(sw) .SetOptions(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 = XmlFormatReader.CreateInstance(xml); rdr.Options = XmlReaderOptions.ReadNestedArrays; TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder()).Build(); Assert.AreEqual(TestXmlMessage.DefaultInstance, copy); }
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(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestEmptyMessage() { TestXmlChild message = TestXmlChild.CreateBuilder() .Build(); StringWriter sw = new StringWriter(); XmlWriter xw = XmlWriter.Create(sw); //When we call message.WriteTo, we are responsible for the root element xw.WriteStartElement("root"); message.WriteTo(XmlFormatWriter.CreateInstance(xw)); xw.WriteEndElement(); xw.Flush(); string xml = sw.ToString(); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlChild copy = rdr.Merge(TestXmlChild.CreateBuilder()).Build(); Assert.AreEqual(message, copy); }
public void TestXmlWithExtensionMessage() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetExtension(UnitTestXmlSerializerTestProtoFile.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build()).Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnitTestXmlSerializerTestProtoFile.RegisterAllExtensions(registry); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); }
public void TestXmlWithExtensionEnum() { TestXmlMessage message = TestXmlMessage.CreateBuilder() .SetExtension(UnittestExtrasXmltest.ExtensionEnum, EnumOptions.ONE) .Build(); StringWriter sw = new StringWriter(); XmlFormatWriter.CreateInstance(sw).WriteMessage("root", message); string xml = sw.ToString(); ExtensionRegistry registry = ExtensionRegistry.CreateInstance(); UnittestExtrasXmltest.RegisterAllExtensions(registry); XmlFormatReader rdr = XmlFormatReader.CreateInstance(xml); TestXmlMessage copy = rdr.Merge(TestXmlMessage.CreateBuilder(), registry).Build(); Assert.AreEqual(message, copy); }
public void TestXmlWriterOptions() { TestXmlMessage message = TestXmlMessage.CreateBuilder().SetText("a").AddNumbers(1).AddNumbers(2).Build(); MessageFormatOptions options = new MessageFormatOptions() { XmlWriterOptions = XmlWriterOptions.OutputNestedArrays, XmlWriterRootElementName = "root-node" }; MemoryStream ms = new MemoryStream(); Extensions.WriteTo(message, options, "application/xml", ms); ms.Position = 0; TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder(); XmlFormatReader.CreateInstance(ms) .SetOptions(XmlReaderOptions.ReadNestedArrays) .Merge("root-node", builder); Assert.AreEqual("a", builder.Text); Assert.AreEqual(1, builder.NumbersList[0]); Assert.AreEqual(2, builder.NumbersList[1]); }
protected override TBuilder DeserializeMessage <TMessage, TBuilder>(object message, TBuilder builder, ExtensionRegistry registry) { XmlFormatReader reader = XmlFormatReader.CreateInstance((string)message).SetOptions(XmlReaderOptions.ReadNestedArrays); return(reader.Merge("root", builder, registry)); }
public void ShouldReadRealWorldNoark4Xml() { var sb = new StringBuilder(); sb.AppendLine(@"<?xml version=""1.0"" encoding=""ISO-8859-1""?>"); sb.AppendLine(@"<!DOCTYPE AVGRADKODE.TAB SYSTEM ""AVGRKODE.DTD"">"); sb.AppendLine(@"<AVGRADKODE.TAB VERSJON=""1.0"">"); sb.AppendLine(@" <AVGRADKODE>"); sb.AppendLine(@" <AG.KODE>A</AG.KODE>"); sb.AppendLine(@" <AG.BETEGN>Avgraderes ved funksjon kjørt etter avgraderingstidspunkt</AG.BETEGN>"); sb.AppendLine(@" </AVGRADKODE>"); sb.AppendLine(@" <AVGRADKODE>"); sb.AppendLine(@" <AG.KODE>G</AG.KODE>"); sb.AppendLine(@" <AG.BETEGN>Gjennomgås for vurdering ved avgraderingstidspunkt</AG.BETEGN>"); sb.AppendLine(@" </AVGRADKODE>"); sb.AppendLine(@" <AVGRADKODE>"); sb.AppendLine(@" <AG.KODE>S</AG.KODE>"); sb.AppendLine(@" <AG.BETEGN>Sperrefrist, avgraderes automatisk på avgraderingsdato</AG.BETEGN>"); sb.AppendLine(@" </AVGRADKODE>"); sb.AppendLine(@" <AVGRADKODE>"); sb.AppendLine(@" <AG.KODE>AU</AG.KODE>"); sb.AppendLine(@" <AG.BETEGN>Avgradering utført</AG.BETEGN>"); sb.AppendLine(@" </AVGRADKODE>"); sb.AppendLine(@" <AVGRADKODE>"); sb.AppendLine(@" <AG.KODE>U</AG.KODE>"); sb.AppendLine(@" <AG.BETEGN>Unntatt fra automatisk avgradering</AG.BETEGN>"); sb.AppendLine(@" </AVGRADKODE>"); sb.AppendLine(@"</AVGRADKODE.TAB>"); XmlReader reader = XmlReaderUtil.Read(sb.ToString()); string recordName = "AVGRADKODE"; XmlFormatReader xmlFormatReader = new XmlFormatReader(reader, recordName); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next() .Should() .Equal(new Dictionary <string, string> { { "AG.KODE", "A" }, { "AG.BETEGN", "Avgraderes ved funksjon kjørt etter avgraderingstidspunkt" } }); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next() .Should() .Equal(new Dictionary <string, string> { { "AG.KODE", "G" }, { "AG.BETEGN", "Gjennomgås for vurdering ved avgraderingstidspunkt" } }); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next() .Should() .Equal(new Dictionary <string, string> { { "AG.KODE", "S" }, { "AG.BETEGN", "Sperrefrist, avgraderes automatisk på avgraderingsdato" } }); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next() .Should() .Equal(new Dictionary <string, string> { { "AG.KODE", "AU" }, { "AG.BETEGN", "Avgradering utført" } }); xmlFormatReader.HasNext().Should().BeTrue(); xmlFormatReader.Next() .Should() .Equal(new Dictionary <string, string> { { "AG.KODE", "U" }, { "AG.BETEGN", "Unntatt fra automatisk avgradering" } }); xmlFormatReader.HasNext().Should().BeFalse(); }
/// <summary> /// Runs a single test. Error messages are displayed to Console.Error, and the return value indicates /// general success/failure. /// </summary> public static bool RunTest(string typeName, string file, byte[] inputData) { WriteLine("Benchmarking {0} with file {1}", typeName, file); IMessage defaultMessage; try { defaultMessage = MessageUtil.GetDefaultMessage(typeName); } catch (ArgumentException e) { Console.Error.WriteLine(e.Message); return(false); } try { ExtensionRegistry registry = ExtensionRegistry.Empty; inputData = inputData ?? File.ReadAllBytes(file); MemoryStream inputStream = new MemoryStream(inputData); ByteString inputString = ByteString.CopyFrom(inputData); IMessage sampleMessage = defaultMessage.WeakCreateBuilderForType().WeakMergeFrom(inputString, registry).WeakBuild(); IDictionary <string, object> dictionary = null; byte[] jsonBytes = null, xmlBytes = null; /*no pun intended, well... maybe for xml*/ if (OtherFormats) { using (MemoryStream temp = new MemoryStream()) { XmlFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage); xmlBytes = temp.ToArray(); } using (MemoryStream temp = new MemoryStream()) { JsonFormatWriter.CreateInstance(temp).WriteMessage(sampleMessage); jsonBytes = temp.ToArray(); } dictionary = new Dictionary <string, object>(StringComparer.Ordinal); new DictionaryWriter(dictionary).WriteMessage(sampleMessage); } //Serializers if (!FastTest) { RunBenchmark("Serialize to byte string", inputData.Length, () => sampleMessage.ToByteString()); } RunBenchmark("Serialize to byte array", inputData.Length, () => sampleMessage.ToByteArray()); if (!FastTest) { RunBenchmark("Serialize to memory stream", inputData.Length, () => sampleMessage.WriteTo(new MemoryStream())); } if (OtherFormats) { RunBenchmark("Serialize to xml", xmlBytes.Length, () => { XmlFormatWriter.CreateInstance(new MemoryStream(), Encoding.UTF8).WriteMessage(sampleMessage); }); RunBenchmark("Serialize to json", jsonBytes.Length, () => { JsonFormatWriter.CreateInstance().WriteMessage(sampleMessage); }); RunBenchmark("Serialize to json via xml", jsonBytes.Length, () => XmlFormatWriter.CreateInstance( JsonReaderWriterFactory.CreateJsonWriter(new MemoryStream(), Encoding.UTF8)) .SetOptions(XmlWriterOptions.OutputJsonTypes) .WriteMessage(sampleMessage) ); RunBenchmark("Serialize to dictionary", sampleMessage.SerializedSize, () => new DictionaryWriter().WriteMessage(sampleMessage)); } //Deserializers if (!FastTest) { RunBenchmark("Deserialize from byte string", inputData.Length, () => defaultMessage.WeakCreateBuilderForType() .WeakMergeFrom(inputString, registry) .WeakBuild() ); } RunBenchmark("Deserialize from byte array", inputData.Length, () => defaultMessage.WeakCreateBuilderForType() .WeakMergeFrom(CodedInputStream.CreateInstance(inputData), registry) .WeakBuild() ); if (!FastTest) { RunBenchmark("Deserialize from memory stream", inputData.Length, () => { inputStream.Position = 0; defaultMessage.WeakCreateBuilderForType().WeakMergeFrom( CodedInputStream.CreateInstance(inputStream), registry) .WeakBuild(); }); } if (OtherFormats) { RunBenchmark("Deserialize from xml", xmlBytes.Length, () => XmlFormatReader.CreateInstance(xmlBytes).Merge( defaultMessage.WeakCreateBuilderForType()).WeakBuild()); RunBenchmark("Deserialize from json", jsonBytes.Length, () => JsonFormatReader.CreateInstance(jsonBytes).Merge( defaultMessage.WeakCreateBuilderForType()).WeakBuild()); RunBenchmark("Deserialize from json via xml", jsonBytes.Length, () => XmlFormatReader.CreateInstance(JsonReaderWriterFactory.CreateJsonReader(jsonBytes, XmlDictionaryReaderQuotas.Max)) .SetOptions(XmlReaderOptions.ReadNestedArrays).Merge( defaultMessage.WeakCreateBuilderForType()).WeakBuild()); RunBenchmark("Deserialize from dictionary", sampleMessage.SerializedSize, () => new DictionaryReader(dictionary).Merge(defaultMessage.WeakCreateBuilderForType()). WeakBuild()); } WriteLine(String.Empty); return(true); } catch (Exception e) { Console.Error.WriteLine("Error: {0}", e.Message); Console.Error.WriteLine(); Console.Error.WriteLine("Detailed exception information: {0}", e); return(false); } }