Add the ability to print a builder (not just a message),

and override ToString in AbstractBuilder.

This fixes issue 73.
pull/288/head
Jon Skeet 11 years ago
parent 8e04d10dab
commit 8bb0d7288e
  1. 7
      src/ProtocolBuffers.Test/MessageTest.cs
  2. 14
      src/ProtocolBuffers.Test/TextFormatTest.cs
  3. 13
      src/ProtocolBuffers/AbstractBuilder.cs
  4. 26
      src/ProtocolBuffers/TextFormat.cs

@ -141,6 +141,13 @@ namespace Google.ProtocolBuffers
Assert.IsTrue(builder.IsInitialized); Assert.IsTrue(builder.IsInitialized);
} }
[TestMethod]
public void UninitializedBuilderToString()
{
TestRequired.Builder builder = TestRequired.CreateBuilder().SetA(1);
Assert.AreEqual("a: 1\n", builder.ToString());
}
[TestMethod] [TestMethod]
public void RequiredForeign() public void RequiredForeign()
{ {

@ -99,6 +99,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> /// <summary>
/// Print TestAllExtensions and compare with golden file. /// Print TestAllExtensions and compare with golden file.
/// </summary> /// </summary>

@ -249,5 +249,18 @@ namespace Google.ProtocolBuffers
} }
#endregion #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);
}
} }
} }

@ -61,6 +61,16 @@ namespace Google.ProtocolBuffers
Print(message, generator); Print(message, generator);
} }
/// <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> /// <summary>
/// Outputs a textual representation of <paramref name="fields" /> to <paramref name="output"/>. /// Outputs a textual representation of <paramref name="fields" /> to <paramref name="output"/>.
/// </summary> /// </summary>
@ -77,6 +87,13 @@ namespace Google.ProtocolBuffers
return text.ToString(); 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) public static string PrintToString(UnknownFieldSet fields)
{ {
StringWriter text = new StringWriter(); StringWriter text = new StringWriter();
@ -93,6 +110,15 @@ namespace Google.ProtocolBuffers
PrintUnknownFields(message.UnknownFields, generator); 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) internal static void PrintField(FieldDescriptor field, object value, TextGenerator generator)
{ {
if (field.IsRepeated) if (field.IsRepeated)

Loading…
Cancel
Save