encoding: add Format helper function and method

The Format function and MarshalOptions.Format method are helper
functions for directly obtaining the formatted string for a message
without having to deal with errors or convert a []byte to string.
It is only intended for human consumption (e.g., debugging or logging).

We also add a MarshalOptions.Multiline option to specify that the output
should use some default indentation in a multiline output.

This assists in the v1 to v2 migration where:
	protoV1.CompactTextString(m) => prototext.MarshalOptions{}.Format(m)
	protoV1.MarshalTextString(m) => prototext.Format(m)

At Google, there are approximately 10x more usages of MarshalTextString than
CompactTextString, so it makes sense that the top-level Format function
does multiline expansion by default.

Fixes #850

Change-Id: I149c9e190a6d99b985d3884df675499a3313e9b3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/213460
Reviewed-by: Damien Neil <dneil@google.com>
Reviewed-by: Herbie Ong <herbie@google.com>
diff --git a/testing/prototest/prototest.go b/testing/prototest/prototest.go
index cabe0b0..7a403a9 100644
--- a/testing/prototest/prototest.go
+++ b/testing/prototest/prototest.go
@@ -72,25 +72,20 @@
 		AllowPartial: true,
 	}.Marshal(m2)
 	if err != nil {
-		t.Errorf("Marshal() = %v, want nil\n%v", err, marshalText(m2))
+		t.Errorf("Marshal() = %v, want nil\n%v", err, prototext.Format(m2))
 	}
 	m3 := m.ProtoReflect().New().Interface()
 	if err := (proto.UnmarshalOptions{
 		AllowPartial: true,
 		Resolver:     opts.Resolver,
 	}.Unmarshal(b, m3)); err != nil {
-		t.Errorf("Unmarshal() = %v, want nil\n%v", err, marshalText(m2))
+		t.Errorf("Unmarshal() = %v, want nil\n%v", err, prototext.Format(m2))
 	}
 	if !proto.Equal(m2, m3) {
-		t.Errorf("round-trip marshal/unmarshal did not preserve message\nOriginal:\n%v\nNew:\n%v", marshalText(m2), marshalText(m3))
+		t.Errorf("round-trip marshal/unmarshal did not preserve message\nOriginal:\n%v\nNew:\n%v", prototext.Format(m2), prototext.Format(m3))
 	}
 }
 
-func marshalText(m proto.Message) string {
-	b, _ := prototext.MarshalOptions{Indent: "  "}.Marshal(m)
-	return string(b)
-}
-
 func testType(t testing.TB, m proto.Message) {
 	want := reflect.TypeOf(m)
 	if got := reflect.TypeOf(m.ProtoReflect().Interface()); got != want {