| 
					
				 | 
			
			
				@@ -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 { 
			 |