diff options
author | Jon Skeet <skeet@pobox.com> | 2014-04-07 17:34:03 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2014-04-07 17:34:03 +0100 |
commit | 8bb0d7288e333e76eee4a04d5d6ed7089f0fa0b0 (patch) | |
tree | 52166873ee5959564cad1904934522fa3f304d5b | |
parent | 8e04d10daba5bfd1213cc9b6c8554a017250e199 (diff) | |
download | protobuf-8bb0d7288e333e76eee4a04d5d6ed7089f0fa0b0.tar.gz protobuf-8bb0d7288e333e76eee4a04d5d6ed7089f0fa0b0.tar.bz2 protobuf-8bb0d7288e333e76eee4a04d5d6ed7089f0fa0b0.zip |
Add the ability to print a builder (not just a message),
and override ToString in AbstractBuilder.
This fixes issue 73.
-rw-r--r-- | src/ProtocolBuffers.Test/MessageTest.cs | 7 | ||||
-rw-r--r-- | src/ProtocolBuffers.Test/TextFormatTest.cs | 14 | ||||
-rw-r--r-- | src/ProtocolBuffers/AbstractBuilder.cs | 13 | ||||
-rw-r--r-- | src/ProtocolBuffers/TextFormat.cs | 26 |
4 files changed, 60 insertions, 0 deletions
diff --git a/src/ProtocolBuffers.Test/MessageTest.cs b/src/ProtocolBuffers.Test/MessageTest.cs index f27865b0..8bb0fac7 100644 --- a/src/ProtocolBuffers.Test/MessageTest.cs +++ b/src/ProtocolBuffers.Test/MessageTest.cs @@ -142,6 +142,13 @@ namespace Google.ProtocolBuffers }
[TestMethod]
+ public void UninitializedBuilderToString()
+ {
+ TestRequired.Builder builder = TestRequired.CreateBuilder().SetA(1);
+ Assert.AreEqual("a: 1\n", builder.ToString());
+ }
+
+ [TestMethod]
public void RequiredForeign()
{
TestRequiredForeign.Builder builder = TestRequiredForeign.CreateBuilder();
diff --git a/src/ProtocolBuffers.Test/TextFormatTest.cs b/src/ProtocolBuffers.Test/TextFormatTest.cs index 2cdd9ce2..37a4192a 100644 --- a/src/ProtocolBuffers.Test/TextFormatTest.cs +++ b/src/ProtocolBuffers.Test/TextFormatTest.cs @@ -100,6 +100,20 @@ namespace Google.ProtocolBuffers }
/// <summary>
+ /// Tests that a builder prints the same way as a message.
+ /// </summary>
+ [TestMethod]
+ public void PrintBuilder()
+ {
+ TestUtil.TestInMultipleCultures(() =>
+ {
+ string messageText = TextFormat.PrintToString(TestUtil.GetAllSet());
+ string builderText = TextFormat.PrintToString(TestUtil.GetAllSet().ToBuilder());
+ Assert.AreEqual(messageText, builderText);
+ });
+ }
+
+ /// <summary>
/// Print TestAllExtensions and compare with golden file.
/// </summary>
[TestMethod]
diff --git a/src/ProtocolBuffers/AbstractBuilder.cs b/src/ProtocolBuffers/AbstractBuilder.cs index 47d84a35..e7a41fb3 100644 --- a/src/ProtocolBuffers/AbstractBuilder.cs +++ b/src/ProtocolBuffers/AbstractBuilder.cs @@ -249,5 +249,18 @@ namespace Google.ProtocolBuffers }
#endregion
+
+ /// <summary>
+ /// Converts this builder to a string using <see cref="TextFormat" />.
+ /// </summary>
+ /// <remarks>
+ /// This method is not sealed (in the way that it is in <see cref="AbstractMessage{TMessage, TBuilder}" />
+ /// as it was added after earlier releases; some other implementations may already be overriding the
+ /// method.
+ /// </remarks>
+ public override string ToString()
+ {
+ return TextFormat.PrintToString(this);
+ }
}
}
\ No newline at end of file diff --git a/src/ProtocolBuffers/TextFormat.cs b/src/ProtocolBuffers/TextFormat.cs index 7ea25053..747dce4e 100644 --- a/src/ProtocolBuffers/TextFormat.cs +++ b/src/ProtocolBuffers/TextFormat.cs @@ -62,6 +62,16 @@ namespace Google.ProtocolBuffers }
/// <summary>
+ /// Outputs a textual representation of the Protocol Message builder supplied into
+ /// the parameter output.
+ /// </summary>
+ public static void Print(IBuilder builder, TextWriter output)
+ {
+ TextGenerator generator = new TextGenerator(output, "\n");
+ Print(builder, generator);
+ }
+
+ /// <summary>
/// Outputs a textual representation of <paramref name="fields" /> to <paramref name="output"/>.
/// </summary>
public static void Print(UnknownFieldSet fields, TextWriter output)
@@ -77,6 +87,13 @@ namespace Google.ProtocolBuffers return text.ToString();
}
+ public static string PrintToString(IBuilder builder)
+ {
+ StringWriter text = new StringWriter();
+ Print(builder, text);
+ return text.ToString();
+ }
+
public static string PrintToString(UnknownFieldSet fields)
{
StringWriter text = new StringWriter();
@@ -93,6 +110,15 @@ namespace Google.ProtocolBuffers PrintUnknownFields(message.UnknownFields, generator);
}
+ private static void Print(IBuilder message, TextGenerator generator)
+ {
+ foreach (KeyValuePair<FieldDescriptor, object> entry in message.AllFields)
+ {
+ PrintField(entry.Key, entry.Value, generator);
+ }
+ PrintUnknownFields(message.UnknownFields, generator);
+ }
+
internal static void PrintField(FieldDescriptor field, object value, TextGenerator generator)
{
if (field.IsRepeated)
|