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