Index: third_party/protobuf/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs |
diff --git a/third_party/protobuf/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs b/third_party/protobuf/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs |
index 8473b4be58c680896195398d797ef3aa43d8181b..827a75956fc0dcef2ca589ad63267ff1919fb761 100644 |
--- a/third_party/protobuf/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs |
+++ b/third_party/protobuf/csharp/src/Google.Protobuf.Test/JsonFormatterTest.cs |
@@ -37,6 +37,8 @@ using UnitTest.Issues.TestProtos; |
using Google.Protobuf.WellKnownTypes; |
using Google.Protobuf.Reflection; |
+using static Google.Protobuf.JsonParserTest; // For WrapInQuotes |
+ |
namespace Google.Protobuf |
{ |
/// <summary> |
@@ -73,13 +75,13 @@ namespace Google.Protobuf |
SingleFixed32 = 23, |
SingleFixed64 = 1234567890123, |
SingleFloat = 12.25f, |
- SingleForeignEnum = ForeignEnum.FOREIGN_BAR, |
+ SingleForeignEnum = ForeignEnum.ForeignBar, |
SingleForeignMessage = new ForeignMessage { C = 10 }, |
- SingleImportEnum = ImportEnum.IMPORT_BAZ, |
+ SingleImportEnum = ImportEnum.ImportBaz, |
SingleImportMessage = new ImportMessage { D = 20 }, |
SingleInt32 = 100, |
SingleInt64 = 3210987654321, |
- SingleNestedEnum = TestAllTypes.Types.NestedEnum.FOO, |
+ SingleNestedEnum = TestAllTypes.Types.NestedEnum.Foo, |
SingleNestedMessage = new TestAllTypes.Types.NestedMessage { Bb = 35 }, |
SinglePublicImportMessage = new PublicImportMessage { E = 54 }, |
SingleSfixed32 = -123, |
@@ -163,41 +165,31 @@ namespace Google.Protobuf |
} |
[Test] |
- public void UnknownEnumValueOmitted_SingleField() |
+ public void UnknownEnumValueNumeric_SingleField() |
{ |
var message = new TestAllTypes { SingleForeignEnum = (ForeignEnum) 100 }; |
- AssertJson("{ }", JsonFormatter.Default.Format(message)); |
+ AssertJson("{ 'singleForeignEnum': 100 }", JsonFormatter.Default.Format(message)); |
} |
[Test] |
- public void UnknownEnumValueOmitted_RepeatedField() |
+ public void UnknownEnumValueNumeric_RepeatedField() |
{ |
- var message = new TestAllTypes { RepeatedForeignEnum = { ForeignEnum.FOREIGN_BAZ, (ForeignEnum) 100, ForeignEnum.FOREIGN_FOO } }; |
- AssertJson("{ 'repeatedForeignEnum': [ 'FOREIGN_BAZ', 'FOREIGN_FOO' ] }", JsonFormatter.Default.Format(message)); |
+ var message = new TestAllTypes { RepeatedForeignEnum = { ForeignEnum.ForeignBaz, (ForeignEnum) 100, ForeignEnum.ForeignFoo } }; |
+ AssertJson("{ 'repeatedForeignEnum': [ 'FOREIGN_BAZ', 100, 'FOREIGN_FOO' ] }", JsonFormatter.Default.Format(message)); |
} |
[Test] |
- public void UnknownEnumValueOmitted_MapField() |
+ public void UnknownEnumValueNumeric_MapField() |
{ |
- // This matches the C++ behaviour. |
- var message = new TestMap { MapInt32Enum = { { 1, MapEnum.MAP_ENUM_FOO }, { 2, (MapEnum) 100 }, { 3, MapEnum.MAP_ENUM_BAR } } }; |
- AssertJson("{ 'mapInt32Enum': { '1': 'MAP_ENUM_FOO', '3': 'MAP_ENUM_BAR' } }", JsonFormatter.Default.Format(message)); |
+ var message = new TestMap { MapInt32Enum = { { 1, MapEnum.Foo }, { 2, (MapEnum) 100 }, { 3, MapEnum.Bar } } }; |
+ AssertJson("{ 'mapInt32Enum': { '1': 'MAP_ENUM_FOO', '2': 100, '3': 'MAP_ENUM_BAR' } }", JsonFormatter.Default.Format(message)); |
} |
[Test] |
- public void UnknownEnumValueOmitted_RepeatedField_AllEntriesUnknown() |
+ public void UnknownEnumValue_RepeatedField_AllEntriesUnknown() |
{ |
- // *Maybe* we should hold off on writing the "[" until we find that we've got at least one value to write... |
- // but this is what happens at the moment, and it doesn't seem too awful. |
var message = new TestAllTypes { RepeatedForeignEnum = { (ForeignEnum) 200, (ForeignEnum) 100 } }; |
- AssertJson("{ 'repeatedForeignEnum': [ ] }", JsonFormatter.Default.Format(message)); |
- } |
- |
- [Test] |
- public void NullValueForMessage() |
- { |
- var message = new TestMap { MapInt32ForeignMessage = { { 10, null } } }; |
- AssertJson("{ 'mapInt32ForeignMessage': { '10': null } }", JsonFormatter.Default.Format(message)); |
+ AssertJson("{ 'repeatedForeignEnum': [ 200, 100 ] }", JsonFormatter.Default.Format(message)); |
} |
[Test] |
@@ -319,27 +311,51 @@ namespace Google.Protobuf |
} |
[Test] |
- public void TimestampStandalone() |
+ [TestCase("1970-01-01T00:00:00Z", 0)] |
+ [TestCase("1970-01-01T00:00:00.000000001Z", 1)] |
+ [TestCase("1970-01-01T00:00:00.000000010Z", 10)] |
+ [TestCase("1970-01-01T00:00:00.000000100Z", 100)] |
+ [TestCase("1970-01-01T00:00:00.000001Z", 1000)] |
+ [TestCase("1970-01-01T00:00:00.000010Z", 10000)] |
+ [TestCase("1970-01-01T00:00:00.000100Z", 100000)] |
+ [TestCase("1970-01-01T00:00:00.001Z", 1000000)] |
+ [TestCase("1970-01-01T00:00:00.010Z", 10000000)] |
+ [TestCase("1970-01-01T00:00:00.100Z", 100000000)] |
+ [TestCase("1970-01-01T00:00:00.120Z", 120000000)] |
+ [TestCase("1970-01-01T00:00:00.123Z", 123000000)] |
+ [TestCase("1970-01-01T00:00:00.123400Z", 123400000)] |
+ [TestCase("1970-01-01T00:00:00.123450Z", 123450000)] |
+ [TestCase("1970-01-01T00:00:00.123456Z", 123456000)] |
+ [TestCase("1970-01-01T00:00:00.123456700Z", 123456700)] |
+ [TestCase("1970-01-01T00:00:00.123456780Z", 123456780)] |
+ [TestCase("1970-01-01T00:00:00.123456789Z", 123456789)] |
+ public void TimestampStandalone(string expected, int nanos) |
{ |
- Assert.AreEqual("1970-01-01T00:00:00Z", new Timestamp().ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.100Z", new Timestamp { Nanos = 100000000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.120Z", new Timestamp { Nanos = 120000000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123Z", new Timestamp { Nanos = 123000000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123400Z", new Timestamp { Nanos = 123400000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123450Z", new Timestamp { Nanos = 123450000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123456Z", new Timestamp { Nanos = 123456000 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123456700Z", new Timestamp { Nanos = 123456700 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123456780Z", new Timestamp { Nanos = 123456780 }.ToString()); |
- Assert.AreEqual("1970-01-01T00:00:00.123456789Z", new Timestamp { Nanos = 123456789 }.ToString()); |
+ Assert.AreEqual(WrapInQuotes(expected), new Timestamp { Nanos = nanos }.ToString()); |
+ } |
- // One before and one after the Unix epoch |
- Assert.AreEqual("1673-06-19T12:34:56Z", |
+ [Test] |
+ public void TimestampStandalone_FromDateTime() |
+ { |
+ // One before and one after the Unix epoch, more easily represented via DateTime. |
+ Assert.AreEqual("\"1673-06-19T12:34:56Z\"", |
new DateTime(1673, 6, 19, 12, 34, 56, DateTimeKind.Utc).ToTimestamp().ToString()); |
- Assert.AreEqual("2015-07-31T10:29:34Z", |
+ Assert.AreEqual("\"2015-07-31T10:29:34Z\"", |
new DateTime(2015, 7, 31, 10, 29, 34, DateTimeKind.Utc).ToTimestamp().ToString()); |
} |
[Test] |
+ [TestCase(-1, -1)] // Would be valid as duration |
+ [TestCase(1, Timestamp.MaxNanos + 1)] |
+ [TestCase(Timestamp.UnixSecondsAtBclMaxValue + 1, 0)] |
+ [TestCase(Timestamp.UnixSecondsAtBclMinValue - 1, 0)] |
+ public void TimestampStandalone_NonNormalized(long seconds, int nanoseconds) |
+ { |
+ var timestamp = new Timestamp { Seconds = seconds, Nanos = nanoseconds }; |
+ Assert.Throws<InvalidOperationException>(() => JsonFormatter.Default.Format(timestamp)); |
+ } |
+ |
+ [Test] |
public void TimestampField() |
{ |
var message = new TestWellKnownTypes { TimestampField = new Timestamp() }; |
@@ -350,6 +366,14 @@ namespace Google.Protobuf |
[TestCase(0, 0, "0s")] |
[TestCase(1, 0, "1s")] |
[TestCase(-1, 0, "-1s")] |
+ [TestCase(0, 1, "0.000000001s")] |
+ [TestCase(0, 10, "0.000000010s")] |
+ [TestCase(0, 100, "0.000000100s")] |
+ [TestCase(0, 1000, "0.000001s")] |
+ [TestCase(0, 10000, "0.000010s")] |
+ [TestCase(0, 100000, "0.000100s")] |
+ [TestCase(0, 1000000, "0.001s")] |
+ [TestCase(0, 10000000, "0.010s")] |
[TestCase(0, 100000000, "0.100s")] |
[TestCase(0, 120000000, "0.120s")] |
[TestCase(0, 123000000, "0.123s")] |
@@ -362,12 +386,19 @@ namespace Google.Protobuf |
[TestCase(0, -100000000, "-0.100s")] |
[TestCase(1, 100000000, "1.100s")] |
[TestCase(-1, -100000000, "-1.100s")] |
- // Non-normalized examples |
- [TestCase(1, 2123456789, "3.123456789s")] |
- [TestCase(1, -100000000, "0.900s")] |
public void DurationStandalone(long seconds, int nanoseconds, string expected) |
{ |
- Assert.AreEqual(expected, new Duration { Seconds = seconds, Nanos = nanoseconds }.ToString()); |
+ var json = JsonFormatter.Default.Format(new Duration { Seconds = seconds, Nanos = nanoseconds }); |
+ Assert.AreEqual(WrapInQuotes(expected), json); |
+ } |
+ |
+ [Test] |
+ [TestCase(1, 2123456789)] |
+ [TestCase(1, -100000000)] |
+ public void DurationStandalone_NonNormalized(long seconds, int nanoseconds) |
+ { |
+ var duration = new Duration { Seconds = seconds, Nanos = nanoseconds }; |
+ Assert.Throws<InvalidOperationException>(() => JsonFormatter.Default.Format(duration)); |
} |
[Test] |
@@ -396,14 +427,24 @@ namespace Google.Protobuf |
} |
[Test] |
+ [TestCase("foo__bar")] |
+ [TestCase("foo_3_ar")] |
+ [TestCase("fooBar")] |
+ public void FieldMaskInvalid(string input) |
+ { |
+ var mask = new FieldMask { Paths = { input } }; |
+ Assert.Throws<InvalidOperationException>(() => JsonFormatter.Default.Format(mask)); |
+ } |
+ |
+ [Test] |
public void FieldMaskStandalone() |
{ |
var fieldMask = new FieldMask { Paths = { "", "single", "with_underscore", "nested.field.name", "nested..double_dot" } }; |
- Assert.AreEqual(",single,withUnderscore,nested.field.name,nested..doubleDot", fieldMask.ToString()); |
+ Assert.AreEqual("\",single,withUnderscore,nested.field.name,nested..doubleDot\"", fieldMask.ToString()); |
// Invalid, but we shouldn't create broken JSON... |
fieldMask = new FieldMask { Paths = { "x\\y" } }; |
- Assert.AreEqual(@"x\\y", fieldMask.ToString()); |
+ Assert.AreEqual(@"""x\\y""", fieldMask.ToString()); |
} |
[Test] |
@@ -440,6 +481,15 @@ namespace Google.Protobuf |
} |
[Test] |
+ public void AnyMessageType_CustomPrefix() |
+ { |
+ var formatter = new JsonFormatter(new JsonFormatter.Settings(false, TypeRegistry.FromMessages(TestAllTypes.Descriptor))); |
+ var message = new TestAllTypes { SingleInt32 = 10 }; |
+ var any = Any.Pack(message, "foo.bar/baz"); |
+ AssertJson("{ '@type': 'foo.bar/baz/protobuf_unittest.TestAllTypes', 'singleInt32': 10 }", formatter.Format(any)); |
+ } |
+ |
+ [Test] |
public void AnyNested() |
{ |
var registry = TypeRegistry.FromMessages(TestWellKnownTypes.Descriptor, TestAllTypes.Descriptor); |