1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc. All rights reserved. 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/ 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met: 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions of source code must retain the above copyright 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer. 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Redistributions in binary form must reproduce the above 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution. 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// * Neither the name of Google Inc. nor the names of its 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission. 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: jschorr@google.com (Joseph Schorr) 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Based on original Protocol Buffers design by 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Sanjay Ghemawat, Jeff Dean, and others. 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <math.h> 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <stdlib.h> 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <limits> 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/text_format.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/zero_copy_stream_impl.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/tokenizer.h> 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest.pb.h> 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/unittest_mset.pb.h> 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/test_util.h> 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h> 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/file.h> 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h> 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h> 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h> 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h> 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace text_format_unittest { 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool IsNaN(double value) { 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // NaN is never equal to anything, even itself. 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return value != value; 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A basic string with different escapable characters for testing. 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string kEscapeTestString = 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"A string with ' characters \n and \r newlines and \t tabs and \001 " 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "slashes \\ and multiple spaces"; 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A representation of the above string with all the characters escaped. 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string kEscapeTestStringEscaped = 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"\\\"A string with \\' characters \\n and \\r newlines " 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "and \\t tabs and \\001 slashes \\\\ and multiple spaces\""; 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TextFormatTest : public testing::Test { 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetUpTestCase() { 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::ReadFileToStringOrDie( 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestSourceDir() 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + "/google/protobuf/testdata/text_format_unittest_data.txt", 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &static_proto_debug_string_); 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormatTest() : proto_debug_string_(static_proto_debug_string_) {} 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Debug string read from text_format_unittest_data.txt. 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string proto_debug_string_; 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes proto_; 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static string static_proto_debug_string_; 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring TextFormatTest::static_proto_debug_string_; 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TextFormatExtensionsTest : public testing::Test { 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static void SetUpTestCase() { 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville File::ReadFileToStringOrDie( 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestSourceDir() 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + "/google/protobuf/testdata/" 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "text_format_unittest_extensions_data.txt", 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &static_proto_debug_string_); 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormatExtensionsTest() 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville : proto_debug_string_(static_proto_debug_string_) {} 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Debug string read from text_format_unittest_data.txt. 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const string proto_debug_string_; 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllExtensions proto_; 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville private: 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static string static_proto_debug_string_; 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring TextFormatExtensionsTest::static_proto_debug_string_; 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, Basic) { 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllFields(&proto_); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(proto_debug_string_, proto_.DebugString()); 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatExtensionsTest, Extensions) { 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::SetAllExtensions(&proto_); 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(proto_debug_string_, proto_.DebugString()); 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ShortDebugString) { 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.set_optional_int32(1); 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.set_optional_string("hello"); 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.mutable_optional_nested_message()->set_bb(2); 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.mutable_optional_foreign_message(); 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("optional_int32: 1 optional_string: \"hello\" " 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_message { bb: 2 } " 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_foreign_message { }", 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.ShortDebugString()); 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 141d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(TextFormatTest, ShortPrimitiveRepeateds) { 142d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.set_optional_int32(123); 143d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_int32(456); 144d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_int32(789); 145d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_string("foo"); 146d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_string("bar"); 147d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_nested_message()->set_bb(2); 148d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_nested_message()->set_bb(3); 149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_nested_enum(unittest::TestAllTypes::FOO); 150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.add_repeated_nested_enum(unittest::TestAllTypes::BAR); 151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville TextFormat::Printer printer; 153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer.SetUseShortRepeatedPrimitives(true); 154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string text; 155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer.PrintToString(proto_, &text); 156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("optional_int32: 123\n" 158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_int32: [456, 789]\n" 159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_string: \"foo\"\n" 160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_string: \"bar\"\n" 161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_message {\n bb: 2\n}\n" 162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_message {\n bb: 3\n}\n" 163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_enum: [FOO, BAR]\n", 164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville text); 165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Try in single-line mode. 167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer.SetSingleLineMode(true); 168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville printer.PrintToString(proto_, &text); 169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ("optional_int32: 123 " 171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_int32: [456, 789] " 172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_string: \"foo\" " 173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_string: \"bar\" " 174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_message { bb: 2 } " 175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_message { bb: 3 } " 176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "repeated_nested_enum: [FOO, BAR] ", 177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville text); 178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, StringEscape) { 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Set the string value to test. 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_.set_optional_string(kEscapeTestString); 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Get the DebugString from the proto. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string debug_string = proto_.DebugString(); 187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string utf8_debug_string = proto_.Utf8DebugString(); 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Hardcode a correct value to test against. 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string correct_string = "optional_string: " 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + kEscapeTestStringEscaped 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + "\n"; 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(correct_string, debug_string); 196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // UTF-8 string is the same as non-UTF-8 because 197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // the protocol buffer contains no UTF-8 text. 198d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(correct_string, utf8_debug_string); 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string expected_short_debug_string = "optional_string: " 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + kEscapeTestStringEscaped; 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString()); 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(TextFormatTest, Utf8DebugString) { 206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Set the string value to test. 207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville proto_.set_optional_string("\350\260\267\346\255\214"); 208d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 209d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Get the DebugString from the proto. 210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string debug_string = proto_.DebugString(); 211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string utf8_debug_string = proto_.Utf8DebugString(); 212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Hardcode a correct value to test against. 214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string correct_utf8_string = "optional_string: " 215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "\"\350\260\267\346\255\214\"" 216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "\n"; 217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville string correct_string = "optional_string: " 218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "\"\\350\\260\\267\\346\\255\\214\"" 219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "\n"; 220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 221d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville // Compare. 222d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(correct_utf8_string, utf8_debug_string); 223d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(correct_string, debug_string); 224d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintUnknownFields) { 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test printing of unknown fields in a message. 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestEmptyMessage message; 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UnknownFieldSet* unknown_fields = message.mutable_unknown_fields(); 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddVarint(5, 1); 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddFixed32(5, 2); 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddFixed64(5, 3); 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddLengthDelimited(5, "4"); 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddGroup(5)->AddVarint(10, 5); 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddVarint(8, 1); 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddVarint(8, 2); 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unknown_fields->AddVarint(8, 3); 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 1\n" 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 0x00000002\n" 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: 0x0000000000000003\n" 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5: \"4\"\n" 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "5 {\n" 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " 10: 5\n" 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n" 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 1\n" 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 2\n" 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "8: 3\n", 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.DebugString()); 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintUnknownMessage) { 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test heuristic printing of messages in an UnknownFieldSet. 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Cases which should not be interpreted as sub-messages. 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 'a' is a valid FIXED64 tag, so for the string to be parseable as a message 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it should be followed by 8 bytes. Since this string only has two 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // subsequent bytes, it should be treated as a string. 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("abc"); 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 'd' happens to be a valid ENDGROUP tag. So, 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // UnknownFieldSet::MergeFromCodedStream() will successfully parse "def", but 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the ConsumedEntireMessage() check should fail. 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("def"); 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // A zero-length string should never be interpreted as a message even though 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // it is technically valid as one. 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string(""); 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Case which should be interpreted as a sub-message. 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // An actual nested message with content should always be interpreted as a 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // nested message. 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_nested_message()->set_bb(123); 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string data; 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.SerializeToString(&data); 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text; 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville UnknownFieldSet unknown_fields; 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(unknown_fields.ParseFromString(data)); 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text)); 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "44: \"abc\"\n" 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "44: \"def\"\n" 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "44: \"\"\n" 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "48 {\n" 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " 1: 123\n" 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "}\n", 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text); 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintMessageWithIndent) { 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test adding an initial indent to printing. 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("abc"); 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("def"); 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_nested_message()->set_bb(123); 308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text; 310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Printer printer; 311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer.SetInitialIndentLevel(1); 312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(printer.PrintToString(message, &text)); 313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated_string: \"abc\"\n" 315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated_string: \"def\"\n" 316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated_nested_message {\n" 317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " bb: 123\n" 318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " }\n", 319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text); 320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintMessageSingleLine) { 323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test printing a message on a single line. 324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestAllTypes message; 326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("abc"); 328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string("def"); 329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_nested_message()->set_bb(123); 330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text; 332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Printer printer; 333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer.SetInitialIndentLevel(1); 334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville printer.SetSingleLineMode(true); 335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(printer.PrintToString(message, &text)); 336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville " repeated_string: \"abc\" repeated_string: \"def\" " 338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_nested_message { bb: 123 } ", 339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text); 340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ParseBasic) { 343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(proto_debug_string_.data(), 344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_debug_string_.size()); 345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllFieldsSet(proto_); 347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatExtensionsTest, ParseExtensions) { 350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(proto_debug_string_.data(), 351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_debug_string_.size()); 352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TestUtil::ExpectAllExtensionsSet(proto_); 354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ParseStringEscape) { 357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create a parse string with escpaed characters in it. 358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string parse_string = "optional_string: " 359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + kEscapeTestStringEscaped 360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville + "\n"; 361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(parse_string.data(), 363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(kEscapeTestString, proto_.optional_string()); 368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ParseConcatenatedString) { 371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create a parse string with multiple parts on one line. 372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string parse_string = "optional_string: \"foo\" \"bar\"\n"; 373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream1(parse_string.data(), 375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream1, &proto_); 377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar", proto_.optional_string()); 380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Create a parse string with multiple parts on seperate lines. 382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string = "optional_string: \"foo\"\n" 383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"bar\"\n"; 384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream2(parse_string.data(), 386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream2, &proto_); 388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foobar", proto_.optional_string()); 391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ParseFloatWithSuffix) { 394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can parse a floating-point value with 'f' appended to the 395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // end. This is needed for backwards-compatibility with proto1. 396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Have it parse a float with the 'f' suffix. 398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string parse_string = "optional_float: 1.0f\n"; 399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(parse_string.data(), 401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1.0, proto_.optional_float()); 407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, Comments) { 410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that comments are ignored. 411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string parse_string = "optional_int32: 1 # a comment\n" 413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_int64: 2 # another comment"; 414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(parse_string.data(), 416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, proto_.optional_int32()); 422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, proto_.optional_int64()); 423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, OptionalColon) { 426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Test that we can place a ':' after the field name of a nested message, 427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // even though we don't have to. 428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string parse_string = "optional_nested_message: { bb: 1}\n"; 430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville io::ArrayInputStream input_stream(parse_string.data(), 432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parse_string.size()); 433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parse(&input_stream, &proto_); 435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Compare. 437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(proto_.has_optional_nested_message()); 438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, proto_.optional_nested_message().bb()); 439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Some platforms (e.g. Windows) insist on padding the exponent to three 442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// digits when one or two would be just fine. 443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestatic string RemoveRedundantZeros(string text) { 444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text = StringReplace(text, "e+0", "e+", true); 445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville text = StringReplace(text, "e-0", "e-", true); 446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return text; 447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintExotic) { 450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: In C, a negative integer literal is actually the unary negation 453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // operator being applied to a positive integer literal, and 454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 9223372036854775808 is outside the range of int64. However, it is not 455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // outside the range of uint64. Confusingly, this means that everything 456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // works if we make the literal unsigned, even though we are negating it. 457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_int64(-GOOGLE_ULONGLONG(9223372036854775808)); 458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_uint64(GOOGLE_ULONGLONG(18446744073709551615)); 459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(123.456); 460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23e21); 461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23e-18); 462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(std::numeric_limits<double>::infinity()); 463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(-std::numeric_limits<double>::infinity()); 464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(std::numeric_limits<double>::quiet_NaN()); 465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_string(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12)); 466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Fun story: We used to use 1.23e22 instead of 1.23e21 above, but this 468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // seemed to trigger an odd case on MinGW/GCC 3.4.5 where GCC's parsing of 469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // the value differed from strtod()'s parsing. That is to say, the 470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // following assertion fails on MinGW: 471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // assert(1.23e22 == strtod("1.23e22", NULL)); 472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // As a result, SimpleDtoa() would print the value as 473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // "1.2300000000000001e+22" to make sure strtod() produce the exact same 474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // result. Our goal is to test runtime parsing, not compile-time parsing, 475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // so this wasn't our problem. It was found that using 1.23e21 did not 476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // have this problem, so we switched to that instead. 477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int64: -9223372036854775808\n" 480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint64: 18446744073709551615\n" 481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.456\n" 482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23e+21\n" 483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23e-18\n" 484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: inf\n" 485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -inf\n" 486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: nan\n" 487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string: \"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n", 488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RemoveRedundantZeros(message.DebugString())); 489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, PrintFloatPrecision) { 492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.2); 495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.23); 496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.234); 497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.2345); 498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.23456); 499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.2e10); 500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.23e10); 501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.234e10); 502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.2345e10); 503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_float(1.23456e10); 504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2); 505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23); 506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234); 507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345); 508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456); 509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567); 510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678); 511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789); 512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567898); 513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678987); 514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789876); 515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567898765); 516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678987654); 517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789876543); 518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2e100); 519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23e100); 520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234e100); 521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345e100); 522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456e100); 523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567e100); 524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678e100); 525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789e100); 526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567898e100); 527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678987e100); 528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789876e100); 529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.234567898765e100); 530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.2345678987654e100); 531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.add_repeated_double(1.23456789876543e100); 532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ( 534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.2\n" 535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.23\n" 536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.234\n" 537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.2345\n" 538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.23456\n" 539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.2e+10\n" 540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.23e+10\n" 541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.234e+10\n" 542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.2345e+10\n" 543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_float: 1.23456e+10\n" 544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2\n" 545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23\n" 546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234\n" 547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345\n" 548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456\n" 549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567\n" 550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678\n" 551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789\n" 552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567898\n" 553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678987\n" 554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789876\n" 555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567898765\n" 556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678987654\n" 557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789876543\n" 558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2e+100\n" 559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23e+100\n" 560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234e+100\n" 561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345e+100\n" 562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456e+100\n" 563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567e+100\n" 564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678e+100\n" 565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789e+100\n" 566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567898e+100\n" 567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678987e+100\n" 568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789876e+100\n" 569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.234567898765e+100\n" 570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.2345678987654e+100\n" 571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23456789876543e+100\n", 572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville RemoveRedundantZeros(message.DebugString())); 573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, AllowPartial) { 577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parser parser; 579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser.AllowPartialMessage(true); 580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(parser.ParseFromString("a: 1", &message)); 581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1, message.a()); 582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.has_b()); 583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(message.has_c()); 584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatTest, ParseExotic) { 587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes message; 588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString( 589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int32: -1\n" 590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int32: -2147483648\n" 591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int64: -1\n" 592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_int64: -9223372036854775808\n" 593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint32: 4294967295\n" 594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint32: 2147483648\n" 595fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint64: 18446744073709551615\n" 596fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_uint64: 9223372036854775808\n" 597fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.0\n" 598fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.5\n" 599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 0.125\n" 600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.23E17\n" 601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.235E+22\n" 602fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 1.235e-18\n" 603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: 123.456789\n" 604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: inf\n" 605fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: Infinity\n" 606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -inf\n" 607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: -Infinity\n" 608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: nan\n" 609fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_double: NaN\n" 610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n", 611fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville &message)); 612fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 613fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message.repeated_int32_size()); 614fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-1, message.repeated_int32(0)); 615fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: In C, a negative integer literal is actually the unary negation 616fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // operator being applied to a positive integer literal, and 2147483648 is 617fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // outside the range of int32. However, it is not outside the range of 618fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uint32. Confusingly, this means that everything works if we make the 619fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // literal unsigned, even though we are negating it. 620fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-2147483648u, message.repeated_int32(1)); 621fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 622fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message.repeated_int64_size()); 623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-1, message.repeated_int64(0)); 624fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: In C, a negative integer literal is actually the unary negation 625fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // operator being applied to a positive integer literal, and 626fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // 9223372036854775808 is outside the range of int64. However, it is not 627fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // outside the range of uint64. Confusingly, this means that everything 628fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // works if we make the literal unsigned, even though we are negating it. 629fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(-GOOGLE_ULONGLONG(9223372036854775808), message.repeated_int64(1)); 630fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message.repeated_uint32_size()); 632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(4294967295u, message.repeated_uint32(0)); 633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2147483648u, message.repeated_uint32(1)); 634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 635fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(2, message.repeated_uint64_size()); 636fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_ULONGLONG(18446744073709551615), message.repeated_uint64(0)); 637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(GOOGLE_ULONGLONG(9223372036854775808), message.repeated_uint64(1)); 638fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 639fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(13, message.repeated_double_size()); 640fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(123.0 , message.repeated_double(0)); 641fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(123.5 , message.repeated_double(1)); 642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(0.125 , message.repeated_double(2)); 643fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1.23E17 , message.repeated_double(3)); 644fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1.235E22 , message.repeated_double(4)); 645fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(1.235E-18 , message.repeated_double(5)); 646fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(123.456789, message.repeated_double(6)); 647fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message.repeated_double(7), numeric_limits<double>::infinity()); 648fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message.repeated_double(8), numeric_limits<double>::infinity()); 649fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message.repeated_double(9), -numeric_limits<double>::infinity()); 650fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(message.repeated_double(10), -numeric_limits<double>::infinity()); 651fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsNaN(message.repeated_double(11))); 652fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(IsNaN(message.repeated_double(12))); 653fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 654fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Note: Since these string literals have \0's in them, we must explicitly 655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // pass their sizes to string's constructor. 656fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, message.repeated_string_size()); 657fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12), 658fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message.repeated_string(0)); 659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 660fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 661fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TextFormatParserTest : public testing::Test { 662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 663fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectFailure(const string& input, const string& message, int line, 664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int col) { 665fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville scoped_ptr<unittest::TestAllTypes> proto(new unittest::TestAllTypes); 666fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure(input, message, line, col, proto.get()); 667fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 669fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void ExpectFailure(const string& input, const string& message, int line, 670fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville int col, Message* proto) { 671d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExpectMessage(input, message, line, col, proto, false); 672d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 673d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 674d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void ExpectMessage(const string& input, const string& message, int line, 675d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville int col, Message* proto, bool expected_result) { 676fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parser parser; 677fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector error_collector; 678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville parser.RecordErrorsTo(&error_collector); 679d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville EXPECT_EQ(parser.ParseFromString(input, proto), expected_result); 680fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(SimpleItoa(line) + ":" + SimpleItoa(col) + ": " + message + "\n", 681fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville error_collector.text_); 682fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 683fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 684fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // An error collector which simply concatenates all its errors into a big 685fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // block of text which can be checked. 686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville class MockErrorCollector : public io::ErrorCollector { 687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public: 688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville MockErrorCollector() {} 689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ~MockErrorCollector() {} 690fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 691fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville string text_; 692fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 693fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // implements ErrorCollector ------------------------------------- 694fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville void AddError(int line, int column, const string& message) { 695fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", 696fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville line + 1, column + 1, message); 697fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 698d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 699d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville void AddWarning(int line, int column, const string& message) { 700d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville AddError(line, column, "WARNING:" + message); 701d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 702fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville }; 703fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 704fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 705fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, ParseFieldValueFromString) { 706fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville scoped_ptr<unittest::TestAllTypes> message(new unittest::TestAllTypes); 707fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville const Descriptor* d = message->GetDescriptor(); 708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 709fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_FIELD(name, value, valuestring) \ 710fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ 711fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville valuestring, d->FindFieldByName("optional_" #name), message.get())); \ 712fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(value, message->optional_##name()); \ 713fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->has_optional_##name()); 714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_FLOAT_FIELD(name, value, valuestring) \ 716fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ 717fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville valuestring, d->FindFieldByName("optional_" #name), message.get())); \ 718fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_EQ(value, message->optional_##name()); \ 719fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->has_optional_##name()); 720fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 721fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_DOUBLE_FIELD(name, value, valuestring) \ 722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ 723fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville valuestring, d->FindFieldByName("optional_" #name), message.get())); \ 724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_EQ(value, message->optional_##name()); \ 725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->has_optional_##name()); 726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 727fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define EXPECT_INVALID(name, valuestring) \ 728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \ 729fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville valuestring, d->FindFieldByName("optional_" #name), message.get())); 730fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // int32 732fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int32, 1, "1"); 733fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int32, -1, "-1"); 734fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int32, 0x1234, "0x1234"); 735fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int32, "a"); 736fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int32, "999999999999999999999999999999999999"); 737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int32, "1,2"); 738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 739fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // int64 740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int64, 1, "1"); 741fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int64, -1, "-1"); 742fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(int64, 0x1234567812345678LL, "0x1234567812345678"); 743fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int64, "a"); 744fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int64, "999999999999999999999999999999999999"); 745fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(int64, "1,2"); 746fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 747fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // uint64 748fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(uint64, 1, "1"); 749fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(uint64, 0xf234567812345678ULL, "0xf234567812345678"); 750fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(uint64, "-1"); 751fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(uint64, "a"); 752fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(uint64, "999999999999999999999999999999999999"); 753fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(uint64, "1,2"); 754fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 755fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fixed32 756fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(fixed32, 1, "1"); 757fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(fixed32, 0x12345678, "0x12345678"); 758fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed32, "-1"); 759fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed32, "a"); 760fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed32, "999999999999999999999999999999999999"); 761fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed32, "1,2"); 762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // fixed64 764fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(fixed64, 1, "1"); 765fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(fixed64, 0x1234567812345678ULL, "0x1234567812345678"); 766fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed64, "-1"); 767fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed64, "a"); 768fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed64, "999999999999999999999999999999999999"); 769fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(fixed64, "1,2"); 770fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 771fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // bool 772fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(bool, true, "true"); 773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(bool, false, "false"); 774fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(bool, "1"); 775fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(bool, "on"); 776fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(bool, "a"); 777fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(bool, "True"); 778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // float 780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(float, 1, "1"); 781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_FIELD(float, 1.5, "1.5"); 782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_FIELD(float, 1.5e3, "1.5e3"); 783fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FLOAT_FIELD(float, -4.55, "-4.55"); 784fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(float, "a"); 785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(float, "1,2"); 786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // double 788fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(double, 1, "1"); 789fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(double, -1, "-1"); 790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_FIELD(double, 2.3, "2.3"); 791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_DOUBLE_FIELD(double, 3e5, "3e5"); 792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(double, "a"); 793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(double, "1,2"); 794fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // string 796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(string, "hello", "\"hello\""); 797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(string, "-1.87", "'-1.87'"); 798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(string, "hello"); // without quote for value 799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // enum 801fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR"); 802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(nested_enum, "1"); // number not supported 803fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(nested_enum, "FOOBAR"); 804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 805fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // message 806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(TextFormat::ParseFieldValueFromString( 807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "<bb:12>", d->FindFieldByName("optional_nested_message"), message.get())); 808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(12, message->optional_nested_message().bb()); \ 809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(message->has_optional_nested_message()); 810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_INVALID(nested_message, "any"); 811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef EXPECT_FIELD 813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef EXPECT_FLOAT_FIELD 814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef EXPECT_DOUBLE_FIELD 815fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#undef EXPECT_INVALID 816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, InvalidToken) { 820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: true\n-5\n", "Expected identifier.", 821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2, 1); 822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: true;\n", "Expected identifier.", 1, 20); 824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("\"some string\"", "Expected identifier.", 1, 1); 825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, InvalidFieldName) { 828fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "invalid_field: somevalue\n", 830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message type \"protobuf_unittest.TestAllTypes\" has no field named " 831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"invalid_field\".", 832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 14); 833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, InvalidCapitalization) { 836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // We require that group names be exactly as they appear in the .proto. 837fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 838fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optionalgroup {\na: 15\n}\n", 839fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message type \"protobuf_unittest.TestAllTypes\" has no field named " 840fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"optionalgroup\".", 841fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 15); 842fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 843fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "OPTIONALgroup {\na: 15\n}\n", 844fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message type \"protobuf_unittest.TestAllTypes\" has no field named " 845fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"OPTIONALgroup\".", 846fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 15); 847fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 848fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Optional_Double: 10.0\n", 849fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message type \"protobuf_unittest.TestAllTypes\" has no field named " 850fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"Optional_Double\".", 851fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 16); 852fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 853fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, InvalidFieldValues) { 855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for a double/float field. 856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_double: \"hello\"\n", "Expected double.", 1, 18); 857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_double: true\n", "Expected double.", 1, 18); 858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_double: !\n", "Expected double.", 1, 18); 859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_double {\n \n}\n", "Expected \":\", found \"{\".", 860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 17); 861fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 862fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for a signed integer field. 863fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: \"hello\"\n", "Expected integer.", 1, 17); 864fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: true\n", "Expected integer.", 1, 17); 865fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: 4.5\n", "Expected integer.", 1, 17); 866fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: !\n", "Expected integer.", 1, 17); 867fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".", 868fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 16); 869fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: 0x80000000\n", 870fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 17); 871fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int32: -0x80000001\n", 872fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 18); 873fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int64: 0x8000000000000000\n", 874fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 17); 875fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_int64: -0x8000000000000001\n", 876fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 18); 877fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 878fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for an unsigned integer field. 879fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: \"hello\"\n", "Expected integer.", 1, 18); 880fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: true\n", "Expected integer.", 1, 18); 881fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: 4.5\n", "Expected integer.", 1, 18); 882fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: -5\n", "Expected integer.", 1, 18); 883fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: !\n", "Expected integer.", 1, 18); 884fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".", 885fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 17); 886fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint32: 0x100000000\n", 887fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 18); 888fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_uint64: 0x10000000000000000\n", 889fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Integer out of range.", 1, 18); 890fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 891fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for a boolean field. 892fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: \"hello\"\n", "Expected identifier.", 1, 16); 893fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: 5\n", "Expected identifier.", 1, 16); 894fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: -7.5\n", "Expected identifier.", 1, 16); 895fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool: !\n", "Expected identifier.", 1, 16); 896fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 897fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 898fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_bool: meh\n", 899fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Invalid value for boolean field \"optional_bool\". Value: \"meh\".", 900fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 2, 1); 901fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 902fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".", 903fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 15); 904fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 905fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for a string field. 906fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_string: true\n", "Expected string.", 1, 18); 907fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_string: 5\n", "Expected string.", 1, 18); 908fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_string: -7.5\n", "Expected string.", 1, 18); 909fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_string: !\n", "Expected string.", 1, 18); 910fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".", 911fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 17); 912fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 913fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid values for an enumeration field. 914fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_nested_enum: \"hello\"\n", "Expected identifier.", 915fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 23); 916fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_nested_enum: 5\n", "Expected identifier.", 1, 23); 918fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_nested_enum: -7.5\n", "Expected identifier.", 1, 23); 919fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_nested_enum: !\n", "Expected identifier.", 1, 23); 920fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 921fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 922fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_enum: grah\n", 923fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Unknown enumeration value of \"grah\" for field " 924fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "\"optional_nested_enum\".", 2, 1); 925fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 926fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure( 927fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "optional_nested_enum {\n \n}\n", 928fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Expected \":\", found \"{\".", 1, 22); 929fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 930fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 931fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, MessageDelimeters) { 932fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-matching delimeters. 933fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".", 934fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 3, 1); 935fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 936fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Invalid delimeters. 937fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".", 938fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 15); 939fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 940fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Unending message. 941fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("optional_nested_message {\n \nbb: 118\n", 942fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Expected identifier.", 943fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 4, 1); 944fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 945fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 946fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, UnknownExtension) { 947fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Non-matching delimeters. 948fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("[blahblah]: 123", 949fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Extension \"blahblah\" is not defined or is not an " 950fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "extension of \"protobuf_unittest.TestAllTypes\".", 951fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 11); 952fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 953fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 954fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, MissingRequired) { 955fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 956fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("a: 1", 957fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Message missing required fields: b, c", 958fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 0, 1, &message); 959fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 960fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 961fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, ParseDuplicateRequired) { 962fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 963fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("a: 1 b: 2 c: 3 a: 1", 964fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Non-repeated field \"a\" is specified multiple times.", 965fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 17, &message); 966fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 967fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, ParseDuplicateOptional) { 969fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::ForeignMessage message; 970fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ExpectFailure("c: 1 c: 2", 971fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "Non-repeated field \"c\" is specified multiple times.", 972fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1, 7, &message); 973fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 974fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 975fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, MergeDuplicateRequired) { 976fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestRequired message; 977fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parser parser; 978fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(parser.MergeFromString("a: 1 b: 2 c: 3 a: 4", &message)); 979fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(4, message.a()); 980fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 981fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 982fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, MergeDuplicateOptional) { 983fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::ForeignMessage message; 984fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville TextFormat::Parser parser; 985fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_TRUE(parser.MergeFromString("c: 1 c: 2", &message)); 986fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, message.c()); 987fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 988fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 989fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, PrintErrorsToStderr) { 990fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 991fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 992fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 993fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 994fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes proto; 995fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(TextFormat::ParseFromString("no_such_field: 1", &proto)); 996fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 997fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 998fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 999fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, errors.size()); 1000fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " 1001fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field " 1002fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "named \"no_such_field\".", 1003fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors[0]); 1004fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1005fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1006fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatParserTest, FailsOnTokenizationError) { 1007fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<string> errors; 1008fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1009fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville { 1010fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ScopedMemoryLog log; 1011fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest::TestAllTypes proto; 1012fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_FALSE(TextFormat::ParseFromString("\020", &proto)); 1013fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors = log.GetMessages(ERROR); 1014fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville } 1015fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1016fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_EQ(1, errors.size()); 1017fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " 1018fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville "1:1: Invalid control characters encountered in text.", 1019fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville errors[0]); 1020fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1021fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1022d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleTEST_F(TextFormatParserTest, ParseDeprecatedField) { 1023d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest::TestDeprecatedFields message; 1024d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ExpectMessage("deprecated_int32: 42", 1025d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "WARNING:text format contains deprecated field " 1026d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville "\"deprecated_int32\"", 1, 21, &message, true); 1027d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 1028fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1029fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass TextFormatMessageSetTest : public testing::Test { 1030fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protected: 1031fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville static const char proto_debug_string_[]; 1032fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 1033fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char TextFormatMessageSetTest::proto_debug_string_[] = 1034fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"message_set {\n" 1035fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" [protobuf_unittest.TestMessageSetExtension1] {\n" 1036fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" i: 23\n" 1037fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" }\n" 1038fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" [protobuf_unittest.TestMessageSetExtension2] {\n" 1039fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" str: \"foo\"\n" 1040fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville" }\n" 1041fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"}\n"; 1042fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1043fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1044fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatMessageSetTest, Serialize) { 1045fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetContainer proto; 1046fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension1* item_a = 1047fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.mutable_message_set()->MutableExtension( 1048fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension1::message_set_extension); 1049fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item_a->set_i(23); 1050fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension2* item_b = 1051fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.mutable_message_set()->MutableExtension( 1052fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension2::message_set_extension); 1053fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville item_b->set_str("foo"); 1054fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(proto_debug_string_, proto.DebugString()); 1055fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1056fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1057fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(TextFormatMessageSetTest, Deserialize) { 1058fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetContainer proto; 1059fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville ASSERT_TRUE(TextFormat::ParseFromString(proto_debug_string_, &proto)); 1060fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(23, proto.message_set().GetExtension( 1061fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension1::message_set_extension).i()); 1062fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ("foo", proto.message_set().GetExtension( 1063fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville protobuf_unittest::TestMessageSetExtension2::message_set_extension).str()); 1064fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1065fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville // Ensure that these are the only entries present. 1066fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville vector<const FieldDescriptor*> descriptors; 1067fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.message_set().GetReflection()->ListFields( 1068fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto.message_set(), &descriptors); 1069fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville EXPECT_EQ(2, descriptors.size()); 1070fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 1071fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 1072fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace text_format_unittest 1073fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 1074fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 1075