Skip to content

Commit

Permalink
Merge pull request #594 from jskeet/csharp-wellknowntypes
Browse files Browse the repository at this point in the history
Introduce C# well-known types
  • Loading branch information
jtattermusch committed Jul 15, 2015
2 parents f30c3d3 + 62a4aa5 commit f828160
Show file tree
Hide file tree
Showing 31 changed files with 4,808 additions and 130 deletions.
12 changes: 12 additions & 0 deletions csharp/generate_protos.sh
Expand Up @@ -42,6 +42,18 @@ $PROTOC -Isrc --csharp_out=csharp/src/ProtocolBuffers/Reflection \
src/google/protobuf/descriptor_proto_file.proto
rm src/google/protobuf/descriptor_proto_file.proto

$PROTOC -Isrc --csharp_out=csharp/src/ProtocolBuffers/WellKnownTypes \
src/google/protobuf/any.proto \
src/google/protobuf/api.proto \
src/google/protobuf/duration.proto \
src/google/protobuf/empty.proto \
src/google/protobuf/field_mask.proto \
src/google/protobuf/source_context.proto \
src/google/protobuf/struct.proto \
src/google/protobuf/timestamp.proto \
src/google/protobuf/type.proto \
src/google/protobuf/wrappers.proto

$PROTOC -Isrc --csharp_out=csharp/src/ProtocolBuffers.Test/TestProtos \
src/google/protobuf/map_unittest_proto3.proto \
src/google/protobuf/unittest_proto3.proto \
Expand Down
6 changes: 3 additions & 3 deletions csharp/src/AddressBook/Addressbook.cs
Expand Up @@ -63,7 +63,7 @@ public sealed partial class Person : pb::IMessage<Person> {
get { return global::Google.Protobuf.Examples.AddressBook.Addressbook.Descriptor.MessageTypes[0]; }
}

public pbr::FieldAccessorTable Fields {
pbr::FieldAccessorTable pb::IReflectedMessage.Fields {
get { return global::Google.Protobuf.Examples.AddressBook.Addressbook.internal__static_tutorial_Person__FieldAccessorTable; }
}

Expand Down Expand Up @@ -262,7 +262,7 @@ public sealed partial class PhoneNumber : pb::IMessage<PhoneNumber> {
get { return global::Google.Protobuf.Examples.AddressBook.Person.Descriptor.NestedTypes[0]; }
}

public pbr::FieldAccessorTable Fields {
pbr::FieldAccessorTable pb::IReflectedMessage.Fields {
get { return global::Google.Protobuf.Examples.AddressBook.Addressbook.internal__static_tutorial_Person_PhoneNumber__FieldAccessorTable; }
}

Expand Down Expand Up @@ -413,7 +413,7 @@ public sealed partial class AddressBook : pb::IMessage<AddressBook> {
get { return global::Google.Protobuf.Examples.AddressBook.Addressbook.Descriptor.MessageTypes[1]; }
}

public pbr::FieldAccessorTable Fields {
pbr::FieldAccessorTable pb::IReflectedMessage.Fields {
get { return global::Google.Protobuf.Examples.AddressBook.Addressbook.internal__static_tutorial_AddressBook__FieldAccessorTable; }
}

Expand Down
22 changes: 12 additions & 10 deletions csharp/src/ProtocolBuffers.Test/GeneratedMessageTest.cs
Expand Up @@ -604,7 +604,7 @@ public void OneofSerialization_DefaultValue()
public void Reflection_GetValue()
{
var message = SampleMessages.CreateFullTestAllTypes();
var fields = message.Fields;
var fields = ((IReflectedMessage) message).Fields;
Assert.AreEqual(message.SingleBool, fields[TestAllTypes.SingleBoolFieldNumber].GetValue(message));
Assert.AreEqual(message.SingleBytes, fields[TestAllTypes.SingleBytesFieldNumber].GetValue(message));
Assert.AreEqual(message.SingleDouble, fields[TestAllTypes.SingleDoubleFieldNumber].GetValue(message));
Expand Down Expand Up @@ -639,15 +639,16 @@ public void Reflection_GetValue()

// Just a single map field, for the same reason
var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
var dictionary = (IDictionary)mapMessage.Fields[TestMap.MapStringStringFieldNumber].GetValue(mapMessage);
fields = ((IReflectedMessage) mapMessage).Fields;
var dictionary = (IDictionary) fields[TestMap.MapStringStringFieldNumber].GetValue(mapMessage);
Assert.AreEqual(mapMessage.MapStringString, dictionary);
Assert.AreEqual("value1", dictionary["key1"]);
}

[Test]
public void Reflection_Clear()
{
var message = SampleMessages.CreateFullTestAllTypes();
IReflectedMessage message = SampleMessages.CreateFullTestAllTypes();
var fields = message.Fields;
fields[TestAllTypes.SingleBoolFieldNumber].Clear(message);
fields[TestAllTypes.SingleInt32FieldNumber].Clear(message);
Expand All @@ -672,15 +673,16 @@ public void Reflection_Clear()

// Separately, maps.
var mapMessage = new TestMap { MapStringString = { { "key1", "value1" }, { "key2", "value2" } } };
mapMessage.Fields[TestMap.MapStringStringFieldNumber].Clear(mapMessage);
fields = ((IReflectedMessage) mapMessage).Fields;
fields[TestMap.MapStringStringFieldNumber].Clear(mapMessage);
Assert.AreEqual(0, mapMessage.MapStringString.Count);
}

[Test]
public void Reflection_SetValue_SingleFields()
{
// Just a sample (primitives, messages, enums, strings, byte strings)
var message = SampleMessages.CreateFullTestAllTypes();
IReflectedMessage message = SampleMessages.CreateFullTestAllTypes();
var fields = message.Fields;
fields[TestAllTypes.SingleBoolFieldNumber].SetValue(message, false);
fields[TestAllTypes.SingleInt32FieldNumber].SetValue(message, 500);
Expand All @@ -707,39 +709,39 @@ public void Reflection_SetValue_SingleFields()
[Test]
public void Reflection_SetValue_SingleFields_WrongType()
{
var message = SampleMessages.CreateFullTestAllTypes();
IReflectedMessage message = SampleMessages.CreateFullTestAllTypes();
var fields = message.Fields;
Assert.Throws<InvalidCastException>(() => fields[TestAllTypes.SingleBoolFieldNumber].SetValue(message, "This isn't a bool"));
}

[Test]
public void Reflection_SetValue_MapFields()
{
var message = new TestMap();
IReflectedMessage message = new TestMap();
var fields = message.Fields;
Assert.Throws<InvalidOperationException>(() => fields[TestMap.MapStringStringFieldNumber].SetValue(message, new Dictionary<string, string>()));
}

[Test]
public void Reflection_SetValue_RepeatedFields()
{
var message = SampleMessages.CreateFullTestAllTypes();
IReflectedMessage message = SampleMessages.CreateFullTestAllTypes();
var fields = message.Fields;
Assert.Throws<InvalidOperationException>(() => fields[TestAllTypes.RepeatedDoubleFieldNumber].SetValue(message, new double[10]));
}

[Test]
public void Reflection_GetValue_IncorrectType()
{
var message = SampleMessages.CreateFullTestAllTypes();
IReflectedMessage message = SampleMessages.CreateFullTestAllTypes();
Assert.Throws<InvalidCastException>(() => message.Fields[TestAllTypes.SingleBoolFieldNumber].GetValue(new TestMap()));
}

[Test]
public void Reflection_Oneof()
{
var message = new TestAllTypes();
var fields = message.Fields;
var fields = ((IReflectedMessage) message).Fields;
Assert.AreEqual(1, fields.Oneofs.Count);
var oneof = fields.Oneofs[0];
Assert.AreEqual("oneof_field", oneof.Descriptor.Name);
Expand Down

0 comments on commit f828160

Please sign in to comment.