371
390
TestMessageSetExtension2.messageSetExtension));
372
391
assertEquals("foo", messageSet.getExtension(
373
392
TestMessageSetExtension2.messageSetExtension).getStr());
394
builder = TestMessageSet.newBuilder();
395
TextFormat.merge(messageSetTextWithRepeatedExtension, extensionRegistry,
397
messageSet = builder.build();
398
assertEquals(456, messageSet.getExtension(
399
TestMessageSetExtension1.messageSetExtension).getI());
402
public void testParseMessageSetWithOverwriteForbidden() throws Exception {
403
ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance();
404
extensionRegistry.add(TestMessageSetExtension1.messageSetExtension);
405
extensionRegistry.add(TestMessageSetExtension2.messageSetExtension);
407
TestMessageSet.Builder builder = TestMessageSet.newBuilder();
408
parserWithOverwriteForbidden.merge(
409
messageSetText, extensionRegistry, builder);
410
TestMessageSet messageSet = builder.build();
411
assertEquals(123, messageSet.getExtension(
412
TestMessageSetExtension1.messageSetExtension).getI());
413
assertEquals("foo", messageSet.getExtension(
414
TestMessageSetExtension2.messageSetExtension).getStr());
416
builder = TestMessageSet.newBuilder();
418
parserWithOverwriteForbidden.merge(
419
messageSetTextWithRepeatedExtension, extensionRegistry, builder);
420
fail("expected parse exception");
421
} catch (TextFormat.ParseException e) {
422
assertEquals("6:1: Non-repeated field "
423
+ "\"protobuf_unittest.TestMessageSetExtension1.message_set_extension\""
424
+ " cannot be overwritten.",
376
429
public void testParseNumericEnum() throws Exception {
463
private void assertParseErrorWithOverwriteForbidden(String error,
465
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
467
parserWithOverwriteForbidden.merge(
468
text, TestUtil.getExtensionRegistry(), builder);
469
fail("Expected parse exception.");
470
} catch (TextFormat.ParseException e) {
471
assertEquals(error, e.getMessage());
475
private TestAllTypes assertParseSuccessWithOverwriteForbidden(
476
String text) throws TextFormat.ParseException {
477
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
478
parserWithOverwriteForbidden.merge(
479
text, TestUtil.getExtensionRegistry(), builder);
480
return builder.build();
410
483
public void testParseErrors() throws Exception {
411
484
assertParseError(
412
485
"1:16: Expected \":\".",
413
486
"optional_int32 123");
414
487
assertParseError(
415
"1:23: Expected identifier.",
488
"1:23: Expected identifier. Found '?'",
416
489
"optional_nested_enum: ?");
417
490
assertParseError(
418
491
"1:18: Couldn't parse integer: Number must be positive: -1",
772
845
.setOptionalBytes(bytes(0xe3, 0x81, 0x82))
773
846
.addRepeatedString("\u3093XYZ")
849
// Double quotes and backslashes should be escaped
851
"optional_string: \"a\\\\bc\\\"ef\\\"g\"\n",
852
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
853
.setOptionalString("a\\bc\"ef\"g")
856
// Test escaping roundtrip
857
TestAllTypes message = TestAllTypes.newBuilder()
858
.setOptionalString("a\\bc\\\"ef\"g")
860
TestAllTypes.Builder builder = TestAllTypes.newBuilder();
861
TextFormat.merge(TextFormat.printToUnicodeString(message), builder);
862
assertEquals(message.getOptionalString(), builder.getOptionalString());
865
public void testPrintToUnicodeStringWithNewlines() {
866
// No newlines at start and end
867
assertEquals("optional_string: \"test newlines\n\nin\nstring\"\n",
868
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
869
.setOptionalString("test newlines\n\nin\nstring")
872
// Newlines at start and end
873
assertEquals("optional_string: \"\ntest\nnewlines\n\nin\nstring\n\"\n",
874
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
875
.setOptionalString("\ntest\nnewlines\n\nin\nstring\n")
878
// Strings with 0, 1 and 2 newlines.
879
assertEquals("optional_string: \"\"\n",
880
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
881
.setOptionalString("")
883
assertEquals("optional_string: \"\n\"\n",
884
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
885
.setOptionalString("\n")
887
assertEquals("optional_string: \"\n\n\"\n",
888
TextFormat.printToUnicodeString(TestAllTypes.newBuilder()
889
.setOptionalString("\n\n")
777
893
public void testPrintToUnicodeString_unknown() {
783
899
.addLengthDelimited(bytes(0xe3, 0x81, 0x82)).build())
903
public void testParseNonRepeatedFields() throws Exception {
904
assertParseSuccessWithOverwriteForbidden(
905
"repeated_int32: 1\n" +
906
"repeated_int32: 2\n");
907
assertParseSuccessWithOverwriteForbidden(
908
"RepeatedGroup { a: 1 }\n" +
909
"RepeatedGroup { a: 2 }\n");
910
assertParseSuccessWithOverwriteForbidden(
911
"repeated_nested_message { bb: 1 }\n" +
912
"repeated_nested_message { bb: 2 }\n");
913
assertParseErrorWithOverwriteForbidden(
914
"3:17: Non-repeated field " +
915
"\"protobuf_unittest.TestAllTypes.optional_int32\" " +
916
"cannot be overwritten.",
917
"optional_int32: 1\n" +
918
"optional_bool: true\n" +
919
"optional_int32: 1\n");
920
assertParseErrorWithOverwriteForbidden(
921
"2:17: Non-repeated field " +
922
"\"protobuf_unittest.TestAllTypes.optionalgroup\" " +
923
"cannot be overwritten.",
924
"OptionalGroup { a: 1 }\n" +
925
"OptionalGroup { }\n");
926
assertParseErrorWithOverwriteForbidden(
927
"2:33: Non-repeated field " +
928
"\"protobuf_unittest.TestAllTypes.optional_nested_message\" " +
929
"cannot be overwritten.",
930
"optional_nested_message { }\n" +
931
"optional_nested_message { bb: 3 }\n");
932
assertParseErrorWithOverwriteForbidden(
933
"2:16: Non-repeated field " +
934
"\"protobuf_unittest.TestAllTypes.default_int32\" " +
935
"cannot be overwritten.",
936
"default_int32: 41\n" + // the default value
937
"default_int32: 41\n");
938
assertParseErrorWithOverwriteForbidden(
939
"2:17: Non-repeated field " +
940
"\"protobuf_unittest.TestAllTypes.default_string\" " +
941
"cannot be overwritten.",
942
"default_string: \"zxcv\"\n" +
943
"default_string: \"asdf\"\n");
946
public void testParseShortRepeatedFormOfRepeatedFields() throws Exception {
947
assertParseSuccessWithOverwriteForbidden("repeated_foreign_enum: [FOREIGN_FOO, FOREIGN_BAR]");
948
assertParseSuccessWithOverwriteForbidden("repeated_int32: [ 1, 2 ]\n");
949
assertParseSuccessWithOverwriteForbidden("RepeatedGroup [{ a: 1 },{ a: 2 }]\n");
950
assertParseSuccessWithOverwriteForbidden("repeated_nested_message [{ bb: 1 }, { bb: 2 }]\n");
953
public void testParseShortRepeatedFormOfNonRepeatedFields() throws Exception {
954
assertParseErrorWithOverwriteForbidden(
955
"1:17: Couldn't parse integer: For input string: \"[\"",
956
"optional_int32: [1]\n");
959
// =======================================================================
962
public void testOneofTextFormat() throws Exception {
963
TestOneof2.Builder builder = TestOneof2.newBuilder();
964
TestUtil.setOneof(builder);
965
TestOneof2 message = builder.build();
966
TestOneof2.Builder dest = TestOneof2.newBuilder();
967
TextFormat.merge(TextFormat.printToUnicodeString(message), dest);
968
TestUtil.assertOneofSet(dest.build());
971
public void testOneofOverwriteForbidden() throws Exception {
972
String input = "foo_string: \"stringvalue\" foo_int: 123";
973
TestOneof2.Builder builder = TestOneof2.newBuilder();
975
parserWithOverwriteForbidden.merge(
976
input, TestUtil.getExtensionRegistry(), builder);
977
fail("Expected parse exception.");
978
} catch (TextFormat.ParseException e) {
979
assertEquals("1:36: Field \"protobuf_unittest.TestOneof2.foo_int\""
980
+ " is specified along with field \"protobuf_unittest.TestOneof2.foo_string\","
981
+ " another member of oneof \"foo\".", e.getMessage());
985
public void testOneofOverwriteAllowed() throws Exception {
986
String input = "foo_string: \"stringvalue\" foo_int: 123";
987
TestOneof2.Builder builder = TestOneof2.newBuilder();
988
defaultParser.merge(input, TestUtil.getExtensionRegistry(), builder);
989
// Only the last value sticks.
990
TestOneof2 oneof = builder.build();
991
assertFalse(oneof.hasFooString());
992
assertTrue(oneof.hasFooInt());