proto: fix DiscardUnknown

UnmarshalOptions.DiscardUnknown was simply not working. Oops. Fix it.
Add a test.

Change-Id: I76888eae1221d99a007f0e9cdb711d292e6856b1
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/216762
Reviewed-by: Joe Tsai <joetsai@google.com>
diff --git a/proto/decode_test.go b/proto/decode_test.go
index 02f07d4..5ccb816 100644
--- a/proto/decode_test.go
+++ b/proto/decode_test.go
@@ -25,9 +25,8 @@
 		}
 		for _, want := range test.decodeTo {
 			t.Run(fmt.Sprintf("%s (%T)", test.desc, want), func(t *testing.T) {
-				opts := proto.UnmarshalOptions{
-					AllowPartial: test.partial,
-				}
+				opts := test.unmarshalOptions
+				opts.AllowPartial = test.partial
 				wire := append(([]byte)(nil), test.wire...)
 				got := reflect.New(reflect.TypeOf(want).Elem()).Interface().(proto.Message)
 				if err := opts.Unmarshal(wire, got); err != nil {
@@ -55,6 +54,8 @@
 		}
 		for _, m := range test.decodeTo {
 			t.Run(fmt.Sprintf("%s (%T)", test.desc, m), func(t *testing.T) {
+				opts := test.unmarshalOptions
+				opts.AllowPartial = false
 				got := reflect.New(reflect.TypeOf(m).Elem()).Interface().(proto.Message)
 				if err := proto.Unmarshal(test.wire, got); err == nil {
 					t.Fatalf("Unmarshal succeeded (want error)\nMessage:\n%v", marshalText(got))
@@ -71,9 +72,8 @@
 		}
 		for _, want := range test.decodeTo {
 			t.Run(fmt.Sprintf("%s (%T)", test.desc, want), func(t *testing.T) {
-				opts := proto.UnmarshalOptions{
-					AllowPartial: test.partial,
-				}
+				opts := test.unmarshalOptions
+				opts.AllowPartial = test.partial
 				got := want.ProtoReflect().New().Interface()
 				if err := opts.Unmarshal(test.wire, got); err == nil {
 					t.Errorf("Unmarshal unexpectedly succeeded\ninput bytes: [%x]\nMessage:\n%v", test.wire, marshalText(got))