1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpackage com.google.protobuf.util; 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport com.google.protobuf.FieldMask; 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport protobuf_unittest.UnittestProto.NestedTestAllTypes; 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport protobuf_unittest.UnittestProto.TestAllTypes; 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerimport junit.framework.TestCase; 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/** Unit tests for {@link FieldMaskUtil}. */ 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerpublic class FieldMaskUtilTest extends TestCase { 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testIsValid() throws Exception { 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.class, "payload")); 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.class, "nonexist")); 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.optional_int32")); 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.repeated_int32")); 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.optional_nested_message")); 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.repeated_nested_message")); 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.nonexist")); 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, FieldMaskUtil.fromString("payload"))); 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, FieldMaskUtil.fromString("nonexist"))); 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, FieldMaskUtil.fromString("payload,nonexist"))); 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid(NestedTestAllTypes.getDescriptor(), "payload")); 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid(NestedTestAllTypes.getDescriptor(), "nonexist")); 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("payload"))); 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.getDescriptor(), FieldMaskUtil.fromString("nonexist"))); 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertTrue(FieldMaskUtil.isValid( 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.optional_nested_message.bb")); 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Repeated fields cannot have sub-paths. 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.repeated_nested_message.bb")); 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Non-message fields cannot have sub-paths. 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertFalse(FieldMaskUtil.isValid( 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload.optional_int32.bb")); 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testToString() throws Exception { 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("", FieldMaskUtil.toString(FieldMask.getDefaultInstance())); 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask = FieldMask.newBuilder().addPaths("foo").build(); 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo", FieldMaskUtil.toString(mask)); 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMask.newBuilder().addPaths("foo").addPaths("bar").build(); 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo,bar", FieldMaskUtil.toString(mask)); 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Empty field paths are ignored. 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMask.newBuilder().addPaths("").addPaths("foo").addPaths(""). 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer addPaths("bar").addPaths("").build(); 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo,bar", FieldMaskUtil.toString(mask)); 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testFromString() throws Exception { 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask = FieldMaskUtil.fromString(""); 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, mask.getPathsCount()); 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromString("foo"); 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, mask.getPathsCount()); 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo", mask.getPaths(0)); 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromString("foo,bar.baz"); 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, mask.getPathsCount()); 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo", mask.getPaths(0)); 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("bar.baz", mask.getPaths(1)); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Empty field paths are ignore. 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromString(",foo,,bar,"); 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, mask.getPathsCount()); 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("foo", mask.getPaths(0)); 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("bar", mask.getPaths(1)); 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Check whether the field paths are valid if a class parameter is provided. 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromString(NestedTestAllTypes.class, ",payload"); 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer try { 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromString( 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.class, "payload,nonexist"); 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fail("Exception is expected."); 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } catch (IllegalArgumentException e) { 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Expected. 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testFromFieldNumbers() throws Exception { 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask = FieldMaskUtil.fromFieldNumbers(TestAllTypes.class); 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(0, mask.getPathsCount()); 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMaskUtil.fromFieldNumbers( 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes.class, TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER); 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1, mask.getPathsCount()); 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("optional_int32", mask.getPaths(0)); 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMaskUtil.fromFieldNumbers( 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes.class, 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer TestAllTypes.OPTIONAL_INT64_FIELD_NUMBER); 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(2, mask.getPathsCount()); 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("optional_int32", mask.getPaths(0)); 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("optional_int64", mask.getPaths(1)); 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer try { 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer int invalidFieldNumber = 1000; 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer mask = FieldMaskUtil.fromFieldNumbers(TestAllTypes.class, invalidFieldNumber); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer fail("Exception is expected."); 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } catch (IllegalArgumentException expected) { 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testUnion() throws Exception { 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Only test a simple case here and expect 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // {@link FieldMaskTreeTest#testAddFieldPath} to cover all scenarios. 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask1 = FieldMaskUtil.fromString("foo,bar.baz,bar.quz"); 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask2 = FieldMaskUtil.fromString("foo.bar,bar"); 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask result = FieldMaskUtil.union(mask1, mask2); 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("bar,foo", FieldMaskUtil.toString(result)); 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testUnion_usingVarArgs() throws Exception { 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask1 = FieldMaskUtil.fromString("foo"); 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask2 = FieldMaskUtil.fromString("foo.bar,bar.quz"); 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask3 = FieldMaskUtil.fromString("bar.quz"); 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask4 = FieldMaskUtil.fromString("bar"); 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask result = FieldMaskUtil.union(mask1, mask2, mask3, mask4); 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("bar,foo", FieldMaskUtil.toString(result)); 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testIntersection() throws Exception { 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Only test a simple case here and expect 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // {@link FieldMaskTreeTest#testIntersectFieldPath} to cover all scenarios. 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask1 = FieldMaskUtil.fromString("foo,bar.baz,bar.quz"); 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask mask2 = FieldMaskUtil.fromString("foo.bar,bar"); 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMask result = FieldMaskUtil.intersection(mask1, mask2); 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals("bar.baz,bar.quz,foo.bar", FieldMaskUtil.toString(result)); 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public void testMerge() throws Exception { 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Only test a simple case here and expect 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // {@link FieldMaskTreeTest#testMerge} to cover all scenarios. 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes source = NestedTestAllTypes.newBuilder() 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer .setPayload(TestAllTypes.newBuilder().setOptionalInt32(1234)) 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer .build(); 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer NestedTestAllTypes.Builder builder = NestedTestAllTypes.newBuilder(); 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer FieldMaskUtil.merge(FieldMaskUtil.fromString("payload"), source, builder); 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer assertEquals(1234, builder.getPayload().getOptionalInt32()); 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 185