public void Merge() { // Only test a simple case here and expect // {@link FieldMaskTreeTest#Merge} to cover all scenarios. FieldMask fieldMask = FieldMask.FromString("payload"); NestedTestAllTypes source = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1234, SingleFixed64 = 4321 } }; NestedTestAllTypes destination = new NestedTestAllTypes(); fieldMask.Merge(source, destination); Assert.AreEqual(1234, destination.Payload.SingleInt32); Assert.AreEqual(4321, destination.Payload.SingleFixed64); destination = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 4321, SingleInt64 = 5678 } }; fieldMask.Merge(source, destination); Assert.AreEqual(1234, destination.Payload.SingleInt32); Assert.AreEqual(5678, destination.Payload.SingleInt64); Assert.AreEqual(4321, destination.Payload.SingleFixed64); }
public void Merge(bool useDynamicMessage) { TestAllTypes value = new TestAllTypes { SingleInt32 = 1234, SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 5678 }, RepeatedInt32 = { 4321 }, RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 8765 } } }; NestedTestAllTypes source = new NestedTestAllTypes { Payload = value, Child = new NestedTestAllTypes { Payload = value } }; // Now we have a message source with the following structure: // [root] -+- payload -+- single_int32 // | +- single_nested_message // | +- repeated_int32 // | +- repeated_nested_message // | // +- child --- payload -+- single_int32 // +- single_nested_message // +- repeated_int32 // +- repeated_nested_message FieldMask.MergeOptions options = new FieldMask.MergeOptions(); // Test merging each individual field. NestedTestAllTypes destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload.single_int32"), source, destination, options, useDynamicMessage); NestedTestAllTypes expected = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1234 } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload.single_nested_message"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Payload = new TestAllTypes { SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 5678 } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload.repeated_int32"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Payload = new TestAllTypes { RepeatedInt32 = { 4321 } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload.repeated_nested_message"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Payload = new TestAllTypes { RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 8765 } } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge( new FieldMaskTree().AddFieldPath("child.payload.single_int32"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Child = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1234 } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge( new FieldMaskTree().AddFieldPath("child.payload.single_nested_message"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Child = new NestedTestAllTypes { Payload = new TestAllTypes { SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 5678 } } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("child.payload.repeated_int32"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Child = new NestedTestAllTypes { Payload = new TestAllTypes { RepeatedInt32 = { 4321 } } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("child.payload.repeated_nested_message"), source, destination, options, useDynamicMessage); expected = new NestedTestAllTypes { Child = new NestedTestAllTypes { Payload = new TestAllTypes { RepeatedNestedMessage = { new TestAllTypes.Types.NestedMessage { Bb = 8765 } } } } }; Assert.AreEqual(expected, destination); destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("child").AddFieldPath("payload"), source, destination, options, useDynamicMessage); Assert.AreEqual(source, destination); // Test repeated options. destination = new NestedTestAllTypes { Payload = new TestAllTypes { RepeatedInt32 = { 1000 } } }; Merge(new FieldMaskTree().AddFieldPath("payload.repeated_int32"), source, destination, options, useDynamicMessage); // Default behavior is to append repeated fields. Assert.AreEqual(2, destination.Payload.RepeatedInt32.Count); Assert.AreEqual(1000, destination.Payload.RepeatedInt32[0]); Assert.AreEqual(4321, destination.Payload.RepeatedInt32[1]); // Change to replace repeated fields. options.ReplaceRepeatedFields = true; Merge(new FieldMaskTree().AddFieldPath("payload.repeated_int32"), source, destination, options, useDynamicMessage); Assert.AreEqual(1, destination.Payload.RepeatedInt32.Count); Assert.AreEqual(4321, destination.Payload.RepeatedInt32[0]); // Test message options. destination = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1000, SingleUint32 = 2000 } }; Merge(new FieldMaskTree().AddFieldPath("payload"), source, destination, options, useDynamicMessage); // Default behavior is to merge message fields. Assert.AreEqual(1234, destination.Payload.SingleInt32); Assert.AreEqual(2000, destination.Payload.SingleUint32); // Test merging unset message fields. NestedTestAllTypes clearedSource = source.Clone(); clearedSource.Payload = null; destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload"), clearedSource, destination, options, useDynamicMessage); Assert.IsNull(destination.Payload); // Skip a message field if they are unset in both source and target. destination = new NestedTestAllTypes(); Merge(new FieldMaskTree().AddFieldPath("payload.single_int32"), clearedSource, destination, options, useDynamicMessage); Assert.IsNull(destination.Payload); // Change to replace message fields. options.ReplaceMessageFields = true; destination = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1000, SingleUint32 = 2000 } }; Merge(new FieldMaskTree().AddFieldPath("payload"), source, destination, options, useDynamicMessage); Assert.AreEqual(1234, destination.Payload.SingleInt32); Assert.AreEqual(0, destination.Payload.SingleUint32); // Test merging unset message fields. destination = new NestedTestAllTypes { Payload = new TestAllTypes { SingleInt32 = 1000, SingleUint32 = 2000 } }; Merge(new FieldMaskTree().AddFieldPath("payload"), clearedSource, destination, options, useDynamicMessage); Assert.IsNull(destination.Payload); // Test merging unset primitive fields. destination = source.Clone(); destination.Payload.SingleInt32 = 0; NestedTestAllTypes sourceWithPayloadInt32Unset = destination; destination = source.Clone(); Merge(new FieldMaskTree().AddFieldPath("payload.single_int32"), sourceWithPayloadInt32Unset, destination, options, useDynamicMessage); Assert.AreEqual(0, destination.Payload.SingleInt32); // Change to clear unset primitive fields. options.ReplacePrimitiveFields = true; destination = source.Clone(); Merge(new FieldMaskTree().AddFieldPath("payload.single_int32"), sourceWithPayloadInt32Unset, destination, options, useDynamicMessage); Assert.IsNotNull(destination.Payload); }