|  | @@ -333,6 +333,64 @@ TEST_F(JsonUtilTest, TestDynamicMessage) {
 | 
	
		
			
				|  |  |    EXPECT_EQ(ToJson(generated, options), ToJson(*message, options));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +TEST_F(JsonUtilTest, TestParsingUnknownEnumsAs0) {
 | 
	
		
			
				|  |  | +  TestMessage m;
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    JsonParseOptions options;
 | 
	
		
			
				|  |  | +    ASSERT_FALSE(options.ignore_unknown_fields);
 | 
	
		
			
				|  |  | +    string input =
 | 
	
		
			
				|  |  | +      "{\n"
 | 
	
		
			
				|  |  | +      "  \"enum_value\":\"UNKNOWN_VALUE\"\n"
 | 
	
		
			
				|  |  | +      "}";
 | 
	
		
			
				|  |  | +    m.set_enum_value(proto3::BAR);
 | 
	
		
			
				|  |  | +    EXPECT_FALSE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    ASSERT_EQ(proto3::BAR, m.enum_value()); // Keep previous value
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    options.ignore_unknown_fields = true;
 | 
	
		
			
				|  |  | +    EXPECT_TRUE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    EXPECT_EQ(0, m.enum_value()); // Unknown enum value must be decoded as 0
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Integer values are read as usual
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    JsonParseOptions options;
 | 
	
		
			
				|  |  | +    string input =
 | 
	
		
			
				|  |  | +      "{\n"
 | 
	
		
			
				|  |  | +      "  \"enum_value\":12345\n"
 | 
	
		
			
				|  |  | +      "}";
 | 
	
		
			
				|  |  | +    m.set_enum_value(proto3::BAR);
 | 
	
		
			
				|  |  | +    EXPECT_TRUE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    ASSERT_EQ(12345, m.enum_value());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    options.ignore_unknown_fields = true;
 | 
	
		
			
				|  |  | +    EXPECT_TRUE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    EXPECT_EQ(12345, m.enum_value());
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Trying to pass an object as an enum field value is always treated as an error
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    JsonParseOptions options;
 | 
	
		
			
				|  |  | +    string input =
 | 
	
		
			
				|  |  | +      "{\n"
 | 
	
		
			
				|  |  | +      "  \"enum_value\":{}\n"
 | 
	
		
			
				|  |  | +      "}";
 | 
	
		
			
				|  |  | +    options.ignore_unknown_fields = true;
 | 
	
		
			
				|  |  | +    EXPECT_FALSE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    options.ignore_unknown_fields = false;
 | 
	
		
			
				|  |  | +    EXPECT_FALSE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  // Trying to pass an array as an enum field value is always treated as an error
 | 
	
		
			
				|  |  | +  {
 | 
	
		
			
				|  |  | +    JsonParseOptions options;
 | 
	
		
			
				|  |  | +    string input =
 | 
	
		
			
				|  |  | +      "{\n"
 | 
	
		
			
				|  |  | +      "  \"enum_value\":[]\n"
 | 
	
		
			
				|  |  | +      "}";
 | 
	
		
			
				|  |  | +    EXPECT_FALSE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +    options.ignore_unknown_fields = true;
 | 
	
		
			
				|  |  | +    EXPECT_FALSE(FromJson(input, &m, options));
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  typedef std::pair<char*, int> Segment;
 | 
	
		
			
				|  |  |  // A ZeroCopyOutputStream that writes to multiple buffers.
 | 
	
		
			
				|  |  |  class SegmentedZeroCopyOutputStream : public io::ZeroCopyOutputStream {
 |