|  | @@ -31,6 +31,7 @@
 | 
	
		
			
				|  |  |  #endregion
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  using Conformance;
 | 
	
		
			
				|  |  | +using Google.Protobuf.Reflection;
 | 
	
		
			
				|  |  |  using System;
 | 
	
		
			
				|  |  |  using System.IO;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -47,16 +48,17 @@ namespace Google.Protobuf.Conformance
 | 
	
		
			
				|  |  |              // This way we get the binary streams instead of readers/writers.
 | 
	
		
			
				|  |  |              var input = new BinaryReader(Console.OpenStandardInput());
 | 
	
		
			
				|  |  |              var output = new BinaryWriter(Console.OpenStandardOutput());
 | 
	
		
			
				|  |  | +            var typeRegistry = TypeRegistry.FromMessages(TestAllTypes.Descriptor);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              int count = 0;
 | 
	
		
			
				|  |  | -            while (RunTest(input, output))
 | 
	
		
			
				|  |  | +            while (RunTest(input, output, typeRegistry))
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  count++;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              Console.Error.WriteLine("Received EOF after {0} tests", count);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static bool RunTest(BinaryReader input, BinaryWriter output)
 | 
	
		
			
				|  |  | +        private static bool RunTest(BinaryReader input, BinaryWriter output, TypeRegistry typeRegistry)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              int? size = ReadInt32(input);
 | 
	
		
			
				|  |  |              if (size == null)
 | 
	
	
		
			
				|  | @@ -69,7 +71,7 @@ namespace Google.Protobuf.Conformance
 | 
	
		
			
				|  |  |                  throw new EndOfStreamException("Read " + inputData.Length + " bytes of data when expecting " + size);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              ConformanceRequest request = ConformanceRequest.Parser.ParseFrom(inputData);
 | 
	
		
			
				|  |  | -            ConformanceResponse response = PerformRequest(request);
 | 
	
		
			
				|  |  | +            ConformanceResponse response = PerformRequest(request, typeRegistry);
 | 
	
		
			
				|  |  |              byte[] outputData = response.ToByteArray();
 | 
	
		
			
				|  |  |              output.Write(outputData.Length);
 | 
	
		
			
				|  |  |              output.Write(outputData);
 | 
	
	
		
			
				|  | @@ -77,30 +79,33 @@ namespace Google.Protobuf.Conformance
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        private static ConformanceResponse PerformRequest(ConformanceRequest request)
 | 
	
		
			
				|  |  | +        private static ConformanceResponse PerformRequest(ConformanceRequest request, TypeRegistry typeRegistry)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              TestAllTypes message;
 | 
	
		
			
				|  |  | -            switch (request.PayloadCase)
 | 
	
		
			
				|  |  | +            try
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                case ConformanceRequest.PayloadOneofCase.JsonPayload:
 | 
	
		
			
				|  |  | -                    return new ConformanceResponse { Skipped = "JSON parsing not implemented in C# yet" };
 | 
	
		
			
				|  |  | -                case ConformanceRequest.PayloadOneofCase.ProtobufPayload:
 | 
	
		
			
				|  |  | -                    try
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | +                switch (request.PayloadCase)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    case ConformanceRequest.PayloadOneofCase.JsonPayload:
 | 
	
		
			
				|  |  | +                        var parser = new JsonParser(new JsonParser.Settings(20, typeRegistry));
 | 
	
		
			
				|  |  | +                        message = parser.Parse<TestAllTypes>(request.JsonPayload);
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    case ConformanceRequest.PayloadOneofCase.ProtobufPayload:
 | 
	
		
			
				|  |  |                          message = TestAllTypes.Parser.ParseFrom(request.ProtobufPayload);
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    catch (InvalidProtocolBufferException e)
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        return new ConformanceResponse { ParseError = e.Message };
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                    break;
 | 
	
		
			
				|  |  | -                default:
 | 
	
		
			
				|  |  | -                    throw new Exception("Unsupported request payload: " + request.PayloadCase);
 | 
	
		
			
				|  |  | +                        break;
 | 
	
		
			
				|  |  | +                    default:
 | 
	
		
			
				|  |  | +                        throw new Exception("Unsupported request payload: " + request.PayloadCase);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            catch (InvalidProtocolBufferException e)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                return new ConformanceResponse { ParseError = e.Message };
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              switch (request.RequestedOutputFormat)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  case global::Conformance.WireFormat.JSON:
 | 
	
		
			
				|  |  | -                    return new ConformanceResponse { JsonPayload = JsonFormatter.Default.Format(message) };
 | 
	
		
			
				|  |  | +                    var formatter = new JsonFormatter(new JsonFormatter.Settings(false, typeRegistry));
 | 
	
		
			
				|  |  | +                    return new ConformanceResponse { JsonPayload = formatter.Format(message) };
 | 
	
		
			
				|  |  |                  case global::Conformance.WireFormat.PROTOBUF:
 | 
	
		
			
				|  |  |                      return new ConformanceResponse { ProtobufPayload = message.ToByteString() };
 | 
	
		
			
				|  |  |                  default:
 |