1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 //     * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 //     * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 //     * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 
31 package com.google.protobuf;
32 
33 import com.google.protobuf.testing.Proto2Testing.Proto2Message;
34 import com.google.protobuf.testing.Proto2Testing.Proto2MessageWithMaps;
35 import java.util.ArrayList;
36 import java.util.HashMap;
37 import java.util.List;
38 import java.util.Map;
39 
40 /** Creates instances of {@link Proto2Message} based on the tree configuration. */
41 public final class Proto2MessageFactory implements ExperimentalMessageFactory<Proto2Message> {
42   private final int numRepeatedFields;
43   private final int branchingFactor;
44   private final Proto2MessageFactory nextLevel;
45   private final ExperimentalTestDataProvider data;
46 
Proto2MessageFactory( int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth)47   public Proto2MessageFactory(
48       int numRepeatedFields, int stringLength, int branchingFactor, int treeDepth) {
49     this(
50         new ExperimentalTestDataProvider(stringLength),
51         numRepeatedFields,
52         branchingFactor,
53         treeDepth);
54   }
55 
Proto2MessageFactory( ExperimentalTestDataProvider data, int numRepeatedFields, int branchingFactor, int treeDepth)56   private Proto2MessageFactory(
57       ExperimentalTestDataProvider data,
58       int numRepeatedFields,
59       int branchingFactor,
60       int treeDepth) {
61     this.numRepeatedFields = numRepeatedFields;
62     this.branchingFactor = branchingFactor;
63     this.data = data;
64     if (treeDepth > 0) {
65       nextLevel = new Proto2MessageFactory(data, numRepeatedFields, branchingFactor, treeDepth - 1);
66     } else {
67       nextLevel = null;
68     }
69   }
70 
71   @Override
dataProvider()72   public ExperimentalTestDataProvider dataProvider() {
73     return data;
74   }
75 
76   @Override
newMessage()77   public Proto2Message newMessage() {
78     Proto2Message.Builder builder = Proto2Message.newBuilder();
79     builder.setFieldDouble1(data.getDouble());
80     builder.setFieldFloat2(data.getFloat());
81     builder.setFieldInt643(data.getLong());
82     builder.setFieldUint644(data.getLong());
83     builder.setFieldInt325(data.getInt());
84     builder.setFieldFixed646(data.getLong());
85     builder.setFieldFixed327(data.getInt());
86     builder.setFieldBool8(data.getBool());
87     builder.setFieldString9(data.getString());
88     // We don't populate the message field. Instead we apply the branching factor to the
89     // repeated message field below.
90     builder.setFieldBytes11(data.getBytes());
91     builder.setFieldUint3212(data.getInt());
92     builder.setFieldEnum13(Proto2Message.TestEnum.forNumber(data.getEnum()));
93     builder.setFieldSfixed3214(data.getInt());
94     builder.setFieldSfixed6415(data.getLong());
95     builder.setFieldSint3216(data.getInt());
96     builder.setFieldSint6417(data.getLong());
97 
98     for (int i = 0; i < numRepeatedFields; ++i) {
99       builder.addFieldDoubleList18(data.getDouble());
100       builder.addFieldFloatList19(data.getFloat());
101       builder.addFieldInt64List20(data.getLong());
102       builder.addFieldUint64List21(data.getLong());
103       builder.addFieldInt32List22(data.getInt());
104       builder.addFieldFixed64List23(data.getLong());
105       builder.addFieldFixed32List24(data.getInt());
106       builder.addFieldBoolList25(data.getBool());
107       builder.addFieldStringList26(data.getString());
108       // Repeated message field is controlled by the branching factor below.
109       builder.addFieldBytesList28(data.getBytes());
110       builder.addFieldUint32List29(data.getInt());
111       builder.addFieldEnumList30(Proto2Message.TestEnum.forNumber(data.getEnum()));
112       builder.addFieldSfixed32List31(data.getInt());
113       builder.addFieldSfixed64List32(data.getLong());
114       builder.addFieldSint32List33(data.getInt());
115       builder.addFieldSint64List34(data.getLong());
116 
117       builder.addFieldDoubleListPacked35(data.getDouble());
118       builder.addFieldFloatListPacked36(data.getFloat());
119       builder.addFieldInt64ListPacked37(data.getLong());
120       builder.addFieldUint64ListPacked38(data.getLong());
121       builder.addFieldInt32ListPacked39(data.getInt());
122       builder.addFieldFixed64ListPacked40(data.getLong());
123       builder.addFieldFixed32ListPacked41(data.getInt());
124       builder.addFieldBoolListPacked42(data.getBool());
125       builder.addFieldUint32ListPacked43(data.getInt());
126       builder.addFieldEnumListPacked44(Proto2Message.TestEnum.forNumber(data.getEnum()));
127       builder.addFieldSfixed32ListPacked45(data.getInt());
128       builder.addFieldSfixed64ListPacked46(data.getLong());
129       builder.addFieldSint32ListPacked47(data.getInt());
130       builder.addFieldSint64ListPacked48(data.getLong());
131     }
132 
133     builder.setFieldGroup49(Proto2Message.FieldGroup49.newBuilder().setFieldInt3250(data.getInt()));
134 
135     for (int i = 0; i < branchingFactor; ++i) {
136       builder.addFieldGroupList51(
137           Proto2Message.FieldGroupList51.newBuilder().setFieldInt3252(data.getInt()));
138     }
139 
140     // Set all required fields.
141     populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
142 
143     // Handle the branching factor.
144     if (nextLevel != null) {
145       for (int i = 0; i < branchingFactor; ++i) {
146         builder.addFieldMessageList27(nextLevel.newMessage());
147       }
148     }
149 
150     return builder.build();
151   }
152 
153   private interface MapValueProvider<T> {
getValue()154     public T getValue();
155   }
156 
157   private final MapValueProvider<Integer> integerProvider =
158       new MapValueProvider<Integer>() {
159         @Override
160         public Integer getValue() {
161           return data.getInt();
162         }
163       };
164   private final MapValueProvider<Long> longProvider =
165       new MapValueProvider<Long>() {
166         @Override
167         public Long getValue() {
168           return data.getLong();
169         }
170       };
171   private final MapValueProvider<String> stringProvider =
172       new MapValueProvider<String>() {
173         @Override
174         public String getValue() {
175           return data.getString();
176         }
177       };
178   private final MapValueProvider<ByteString> bytesProvider =
179       new MapValueProvider<ByteString>() {
180         @Override
181         public ByteString getValue() {
182           return data.getBytes();
183         }
184       };
185   private final MapValueProvider<Boolean> booleanProvider =
186       new MapValueProvider<Boolean>() {
187         @Override
188         public Boolean getValue() {
189           return data.getBool();
190         }
191       };
192   private final MapValueProvider<Float> floatProvider =
193       new MapValueProvider<Float>() {
194         @Override
195         public Float getValue() {
196           return data.getFloat();
197         }
198       };
199   private final MapValueProvider<Double> doubleProvider =
200       new MapValueProvider<Double>() {
201         @Override
202         public Double getValue() {
203           return data.getDouble();
204         }
205       };
206   private final MapValueProvider<Proto2Message> messageProvider =
207       new MapValueProvider<Proto2Message>() {
208         @Override
209         public Proto2Message getValue() {
210           return newMessage();
211         }
212       };
213   private final MapValueProvider<Proto2Message.TestEnum> enumProvider =
214       new MapValueProvider<Proto2Message.TestEnum>() {
215         @Override
216         public Proto2Message.TestEnum getValue() {
217           return Proto2Message.TestEnum.forNumber(data.getEnum());
218         }
219       };
220 
populateIntegerMap(MapValueProvider<V> provider)221   private <V> Map<Integer, V> populateIntegerMap(MapValueProvider<V> provider) {
222     Map<Integer, V> map = new HashMap<>();
223     for (int i = 0; i < numRepeatedFields; ++i) {
224       map.put(data.getInt(), provider.getValue());
225     }
226     return map;
227   }
228 
populateLongMap(MapValueProvider<V> provider)229   private <V> Map<Long, V> populateLongMap(MapValueProvider<V> provider) {
230     Map<Long, V> map = new HashMap<>();
231     for (int i = 0; i < numRepeatedFields; ++i) {
232       map.put(data.getLong(), provider.getValue());
233     }
234     return map;
235   }
236 
populateStringMap(MapValueProvider<V> provider)237   private <V> Map<String, V> populateStringMap(MapValueProvider<V> provider) {
238     Map<String, V> map = new HashMap<>();
239     for (int i = 0; i < numRepeatedFields; ++i) {
240       map.put(data.getString(), provider.getValue());
241     }
242     return map;
243   }
244 
populateBooleanMap(MapValueProvider<V> provider)245   private <V> Map<Boolean, V> populateBooleanMap(MapValueProvider<V> provider) {
246     Map<Boolean, V> map = new HashMap<>();
247     map.put(false, provider.getValue());
248     map.put(true, provider.getValue());
249     return map;
250   }
251 
newMessageWithMaps()252   public Proto2MessageWithMaps newMessageWithMaps() {
253     Proto2MessageWithMaps.Builder builder = Proto2MessageWithMaps.newBuilder();
254 
255     builder.putAllFieldMapBoolBool1(populateBooleanMap(booleanProvider));
256     builder.putAllFieldMapBoolBytes2(populateBooleanMap(bytesProvider));
257     builder.putAllFieldMapBoolDouble3(populateBooleanMap(doubleProvider));
258     builder.putAllFieldMapBoolEnum4(populateBooleanMap(enumProvider));
259     builder.putAllFieldMapBoolFixed325(populateBooleanMap(integerProvider));
260     builder.putAllFieldMapBoolFixed646(populateBooleanMap(longProvider));
261     builder.putAllFieldMapBoolFloat7(populateBooleanMap(floatProvider));
262     builder.putAllFieldMapBoolInt328(populateBooleanMap(integerProvider));
263     builder.putAllFieldMapBoolInt649(populateBooleanMap(longProvider));
264     builder.putAllFieldMapBoolMessage10(populateBooleanMap(messageProvider));
265     builder.putAllFieldMapBoolSfixed3211(populateBooleanMap(integerProvider));
266     builder.putAllFieldMapBoolSfixed6412(populateBooleanMap(longProvider));
267     builder.putAllFieldMapBoolSint3213(populateBooleanMap(integerProvider));
268     builder.putAllFieldMapBoolSint6414(populateBooleanMap(longProvider));
269     builder.putAllFieldMapBoolString15(populateBooleanMap(stringProvider));
270     builder.putAllFieldMapBoolUint3216(populateBooleanMap(integerProvider));
271     builder.putAllFieldMapBoolUint6417(populateBooleanMap(longProvider));
272     builder.putAllFieldMapFixed32Bool18(populateIntegerMap(booleanProvider));
273     builder.putAllFieldMapFixed32Bytes19(populateIntegerMap(bytesProvider));
274     builder.putAllFieldMapFixed32Double20(populateIntegerMap(doubleProvider));
275     builder.putAllFieldMapFixed32Enum21(populateIntegerMap(enumProvider));
276     builder.putAllFieldMapFixed32Fixed3222(populateIntegerMap(integerProvider));
277     builder.putAllFieldMapFixed32Fixed6423(populateIntegerMap(longProvider));
278     builder.putAllFieldMapFixed32Float24(populateIntegerMap(floatProvider));
279     builder.putAllFieldMapFixed32Int3225(populateIntegerMap(integerProvider));
280     builder.putAllFieldMapFixed32Int6426(populateIntegerMap(longProvider));
281     builder.putAllFieldMapFixed32Message27(populateIntegerMap(messageProvider));
282     builder.putAllFieldMapFixed32Sfixed3228(populateIntegerMap(integerProvider));
283     builder.putAllFieldMapFixed32Sfixed6429(populateIntegerMap(longProvider));
284     builder.putAllFieldMapFixed32Sint3230(populateIntegerMap(integerProvider));
285     builder.putAllFieldMapFixed32Sint6431(populateIntegerMap(longProvider));
286     builder.putAllFieldMapFixed32String32(populateIntegerMap(stringProvider));
287     builder.putAllFieldMapFixed32Uint3233(populateIntegerMap(integerProvider));
288     builder.putAllFieldMapFixed32Uint6434(populateIntegerMap(longProvider));
289     builder.putAllFieldMapFixed64Bool35(populateLongMap(booleanProvider));
290     builder.putAllFieldMapFixed64Bytes36(populateLongMap(bytesProvider));
291     builder.putAllFieldMapFixed64Double37(populateLongMap(doubleProvider));
292     builder.putAllFieldMapFixed64Enum38(populateLongMap(enumProvider));
293     builder.putAllFieldMapFixed64Fixed3239(populateLongMap(integerProvider));
294     builder.putAllFieldMapFixed64Fixed6440(populateLongMap(longProvider));
295     builder.putAllFieldMapFixed64Float41(populateLongMap(floatProvider));
296     builder.putAllFieldMapFixed64Int3242(populateLongMap(integerProvider));
297     builder.putAllFieldMapFixed64Int6443(populateLongMap(longProvider));
298     builder.putAllFieldMapFixed64Message44(populateLongMap(messageProvider));
299     builder.putAllFieldMapFixed64Sfixed3245(populateLongMap(integerProvider));
300     builder.putAllFieldMapFixed64Sfixed6446(populateLongMap(longProvider));
301     builder.putAllFieldMapFixed64Sint3247(populateLongMap(integerProvider));
302     builder.putAllFieldMapFixed64Sint6448(populateLongMap(longProvider));
303     builder.putAllFieldMapFixed64String49(populateLongMap(stringProvider));
304     builder.putAllFieldMapFixed64Uint3250(populateLongMap(integerProvider));
305     builder.putAllFieldMapFixed64Uint6451(populateLongMap(longProvider));
306     builder.putAllFieldMapInt32Bool52(populateIntegerMap(booleanProvider));
307     builder.putAllFieldMapInt32Bytes53(populateIntegerMap(bytesProvider));
308     builder.putAllFieldMapInt32Double54(populateIntegerMap(doubleProvider));
309     builder.putAllFieldMapInt32Enum55(populateIntegerMap(enumProvider));
310     builder.putAllFieldMapInt32Fixed3256(populateIntegerMap(integerProvider));
311     builder.putAllFieldMapInt32Fixed6457(populateIntegerMap(longProvider));
312     builder.putAllFieldMapInt32Float58(populateIntegerMap(floatProvider));
313     builder.putAllFieldMapInt32Int3259(populateIntegerMap(integerProvider));
314     builder.putAllFieldMapInt32Int6460(populateIntegerMap(longProvider));
315     builder.putAllFieldMapInt32Message61(populateIntegerMap(messageProvider));
316     builder.putAllFieldMapInt32Sfixed3262(populateIntegerMap(integerProvider));
317     builder.putAllFieldMapInt32Sfixed6463(populateIntegerMap(longProvider));
318     builder.putAllFieldMapInt32Sint3264(populateIntegerMap(integerProvider));
319     builder.putAllFieldMapInt32Sint6465(populateIntegerMap(longProvider));
320     builder.putAllFieldMapInt32String66(populateIntegerMap(stringProvider));
321     builder.putAllFieldMapInt32Uint3267(populateIntegerMap(integerProvider));
322     builder.putAllFieldMapInt32Uint6468(populateIntegerMap(longProvider));
323     builder.putAllFieldMapInt64Bool69(populateLongMap(booleanProvider));
324     builder.putAllFieldMapInt64Bytes70(populateLongMap(bytesProvider));
325     builder.putAllFieldMapInt64Double71(populateLongMap(doubleProvider));
326     builder.putAllFieldMapInt64Enum72(populateLongMap(enumProvider));
327     builder.putAllFieldMapInt64Fixed3273(populateLongMap(integerProvider));
328     builder.putAllFieldMapInt64Fixed6474(populateLongMap(longProvider));
329     builder.putAllFieldMapInt64Float75(populateLongMap(floatProvider));
330     builder.putAllFieldMapInt64Int3276(populateLongMap(integerProvider));
331     builder.putAllFieldMapInt64Int6477(populateLongMap(longProvider));
332     builder.putAllFieldMapInt64Message78(populateLongMap(messageProvider));
333     builder.putAllFieldMapInt64Sfixed3279(populateLongMap(integerProvider));
334     builder.putAllFieldMapInt64Sfixed6480(populateLongMap(longProvider));
335     builder.putAllFieldMapInt64Sint3281(populateLongMap(integerProvider));
336     builder.putAllFieldMapInt64Sint6482(populateLongMap(longProvider));
337     builder.putAllFieldMapInt64String83(populateLongMap(stringProvider));
338     builder.putAllFieldMapInt64Uint3284(populateLongMap(integerProvider));
339     builder.putAllFieldMapInt64Uint6485(populateLongMap(longProvider));
340     builder.putAllFieldMapSfixed32Bool86(populateIntegerMap(booleanProvider));
341     builder.putAllFieldMapSfixed32Bytes87(populateIntegerMap(bytesProvider));
342     builder.putAllFieldMapSfixed32Double88(populateIntegerMap(doubleProvider));
343     builder.putAllFieldMapSfixed32Enum89(populateIntegerMap(enumProvider));
344     builder.putAllFieldMapSfixed32Fixed3290(populateIntegerMap(integerProvider));
345     builder.putAllFieldMapSfixed32Fixed6491(populateIntegerMap(longProvider));
346     builder.putAllFieldMapSfixed32Float92(populateIntegerMap(floatProvider));
347     builder.putAllFieldMapSfixed32Int3293(populateIntegerMap(integerProvider));
348     builder.putAllFieldMapSfixed32Int6494(populateIntegerMap(longProvider));
349     builder.putAllFieldMapSfixed32Message95(populateIntegerMap(messageProvider));
350     builder.putAllFieldMapSfixed32Sfixed3296(populateIntegerMap(integerProvider));
351     builder.putAllFieldMapSfixed32Sfixed6497(populateIntegerMap(longProvider));
352     builder.putAllFieldMapSfixed32Sint3298(populateIntegerMap(integerProvider));
353     builder.putAllFieldMapSfixed32Sint6499(populateIntegerMap(longProvider));
354     builder.putAllFieldMapSfixed32String100(populateIntegerMap(stringProvider));
355     builder.putAllFieldMapSfixed32Uint32101(populateIntegerMap(integerProvider));
356     builder.putAllFieldMapSfixed32Uint64102(populateIntegerMap(longProvider));
357     builder.putAllFieldMapSfixed64Bool103(populateLongMap(booleanProvider));
358     builder.putAllFieldMapSfixed64Bytes104(populateLongMap(bytesProvider));
359     builder.putAllFieldMapSfixed64Double105(populateLongMap(doubleProvider));
360     builder.putAllFieldMapSfixed64Enum106(populateLongMap(enumProvider));
361     builder.putAllFieldMapSfixed64Fixed32107(populateLongMap(integerProvider));
362     builder.putAllFieldMapSfixed64Fixed64108(populateLongMap(longProvider));
363     builder.putAllFieldMapSfixed64Float109(populateLongMap(floatProvider));
364     builder.putAllFieldMapSfixed64Int32110(populateLongMap(integerProvider));
365     builder.putAllFieldMapSfixed64Int64111(populateLongMap(longProvider));
366     builder.putAllFieldMapSfixed64Message112(populateLongMap(messageProvider));
367     builder.putAllFieldMapSfixed64Sfixed32113(populateLongMap(integerProvider));
368     builder.putAllFieldMapSfixed64Sfixed64114(populateLongMap(longProvider));
369     builder.putAllFieldMapSfixed64Sint32115(populateLongMap(integerProvider));
370     builder.putAllFieldMapSfixed64Sint64116(populateLongMap(longProvider));
371     builder.putAllFieldMapSfixed64String117(populateLongMap(stringProvider));
372     builder.putAllFieldMapSfixed64Uint32118(populateLongMap(integerProvider));
373     builder.putAllFieldMapSfixed64Uint64119(populateLongMap(longProvider));
374     builder.putAllFieldMapSint32Bool120(populateIntegerMap(booleanProvider));
375     builder.putAllFieldMapSint32Bytes121(populateIntegerMap(bytesProvider));
376     builder.putAllFieldMapSint32Double122(populateIntegerMap(doubleProvider));
377     builder.putAllFieldMapSint32Enum123(populateIntegerMap(enumProvider));
378     builder.putAllFieldMapSint32Fixed32124(populateIntegerMap(integerProvider));
379     builder.putAllFieldMapSint32Fixed64125(populateIntegerMap(longProvider));
380     builder.putAllFieldMapSint32Float126(populateIntegerMap(floatProvider));
381     builder.putAllFieldMapSint32Int32127(populateIntegerMap(integerProvider));
382     builder.putAllFieldMapSint32Int64128(populateIntegerMap(longProvider));
383     builder.putAllFieldMapSint32Message129(populateIntegerMap(messageProvider));
384     builder.putAllFieldMapSint32Sfixed32130(populateIntegerMap(integerProvider));
385     builder.putAllFieldMapSint32Sfixed64131(populateIntegerMap(longProvider));
386     builder.putAllFieldMapSint32Sint32132(populateIntegerMap(integerProvider));
387     builder.putAllFieldMapSint32Sint64133(populateIntegerMap(longProvider));
388     builder.putAllFieldMapSint32String134(populateIntegerMap(stringProvider));
389     builder.putAllFieldMapSint32Uint32135(populateIntegerMap(integerProvider));
390     builder.putAllFieldMapSint32Uint64136(populateIntegerMap(longProvider));
391     builder.putAllFieldMapSint64Bool137(populateLongMap(booleanProvider));
392     builder.putAllFieldMapSint64Bytes138(populateLongMap(bytesProvider));
393     builder.putAllFieldMapSint64Double139(populateLongMap(doubleProvider));
394     builder.putAllFieldMapSint64Enum140(populateLongMap(enumProvider));
395     builder.putAllFieldMapSint64Fixed32141(populateLongMap(integerProvider));
396     builder.putAllFieldMapSint64Fixed64142(populateLongMap(longProvider));
397     builder.putAllFieldMapSint64Float143(populateLongMap(floatProvider));
398     builder.putAllFieldMapSint64Int32144(populateLongMap(integerProvider));
399     builder.putAllFieldMapSint64Int64145(populateLongMap(longProvider));
400     builder.putAllFieldMapSint64Message146(populateLongMap(messageProvider));
401     builder.putAllFieldMapSint64Sfixed32147(populateLongMap(integerProvider));
402     builder.putAllFieldMapSint64Sfixed64148(populateLongMap(longProvider));
403     builder.putAllFieldMapSint64Sint32149(populateLongMap(integerProvider));
404     builder.putAllFieldMapSint64Sint64150(populateLongMap(longProvider));
405     builder.putAllFieldMapSint64String151(populateLongMap(stringProvider));
406     builder.putAllFieldMapSint64Uint32152(populateLongMap(integerProvider));
407     builder.putAllFieldMapSint64Uint64153(populateLongMap(longProvider));
408     builder.putAllFieldMapStringBool154(populateStringMap(booleanProvider));
409     builder.putAllFieldMapStringBytes155(populateStringMap(bytesProvider));
410     builder.putAllFieldMapStringDouble156(populateStringMap(doubleProvider));
411     builder.putAllFieldMapStringEnum157(populateStringMap(enumProvider));
412     builder.putAllFieldMapStringFixed32158(populateStringMap(integerProvider));
413     builder.putAllFieldMapStringFixed64159(populateStringMap(longProvider));
414     builder.putAllFieldMapStringFloat160(populateStringMap(floatProvider));
415     builder.putAllFieldMapStringInt32161(populateStringMap(integerProvider));
416     builder.putAllFieldMapStringInt64162(populateStringMap(longProvider));
417     builder.putAllFieldMapStringMessage163(populateStringMap(messageProvider));
418     builder.putAllFieldMapStringSfixed32164(populateStringMap(integerProvider));
419     builder.putAllFieldMapStringSfixed64165(populateStringMap(longProvider));
420     builder.putAllFieldMapStringSint32166(populateStringMap(integerProvider));
421     builder.putAllFieldMapStringSint64167(populateStringMap(longProvider));
422     builder.putAllFieldMapStringString168(populateStringMap(stringProvider));
423     builder.putAllFieldMapStringUint32169(populateStringMap(integerProvider));
424     builder.putAllFieldMapStringUint64170(populateStringMap(longProvider));
425     builder.putAllFieldMapUint32Bool171(populateIntegerMap(booleanProvider));
426     builder.putAllFieldMapUint32Bytes172(populateIntegerMap(bytesProvider));
427     builder.putAllFieldMapUint32Double173(populateIntegerMap(doubleProvider));
428     builder.putAllFieldMapUint32Enum174(populateIntegerMap(enumProvider));
429     builder.putAllFieldMapUint32Fixed32175(populateIntegerMap(integerProvider));
430     builder.putAllFieldMapUint32Fixed64176(populateIntegerMap(longProvider));
431     builder.putAllFieldMapUint32Float177(populateIntegerMap(floatProvider));
432     builder.putAllFieldMapUint32Int32178(populateIntegerMap(integerProvider));
433     builder.putAllFieldMapUint32Int64179(populateIntegerMap(longProvider));
434     builder.putAllFieldMapUint32Message180(populateIntegerMap(messageProvider));
435     builder.putAllFieldMapUint32Sfixed32181(populateIntegerMap(integerProvider));
436     builder.putAllFieldMapUint32Sfixed64182(populateIntegerMap(longProvider));
437     builder.putAllFieldMapUint32Sint32183(populateIntegerMap(integerProvider));
438     builder.putAllFieldMapUint32Sint64184(populateIntegerMap(longProvider));
439     builder.putAllFieldMapUint32String185(populateIntegerMap(stringProvider));
440     builder.putAllFieldMapUint32Uint32186(populateIntegerMap(integerProvider));
441     builder.putAllFieldMapUint32Uint64187(populateIntegerMap(longProvider));
442     builder.putAllFieldMapUint64Bool188(populateLongMap(booleanProvider));
443     builder.putAllFieldMapUint64Bytes189(populateLongMap(bytesProvider));
444     builder.putAllFieldMapUint64Double190(populateLongMap(doubleProvider));
445     builder.putAllFieldMapUint64Enum191(populateLongMap(enumProvider));
446     builder.putAllFieldMapUint64Fixed32192(populateLongMap(integerProvider));
447     builder.putAllFieldMapUint64Fixed64193(populateLongMap(longProvider));
448     builder.putAllFieldMapUint64Float194(populateLongMap(floatProvider));
449     builder.putAllFieldMapUint64Int32195(populateLongMap(integerProvider));
450     builder.putAllFieldMapUint64Int64196(populateLongMap(longProvider));
451     builder.putAllFieldMapUint64Message197(populateLongMap(messageProvider));
452     builder.putAllFieldMapUint64Sfixed32198(populateLongMap(integerProvider));
453     builder.putAllFieldMapUint64Sfixed64199(populateLongMap(longProvider));
454     builder.putAllFieldMapUint64Sint32200(populateLongMap(integerProvider));
455     builder.putAllFieldMapUint64Sint64201(populateLongMap(longProvider));
456     builder.putAllFieldMapUint64String202(populateLongMap(stringProvider));
457     builder.putAllFieldMapUint64Uint32203(populateLongMap(integerProvider));
458     builder.putAllFieldMapUint64Uint64204(populateLongMap(longProvider));
459 
460     return builder.build();
461   }
462 
newMessagesMissingRequiredFields()463   public List<Proto2Message> newMessagesMissingRequiredFields() {
464     List<Proto2Message> results = new ArrayList<>();
465     for (int i = 71; i <= 88; ++i) {
466       Proto2Message.Builder builder = Proto2Message.newBuilder();
467       populateRequiredFields(builder, i);
468       results.add(builder.buildPartial());
469     }
470     {
471       // A nested optional message field is missing required fields.
472       Proto2Message.Builder builder = Proto2Message.newBuilder();
473       populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
474       builder.setFieldMessage10(Proto2Message.getDefaultInstance());
475       results.add(builder.buildPartial());
476     }
477     {
478       // A nested repeated message field is missing required fields.
479       Proto2Message.Builder builder = Proto2Message.newBuilder();
480       populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
481       builder.addFieldMessageList27(Proto2Message.getDefaultInstance());
482       results.add(builder.buildPartial());
483     }
484     {
485       // A nested oneof message field is missing required fields.
486       Proto2Message.Builder builder = Proto2Message.newBuilder();
487       populateRequiredFields(builder, INCLUDE_ALL_REQUIRED_FIELDS);
488       builder.setFieldMessage62(Proto2Message.getDefaultInstance());
489       results.add(builder.buildPartial());
490     }
491     return results;
492   }
493 
494   // 0 is not a valid field number so we use it to mean no fields are excluded.
495   private static final int INCLUDE_ALL_REQUIRED_FIELDS = 0;
496 
populateRequiredFields(Proto2Message.Builder builder, int excludedFieldNumber)497   private void populateRequiredFields(Proto2Message.Builder builder, int excludedFieldNumber) {
498     if (excludedFieldNumber != 71) {
499       builder.setFieldRequiredDouble71(data.getDouble());
500     }
501     if (excludedFieldNumber != 72) {
502       builder.setFieldRequiredFloat72(data.getFloat());
503     }
504     if (excludedFieldNumber != 73) {
505       builder.setFieldRequiredInt6473(data.getLong());
506     }
507     if (excludedFieldNumber != 74) {
508       builder.setFieldRequiredUint6474(data.getLong());
509     }
510     if (excludedFieldNumber != 75) {
511       builder.setFieldRequiredInt3275(data.getInt());
512     }
513     if (excludedFieldNumber != 76) {
514       builder.setFieldRequiredFixed6476(data.getLong());
515     }
516     if (excludedFieldNumber != 77) {
517       builder.setFieldRequiredFixed3277(data.getInt());
518     }
519     if (excludedFieldNumber != 78) {
520       builder.setFieldRequiredBool78(data.getBool());
521     }
522     if (excludedFieldNumber != 79) {
523       builder.setFieldRequiredString79(data.getString());
524     }
525     if (excludedFieldNumber != 80) {
526       builder.setFieldRequiredMessage80(
527           Proto2Message.RequiredNestedMessage.newBuilder().setValue(data.getInt()));
528     }
529     if (excludedFieldNumber != 81) {
530       builder.setFieldRequiredBytes81(data.getBytes());
531     }
532     if (excludedFieldNumber != 82) {
533       builder.setFieldRequiredUint3282(data.getInt());
534     }
535     if (excludedFieldNumber != 83) {
536       builder.setFieldRequiredEnum83(Proto2Message.TestEnum.forNumber(data.getEnum()));
537     }
538     if (excludedFieldNumber != 84) {
539       builder.setFieldRequiredSfixed3284(data.getInt());
540     }
541     if (excludedFieldNumber != 85) {
542       builder.setFieldRequiredSfixed6485(data.getLong());
543     }
544     if (excludedFieldNumber != 86) {
545       builder.setFieldRequiredSint3286(data.getInt());
546     }
547     if (excludedFieldNumber != 87) {
548       builder.setFieldRequiredSint6487(data.getLong());
549     }
550     if (excludedFieldNumber != 88) {
551       builder.setFieldRequiredGroup88(
552           Proto2Message.FieldRequiredGroup88.newBuilder().setFieldInt3289(data.getInt()));
553     }
554   }
555 }
556