aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2014-04-07 17:34:03 +0100
committerJon Skeet <skeet@pobox.com>2014-04-07 17:34:03 +0100
commit8bb0d7288e333e76eee4a04d5d6ed7089f0fa0b0 (patch)
tree52166873ee5959564cad1904934522fa3f304d5b
parent8e04d10daba5bfd1213cc9b6c8554a017250e199 (diff)
downloadprotobuf-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.cs7
-rw-r--r--src/ProtocolBuffers.Test/TextFormatTest.cs14
-rw-r--r--src/ProtocolBuffers/AbstractBuilder.cs13
-rw-r--r--src/ProtocolBuffers/TextFormat.cs26
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)