1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format
2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc.  All rights reserved.
3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/
4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without
6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are
7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met:
8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions of source code must retain the above copyright
10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer.
11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Redistributions in binary form must reproduce the above
12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer
13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the
14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution.
15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//     * Neither the name of Google Inc. nor the names of its
16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from
17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission.
18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <stdarg.h>
32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <string>
33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "conformance.pb.h"
35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "conformance_test.h"
36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/common.h>
37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/stringprintf.h>
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/text_format.h>
39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/json_util.h>
40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/field_comparator.h>
41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/message_differencer.h>
42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/util/type_resolver_util.h>
43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/wire_format_lite.h>
44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include "third_party/jsoncpp/json.h"
46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::ConformanceRequest;
48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::ConformanceResponse;
49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::TestAllTypes;
50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing conformance::WireFormat;
51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::Descriptor;
52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::FieldDescriptor;
53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::internal::WireFormatLite;
54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::TextFormat;
55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::DefaultFieldComparator;
56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::JsonToBinaryString;
57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::MessageDifferencer;
58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::NewTypeResolverForDescriptorPool;
59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing google::protobuf::util::Status;
60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerusing std::string;
61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace {
63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic const char kTypeUrlPrefix[] = "type.googleapis.com";
65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstatic string GetTypeUrl(const Descriptor* message) {
67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return string(kTypeUrlPrefix) + "/" + message->full_name();
68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer/* Routines for building arbitrary protos *************************************/
71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// We would use CodedOutputStream except that we want more freedom to build
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// arbitrary protos (even invalid ones).
74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerconst string empty;
76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring cat(const string& a, const string& b,
78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& c = empty,
79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& d = empty,
80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& e = empty,
81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& f = empty,
82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& g = empty,
83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& h = empty,
84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& i = empty,
85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& j = empty,
86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& k = empty,
87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer           const string& l = empty) {
88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string ret;
89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.reserve(a.size() + b.size() + c.size() + d.size() + e.size() + f.size() +
90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              g.size() + h.size() + i.size() + j.size() + k.size() + l.size());
91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(a);
92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(b);
93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(c);
94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(d);
95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(e);
96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(f);
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(g);
98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(h);
99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(i);
100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(j);
101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(k);
102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ret.append(l);
103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return ret;
104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// The maximum number of bytes that it takes to encode a 64-bit varint.
107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define VARINT_MAX_LEN 10
108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammersize_t vencode64(uint64_t val, char *buf) {
110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (val == 0) { buf[0] = 0; return 1; }
111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  size_t i = 0;
112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  while (val) {
113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    uint8_t byte = val & 0x7fU;
114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    val >>= 7;
115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (val) byte |= 0x80U;
116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    buf[i++] = byte;
117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return i;
119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring varint(uint64_t x) {
122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  char buf[VARINT_MAX_LEN];
123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  size_t len = vencode64(x, buf);
124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return string(buf, len);
125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TODO: proper byte-swapping for big-endian machines.
128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring fixed32(void *data) { return string(static_cast<char*>(data), 4); }
129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring fixed64(void *data) { return string(static_cast<char*>(data), 8); }
130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring delim(const string& buf) { return cat(varint(buf.size()), buf); }
132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring uint32(uint32_t u32) { return fixed32(&u32); }
133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring uint64(uint64_t u64) { return fixed64(&u64); }
134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring flt(float f) { return fixed32(&f); }
135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring dbl(double d) { return fixed64(&d); }
136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring zz32(int32_t x) { return varint(WireFormatLite::ZigZagEncode32(x)); }
137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring zz64(int64_t x) { return varint(WireFormatLite::ZigZagEncode64(x)); }
138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring tag(uint32_t fieldnum, char wire_type) {
140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return varint((fieldnum << 3) | wire_type);
141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring submsg(uint32_t fn, const string& buf) {
144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return cat( tag(fn, WireFormatLite::WIRETYPE_LENGTH_DELIMITED), delim(buf) );
145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define UNKNOWN_FIELD 666
148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammeruint32_t GetFieldNumberForType(FieldDescriptor::Type type, bool repeated) {
150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const Descriptor* d = TestAllTypes().GetDescriptor();
151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (int i = 0; i < d->field_count(); i++) {
152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const FieldDescriptor* f = d->field(i);
153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (f->type() == type && f->is_repeated() == repeated) {
154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return f->number();
155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_LOG(FATAL) << "Couldn't find field with type " << (int)type;
158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return 0;
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstring UpperCase(string str) {
162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (int i = 0; i < str.size(); i++) {
163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    str[i] = toupper(str[i]);
164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return str;
166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // anonymous namespace
169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google {
171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf {
172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportSuccess(const string& test_name) {
174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (expected_to_fail_.erase(test_name) != 0) {
175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_,
176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "ERROR: test %s is in the failure list, but test succeeded.  "
177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Remove it from the failure list.\n",
178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  test_name.c_str());
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    unexpected_succeeding_tests_.insert(test_name);
180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  successes_++;
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportFailure(const string& test_name,
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                         const ConformanceRequest& request,
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                         const ConformanceResponse& response,
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                         const char* fmt, ...) {
188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (expected_to_fail_.erase(test_name) == 1) {
189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    expected_failures_++;
190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (!verbose_)
191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return;
192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "ERROR, test=%s: ", test_name.c_str());
194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    unexpected_failing_tests_.insert(test_name);
195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  va_list args;
197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  va_start(args, fmt);
198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  StringAppendV(&output_, fmt, args);
199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  va_end(args);
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  StringAppendF(&output_, " request=%s, response=%s\n",
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                request.ShortDebugString().c_str(),
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                response.ShortDebugString().c_str());
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ReportSkip(const string& test_name,
206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                      const ConformanceRequest& request,
207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                      const ConformanceResponse& response) {
208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (verbose_) {
209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "SKIPPED, test=%s request=%s, response=%s\n",
210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  test_name.c_str(), request.ShortDebugString().c_str(),
211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  response.ShortDebugString().c_str());
212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  skipped_.insert(test_name);
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunTest(const string& test_name,
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                   const ConformanceRequest& request,
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                   ConformanceResponse* response) {
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (test_names_.insert(test_name).second == false) {
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    GOOGLE_LOG(FATAL) << "Duplicated test name: " << test_name;
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string serialized_request;
224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string serialized_response;
225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.SerializeToString(&serialized_request);
226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  runner_->RunTest(test_name, serialized_request, &serialized_response);
228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!response->ParseFromString(serialized_response)) {
230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    response->Clear();
231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    response->set_runtime_error("response proto could not be parsed.");
232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (verbose_) {
235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "conformance test: name=%s, request=%s, response=%s\n",
236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  test_name.c_str(),
237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  request.ShortDebugString().c_str(),
238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  response->ShortDebugString().c_str());
239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidInputTest(
243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const string& input, WireFormat input_format,
244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& equivalent_text_format, WireFormat requested_output) {
245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  TestAllTypes reference_message;
246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK(
247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      TextFormat::ParseFromString(equivalent_text_format, &reference_message))
248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          << "Failed to parse data for test case: " << test_name
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          << ", data: " << equivalent_text_format;
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceRequest request;
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceResponse response;
253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  switch (input_format) {
255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case conformance::PROTOBUF:
256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      request.set_protobuf_payload(input);
257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case conformance::JSON:
260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      request.set_json_payload(input);
261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    default:
264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      GOOGLE_LOG(FATAL) << "Unspecified input format";
265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_requested_output_format(requested_output);
268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunTest(test_name, request, &response);
270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  TestAllTypes test_message;
272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  switch (response.result_case()) {
274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kParseError:
275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kRuntimeError:
276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kSerializeError:
277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ReportFailure(test_name, request, response,
278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    "Failed to parse JSON input or produce JSON output.");
279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return;
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kSkipped:
282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ReportSkip(test_name, request, response);
283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      return;
284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kJsonPayload: {
286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (requested_output != conformance::JSON) {
287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ReportFailure(
288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            test_name, request, response,
289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "Test was asked for protobuf output but provided JSON instead.");
290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      string binary_protobuf;
293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      Status status =
294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          JsonToBinaryString(type_resolver_.get(), type_url_,
295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                             response.json_payload(), &binary_protobuf);
296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (!status.ok()) {
297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ReportFailure(test_name, request, response,
298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      "JSON output we received from test was unparseable.");
299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (!test_message.ParseFromString(binary_protobuf)) {
303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ReportFailure(test_name, request, response,
304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      "INTERNAL ERROR: internal JSON->protobuf transcode "
305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      "yielded unparseable proto.");
306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    case ConformanceResponse::kProtobufPayload: {
313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (requested_output != conformance::PROTOBUF) {
314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ReportFailure(
315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            test_name, request, response,
316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "Test was asked for JSON output but provided protobuf instead.");
317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      if (!test_message.ParseFromString(response.protobuf_payload())) {
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ReportFailure(test_name, request, response,
322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                      "Protobuf output we received from test was unparseable.");
323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return;
324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      }
325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      break;
327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    default:
330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      GOOGLE_LOG(FATAL) << test_name << ": unknown payload type: "
331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                        << response.result_case();
332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  MessageDifferencer differencer;
335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  DefaultFieldComparator field_comparator;
336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  field_comparator.set_treat_nan_as_equal(true);
337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  differencer.set_field_comparator(&field_comparator);
338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string differences;
339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  differencer.ReportDifferencesToString(&differences);
340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (differencer.Compare(reference_message, test_message)) {
342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSuccess(test_name);
343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(test_name, request, response,
345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Output was not equivalent to reference message: %s.",
346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  differences.c_str());
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Expect that this precise protobuf will cause a parse error.
351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectParseFailureForProto(
352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& proto, const string& test_name) {
353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceRequest request;
354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceResponse response;
355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_protobuf_payload(proto);
356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string effective_test_name = "ProtobufInput." + test_name;
357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // We don't expect output, but if the program erroneously accepts the protobuf
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // we let it send its response as this.  We must not leave it unspecified.
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_requested_output_format(conformance::PROTOBUF);
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunTest(effective_test_name, request, &response);
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (response.result_case() == ConformanceResponse::kParseError) {
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSuccess(effective_test_name);
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else if (response.result_case() == ConformanceResponse::kSkipped) {
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSkip(effective_test_name, request, response);
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Should have failed to parse, but didn't.");
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Expect that this protobuf will cause a parse error, even if it is followed
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// by valid protobuf data.  We can try running this twice: once with this
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// data verbatim and once with this data followed by some valid data.
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// TODO(haberman): implement the second of these.
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectHardParseFailureForProto(
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& proto, const string& test_name) {
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return ExpectParseFailureForProto(proto, test_name);
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTest(
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const string& input_json,
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& equivalent_text_format) {
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidInputTest("JsonInput." + test_name + ".ProtobufOutput", input_json,
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    conformance::JSON, equivalent_text_format,
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    conformance::PROTOBUF);
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidInputTest("JsonInput." + test_name + ".JsonOutput", input_json,
390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    conformance::JSON, equivalent_text_format,
391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    conformance::JSON);
392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTestWithProtobufInput(
395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const TestAllTypes& input,
396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& equivalent_text_format) {
397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidInputTest("ProtobufInput." + test_name + ".JsonOutput",
398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    input.SerializeAsString(), conformance::PROTOBUF,
399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    equivalent_text_format, conformance::JSON);
400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// According to proto3 JSON specification, JSON serializers follow more strict
403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// rules than parsers (e.g., a serializer must serialize int32 values as JSON
404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// numbers while the parser is allowed to accept them as JSON strings). This
405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// method allows strict checking on a proto3 JSON serializer by inspecting
406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// the JSON output directly.
407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::RunValidJsonTestWithValidator(
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const string& input_json,
409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const Validator& validator) {
410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceRequest request;
411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceResponse response;
412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_json_payload(input_json);
413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_requested_output_format(conformance::JSON);
414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string effective_test_name = "JsonInput." + test_name + ".Validator";
416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunTest(effective_test_name, request, &response);
418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (response.result_case() == ConformanceResponse::kSkipped) {
420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSkip(effective_test_name, request, response);
421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (response.result_case() != ConformanceResponse::kJsonPayload) {
425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Expected JSON payload but got type %d.",
427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  response.result_case());
428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  Json::Reader reader;
431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  Json::Value value;
432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!reader.parse(response.json_payload(), value)) {
433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "JSON payload cannot be parsed as valid JSON: %s",
435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  reader.getFormattedErrorMessages().c_str());
436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!validator(value)) {
439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "JSON payload validation failed.");
441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return;
442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ReportSuccess(effective_test_name);
444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectParseFailureForJson(
447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const string& input_json) {
448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceRequest request;
449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceResponse response;
450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_json_payload(input_json);
451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string effective_test_name = "JsonInput." + test_name;
452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // We don't expect output, but if the program erroneously accepts the protobuf
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // we let it send its response as this.  We must not leave it unspecified.
455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_requested_output_format(conformance::JSON);
456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunTest(effective_test_name, request, &response);
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (response.result_case() == ConformanceResponse::kParseError) {
459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSuccess(effective_test_name);
460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else if (response.result_case() == ConformanceResponse::kSkipped) {
461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSkip(effective_test_name, request, response);
462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Should have failed to parse, but didn't.");
465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::ExpectSerializeFailureForJson(
469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    const string& test_name, const string& text_format) {
470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  TestAllTypes payload_message;
471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  GOOGLE_CHECK(
472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      TextFormat::ParseFromString(text_format, &payload_message))
473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          << "Failed to parse: " << text_format;
474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceRequest request;
476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ConformanceResponse response;
477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_protobuf_payload(payload_message.SerializeAsString());
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  string effective_test_name = test_name + ".JsonOutput";
479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  request.set_requested_output_format(conformance::JSON);
480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunTest(effective_test_name, request, &response);
482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (response.result_case() == ConformanceResponse::kSerializeError) {
483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSuccess(effective_test_name);
484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else if (response.result_case() == ConformanceResponse::kSkipped) {
485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportSkip(effective_test_name, request, response);
486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ReportFailure(effective_test_name, request, response,
488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "Should have failed to serialize, but didn't.");
489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::TestPrematureEOFForType(FieldDescriptor::Type type) {
493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Incomplete values for each wire type.
494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  static const string incompletes[6] = {
495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string("\x80"),     // VARINT
496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string("abcdefg"),  // 64BIT
497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string("\x80"),     // DELIMITED (partial length)
498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string(),           // START_GROUP (no value required)
499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string(),           // END_GROUP (no value required)
500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    string("abc")       // 32BIT
501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  };
502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  uint32_t fieldnum = GetFieldNumberForType(type, false);
504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  uint32_t rep_fieldnum = GetFieldNumberForType(type, true);
505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WireFormatLite::WireType wire_type = WireFormatLite::WireTypeForFieldType(
506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      static_cast<WireFormatLite::FieldType>(type));
507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string& incomplete = incompletes[wire_type];
508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  const string type_name =
509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      UpperCase(string(".") + FieldDescriptor::TypeName(type));
510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      tag(fieldnum, wire_type),
513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofBeforeKnownNonRepeatedValue" + type_name);
514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      tag(rep_fieldnum, wire_type),
517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofBeforeKnownRepeatedValue" + type_name);
518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      tag(UNKNOWN_FIELD, wire_type),
521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofBeforeUnknownValue" + type_name);
522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      cat( tag(fieldnum, wire_type), incomplete ),
525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofInsideKnownNonRepeatedValue" + type_name);
526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      cat( tag(rep_fieldnum, wire_type), incomplete ),
529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofInsideKnownRepeatedValue" + type_name);
530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForProto(
532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      cat( tag(UNKNOWN_FIELD, wire_type), incomplete ),
533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrematureEofInsideUnknownValue" + type_name);
534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (wire_type == WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ExpectParseFailureForProto(
537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        cat( tag(fieldnum, wire_type), varint(1) ),
538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "PrematureEofInDelimitedDataForKnownNonRepeatedValue" + type_name);
539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ExpectParseFailureForProto(
541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        cat( tag(rep_fieldnum, wire_type), varint(1) ),
542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "PrematureEofInDelimitedDataForKnownRepeatedValue" + type_name);
543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // EOF in the middle of delimited data for unknown value.
545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ExpectParseFailureForProto(
546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        cat( tag(UNKNOWN_FIELD, wire_type), varint(1) ),
547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "PrematureEofInDelimitedDataForUnknownValue" + type_name);
548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (type == FieldDescriptor::TYPE_MESSAGE) {
550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Submessage ends in the middle of a value.
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      string incomplete_submsg =
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          cat( tag(WireFormatLite::TYPE_INT32, WireFormatLite::WIRETYPE_VARINT),
553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                incompletes[WireFormatLite::WIRETYPE_VARINT] );
554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      ExpectHardParseFailureForProto(
555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          cat( tag(fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer               varint(incomplete_submsg.size()),
557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer               incomplete_submsg ),
558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "PrematureEofInSubmessageValue" + type_name);
559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else if (type != FieldDescriptor::TYPE_GROUP) {
561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Non-delimited, non-group: eligible for packing.
562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // Packed region ends in the middle of a value.
564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ExpectHardParseFailureForProto(
565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer             varint(incomplete.size()),
567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer             incomplete ),
568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "PrematureEofInPackedFieldValue" + type_name);
569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // EOF in the middle of packed region.
571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ExpectParseFailureForProto(
572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        cat( tag(rep_fieldnum, WireFormatLite::WIRETYPE_LENGTH_DELIMITED),
573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer             varint(1) ),
574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "PrematureEofInPackedField" + type_name);
575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammervoid ConformanceTestSuite::SetFailureList(const vector<string>& failure_list) {
579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  expected_to_fail_.clear();
580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  std::copy(failure_list.begin(), failure_list.end(),
581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            std::inserter(expected_to_fail_, expected_to_fail_.end()));
582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool ConformanceTestSuite::CheckSetEmpty(const set<string>& set_to_check,
585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                         const char* msg) {
586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (set_to_check.empty()) {
587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return true;
588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  } else {
589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "\n");
590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "%s:\n", msg);
591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    for (set<string>::const_iterator iter = set_to_check.begin();
592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer         iter != set_to_check.end(); ++iter) {
593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      StringAppendF(&output_, "  %s\n", iter->c_str());
594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    }
595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    StringAppendF(&output_, "\n");
596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    return false;
597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerbool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner,
601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                                    std::string* output) {
602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  runner_ = runner;
603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  successes_ = 0;
604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  expected_failures_ = 0;
605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  skipped_.clear();
606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  test_names_.clear();
607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  unexpected_failing_tests_.clear();
608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  unexpected_succeeding_tests_.clear();
609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  type_resolver_.reset(NewTypeResolverForDescriptorPool(
610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      kTypeUrlPrefix, DescriptorPool::generated_pool()));
611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  type_url_ = GetTypeUrl(TestAllTypes::descriptor());
612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  output_ = "\nCONFORMANCE TEST BEGIN ====================================\n\n";
614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  for (int i = 1; i <= FieldDescriptor::MAX_TYPE; i++) {
616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    if (i == FieldDescriptor::TYPE_GROUP) continue;
617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    TestPrematureEOFForType(static_cast<FieldDescriptor::Type>(i));
618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest("HelloWorld", "{\"optionalString\":\"Hello, World!\"}",
621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                   "optional_string: 'Hello, World!'");
622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Test field name conventions.
624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameInSnakeCase",
626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldname1": 1,
628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName2": 2,
629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FieldName3": 3
630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        fieldname1: 1
633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_name2: 2
634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        _field_name3: 3
635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameWithNumbers",
638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field0name5": 5,
640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field0Name6": 6
641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field0name5: 5
644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_0_name6: 6
645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameWithMixedCases",
648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName7": 7,
650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName8": 8,
651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName9": 9,
652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName10": 10,
653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fIELDNAME11": 11,
654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fIELDName12": 12
655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        fieldName7: 7
658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FieldName8: 8
659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_Name9: 9
660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        Field_Name10: 10
661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FIELD_NAME11: 11
662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FIELD_name12: 12
663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Using the original proto field name in JSON is also allowed.
665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OriginalProtoFieldName",
667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldname1": 1,
669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field_name2": 2,
670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "_field_name3": 3,
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field0name5": 5,
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field_0_name6": 6,
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName7": 7,
674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FieldName8": 8,
675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field_Name9": 9,
676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "Field_Name10": 10,
677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FIELD_NAME11": 11,
678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FIELD_name12": 12
679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        fieldname1: 1
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_name2: 2
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        _field_name3: 3
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field0name5: 5
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_0_name6: 6
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        fieldName7: 7
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FieldName8: 8
688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        field_Name9: 9
689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        Field_Name10: 10
690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FIELD_NAME11: 11
691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        FIELD_name12: 12
692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Field names can be escaped.
694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameEscaped",
696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"fieldn\u0061me1": 1})",
697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "fieldname1: 1");
698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Field names must be quoted (or it's not valid JSON).
699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameNotQuoted",
701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "{fieldname1: 1}");
702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Trailing comma is not allowed (not valid JSON).
703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TrailingCommaInAnObject",
705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"fieldname1":1,})");
706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // JSON doesn't support comments.
707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "JsonWithComments",
709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        // This is a comment.
711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldname1": 1
712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })");
713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Duplicated field names are not allowed.
714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameDuplicate",
716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedMessage": {a: 1},
718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedMessage": {}
719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })");
720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameDuplicateDifferentCasing1",
722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_nested_message": {a: 1},
724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedMessage": {}
725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })");
726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameDuplicateDifferentCasing2",
728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedMessage": {a: 1},
730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_nested_message": {}
731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })");
732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Serializers should use lowerCamelCase by default.
733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameInLowerCamelCase",
735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldname1": 1,
737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName2": 2,
738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FieldName3": 3
739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value.isMember("fieldname1") &&
742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fieldName2") &&
743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("FieldName3");
744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameWithNumbers",
747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field0name5": 5,
749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "field0Name6": 6
750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value.isMember("field0name5") &&
753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("field0Name6");
754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldNameWithMixedCases",
757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName7": 7,
759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName8": 8,
760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName9": 9,
761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fieldName10": 10,
762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fIELDNAME11": 11,
763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "fIELDName12": 12
764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value.isMember("fieldName7") &&
767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fieldName8") &&
768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fieldName9") &&
769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fieldName10") &&
770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fIELDNAME11") &&
771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value.isMember("fIELDName12");
772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Integer fields.
775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldMaxValue",
777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 2147483647})",
778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 2147483647");
779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldMinValue",
781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": -2147483648})",
782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: -2147483648");
783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32FieldMaxValue",
785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32": 4294967295})",
786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint32: 4294967295");
787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldMaxValue",
789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "9223372036854775807"})",
790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int64: 9223372036854775807");
791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldMinValue",
793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "-9223372036854775808"})",
794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int64: -9223372036854775808");
795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldMaxValue",
797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": "18446744073709551615"})",
798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint64: 18446744073709551615");
799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldMaxValueNotQuoted",
801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": 9223372036854775807})",
802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int64: 9223372036854775807");
803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldMinValueNotQuoted",
805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": -9223372036854775808})",
806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int64: -9223372036854775808");
807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldMaxValueNotQuoted",
809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": 18446744073709551615})",
810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint64: 18446744073709551615");
811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Values can be represented as JSON strings.
812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldStringValue",
814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": "2147483647"})",
815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 2147483647");
816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldStringValueEscaped",
818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": "2\u003147483647"})",
819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 2147483647");
820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Parsers reject out-of-bound integer values.
822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldTooLarge",
824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 2147483648})");
825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldTooSmall",
827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": -2147483649})");
828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32FieldTooLarge",
830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32": 4294967296})");
831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldTooLarge",
833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "9223372036854775808"})");
834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldTooSmall",
836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "-9223372036854775809"})");
837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldTooLarge",
839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": "18446744073709551616"})");
840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Parser reject non-integer numeric values as well.
841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldNotInteger",
843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 0.5})");
844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32FieldNotInteger",
846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32": 0.5})");
847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldNotInteger",
849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "0.5"})");
850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldNotInteger",
852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": "0.5"})");
853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Integers but represented as float values are accepted.
855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldFloatTrailingZero",
857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 100000.000})",
858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 100000");
859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldExponentialFormat",
861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 1e5})",
862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 100000");
863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldMaxFloatValue",
865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 2.147483647e9})",
866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: 2147483647");
867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldMinFloatValue",
869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": -2.147483648e9})",
870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32: -2147483648");
871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32FieldMaxFloatValue",
873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32": 4.294967295e9})",
874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint32: 4294967295");
875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Parser reject non-numeric values.
877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldNotNumber",
879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": "3x3"})");
880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32FieldNotNumber",
882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32": "3x3"})");
883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldNotNumber",
885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": "3x3"})");
886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldNotNumber",
888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": "3x3"})");
889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // JSON does not allow "+" on numric values.
890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldPlusSign",
892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": +1})");
893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // JSON doesn't allow leading 0s.
894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldLeadingZero",
896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": 01})");
897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldNegativeWithLeadingZero",
899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": -01})");
900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // String values must follow the same syntax rule. Specifically leading
901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // or traling spaces are not allowed.
902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldLeadingSpace",
904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": " 1"})");
905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32FieldTrailingSpace",
907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32": "1 "})");
908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // 64-bit values are serialized as strings.
910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64FieldBeString",
912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64": 1})",
913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalInt64"].type() == Json::stringValue &&
915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value["optionalInt64"].asString() == "1";
916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64FieldBeString",
919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64": 1})",
920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalUint64"].type() == Json::stringValue &&
922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value["optionalUint64"].asString() == "1";
923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Bool fields.
926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldTrue",
928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":true})",
929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_bool: true");
930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldFalse",
932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":false})",
933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_bool: false");
934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Other forms are not allowed.
936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldIntegerZero",
938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":0})");
939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldIntegerOne",
941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":1})");
942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldCamelCaseTrue",
944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":True})");
945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldCamelCaseFalse",
947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":False})");
948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldAllCapitalTrue",
950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":TRUE})");
951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldAllCapitalFalse",
953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":FALSE})");
954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldDoubleQuotedTrue",
956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":"true"})");
957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolFieldDoubleQuotedFalse",
959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBool":"false"})");
960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Float fields.
962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldMinPositiveValue",
964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": 1.175494e-38})",
965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: 1.175494e-38");
966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldMaxNegativeValue",
968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": -1.175494e-38})",
969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: -1.175494e-38");
970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldMaxPositiveValue",
972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": 3.402823e+38})",
973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: 3.402823e+38");
974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldMinNegativeValue",
976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": 3.402823e+38})",
977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: 3.402823e+38");
978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Values can be quoted.
979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldQuotedValue",
981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": "1"})",
982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: 1");
983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Special values.
984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldNan",
986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": "NaN"})",
987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: nan");
988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldInfinity",
990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": "Infinity"})",
991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: inf");
992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldNegativeInfinity",
994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": "-Infinity"})",
995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float: -inf");
996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Non-cannonical Nan will be correctly normalized.
997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    TestAllTypes message;
999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // IEEE floating-point standard 32-bit quiet NaN:
1000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    //   0111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
1001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.set_optional_float(
1002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        WireFormatLite::DecodeFloat(0x7FA12345));
1003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    RunValidJsonTestWithProtobufInput(
1004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FloatFieldNormalizeQuietNan", message,
1005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_float: nan");
1006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // IEEE floating-point standard 64-bit signaling NaN:
1007b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    //   1111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
1008b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.set_optional_float(
1009b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        WireFormatLite::DecodeFloat(0xFFB54321));
1010b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    RunValidJsonTestWithProtobufInput(
1011b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "FloatFieldNormalizeSignalingNan", message,
1012b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_float: nan");
1013b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1014b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1015b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Special values must be quoted.
1016b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1017b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldNanNotQuoted",
1018b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": NaN})");
1019b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1020b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldInfinityNotQuoted",
1021b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": Infinity})");
1022b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1023b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldNegativeInfinityNotQuoted",
1024b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": -Infinity})");
1025b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Parsers should reject out-of-bound values.
1026b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1027b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldTooSmall",
1028b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": -3.502823e+38})");
1029b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1030b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FloatFieldTooLarge",
1031b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloat": 3.502823e+38})");
1032b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1033b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Double fields.
1034b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1035b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldMinPositiveValue",
1036b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": 2.22507e-308})",
1037b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: 2.22507e-308");
1038b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1039b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldMaxNegativeValue",
1040b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": -2.22507e-308})",
1041b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: -2.22507e-308");
1042b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1043b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldMaxPositiveValue",
1044b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": 1.79769e+308})",
1045b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: 1.79769e+308");
1046b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1047b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldMinNegativeValue",
1048b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": -1.79769e+308})",
1049b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: -1.79769e+308");
1050b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Values can be quoted.
1051b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1052b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldQuotedValue",
1053b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": "1"})",
1054b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: 1");
1055b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Speical values.
1056b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1057b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldNan",
1058b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": "NaN"})",
1059b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: nan");
1060b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1061b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldInfinity",
1062b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": "Infinity"})",
1063b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: inf");
1064b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1065b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldNegativeInfinity",
1066b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": "-Infinity"})",
1067b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double: -inf");
1068b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Non-cannonical Nan will be correctly normalized.
1069b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  {
1070b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    TestAllTypes message;
1071b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.set_optional_double(
1072b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        WireFormatLite::DecodeDouble(0x7FFA123456789ABCLL));
1073b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    RunValidJsonTestWithProtobufInput(
1074b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "DoubleFieldNormalizeQuietNan", message,
1075b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_double: nan");
1076b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    message.set_optional_double(
1077b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        WireFormatLite::DecodeDouble(0xFFFBCBA987654321LL));
1078b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    RunValidJsonTestWithProtobufInput(
1079b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "DoubleFieldNormalizeSignalingNan", message,
1080b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optional_double: nan");
1081b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1082b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1083b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Special values must be quoted.
1084b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1085b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldNanNotQuoted",
1086b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": NaN})");
1087b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1088b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldInfinityNotQuoted",
1089b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": Infinity})");
1090b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1091b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldNegativeInfinityNotQuoted",
1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": -Infinity})");
1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Parsers should reject out-of-bound values.
1095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldTooSmall",
1097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": -1.89769e+308})");
1098b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DoubleFieldTooLarge",
1100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDouble": +1.89769e+308})");
1101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Enum fields.
1103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumField",
1105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedEnum": "FOO"})",
1106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_nested_enum: FOO");
1107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Enum values must be represented as strings.
1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumFieldNotQuoted",
1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedEnum": FOO})");
1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Numeric values are allowed.
1112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumFieldNumericValueZero",
1114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedEnum": 0})",
1115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_nested_enum: FOO");
1116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumFieldNumericValueNonZero",
1118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedEnum": 1})",
1119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_nested_enum: BAR");
1120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Unknown enum values are represented as numeric values.
1121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumFieldUnknownValue",
1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedEnum": 123})",
1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalNestedEnum"].type() == Json::intValue &&
1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value["optionalNestedEnum"].asInt() == 123;
1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // String fields.
1130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringField",
1132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "Hello world!"})",
1133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_string: \"Hello world!\"");
1134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnicode",
1136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // Google in Chinese.
1137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "谷歌"})",
1138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string: "谷歌")");
1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldEscape",
1141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\"\\\/\b\f\n\r\t"})",
1142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string: "\"\\/\b\f\n\r\t")");
1143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnicodeEscape",
1145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\u8C37\u6B4C"})",
1146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string: "谷歌")");
1147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnicodeEscapeWithLowercaseHexLetters",
1149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\u8c37\u6b4c"})",
1150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string: "谷歌")");
1151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldSurrogatePair",
1153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      // The character is an emoji: grinning face with smiling eyes. ��
1154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\uD83D\uDE01"})",
1155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string: "\xF0\x9F\x98\x81")");
1156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Unicode escapes must start with "\u" (lowercase u).
1158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUppercaseEscapeLetter",
1160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\U8C37\U6b4C"})");
1161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldInvalidEscape",
1163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\uXXXX\u6B4C"})");
1164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnterminatedEscape",
1166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\u8C3"})");
1167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnpairedHighSurrogate",
1169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\uD800"})");
1170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldUnpairedLowSurrogate",
1172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\uDC00"})");
1173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldSurrogateInWrongOrder",
1175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": "\uDE01\uD83D"})");
1176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringFieldNotAString",
1178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalString": 12345})");
1179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Bytes fields.
1181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BytesField",
1183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBytes": "AQI="})",
1184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_bytes: "\x01\x02")");
1185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BytesFieldNoPadding",
1187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBytes": "AQI"})");
1188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BytesFieldInvalidBase64Characters",
1190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBytes": "-_=="})");
1191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Message fields.
1193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "MessageField",
1195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalNestedMessage": {"a": 1234}})",
1196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_nested_message: {a: 1234}");
1197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Oneof fields.
1199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OneofFieldDuplicate",
1201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"oneofUint32": 1, "oneofString": "test"})");
1202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Repeated fields.
1204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "PrimitiveRepeatedField",
1206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, 2, 3, 4]})",
1207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_int32: [1, 2, 3, 4]");
1208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "EnumRepeatedField",
1210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedEnum": ["FOO", "BAR", "BAZ"]})",
1211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_nested_enum: [FOO, BAR, BAZ]");
1212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "StringRepeatedField",
1214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedString": ["Hello", "world"]})",
1215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(repeated_string: ["Hello", "world"])");
1216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BytesRepeatedField",
1218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedBytes": ["AAEC", "AQI="]})",
1219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(repeated_bytes: ["\x00\x01\x02", "\x01\x02"])");
1220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "MessageRepeatedField",
1222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedMessage": [{"a": 1234}, {"a": 5678}]})",
1223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_nested_message: {a: 1234}"
1224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_nested_message: {a: 5678}");
1225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Repeated field elements are of incorrect type.
1227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingIntegersGotBool",
1229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, false, 3, 4]})");
1230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingIntegersGotString",
1232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, 2, "name", 4]})");
1233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingIntegersGotMessage",
1235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, 2, 3, {"a": 4}]})");
1236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingStringsGotInt",
1238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedString": ["1", 2, "3", "4"]})");
1239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingStringsGotBool",
1241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedString": ["1", "2", false, "4"]})");
1242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingStringsGotMessage",
1244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedString": ["1", 2, "3", {"a": 4}]})");
1245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingMessagesGotInt",
1247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedMessage": [{"a": 1}, 2]})");
1248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingMessagesGotBool",
1250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedMessage": [{"a": 1}, false]})");
1251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldWrongElementTypeExpectingMessagesGotString",
1253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedMessage": [{"a": 1}, "2"]})");
1254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Trailing comma in the repeated field is not allowed.
1255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldTrailingComma",
1257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, 2, 3, 4,]})");
1258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Map fields.
1260b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1261b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32MapField",
1262b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt32Int32": {"1": 2, "3": 4}})",
1263b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int32_int32: {key: 1 value: 2}"
1264b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int32_int32: {key: 3 value: 4}");
1265b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1266b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32MapFieldKeyNotQuoted",
1267b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt32Int32": {1: 2, 3: 4}})");
1268b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1269b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32MapField",
1270b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapUint32Uint32": {"1": 2, "3": 4}})",
1271b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_uint32_uint32: {key: 1 value: 2}"
1272b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_uint32_uint32: {key: 3 value: 4}");
1273b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1274b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint32MapFieldKeyNotQuoted",
1275b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapUint32Uint32": {1: 2, 3: 4}})");
1276b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1277b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64MapField",
1278b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt64Int64": {"1": 2, "3": 4}})",
1279b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int64_int64: {key: 1 value: 2}"
1280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int64_int64: {key: 3 value: 4}");
1281b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1282b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64MapFieldKeyNotQuoted",
1283b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt64Int64": {1: 2, 3: 4}})");
1284b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1285b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64MapField",
1286b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapUint64Uint64": {"1": 2, "3": 4}})",
1287b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_uint64_uint64: {key: 1 value: 2}"
1288b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_uint64_uint64: {key: 3 value: 4}");
1289b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1290b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Uint64MapFieldKeyNotQuoted",
1291b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapUint64Uint64": {1: 2, 3: 4}})");
1292b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1293b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolMapField",
1294b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapBoolBool": {"true": true, "false": false}})",
1295b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_bool_bool: {key: true value: true}"
1296b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_bool_bool: {key: false value: false}");
1297b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1298b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolMapFieldKeyNotQuoted",
1299b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapBoolBool": {true: true, false: false}})");
1300b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1301b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "MessageMapField",
1302b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1303b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "mapStringNestedMessage": {
1304b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "hello": {"a": 1234},
1305b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "world": {"a": 5678}
1306b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1307b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1308b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1309b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        map_string_nested_message: {
1310b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          key: "hello"
1311b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          value: {a: 1234}
1312b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1313b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        map_string_nested_message: {
1314b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          key: "world"
1315b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          value: {a: 5678}
1316b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1317b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1318b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Since Map keys are represented as JSON strings, escaping should be allowed.
1319b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1320b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int32MapEscapedKey",
1321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt32Int32": {"\u0031": 2}})",
1322b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int32_int32: {key: 1 value: 2}");
1323b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1324b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Int64MapEscapedKey",
1325b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt64Int64": {"\u0031": 2}})",
1326b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_int64_int64: {key: 1 value: 2}");
1327b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1328b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "BoolMapEscapedKey",
1329b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapBoolBool": {"tr\u0075e": true}})",
1330b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "map_bool_bool: {key: true value: true}");
1331b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1332b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // "null" is accepted for all fields types.
1333b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1334b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AllFieldAcceptNull",
1335b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1336b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt32": null,
1337b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt64": null,
1338b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint32": null,
1339b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint64": null,
1340b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBool": null,
1341b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalString": null,
1342b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBytes": null,
1343b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedEnum": null,
1344b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalNestedMessage": null,
1345b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedInt32": null,
1346b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedInt64": null,
1347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedUint32": null,
1348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedUint64": null,
1349b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedBool": null,
1350b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedString": null,
1351b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedBytes": null,
1352b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedNestedEnum": null,
1353b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedNestedMessage": null,
1354b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "mapInt32Int32": null,
1355b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "mapBoolBool": null,
1356b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "mapStringNestedMessage": null
1357b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "");
1359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Repeated field elements cannot be null.
1361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldPrimitiveElementIsNull",
1363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32": [1, null, 2]})");
1364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFieldMessageElementIsNull",
1366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedNestedMessage": [{"a":1}, null, {"a":2}]})");
1367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Map field keys cannot be null.
1368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "MapFieldKeyIsNull",
1370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt32Int32": {null: 1}})");
1371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Map field values cannot be null.
1372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "MapFieldValueIsNull",
1374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"mapInt32Int32": {"0": null}})");
1375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Wrapper types.
1377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalBoolWrapper",
1379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBoolWrapper": false})",
1380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_bool_wrapper: {value: false}");
1381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalInt32Wrapper",
1383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt32Wrapper": 0})",
1384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int32_wrapper: {value: 0}");
1385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalUint32Wrapper",
1387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint32Wrapper": 0})",
1388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint32_wrapper: {value: 0}");
1389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1390b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalInt64Wrapper",
1391b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalInt64Wrapper": 0})",
1392b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_int64_wrapper: {value: 0}");
1393b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1394b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalUint64Wrapper",
1395b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalUint64Wrapper": 0})",
1396b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_uint64_wrapper: {value: 0}");
1397b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1398b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalFloatWrapper",
1399b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFloatWrapper": 0})",
1400b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_float_wrapper: {value: 0}");
1401b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalDoubleWrapper",
1403b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDoubleWrapper": 0})",
1404b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_double_wrapper: {value: 0}");
1405b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1406b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalStringWrapper",
1407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalStringWrapper": ""})",
1408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_string_wrapper: {value: ""})");
1409b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1410b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalBytesWrapper",
1411b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalBytesWrapper": ""})",
1412b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_bytes_wrapper: {value: ""})");
1413b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1414b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "OptionalWrapperTypesWithNonDefaultValue",
1415b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1416b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBoolWrapper": true,
1417b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt32Wrapper": 1,
1418b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint32Wrapper": 1,
1419b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt64Wrapper": "1",
1420b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint64Wrapper": "1",
1421b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalFloatWrapper": 1,
1422b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalDoubleWrapper": 1,
1423b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalStringWrapper": "1",
1424b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBytesWrapper": "AQI="
1425b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1426b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_bool_wrapper: {value: true}
1428b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_int32_wrapper: {value: 1}
1429b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_uint32_wrapper: {value: 1}
1430b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_int64_wrapper: {value: 1}
1431b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_uint64_wrapper: {value: 1}
1432b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_float_wrapper: {value: 1}
1433b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_double_wrapper: {value: 1}
1434b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_string_wrapper: {value: "1"}
1435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_bytes_wrapper: {value: "\x01\x02"}
1436b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1437b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1438b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedBoolWrapper",
1439b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedBoolWrapper": [true, false]})",
1440b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_bool_wrapper: {value: true}"
1441b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_bool_wrapper: {value: false}");
1442b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1443b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedInt32Wrapper",
1444b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt32Wrapper": [0, 1]})",
1445b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_int32_wrapper: {value: 0}"
1446b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_int32_wrapper: {value: 1}");
1447b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1448b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedUint32Wrapper",
1449b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedUint32Wrapper": [0, 1]})",
1450b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_uint32_wrapper: {value: 0}"
1451b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_uint32_wrapper: {value: 1}");
1452b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1453b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedInt64Wrapper",
1454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedInt64Wrapper": [0, 1]})",
1455b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_int64_wrapper: {value: 0}"
1456b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_int64_wrapper: {value: 1}");
1457b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedUint64Wrapper",
1459b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedUint64Wrapper": [0, 1]})",
1460b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_uint64_wrapper: {value: 0}"
1461b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_uint64_wrapper: {value: 1}");
1462b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1463b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedFloatWrapper",
1464b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedFloatWrapper": [0, 1]})",
1465b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_float_wrapper: {value: 0}"
1466b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_float_wrapper: {value: 1}");
1467b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1468b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedDoubleWrapper",
1469b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedDoubleWrapper": [0, 1]})",
1470b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_double_wrapper: {value: 0}"
1471b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_double_wrapper: {value: 1}");
1472b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1473b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedStringWrapper",
1474b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedStringWrapper": ["", "AQI="]})",
1475b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1476b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        repeated_string_wrapper: {value: ""}
1477b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        repeated_string_wrapper: {value: "AQI="}
1478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1479b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1480b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "RepeatedBytesWrapper",
1481b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedBytesWrapper": ["", "AQI="]})",
1482b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1483b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        repeated_bytes_wrapper: {value: ""}
1484b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        repeated_bytes_wrapper: {value: "\x01\x02"}
1485b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1486b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "WrapperTypesWithNullValue",
1488b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1489b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBoolWrapper": null,
1490b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt32Wrapper": null,
1491b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint32Wrapper": null,
1492b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalInt64Wrapper": null,
1493b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalUint64Wrapper": null,
1494b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalFloatWrapper": null,
1495b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalDoubleWrapper": null,
1496b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalStringWrapper": null,
1497b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalBytesWrapper": null,
1498b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedBoolWrapper": null,
1499b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedInt32Wrapper": null,
1500b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedUint32Wrapper": null,
1501b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedInt64Wrapper": null,
1502b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedUint64Wrapper": null,
1503b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedFloatWrapper": null,
1504b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedDoubleWrapper": null,
1505b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedStringWrapper": null,
1506b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedBytesWrapper": null
1507b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1508b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "");
1509b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1510b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Duration
1511b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1512b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationMinValue",
1513b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "-315576000000.999999999s"})",
1514b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_duration: {seconds: -315576000000 nanos: -999999999}");
1515b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1516b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationMaxValue",
1517b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "315576000000.999999999s"})",
1518b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_duration: {seconds: 315576000000 nanos: 999999999}");
1519b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1520b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationRepeatedValue",
1521b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"repeatedDuration": ["1.5s", "-1.5s"]})",
1522b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_duration: {seconds: 1 nanos: 500000000}"
1523b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_duration: {seconds: -1 nanos: -500000000}");
1524b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1525b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1526b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationMissingS",
1527b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "1"})");
1528b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1529b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationJsonInputTooSmall",
1530b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "-315576000001.000000000s"})");
1531b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1532b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationJsonInputTooLarge",
1533b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "315576000001.000000000s"})");
1534b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1535b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationProtoInputTooSmall",
1536b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_duration: {seconds: -315576000001 nanos: 0}");
1537b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1538b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationProtoInputTooLarge",
1539b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_duration: {seconds: 315576000001 nanos: 0}");
1540b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1541b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1542b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationHasZeroFractionalDigit",
1543b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "1.000000000s"})",
1544b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalDuration"].asString() == "1s";
1546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationHas3FractionalDigits",
1549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "1.010000000s"})",
1550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalDuration"].asString() == "1.010s";
1552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1553b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1554b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationHas6FractionalDigits",
1555b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "1.000010000s"})",
1556b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1557b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalDuration"].asString() == "1.000010s";
1558b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1559b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "DurationHas9FractionalDigits",
1561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalDuration": "1.000000010s"})",
1562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalDuration"].asString() == "1.000000010s";
1564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1566b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Timestamp
1567b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1568b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampMinValue",
1569b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0001-01-01T00:00:00Z"})",
1570b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: -62135596800}");
1571b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1572b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampMaxValue",
1573b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "9999-12-31T23:59:59.999999999Z"})",
1574b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: 253402300799 nanos: 999999999}");
1575b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1576b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampRepeatedValue",
1577b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1578b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "repeatedTimestamp": [
1579b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "0001-01-01T00:00:00Z",
1580b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "9999-12-31T23:59:59.999999999Z"
1581b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        ]
1582b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1583b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_timestamp: {seconds: -62135596800}"
1584b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "repeated_timestamp: {seconds: 253402300799 nanos: 999999999}");
1585b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1586b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampWithPositiveOffset",
1587b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1970-01-01T08:00:00+08:00"})",
1588b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: 0}");
1589b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1590b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampWithNegativeOffset",
1591b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})",
1592b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: 0}");
1593b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1594b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1595b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputTooSmall",
1596b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0000-01-01T00:00:00Z"})");
1597b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1598b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputTooLarge",
1599b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "10000-01-01T00:00:00Z"})");
1600b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1601b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputMissingZ",
1602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0001-01-01T00:00:00"})");
1603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1604b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputMissingT",
1605b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0001-01-01 00:00:00Z"})");
1606b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1607b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputLowercaseZ",
1608b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0001-01-01T00:00:00z"})");
1609b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1610b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampJsonInputLowercaseT",
1611b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "0001-01-01t00:00:00Z"})");
1612b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1613b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampProtoInputTooSmall",
1614b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: -62135596801}");
1615b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1616b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampProtoInputTooLarge",
1617b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_timestamp: {seconds: 253402300800}");
1618b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1619b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampZeroNormalized",
1620b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1969-12-31T16:00:00-08:00"})",
1621b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1622b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalTimestamp"].asString() ==
1623b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "1970-01-01T00:00:00Z";
1624b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1625b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1626b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampHasZeroFractionalDigit",
1627b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1970-01-01T00:00:00.000000000Z"})",
1628b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1629b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalTimestamp"].asString() ==
1630b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "1970-01-01T00:00:00Z";
1631b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1632b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1633b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampHas3FractionalDigits",
1634b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1970-01-01T00:00:00.010000000Z"})",
1635b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1636b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalTimestamp"].asString() ==
1637b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "1970-01-01T00:00:00.010Z";
1638b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1639b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1640b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampHas6FractionalDigits",
1641b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1970-01-01T00:00:00.000010000Z"})",
1642b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1643b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalTimestamp"].asString() ==
1644b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "1970-01-01T00:00:00.000010Z";
1645b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1646b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTestWithValidator(
1647b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "TimestampHas9FractionalDigits",
1648b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalTimestamp": "1970-01-01T00:00:00.000000010Z"})",
1649b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      [](const Json::Value& value) {
1650b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        return value["optionalTimestamp"].asString() ==
1651b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "1970-01-01T00:00:00.000000010Z";
1652b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      });
1653b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1654b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // FieldMask
1655b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1656b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldMask",
1657b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFieldMask": "foo,barBaz"})",
1658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_field_mask: {paths: "foo" paths: "bar_baz"})");
1659b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectParseFailureForJson(
1660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldMaskInvalidCharacter",
1661b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalFieldMask": "foo,bar_bar"})");
1662b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1663b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldMaskPathsDontRoundTrip",
1664b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_field_mask: {paths: "fooBar"})");
1665b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1666b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldMaskNumbersDontRoundTrip",
1667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_field_mask: {paths: "foo_3_bar"})");
1668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  ExpectSerializeFailureForJson(
1669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "FieldMaskTooManyUnderscore",
1670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_field_mask: {paths: "foo__bar"})");
1671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Struct
1673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Struct",
1675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalStruct": {
1677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "nullValue": null,
1678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "intValue": 1234,
1679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "boolValue": true,
1680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "doubleValue": 1234.5678,
1681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "stringValue": "Hello world!",
1682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "listValue": [1234, "5678"],
1683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "objectValue": {
1684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "value": 0
1685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_struct: {
1690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "nullValue"
1692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {null_value: NULL_VALUE}
1693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "intValue"
1696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {number_value: 1234}
1697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "boolValue"
1700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {bool_value: true}
1701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "doubleValue"
1704b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {number_value: 1234.5678}
1705b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1706b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1707b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "stringValue"
1708b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {string_value: "Hello world!"}
1709b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1710b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1711b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "listValue"
1712b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {
1713b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              list_value: {
1714b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                values: {
1715b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  number_value: 1234
1716b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                }
1717b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                values: {
1718b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  string_value: "5678"
1719b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                }
1720b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              }
1721b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1722b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1723b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          fields: {
1724b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            key: "objectValue"
1725b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: {
1726b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              struct_value: {
1727b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                fields: {
1728b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  key: "value"
1729b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  value: {
1730b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                    number_value: 0
1731b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  }
1732b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                }
1733b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              }
1734b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1735b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1736b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1737b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Value
1739b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1740b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptInteger",
1741b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": 1})",
1742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_value: { number_value: 1}");
1743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1744b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptFloat",
1745b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": 1.5})",
1746b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_value: { number_value: 1.5}");
1747b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1748b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptBool",
1749b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": false})",
1750b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_value: { bool_value: false}");
1751b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1752b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptNull",
1753b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": null})",
1754b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "optional_value: { null_value: NULL_VALUE}");
1755b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1756b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptString",
1757b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": "hello"})",
1758b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(optional_value: { string_value: "hello"})");
1759b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1760b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptList",
1761b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": [0, "hello"]})",
1762b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1763b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_value: {
1764b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          list_value: {
1765b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            values: {
1766b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              number_value: 0
1767b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1768b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            values: {
1769b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              string_value: "hello"
1770b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1771b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1772b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1773b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "ValueAcceptObject",
1776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({"optionalValue": {"value": 1}})",
1777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1778b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_value: {
1779b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          struct_value: {
1780b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            fields: {
1781b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              key: "value"
1782b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              value: {
1783b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                number_value: 1
1784b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              }
1785b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1786b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1787b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1788b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1789b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1790b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Any
1791b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1792b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "Any",
1793b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1794b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1795b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/conformance.TestAllTypes",
1796b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "optionalInt32": 12345
1797b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1798b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1799b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1800b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1801b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/conformance.TestAllTypes] {
1802b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            optional_int32: 12345
1803b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1804b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1805b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1806b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1807b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyNested",
1808b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1809b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1810b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Any",
1811b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": {
1812b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "@type": "type.googleapis.com/conformance.TestAllTypes",
1813b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "optionalInt32": 12345
1814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Any] {
1820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            [type.googleapis.com/conformance.TestAllTypes] {
1821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              optional_int32: 12345
1822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1823b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1824b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1825b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1826b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // The special "@type" tag is not required to appear first.
1827b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyUnorderedTypeTag",
1829b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1830b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1831b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "optionalInt32": 12345,
1832b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/conformance.TestAllTypes"
1833b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1834b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1835b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1836b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1837b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/conformance.TestAllTypes] {
1838b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            optional_int32: 12345
1839b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1840b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1841b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1842b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Well-known types in Any.
1843b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1844b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithInt32ValueWrapper",
1845b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1846b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1847b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Int32Value",
1848b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": 12345
1849b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1850b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1851b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1852b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1853b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Int32Value] {
1854b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            value: 12345
1855b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1856b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1857b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1858b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1859b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithDuration",
1860b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1861b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1862b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Duration",
1863b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": "1.5s"
1864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Duration] {
1869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            seconds: 1
1870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            nanos: 500000000
1871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1873b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1874b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1875b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithTimestamp",
1876b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1877b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1878b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Timestamp",
1879b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": "1970-01-01T00:00:00Z"
1880b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1881b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1882b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1883b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1884b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Timestamp] {
1885b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            seconds: 0
1886b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            nanos: 0
1887b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1888b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1889b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1890b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1891b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithFieldMask",
1892b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1893b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1894b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.FieldMask",
1895b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": "foo,barBaz"
1896b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1897b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1898b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1899b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1900b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.FieldMask] {
1901b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            paths: ["foo", "bar_baz"]
1902b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1903b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1904b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1905b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1906b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithStruct",
1907b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1908b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1909b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Struct",
1910b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": {
1911b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "foo": 1
1912b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1913b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1914b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1915b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1916b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Struct] {
1918b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            fields: {
1919b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              key: "foo"
1920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              value: {
1921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                number_value: 1
1922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              }
1923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1926b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1927b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1928b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithValueForJsonObject",
1929b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1930b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1931b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Value",
1932b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": {
1933b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            "foo": 1
1934b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1935b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1936b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1937b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1938b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1939b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Value] {
1940b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            struct_value: {
1941b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              fields: {
1942b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                key: "foo"
1943b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                value: {
1944b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  number_value: 1
1945b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                }
1946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer              }
1947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            }
1948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1950b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1951b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  RunValidJsonTest(
1952b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "AnyWithValueForInteger",
1953b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"({
1954b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        "optionalAny": {
1955b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "@type": "type.googleapis.com/google.protobuf.Value",
1956b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "value": 1
1957b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1958b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      })",
1959b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      R"(
1960b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        optional_any: {
1961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          [type.googleapis.com/google.protobuf.Value] {
1962b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer            number_value: 1
1963b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          }
1964b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer        }
1965b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      )");
1966b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  bool ok = true;
1968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!CheckSetEmpty(expected_to_fail_,
1969b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                     "These tests were listed in the failure list, but they "
1970b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                     "don't exist.  Remove them from the failure list")) {
1971b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ok = false;
1972b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1973b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (!CheckSetEmpty(unexpected_failing_tests_,
1974b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                     "These tests failed.  If they can't be fixed right now, "
1975b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                     "you can add them to the failure list so the overall "
1976b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                     "suite can succeed")) {
1977b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    ok = false;
1978b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1979b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1980b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // Sometimes the testee may be fixed before we update the failure list (e.g.,
1981b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // the testee is from a different component). We warn about this case but
1982b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  // don't consider it an overall test failure.
1983b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  CheckSetEmpty(unexpected_succeeding_tests_,
1984b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                "These tests succeeded, even though they were listed in "
1985b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                "the failure list.  Remove them from the failure list");
1986b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1987b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (verbose_) {
1988b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    CheckSetEmpty(skipped_,
1989b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "These tests were skipped (probably because support for some "
1990b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                  "features is not implemented)");
1991b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  }
1992b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
1993b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  StringAppendF(&output_,
1994b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                "CONFORMANCE SUITE %s: %d successes, %d skipped, "
1995b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                "%d expected failures, %d unexpected failures.\n",
1996b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                ok ? "PASSED" : "FAILED", successes_, skipped_.size(),
1997b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer                expected_failures_, unexpected_failing_tests_.size());
1998b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  StringAppendF(&output_, "\n");
1999b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
2000b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  output->assign(output_);
2001b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
2002b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  return ok;
2003b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}
2004b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
2005b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace protobuf
2006b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}  // namespace google
2007