// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/lib/fidl_codec/wire_parser.h"

#include <fuchsia/sys/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "lib/fidl/cpp/test/frobinator_impl.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/writer.h"
#include "src/lib/fidl_codec/encoder.h"
#include "src/lib/fidl_codec/fidl_codec_test.h"
#include "src/lib/fidl_codec/library_loader.h"
#include "src/lib/fidl_codec/library_loader_test_data.h"
#include "src/lib/fidl_codec/message_decoder.h"
#include "src/lib/fidl_codec/wire_object.h"
#include "test/fidlcodec/examples/cpp/fidl.h"

namespace fidl_codec {

constexpr uint32_t kUninitialized = 0xdeadbeef;
constexpr float kFloatValue = 0.25;
constexpr double kDoubleValue = 9007199254740992.0;
constexpr int kUint32Precision = 8;

const Colors FakeColors(/*new_reset=*/"#rst#", /*new_red=*/"#red#", /*new_green=*/"#gre#",
                        /*new_blue=*/"#blu#", /*new_white_on_magenta=*/"#wom#",
                        /*new_yellow_background=*/"#yeb#");

AsyncLoopForTest::AsyncLoopForTest() : impl_(std::make_unique<AsyncLoopForTestImpl>()) {}

AsyncLoopForTest::~AsyncLoopForTest() = default;

zx_status_t AsyncLoopForTest::RunUntilIdle() { return impl_->loop()->RunUntilIdle(); }

zx_status_t AsyncLoopForTest::Run() { return impl_->loop()->Run(); }

async_dispatcher_t* AsyncLoopForTest::dispatcher() { return impl_->loop()->dispatcher(); }

LibraryLoader* InitLoader() {
  std::vector<std::unique_ptr<std::istream>> library_files;
  fidl_codec_test::FidlcodecExamples examples;
  for (const auto& element : examples.map()) {
    std::unique_ptr<std::istream> file =
        std::make_unique<std::istringstream>(std::istringstream(element.second));
    library_files.push_back(std::move(file));
  }
  LibraryReadError err;
  return new LibraryLoader(&library_files, &err);
}

LibraryLoader* GetLoader() {
  static LibraryLoader* loader = InitLoader();
  return loader;
}

class WireParserTest : public ::testing::Test {
 protected:
  void SetUp() override {
    loader_ = GetLoader();
    ASSERT_NE(loader_, nullptr);
  }

  LibraryLoader* loader() const { return loader_; }

 private:
  LibraryLoader* loader_;
};

TEST_F(WireParserTest, ParseSingleString) {
  fidl::MessageBuffer buffer;
  fidl::Message message = buffer.CreateEmptyMessage();

  InterceptRequest<fidl::test::frobinator::Frobinator>(
      message, [](fidl::InterfacePtr<fidl::test::frobinator::Frobinator>& ptr) {
        ptr->Grob("one", [](const fidl::StringPtr& /*value*/) { FAIL(); });
      });

  fidl_message_header_t header = message.header();

  const std::vector<const InterfaceMethod*>* methods = loader()->GetByOrdinal(header.ordinal);
  ASSERT_NE(methods, nullptr);
  ASSERT_TRUE(!methods->empty());
  const InterfaceMethod* method = (*methods)[0];
  ASSERT_NE(method, nullptr);
  ASSERT_EQ("Grob", method->name());

  zx_handle_info_t* handle_infos = nullptr;
  if (message.handles().size() > 0) {
    handle_infos = new zx_handle_info_t[message.handles().size()];
    for (uint32_t i = 0; i < message.handles().size(); ++i) {
      handle_infos[i].handle = message.handles().data()[i];
      handle_infos[i].type = ZX_OBJ_TYPE_NONE;
      handle_infos[i].rights = 0;
    }
  }

  std::unique_ptr<fidl_codec::StructValue> decoded_request;
  std::stringstream error_stream;
  fidl_codec::DecodeRequest(method, message.bytes().data(), message.bytes().size(), handle_infos,
                            message.handles().size(), &decoded_request, error_stream);
  rapidjson::Document actual;
  if (decoded_request != nullptr) {
    decoded_request->ExtractJson(actual.GetAllocator(), actual);
  }

  rapidjson::Document expected;
  expected.Parse(R"JSON({"value":"one"})JSON");
  ASSERT_EQ(expected, actual);

  delete[] handle_infos;
}

// This is a general-purpose macro for calling InterceptRequest and checking its
// results.  It can be generalized to a wide variety of types (and is, below).
// It checks for successful parsing, as well as failure when parsing truncated
// values.
// |_iface| is the interface method name on examples::FidlCodecTestInterface
//    (TODO: generalize which interface to use)
// |_json_value| is the expected JSON representation of the message.
// |_pretty_print| is the expected pretty print of the message.
// The remaining parameters are the parameters to |_iface| to generate the
// message.
// If patched_offset is not -1, we patch the encoded buffer with patched_value.
// This is useful when we want to test that we can decode junk data.
// If num_bytes is not -1, instead of decoding the full buffer, we only decode num_bytes of buffer.
// This is helpful when we want to test display of incorect data.
#define TEST_DECODE_WIRE_BODY_COMMON(_iface, patched_offset, patched_value, _json_value,           \
                                     _pretty_print, num_bytes, ...)                                \
  do {                                                                                             \
    fidl::MessageBuffer buffer;                                                                    \
    fidl::Message message = buffer.CreateEmptyMessage();                                           \
    using test::fidlcodec::examples::FidlCodecTestInterface;                                       \
    InterceptRequest<FidlCodecTestInterface>(                                                      \
        message,                                                                                   \
        [&](fidl::InterfacePtr<FidlCodecTestInterface>& ptr) { ptr->_iface(__VA_ARGS__); });       \
                                                                                                   \
    fidl_message_header_t header = message.header();                                               \
                                                                                                   \
    const std::vector<const InterfaceMethod*>* methods = loader()->GetByOrdinal(header.ordinal);   \
    ASSERT_NE(methods, nullptr);                                                                   \
    ASSERT_TRUE(!methods->empty());                                                                \
    const InterfaceMethod* method = (*methods)[0];                                                 \
    ASSERT_NE(method, nullptr);                                                                    \
    ASSERT_EQ(#_iface, method->name());                                                            \
                                                                                                   \
    zx_handle_info_t* handle_infos = nullptr;                                                      \
    if (message.handles().size() > 0) {                                                            \
      handle_infos = new zx_handle_info_t[message.handles().size()];                               \
      for (uint32_t i = 0; i < message.handles().size(); ++i) {                                    \
        handle_infos[i].handle = message.handles().data()[i];                                      \
        handle_infos[i].type = ZX_OBJ_TYPE_CHANNEL;                                                \
        handle_infos[i].rights = ZX_RIGHT_TRANSFER | ZX_RIGHT_READ | ZX_RIGHT_WRITE |              \
                                 ZX_RIGHT_SIGNAL | ZX_RIGHT_SIGNAL_PEER | ZX_RIGHT_WAIT |          \
                                 ZX_RIGHT_INSPECT;                                                 \
      }                                                                                            \
    }                                                                                              \
    if (patched_offset != -1) {                                                                    \
      *(reinterpret_cast<uint64_t*>(message.bytes().data() + patched_offset)) = patched_value;     \
    }                                                                                              \
                                                                                                   \
    std::stringstream error_stream;                                                                \
    MessageDecoder decoder(message.bytes().data(),                                                 \
                           (num_bytes == -1) ? message.bytes().size() : num_bytes, handle_infos,   \
                           message.handles().size(), error_stream);                                \
    std::unique_ptr<StructValue> object = decoder.DecodeMessage(*method->request());               \
    if ((num_bytes == -1) && (patched_offset == -1)) {                                             \
      std::cerr << error_stream.str();                                                             \
      ASSERT_FALSE(decoder.HasError()) << "Could not decode message";                              \
    }                                                                                              \
    rapidjson::Document actual;                                                                    \
    if (object != nullptr) {                                                                       \
      object->ExtractJson(actual.GetAllocator(), actual);                                          \
    }                                                                                              \
    rapidjson::StringBuffer actual_string;                                                         \
    rapidjson::Writer<rapidjson::StringBuffer> actual_w(actual_string);                            \
    actual.Accept(actual_w);                                                                       \
                                                                                                   \
    rapidjson::Document expected;                                                                  \
    std::string expected_source = _json_value;                                                     \
    expected.Parse(expected_source.c_str());                                                       \
    rapidjson::StringBuffer expected_string;                                                       \
    rapidjson::Writer<rapidjson::StringBuffer> expected_w(expected_string);                        \
    expected.Accept(expected_w);                                                                   \
                                                                                                   \
    ASSERT_EQ(expected, actual) << "expected = " << expected_string.GetString() << " ("            \
                                << expected_source << ")"                                          \
                                << " and actual = " << actual_string.GetString();                  \
                                                                                                   \
    std::stringstream result;                                                                      \
    if (object != nullptr) {                                                                       \
      PrettyPrinter printer(result, FakeColors, "", 80, /*header_on_every_line=*/false);           \
      object->PrettyPrint(nullptr, printer);                                                       \
    }                                                                                              \
    ASSERT_EQ(result.str(), _pretty_print)                                                         \
        << "expected = " << _pretty_print << " actual = " << result.str();                         \
                                                                                                   \
    for (uint32_t actual = 0; actual < message.bytes().actual(); ++actual) {                       \
      std::stringstream error_stream;                                                              \
      MessageDecoder decoder(message.bytes().data(), actual, handle_infos,                         \
                             message.handles().size(), error_stream);                              \
      std::unique_ptr<StructValue> object = decoder.DecodeMessage(*method->request());             \
      ASSERT_TRUE(decoder.HasError()) << "expect decoder error for buffer size " << actual         \
                                      << " instead of " << message.bytes().actual();               \
    }                                                                                              \
                                                                                                   \
    for (uint32_t actual = 0; message.handles().actual() > actual; actual++) {                     \
      std::stringstream error_stream;                                                              \
      MessageDecoder decoder(message.bytes().data(), message.bytes().size(), handle_infos, actual, \
                             error_stream);                                                        \
      std::unique_ptr<StructValue> object = decoder.DecodeMessage(*method->request());             \
      ASSERT_TRUE(decoder.HasError()) << "expect decoder error for handle size " << actual         \
                                      << " instead of " << message.handles().actual();             \
    }                                                                                              \
                                                                                                   \
    if ((num_bytes == -1) && (patched_offset == -1)) {                                             \
      auto encode_result = Encoder::EncodeMessage(header.txid, header.ordinal, header.flags,       \
                                                  header.magic_number, *object.get());             \
      ASSERT_THAT(encode_result.bytes, ::testing::ElementsAreArray(message.bytes()));              \
      ASSERT_EQ(message.handles().size(), encode_result.handles.size());                           \
                                                                                                   \
      for (uint32_t i = 0; i < message.handles().size(); ++i) {                                    \
        EXPECT_EQ(message.handles().data()[i], encode_result.handles[i].handle);                   \
      }                                                                                            \
    }                                                                                              \
                                                                                                   \
    delete[] handle_infos;                                                                         \
  } while (0)

#define TEST_DECODE_WIRE_BODY(_iface, _json_value, _pretty_print, ...) \
  TEST_DECODE_WIRE_BODY_COMMON(_iface, -1, 0, _json_value, _pretty_print, -1, __VA_ARGS__)

#define TEST_DECODE_WIRE_BODY_BAD(_iface, _json_value, _pretty_print, num_bytes, ...) \
  TEST_DECODE_WIRE_BODY_COMMON(_iface, -1, 0, _json_value, _pretty_print, num_bytes, __VA_ARGS__)

// This is a convenience wrapper for calling TEST_DECODE_WIRE_BODY that simply
// executes the code in a test.
// |_testname| is the name of the test (prepended by Parse in the output)
// |_iface| is the interface method name on examples::FidlCodecTestInterface
//    (TODO: generalize which interface to use)
// |_json_value| is the expected JSON representation of the message.
// |_pretty_print| is the expected pretty print of the message.
// The remaining parameters are the parameters to |_iface| to generate the
// message.
#define TEST_DECODE_WIRE(_testname, _iface, _json_value, _pretty_print, ...) \
  TEST_F(WireParserTest, Parse##_testname) {                                 \
    TEST_DECODE_WIRE_BODY(_iface, _json_value, _pretty_print, __VA_ARGS__);  \
  }

#define TEST_DECODE_WIRE_PATCHED(_testname, _iface, patched_offset, patched_value, _json_value, \
                                 _pretty_print, ...)                                            \
  TEST_F(WireParserTest, Parse##_testname) {                                                    \
    TEST_DECODE_WIRE_BODY_COMMON(_iface, patched_offset, patched_value, _json_value,            \
                                 _pretty_print, -1, __VA_ARGS__);                               \
  }

// Scalar Tests

namespace {

template <class T>
std::string ValueToJson(const std::string& key, T value) {
  return "\"" + key + "\":\"" + std::to_string(value) + "\"";
}

template <>
std::string ValueToJson(const std::string& key, bool value) {
  return "\"" + key + "\":\"" + (value ? "true" : "false") + "\"";
}

template <>
std::string ValueToJson(const std::string& key, const char* value) {
  return "\"" + key + "\":\"" + value + "\"";
}

template <>
std::string ValueToJson(const std::string& key, std::string value) {
  return "\"" + key + "\":\"" + value + "\"";
}

template <class T>
std::string SingleToJson(const std::string& key, T value) {
  return "{ " + ValueToJson(key, value) + " }";
}

template <class T>
std::string ValueToPretty(const std::string& key, const std::string& type, T value) {
  return key + ": #gre#" + type + "#rst# = #blu#" + std::to_string(value) + "#rst#";
}

template <>
std::string ValueToPretty(const std::string& key, const std::string& type, bool value) {
  return key + ": #gre#" + type + "#rst# = #blu#" + (value ? "true" : "false") + "#rst#";
}

template <>
std::string ValueToPretty(const std::string& key, const std::string& type, const char* value) {
  return key + ": #gre#" + type + "#rst# = #red#\"" + value + "\"#rst#";
}

template <>
std::string ValueToPretty(const std::string& key, const std::string& type, std::string value) {
  return key + ": #gre#" + type + "#rst# = #red#\"" + value + "\"#rst#";
}

std::string HandleToJson(const std::string& key, zx_handle_t value) {
  std::stringstream ss;
  ss << std::hex << std::setfill('0') << std::setw(kUint32Precision) << value << std::dec
     << std::setw(0);
  return "\"" + key + "\":\"ZX_OBJ_TYPE_CHANNEL:" + ss.str() +
         "(ZX_RIGHT_TRANSFER | ZX_RIGHT_READ | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL | " +
         "ZX_RIGHT_SIGNAL_PEER | ZX_RIGHT_WAIT | ZX_RIGHT_INSPECT)\"";
}

std::string HandleToPretty(const std::string& key, zx_handle_t value) {
  std::stringstream ss;
  ss << std::hex << std::setfill('0') << std::setw(kUint32Precision) << value << std::dec
     << std::setw(0);
  return key + ": #gre#handle#rst# = #red#ZX_OBJ_TYPE_CHANNEL:" + ss.str() + "#blu#" +
         "(ZX_RIGHT_TRANSFER | ZX_RIGHT_READ | ZX_RIGHT_WRITE | ZX_RIGHT_SIGNAL | " +
         "ZX_RIGHT_SIGNAL_PEER | ZX_RIGHT_WAIT | ZX_RIGHT_INSPECT)" + "#rst#";
}

template <class T>
std::string SingleToPretty(const std::string& key, const std::string& type, T value) {
  return "{ " + ValueToPretty(key, type, value) + " }";
}

}  // namespace

#define TEST_SINGLE(_testname, _iface, _key, _type, _value)        \
  TEST_DECODE_WIRE(_testname, _iface, SingleToJson(#_key, _value), \
                   SingleToPretty(#_key, #_type, _value), _value)

TEST_DECODE_WIRE(Empty, Empty, "{}", "{}")

TEST_SINGLE(String, String, s, string, "Hello World!")

TEST_DECODE_WIRE_PATCHED(StringBadSize, String, 16, 100, "{\"s\":\"(invalid)\"}",
                         "{ s: #gre#string#rst# = #red#invalid#rst# }", "Hello World!")

TEST_DECODE_WIRE_PATCHED(StringHugeSize, String, 16, ULLONG_MAX, "{\"s\":\"(invalid)\"}",
                         "{ s: #gre#string#rst# = #red#invalid#rst# }", "Hello World!")

TEST_SINGLE(BoolTrue, Bool, b, bool, true)
TEST_SINGLE(BoolFalse, Bool, b, bool, false)

TEST_SINGLE(Int8Min, Int8, i8, int8, std::numeric_limits<int8_t>::min())
TEST_SINGLE(Int16Min, Int16, i16, int16, std::numeric_limits<int16_t>::min())
TEST_SINGLE(Int32Min, Int32, i32, int32, std::numeric_limits<int32_t>::min())
TEST_SINGLE(Int64Min, Int64, i64, int64, std::numeric_limits<int64_t>::min())
TEST_SINGLE(Int8Max, Int8, i8, int8, std::numeric_limits<int8_t>::max())
TEST_SINGLE(Int16Max, Int16, i16, int16, std::numeric_limits<int16_t>::max())
TEST_SINGLE(Int32Max, Int32, i32, int32, std::numeric_limits<int32_t>::max())
TEST_SINGLE(Int64Max, Int64, i64, int64, std::numeric_limits<int64_t>::max())

TEST_SINGLE(Uint8Min, Uint8, ui8, uint8, std::numeric_limits<uint8_t>::min())
TEST_SINGLE(Uint16Min, Uint16, ui16, uint16, std::numeric_limits<uint16_t>::min())
TEST_SINGLE(Uint32Min, Uint32, ui32, uint32, std::numeric_limits<uint32_t>::min())
TEST_SINGLE(Uint64Min, Uint64, ui64, uint64, std::numeric_limits<uint64_t>::min())
TEST_SINGLE(Uint8Max, Uint8, ui8, uint8, std::numeric_limits<uint8_t>::max())
TEST_SINGLE(Uint16Max, Uint16, ui16, uint16, std::numeric_limits<uint16_t>::max())
TEST_SINGLE(Uint32Max, Uint32, ui32, uint32, std::numeric_limits<uint32_t>::max())
TEST_SINGLE(Uint64Max, Uint64, ui64, uint64, std::numeric_limits<uint64_t>::max())

TEST_SINGLE(Float32, Float32, f32, float32, kFloatValue)
TEST_SINGLE(Float64, Float64, f64, float64, kDoubleValue)

TEST_DECODE_WIRE(TwoTuple, Complex, R"({"real":"1", "imaginary":"2"})",
                 "{ " + ValueToPretty("real", "int32", 1) + ", " +
                     ValueToPretty("imaginary", "int32", 2) + " }",
                 1, 2);

TEST_DECODE_WIRE(StringInt, StringInt, R"({"s":"groucho", "i32":"4"})",
                 "{ " + ValueToPretty("s", "string", "groucho") + ", " +
                     ValueToPretty("i32", "int32", 4) + " }",
                 "groucho", 4)

// Vector / Array Tests

namespace {
std::array<int32_t, 1> one_param_array = {1};
std::array<int32_t, 2> two_param_array = {1, 2};

std::vector<int32_t> one_param_vector = {1};
std::vector<int32_t> two_param_vector = {1, 2};

}  // namespace

TEST_DECODE_WIRE(Array1, Array1, R"({"b_1":["1"]})",
                 "{ b_1: #gre#array<int32>#rst# = [ #blu#1#rst# ] }", one_param_array);

TEST_DECODE_WIRE(Array2, Array2, R"({"b_2":["1", "2"]})",
                 "{ b_2: #gre#array<int32>#rst# = [ #blu#1#rst#, #blu#2#rst# ] }", two_param_array);

TEST_DECODE_WIRE(NullVector, Vector, R"({"v_1": null})",
                 "{ v_1: #gre#vector<int32>#rst# = #red#null#rst# }", nullptr)

TEST_DECODE_WIRE(VectorOneElt, Vector, R"({"v_1":["1"]})",
                 "{ v_1: #gre#vector<int32>#rst# = [ #blu#1#rst# ] }", one_param_vector);

TEST_DECODE_WIRE(VectorTwoElt, Vector, R"({"v_1":["1", "2"]})",
                 "{ v_1: #gre#vector<int32>#rst# = [ #blu#1#rst#, #blu#2#rst# ] }",
                 two_param_vector);

std::array<std::string, 2> TwoStringArrayFromVals(const std::string& v1, const std::string& v2) {
  std::array<std::string, 2> brother_array;
  brother_array[0] = v1;
  brother_array[1] = v2;
  return brother_array;
}

TEST_DECODE_WIRE(TwoStringArrayInt, TwoStringArrayInt, R"({"arr":["harpo","chico"], "i32":"1"})",
                 R"({ arr: #gre#array<string>#rst# = [ #red#"harpo"#rst#, #red#"chico"#rst# ], )" +
                     ValueToPretty("i32", "int32", 1) + " }",
                 TwoStringArrayFromVals("harpo", "chico"), 1)

namespace {

std::vector<std::string> TwoStringVectorFromVals(const std::string& v1, const std::string& v2) {
  return std::vector<std::string>({v1, v2});
}

std::vector<uint8_t> VectorUint8() {
  const int kItemCount = 40;
  std::vector<std::uint8_t> result;
  for (int i = 0; i <= kItemCount; ++i) {
    result.push_back(i);
  }
  return result;
}

std::vector<uint8_t> VectorUint8(const char* text) {
  std::vector<std::uint8_t> result;
  while (*text != 0) {
    result.push_back(*text++);
  }
  return result;
}

std::vector<uint32_t> VectorUint32() {
  const int kItemCount = 25;
  std::vector<std::uint32_t> result;
  for (int i = 0; i <= kItemCount; ++i) {
    const int kShift = 16;
    result.push_back(i + ((i & 1) << kShift));
  }
  return result;
}

}  // namespace

TEST_DECODE_WIRE(TwoStringVectorInt, TwoStringVectorInt, R"({"vec":["harpo", "chico"], "i32":"1"})",
                 R"({ vec: #gre#vector<string>#rst# = [ #red#"harpo"#rst#, #red#"chico"#rst# ], )" +
                     ValueToPretty("i32", "int32", 1) + " }",
                 TwoStringVectorFromVals("harpo", "chico"), 1)

TEST_DECODE_WIRE(TwoStringVectors, TwoStringVectors,
                 R"({"v_1":["harpo","chico"],"v_2":["groucho","zeppo"]})",
                 "{\n  v_1: #gre#vector<string>#rst# = "
                 R"([ #red#"harpo"#rst#, #red#"chico"#rst# ])"
                 "\n  v_2: #gre#vector<string>#rst# = "
                 R"([ #red#"groucho"#rst#, #red#"zeppo"#rst# ])"
                 "\n}",
                 TwoStringVectorFromVals("harpo", "chico"),
                 TwoStringVectorFromVals("groucho", "zeppo"))

TEST_DECODE_WIRE(
    VectorUint8, VectorUint8,
    R"({"v":["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40"]})",
    "{\n"
    "  v: #gre#vector<uint8>#rst# = [\n"
    "    #blu#0#rst#, #blu#1#rst#, #blu#2#rst#, #blu#3#rst#, #blu#4#rst#, #blu#5#rst#, "
    "#blu#6#rst#, #blu#7#rst#, #blu#8#rst#, #blu#9#rst#, #blu#10#rst#, #blu#11#rst#, #blu#12#rst#, "
    "#blu#13#rst#, #blu#14#rst#, #blu#15#rst#, #blu#16#rst#, #blu#17#rst#, #blu#18#rst#, "
    "#blu#19#rst#, #blu#20#rst#\n"
    "    #blu#21#rst#, #blu#22#rst#, #blu#23#rst#, #blu#24#rst#, #blu#25#rst#, #blu#26#rst#, "
    "#blu#27#rst#, #blu#28#rst#, #blu#29#rst#, #blu#30#rst#, #blu#31#rst#, #blu#32#rst#, "
    "#blu#33#rst#, #blu#34#rst#, #blu#35#rst#, #blu#36#rst#, #blu#37#rst#, #blu#38#rst#, "
    "#blu#39#rst#\n"
    "    #blu#40#rst#\n"
    "  ]\n"
    "}",
    VectorUint8())

TEST_DECODE_WIRE(
    VectorUint8String, VectorUint8,
    R"({"v":["72","101","108","108","111","32","116","101","115","116","105","110","103","32","119","111","114","108","100","33"]})",
    "{ v: #gre#vector<uint8>#rst# = \"Hello testing world!\" }",
    VectorUint8("Hello testing world!"))

TEST_DECODE_WIRE(
    VectorUint8MultilineString, VectorUint8,
    R"({"v":["72","101","108","108","111","32","116","101","115","116","105","110","103","32","119","111","114","108","100","33","10","72","111","119","32","97","114","101","32","121","111","117","32","116","111","100","97","121", "63","10","73","39","109","32","116","101","115","116","105","110","103","32","102","105","100","108","95","99","111","100","101","99","46"]})",
    "{\n"
    "  v: #gre#vector<uint8>#rst# = [\n"
    "    Hello testing world!\n"
    "    How are you today?\n"
    "    I'm testing fidl_codec.\n"
    "  ]\n"
    "}",
    VectorUint8("Hello testing world!\nHow are you today?\nI'm testing fidl_codec."))

TEST_DECODE_WIRE(
    VectorUint32, VectorUint32,
    R"({"v":["0","65537","2","65539","4","65541","6","65543","8","65545","10","65547","12","65549","14","65551","16","65553","18","65555","20","65557","22","65559","24","65561"]})",
    "{\n"
    "  v: #gre#vector<uint32>#rst# = [\n"
    "    #blu#0#rst#, #blu#65537#rst#, #blu#2#rst#, #blu#65539#rst#, #blu#4#rst#, #blu#65541#rst#, "
    "#blu#6#rst#, #blu#65543#rst#, #blu#8#rst#, #blu#65545#rst#, #blu#10#rst#, #blu#65547#rst#, "
    "#blu#12#rst#, #blu#65549#rst#, #blu#14#rst#\n"
    "    #blu#65551#rst#, #blu#16#rst#, #blu#65553#rst#, #blu#18#rst#, #blu#65555#rst#, "
    "#blu#20#rst#, #blu#65557#rst#, #blu#22#rst#, #blu#65559#rst#, #blu#24#rst#, #blu#65561#rst#\n"
    "  ]\n"
    "}",
    VectorUint32())

TEST_DECODE_WIRE_PATCHED(
    VectorUint32BadSize, VectorUint32, 16, 100000,
    R"({"v":["0","65537","2","65539","4","65541","6","65543","8","65545","10","65547","12","65549","14","65551","16","65553","18","65555","20","65557","22","65559","24","65561"]})",
    "{\n"
    "  v: #gre#vector<uint32>#rst# = [\n"
    "    #blu#0#rst#, #blu#65537#rst#, #blu#2#rst#, #blu#65539#rst#, #blu#4#rst#, #blu#65541#rst#, "
    "#blu#6#rst#, #blu#65543#rst#, #blu#8#rst#, #blu#65545#rst#, #blu#10#rst#, #blu#65547#rst#, "
    "#blu#12#rst#, #blu#65549#rst#, #blu#14#rst#\n"
    "    #blu#65551#rst#, #blu#16#rst#, #blu#65553#rst#, #blu#18#rst#, #blu#65555#rst#, "
    "#blu#20#rst#, #blu#65557#rst#, #blu#22#rst#, #blu#65559#rst#, #blu#24#rst#, #blu#65561#rst#\n"
    "  ]\n"
    "}",
    VectorUint32())

// Struct Tests

namespace {

class StructSupport {
 public:
  StructSupport() {
    pt.s = "Hello";
    pt.b = true;
    pt.i8 = std::numeric_limits<int8_t>::min();
    pt.i16 = std::numeric_limits<int16_t>::min();
    pt.i32 = std::numeric_limits<int32_t>::min();
    pt.i64 = std::numeric_limits<int64_t>::min();
    pt.u8 = std::numeric_limits<uint8_t>::max();
    pt.u16 = std::numeric_limits<uint16_t>::max();
    pt.u32 = std::numeric_limits<uint32_t>::max();
    pt.u64 = std::numeric_limits<uint64_t>::max();
    pt.f32 = kFloatValue;
    pt.f64 = kDoubleValue;
  }

  std::string GetJson() {
    std::ostringstream es;
    es << R"({"p":{)" << ValueToJson("s", pt.s) << "," << ValueToJson("b", pt.b) << ","
       << ValueToJson("i8", pt.i8) << "," << ValueToJson("i16", pt.i16) << ","
       << ValueToJson("i32", pt.i32) << "," << ValueToJson("i64", pt.i64) << ","
       << ValueToJson("u8", pt.u8) << "," << ValueToJson("u16", pt.u16) << ","
       << ValueToJson("u32", pt.u32) << "," << ValueToJson("u64", pt.u64) << ","
       << ValueToJson("f32", pt.f32) << "," << ValueToJson("f64", pt.f64) << "}}";
    return es.str();
  }
  std::string GetPretty() {
    std::ostringstream es;
    es << "{\n"
       << "  p: #gre#test.fidlcodec.examples/PrimitiveTypes#rst# = {\n"
       << "    " << ValueToPretty("s", "string", pt.s) << "\n"
       << "    " << ValueToPretty("b", "bool", pt.b) << "\n"
       << "    " << ValueToPretty("i8", "int8", pt.i8) << "\n"
       << "    " << ValueToPretty("i16", "int16", pt.i16) << "\n"
       << "    " << ValueToPretty("i32", "int32", pt.i32) << "\n"
       << "    " << ValueToPretty("i64", "int64", pt.i64) << "\n"
       << "    " << ValueToPretty("u8", "uint8", pt.u8) << "\n"
       << "    " << ValueToPretty("u16", "uint16", pt.u16) << "\n"
       << "    " << ValueToPretty("u32", "uint32", pt.u32) << "\n"
       << "    " << ValueToPretty("u64", "uint64", pt.u64) << "\n"
       << "    " << ValueToPretty("f32", "float32", pt.f32) << "\n"
       << "    " << ValueToPretty("f64", "float64", pt.f64) << "\n"
       << "  }\n"
       << "}";
    return es.str();
  }

  test::fidlcodec::examples::PrimitiveTypes pt;
};

}  // namespace

TEST_F(WireParserTest, ParseStruct) {
  StructSupport sd;
  TEST_DECODE_WIRE_BODY(Struct, sd.GetJson(), sd.GetPretty(), sd.pt);
}

TEST_F(WireParserTest, BadBoolStruct) {
  test::fidlcodec::examples::BoolStructType s;
  TEST_DECODE_WIRE_BODY_BAD(BoolStruct, "{\"s\":{\"b\":\"(invalid)\"}}",
                            "{ s: #gre#test.fidlcodec.examples/BoolStructType#rst# = "
                            "{ b: #gre#bool#rst# = #red#invalid#rst# } }",
                            16, s);
}

TEST_DECODE_WIRE(NullableStruct, NullableStruct, R"({"p":null})",
                 "{ p: #gre#test.fidlcodec.examples/PrimitiveTypes#rst# = #red#null#rst# }",
                 nullptr);

TEST_DECODE_WIRE(NullableStructAndInt, NullableStructAndInt, R"({"p":null, "i":"1"})",
                 "{ p: #gre#test.fidlcodec.examples/PrimitiveTypes#rst# = "
                 "#red#null#rst#, i: #gre#int32#rst# = #blu#1#rst# }",
                 nullptr, 1);

namespace {

std::array<std::unique_ptr<test::fidlcodec::examples::TwoStringStruct>, 3> GetArrayNullableStruct(
    const std::string& v1, const std::string& v2, const std::string& v3, const std::string& v4) {
  std::array<std::unique_ptr<test::fidlcodec::examples::TwoStringStruct>, 3> a;
  a[0] = std::make_unique<test::fidlcodec::examples::TwoStringStruct>();
  a[0]->value1 = v1;
  a[0]->value2 = v2;
  a[1] = nullptr;
  a[2] = std::make_unique<test::fidlcodec::examples::TwoStringStruct>();
  a[2]->value1 = v3;
  a[2]->value2 = v4;
  return a;
}

}  // namespace

TEST_DECODE_WIRE(
    ArrayNullableStruct, ArrayNullableStruct,
    R"({"a":[{"value1":"harpo","value2":"chico"},null,{"value1":"groucho","value2":"zeppo"}]})",
    "{\n"
    "  a: #gre#array<test.fidlcodec.examples/TwoStringStruct>#rst# = [\n"
    "    { value1: #gre#string#rst# = #red#\"harpo\"#rst#, "
    "value2: #gre#string#rst# = #red#\"chico\"#rst# }, #red#null#rst#\n"
    "    { value1: #gre#string#rst# = #red#\"groucho\"#rst#, "
    "value2: #gre#string#rst# = #red#\"zeppo\"#rst# }\n"
    "  ]\n"
    "}",
    GetArrayNullableStruct("harpo", "chico", "groucho", "zeppo"))

namespace {

test::fidlcodec::examples::SmallStruct SmallStructFromVals(uint8_t a, uint8_t b, uint8_t c) {
  test::fidlcodec::examples::SmallStruct ss;
  ss.a = a;
  ss.b = b;
  ss.c = c;
  return ss;
}

}  // namespace

TEST_DECODE_WIRE(SmallStruct, SmallStructAfterByte,
                 R"({"u":"1","s1":{"a":"2","b":"3","c":"4"},"s2":{"a":"5","b":"6","c":"7"}})",
                 "{\n"
                 "  u: #gre#uint8#rst# = #blu#1#rst#\n"
                 "  s1: #gre#test.fidlcodec.examples/SmallStruct#rst# = {\n"
                 "    a: #gre#uint8#rst# = #blu#2#rst#\n"
                 "    b: #gre#uint8#rst# = #blu#3#rst#\n"
                 "    c: #gre#uint8#rst# = #blu#4#rst#\n"
                 "  }\n"
                 "  s2: #gre#test.fidlcodec.examples/SmallStruct#rst# = {\n"
                 "    a: #gre#uint8#rst# = #blu#5#rst#\n"
                 "    b: #gre#uint8#rst# = #blu#6#rst#\n"
                 "    c: #gre#uint8#rst# = #blu#7#rst#\n"
                 "  }\n"
                 "}",
                 1, SmallStructFromVals(2, 3, 4), SmallStructFromVals(5, 6, 7));

namespace {

test::fidlcodec::examples::TwoStringStruct TwoStringStructFromVals(const std::string& v1,
                                                                   const std::string& v2) {
  test::fidlcodec::examples::TwoStringStruct tss;
  tss.value1 = v1;
  tss.value2 = v2;
  return tss;
}

std::unique_ptr<test::fidlcodec::examples::TwoStringStruct> TwoStringStructFromValsPtr(
    const std::string& v1, const std::string& v2) {
  std::unique_ptr<test::fidlcodec::examples::TwoStringStruct> ptr(
      new test::fidlcodec::examples::TwoStringStruct());
  ptr->value1 = v1;
  ptr->value2 = v2;
  return ptr;
}

std::string TwoStringStructIntPretty(const char* s1, const char* s2, int v) {
  std::string result = "{\n  s: #gre#test.fidlcodec.examples/TwoStringStruct#rst# = {\n";
  result += "    " + ValueToPretty("value1", "string", s1) + "\n";
  result += "    " + ValueToPretty("value2", "string", s2) + "\n";
  result += "  }\n";
  result += "  " + ValueToPretty("i32", "int32", v) + "\n";
  result += "}";
  return result;
}

}  // namespace

TEST_DECODE_WIRE(TwoStringStructInt, TwoStringStructInt,
                 R"({"s":{"value1":"harpo", "value2":"chico"}, "i32":"1"})",
                 TwoStringStructIntPretty("harpo", "chico", 1),
                 TwoStringStructFromVals("harpo", "chico"), 1)

TEST_DECODE_WIRE(TwoStringNullableStructInt, TwoStringNullableStructInt,
                 R"({"s":{"value1":"harpo", "value2":"chico"}, "i32":"1"})",
                 TwoStringStructIntPretty("harpo", "chico", 1),
                 TwoStringStructFromValsPtr("harpo", "chico"), 1)

TEST_DECODE_WIRE(VectorStruct, VectorStruct,
                 R"({"v":[{"a":"1","b":"2","c":"3"},{"a":"2","b":"4","c":"6"},)"
                 R"({"a":"3","b":"6","c":"9"}]})",
                 "{\n"
                 "  v: #gre#vector<test.fidlcodec.examples/SmallStruct>#rst# = [\n"
                 "    { a: #gre#uint8#rst# = #blu#1#rst#, b: #gre#uint8#rst# = #blu#2#rst#, c: "
                 "#gre#uint8#rst# = #blu#3#rst# }\n"
                 "    { a: #gre#uint8#rst# = #blu#2#rst#, b: #gre#uint8#rst# = #blu#4#rst#, c: "
                 "#gre#uint8#rst# = #blu#6#rst# }\n"
                 "    { a: #gre#uint8#rst# = #blu#3#rst#, b: #gre#uint8#rst# = #blu#6#rst#, c: "
                 "#gre#uint8#rst# = #blu#9#rst# }\n"
                 "  ]\n"
                 "}",
                 std::vector{SmallStructFromVals(1, 2, 3), SmallStructFromVals(2, 4, 6),
                             SmallStructFromVals(3, 6, 9)})

TEST_DECODE_WIRE(ArrayStruct, ArrayStruct,
                 R"({"a":[{"a":"1","b":"2","c":"3"},{"a":"2","b":"4","c":"6"},)"
                 R"({"a":"3","b":"6","c":"9"}]})",
                 "{\n"
                 "  a: #gre#array<test.fidlcodec.examples/SmallStruct>#rst# = [\n"
                 "    { a: #gre#uint8#rst# = #blu#1#rst#, b: #gre#uint8#rst# = #blu#2#rst#, c: "
                 "#gre#uint8#rst# = #blu#3#rst# }\n"
                 "    { a: #gre#uint8#rst# = #blu#2#rst#, b: #gre#uint8#rst# = #blu#4#rst#, c: "
                 "#gre#uint8#rst# = #blu#6#rst# }\n"
                 "    { a: #gre#uint8#rst# = #blu#3#rst#, b: #gre#uint8#rst# = #blu#6#rst#, c: "
                 "#gre#uint8#rst# = #blu#9#rst# }\n"
                 "  ]\n"
                 "}",
                 std::array{SmallStructFromVals(1, 2, 3), SmallStructFromVals(2, 4, 6),
                            SmallStructFromVals(3, 6, 9)})

namespace {

test::fidlcodec::examples::SmallUnevenStruct SmallUnevenStructFromVals(uint8_t a, uint8_t b) {
  test::fidlcodec::examples::SmallUnevenStruct ss;
  ss.a = a;
  ss.b = b;
  return ss;
}

}  // namespace

TEST_DECODE_WIRE(VectorStruct2, VectorStruct2,
                 R"({"v":[{"a":"1","b":"2"},{"a":"2","b":"4"},{"a":"3","b":"6"}]})",
                 "{\n"
                 "  v: #gre#vector<test.fidlcodec.examples/SmallUnevenStruct>#rst# = [\n"
                 "    { a: #gre#uint32#rst# = #blu#1#rst#, b: #gre#uint8#rst# = #blu#2#rst# },"
                 " { a: #gre#uint32#rst# = #blu#2#rst#, b: #gre#uint8#rst# = #blu#4#rst# }\n"
                 "    { a: #gre#uint32#rst# = #blu#3#rst#, b: #gre#uint8#rst# = #blu#6#rst# }\n"
                 "  ]\n"
                 "}",
                 std::vector{SmallUnevenStructFromVals(1, 2), SmallUnevenStructFromVals(2, 4),
                             SmallUnevenStructFromVals(3, 6)})

TEST_DECODE_WIRE(ArrayStruct2, ArrayStruct2,
                 R"({"a":[{"a":"1","b":"2"},{"a":"2","b":"4"},{"a":"3","b":"6"}]})",
                 "{\n"
                 "  a: #gre#array<test.fidlcodec.examples/SmallUnevenStruct>#rst# = [\n"
                 "    { a: #gre#uint32#rst# = #blu#1#rst#, b: #gre#uint8#rst# = #blu#2#rst# },"
                 " { a: #gre#uint32#rst# = #blu#2#rst#, b: #gre#uint8#rst# = #blu#4#rst# }\n"
                 "    { a: #gre#uint32#rst# = #blu#3#rst#, b: #gre#uint8#rst# = #blu#6#rst# }\n"
                 "  ]\n"
                 "}",
                 std::array{SmallUnevenStructFromVals(1, 2), SmallUnevenStructFromVals(2, 4),
                            SmallUnevenStructFromVals(3, 6)})

// Union and XUnion tests

namespace {

using isu = test::fidlcodec::examples::IntStructUnion;
using xisu = test::fidlcodec::examples::IntStructXunion;
using u8u16struct = test::fidlcodec::examples::U8U16UnionStructType;

template <class T>
T GetIntUnion(int32_t i) {
  T u;
  u.set_variant_i(i);
  return u;
}

template <class T>
T GetStructUnion(const std::string& v1, const std::string& v2) {
  T u;
  test::fidlcodec::examples::TwoStringStruct tss = TwoStringStructFromVals(v1, v2);
  u.set_variant_tss(tss);
  return u;
}

template <class T>
std::unique_ptr<T> GetIntUnionPtr(int32_t i) {
  std::unique_ptr<T> ptr(new T());
  ptr->set_variant_i(i);
  return ptr;
}

template <class T>
std::unique_ptr<T> GetStructUnionPtr(const std::string& v1, const std::string& v2) {
  std::unique_ptr<T> ptr(new T());
  test::fidlcodec::examples::TwoStringStruct tss = TwoStringStructFromVals(v1, v2);
  ptr->set_variant_tss(tss);
  return ptr;
}

u8u16struct GetU8U16UnionStruct(int8_t i) {
  u8u16struct s;
  s.u.set_variant_u8(i);
  return s;
}

std::string IntUnionIntPretty(const std::string& name, int u, int v) {
  std::string result = "{\n";
  result += "  isu: #gre#test.fidlcodec.examples/" + name + "#rst# = { " +
            ValueToPretty("variant_i", "int32", u) + " }\n";
  result += "  " + ValueToPretty("i", "int32", v) + "\n";
  result += "}";
  return result;
}

std::string StructUnionIntPretty(const std::string& name, const char* u1, const char* u2, int v) {
  std::string result = "{\n";
  result += "  isu: #gre#test.fidlcodec.examples/" + name + "#rst# = {\n";
  result +=
      "    variant_tss: #gre#test.fidlcodec.examples/TwoStringStruct#rst# = "
      "{\n";
  result += "      " + ValueToPretty("value1", "string", u1) + "\n";
  result += "      " + ValueToPretty("value2", "string", u2) + "\n";
  result += "    }\n";
  result += "  }\n";
  result += "  " + ValueToPretty("i", "int32", v) + "\n";
  result += "}";
  return result;
}

std::string IntIntUnionPretty(const std::string& name, int v, int u) {
  std::string result = "{\n";
  result += "  " + ValueToPretty("i", "int32", v) + "\n";
  result += "  isu: #gre#test.fidlcodec.examples/" + name + "#rst# = { " +
            ValueToPretty("variant_i", "int32", u) + " }\n";
  result += "}";
  return result;
}

std::string IntStructUnionPretty(const std::string& name, int v, const char* u1, const char* u2) {
  std::string result = "{\n";
  result += "  " + ValueToPretty("i", "int32", v) + "\n";
  result += "  isu: #gre#test.fidlcodec.examples/" + name + "#rst# = {\n";
  result +=
      "    variant_tss: #gre#test.fidlcodec.examples/TwoStringStruct#rst# = "
      "{\n";
  result += "      " + ValueToPretty("value1", "string", u1) + "\n";
  result += "      " + ValueToPretty("value2", "string", u2) + "\n";
  result += "    }\n";
  result += "  }\n";
  result += "}";
  return result;
}

}  // namespace

TEST_DECODE_WIRE(UnionInt, Union, R"({"isu":{"variant_i":"42"}, "i" : "1"})",
                 IntUnionIntPretty("IntStructUnion", 42, 1), GetIntUnion<isu>(42), 1);

TEST_DECODE_WIRE(UnionStruct, Union,
                 R"({"isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}, "i":"1"})",
                 StructUnionIntPretty("IntStructUnion", "harpo", "chico", 1),
                 GetStructUnion<isu>("harpo", "chico"), 1);

TEST_DECODE_WIRE(NullableUnionInt, NullableUnion, R"({"isu":{"variant_i":"42"}, "i" : "1"})",
                 IntUnionIntPretty("IntStructUnion", 42, 1), GetIntUnionPtr<isu>(42), 1);

TEST_DECODE_WIRE(NullableUnionStruct, NullableUnion,
                 R"({"isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}, "i":"1"})",
                 StructUnionIntPretty("IntStructUnion", "harpo", "chico", 1),
                 GetStructUnionPtr<isu>("harpo", "chico"), 1);

TEST_DECODE_WIRE(NullableUnionIntFirstInt, NullableUnionIntFirst,
                 R"({"i" : "1", "isu":{"variant_i":"42"}})",
                 IntIntUnionPretty("IntStructUnion", 1, 42), 1, GetIntUnionPtr<isu>(42));

TEST_DECODE_WIRE(NullableUnionIntFirstStruct, NullableUnionIntFirst,
                 R"({"i": "1", "isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}})",
                 IntStructUnionPretty("IntStructUnion", 1, "harpo", "chico"), 1,
                 GetStructUnionPtr<isu>("harpo", "chico"));

TEST_DECODE_WIRE(XUnionInt, XUnion, R"({"isu":{"variant_i":"42"}, "i" : "1"})",
                 IntUnionIntPretty("IntStructXunion", 42, 1), GetIntUnion<xisu>(42), 1);

TEST_DECODE_WIRE(XUnionStruct, XUnion,
                 R"({"isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}, "i":"1"})",
                 StructUnionIntPretty("IntStructXunion", "harpo", "chico", 1),
                 GetStructUnion<xisu>("harpo", "chico"), 1);

TEST_DECODE_WIRE(NullableXUnionInt, NullableXUnion, R"({"isu":{"variant_i":"42"}, "i" : "1"})",
                 IntUnionIntPretty("IntStructXunion", 42, 1), GetIntUnionPtr<xisu>(42), 1);

TEST_DECODE_WIRE(NullableXUnionStruct, NullableXUnion,
                 R"({"isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}, "i":"1"})",
                 StructUnionIntPretty("IntStructXunion", "harpo", "chico", 1),
                 GetStructUnionPtr<xisu>("harpo", "chico"), 1);

TEST_DECODE_WIRE(NullableXUnionIntFirstInt, NullableXUnionIntFirst,
                 R"({"i" : "1", "isu":{"variant_i":"42"}})",
                 IntIntUnionPretty("IntStructXunion", 1, 42), 1, GetIntUnionPtr<xisu>(42));

TEST_DECODE_WIRE(NullableXUnionIntFirstStruct, NullableXUnionIntFirst,
                 R"({"i": "1", "isu":{"variant_tss":{"value1":"harpo","value2":"chico"}}})",
                 IntStructUnionPretty("IntStructXunion", 1, "harpo", "chico"), 1,
                 GetStructUnionPtr<xisu>("harpo", "chico"));

namespace {

std::array<std::unique_ptr<test::fidlcodec::examples::IntStructUnion>, 3> GetArrayNullableUnion(
    int32_t i, const std::string& v1, const std::string& v2) {
  std::array<std::unique_ptr<test::fidlcodec::examples::IntStructUnion>, 3> a;
  a[0] = std::make_unique<test::fidlcodec::examples::IntStructUnion>();
  a[0]->set_variant_i(i);
  test::fidlcodec::examples::TwoStringStruct tss = TwoStringStructFromVals(v1, v2);
  a[2] = std::make_unique<test::fidlcodec::examples::IntStructUnion>();
  a[2]->set_variant_tss(tss);
  return a;
}

}  // namespace

TEST_DECODE_WIRE(
    ArrayNullableUnion, ArrayNullableUnion,
    R"({"a":[{"variant_i":"1234"},null,{"variant_tss":{"value1":"harpo","value2":"chico"}}]})",
    "{\n"
    "  a: #gre#array<test.fidlcodec.examples/IntStructUnion>#rst# = [\n"
    "    { variant_i: #gre#int32#rst# = #blu#1234#rst# }, #red#null#rst#\n"
    "    {\n"
    "      variant_tss: #gre#test.fidlcodec.examples/TwoStringStruct#rst# = {\n"
    "        value1: #gre#string#rst# = #red#\"harpo\"#rst#\n"
    "        value2: #gre#string#rst# = #red#\"chico\"#rst#\n"
    "      }\n"
    "    }\n"
    "  ]\n"
    "}",
    GetArrayNullableUnion(1234, "harpo", "chico"))

TEST_F(WireParserTest, BadU8U16UnionStruct) {
  TEST_DECODE_WIRE_BODY_COMMON(U8U16UnionStruct, -1, 0,
                               "{\"s\":{\"u\":{\"variant_u8\":\"(invalid)\"}}}",
                               "{\n"
                               "  s: #gre#test.fidlcodec.examples/U8U16UnionStructType#rst# = {\n"
                               "    u: #gre#test.fidlcodec.examples/U8U16Union#rst# = "
                               "{ variant_u8: #gre#uint8#rst# = #red#invalid#rst# }\n"
                               "  }\n"
                               "}",
                               24, GetU8U16UnionStruct(12));
}

namespace {

using uuu = test::fidlcodec::examples::U8U16Union;
using uuur = test::fidlcodec::examples::U8U16UnionReserved;
using uux = test::fidlcodec::examples::U8U16Xunion;

template <class T>
T GetUInt8Union(uint8_t i) {
  T u;
  u.set_variant_u8(i);
  return u;
}

template <class T>
T GetUInt16Union(uint16_t i) {
  T u;
  u.set_variant_u16(i);
  return u;
}

std::string ShortUnionPretty(const std::string& name, const char* field, const char* type, int u,
                             int v) {
  std::string result = "{\n";
  result += "  u: #gre#test.fidlcodec.examples/" + name + "#rst# = { " +
            ValueToPretty(field, type, u) + " }\n";
  result += "  " + ValueToPretty("i", "int32", v) + "\n";
  result += "}";
  return result;
}

}  // namespace

TEST_DECODE_WIRE(ShortUnion8, ShortUnion, R"({"u":{"variant_u8":"16"}, "i":"1"})",
                 ShortUnionPretty("U8U16Union", "variant_u8", "uint8", 16, 1),
                 GetUInt8Union<uuu>(16), 1);

TEST_DECODE_WIRE(ShortUnion16, ShortUnion, R"({"u":{"variant_u16":"1024"}, "i":"1"})",
                 ShortUnionPretty("U8U16Union", "variant_u16", "uint16", 1024, 1),
                 GetUInt16Union<uuu>(1024), 1);

TEST_DECODE_WIRE(ShortUnionReserved8, ShortUnionReserved, R"({"u":{"variant_u8":"16"}, "i":"1"})",
                 ShortUnionPretty("U8U16UnionReserved", "variant_u8", "uint8", 16, 1),
                 GetUInt8Union<uuur>(16), 1);

TEST_DECODE_WIRE(ShortUnionReserved16, ShortUnionReserved,
                 R"({"u":{"variant_u16":"1024"}, "i":"1"})",
                 ShortUnionPretty("U8U16UnionReserved", "variant_u16", "uint16", 1024, 1),
                 GetUInt16Union<uuur>(1024), 1);

TEST_DECODE_WIRE(ShortXUnion8, ShortXUnion, R"({"u":{"variant_u8":"16"}, "i":"1"})",
                 ShortUnionPretty("U8U16Xunion", "variant_u8", "uint8", 16, 1),
                 GetUInt8Union<uux>(16), 1);

TEST_DECODE_WIRE(ShortXUnion16, ShortXUnion, R"({"u":{"variant_u16":"1024"}, "i":"1"})",
                 ShortUnionPretty("U8U16Xunion", "variant_u16", "uint16", 1024, 1),
                 GetUInt16Union<uux>(1024), 1);

// Enum Tests

TEST_DECODE_WIRE(DefaultEnum, DefaultEnumMessage, R"({"ev":"X"})",
                 "{ ev: #gre#test.fidlcodec.examples/DefaultEnum#rst# = #blu#X#rst# }",
                 test::fidlcodec::examples::DefaultEnum::X);
TEST_DECODE_WIRE(I8Enum, I8EnumMessage, R"({"ev":"X"})",
                 "{ ev: #gre#test.fidlcodec.examples/I8Enum#rst# = #blu#X#rst# }",
                 test::fidlcodec::examples::I8Enum::X);
TEST_DECODE_WIRE(I16Enum, I16EnumMessage, R"({"ev":"X"})",
                 "{ ev: #gre#test.fidlcodec.examples/I16Enum#rst# = #blu#X#rst# }",
                 test::fidlcodec::examples::I16Enum::X);
TEST_DECODE_WIRE(I32Enum, I32EnumMessage, R"({"ev":"X"})",
                 "{ ev: #gre#test.fidlcodec.examples/I32Enum#rst# = #blu#X#rst# }",
                 test::fidlcodec::examples::I32Enum::X);
TEST_DECODE_WIRE(I64Enum, I64EnumMessage, R"({"ev":"X"})",
                 "{ ev: #gre#test.fidlcodec.examples/I64Enum#rst# = #blu#X#rst# }",
                 test::fidlcodec::examples::I64Enum::X);

// Bits Tests

TEST_DECODE_WIRE(DefaultBits, DefaultBitsMessage, R"({"v":"A|C"})",
                 "{ v: #gre#test.fidlcodec.examples/DefaultBits#rst# = #blu#A|C#rst# }",
                 static_cast<test::fidlcodec::examples::DefaultBits>(
                     static_cast<uint8_t>(test::fidlcodec::examples::DefaultBits::A) |
                     static_cast<uint8_t>(test::fidlcodec::examples::DefaultBits::C)));
TEST_DECODE_WIRE(I8Bits, I8BitsMessage, R"({"v":"A|D"})",
                 "{ v: #gre#test.fidlcodec.examples/I8Bits#rst# = #blu#A|D#rst# }",
                 static_cast<test::fidlcodec::examples::I8Bits>(
                     static_cast<uint8_t>(test::fidlcodec::examples::I8Bits::A) |
                     static_cast<uint8_t>(test::fidlcodec::examples::I8Bits::D)));
TEST_DECODE_WIRE(I16Bits, I16BitsMessage, R"({"v":"B|C"})",
                 "{ v: #gre#test.fidlcodec.examples/I16Bits#rst# = #blu#B|C#rst# }",
                 static_cast<test::fidlcodec::examples::I16Bits>(
                     static_cast<uint16_t>(test::fidlcodec::examples::I16Bits::B) |
                     static_cast<uint16_t>(test::fidlcodec::examples::I16Bits::C)));
TEST_DECODE_WIRE(I32Bits, I32BitsMessage, R"({"v":"B|D"})",
                 "{ v: #gre#test.fidlcodec.examples/I32Bits#rst# = #blu#B|D#rst# }",
                 static_cast<test::fidlcodec::examples::I32Bits>(
                     static_cast<uint32_t>(test::fidlcodec::examples::I32Bits::B) |
                     static_cast<uint32_t>(test::fidlcodec::examples::I32Bits::D)));
TEST_DECODE_WIRE(I64Bits, I64BitsMessage, R"({"v":"C|D"})",
                 "{ v: #gre#test.fidlcodec.examples/I64Bits#rst# = #blu#C|D#rst# }",
                 static_cast<test::fidlcodec::examples::I64Bits>(
                     static_cast<uint64_t>(test::fidlcodec::examples::I64Bits::C) |
                     static_cast<uint64_t>(test::fidlcodec::examples::I64Bits::D)));
TEST_DECODE_WIRE(EmptyDefaultBits, DefaultBitsMessage, R"({"v":"<none>"})",
                 "{ v: #gre#test.fidlcodec.examples/DefaultBits#rst# = #blu#<none>#rst# }",
                 static_cast<test::fidlcodec::examples::DefaultBits>(0));

// Table Tests

test::fidlcodec::examples::ValueTable GetTable(std::optional<int16_t> first_int16,
                                               std::optional<std::string> value1,
                                               std::optional<std::string> value2,
                                               std::optional<int32_t> third_union_val) {
  test::fidlcodec::examples::ValueTable table;
  if (first_int16.has_value()) {
    table.set_first_int16(*first_int16);
  }
  if (value1.has_value()) {
    table.set_second_struct(TwoStringStructFromVals(*value1, *value2));
  }
  if (third_union_val.has_value()) {
    test::fidlcodec::examples::IntStructUnion u;
    u.set_variant_i(*third_union_val);
    table.set_third_union(std::move(u));
  }
  return table;
}

std::string TablePretty(std::optional<int16_t> first_int16, std::optional<std::string> value1,
                        std::optional<std::string> value2, std::optional<int32_t> third_union_val,
                        int i) {
  if (!first_int16.has_value() && !value1.has_value() && !third_union_val.has_value()) {
    std::string result = "{ table: #gre#test.fidlcodec.examples/ValueTable#rst# = {}, ";
    result += ValueToPretty("i", "int32", i);
    result += " }";
    return result;
  }
  std::string result = "{\n";
  if (!value1.has_value() && !third_union_val.has_value()) {
    result += "  table: #gre#test.fidlcodec.examples/ValueTable#rst# = { ";
    result += ValueToPretty("first_int16", "int16", *first_int16) + " }\n";
  } else {
    result += "  table: #gre#test.fidlcodec.examples/ValueTable#rst# = {\n";
    if (first_int16.has_value()) {
      result += "    " + ValueToPretty("first_int16", "int16", *first_int16) + "\n";
    }
    if (value1.has_value()) {
      result +=
          "    second_struct: "
          "#gre#test.fidlcodec.examples/TwoStringStruct#rst# = {\n";
      result += "      " + ValueToPretty("value1", "string", *value1) + "\n";
      result += "      " + ValueToPretty("value2", "string", *value2) + "\n";
      result += "    }\n";
    }
    if (third_union_val.has_value()) {
      result += "    third_union: #gre#test.fidlcodec.examples/IntStructUnion#rst# = {\n";
      result += "      " + ValueToPretty("variant_i", "int32", *third_union_val) + "\n";
      result += "    }\n";
    }
    result += "  }\n";
  }
  result += "  " + ValueToPretty("i", "int32", i) + "\n";
  result += "}";
  return result;
}

TEST_DECODE_WIRE(Table0, Table, R"({"table":{}, "i":"2"})", TablePretty({}, {}, {}, {}, 2),
                 GetTable({}, {}, {}, {}), 2)

TEST_DECODE_WIRE(Table1, Table,
                 R"({"table":{
                          "third_union":{"variant_i":"42"}
                      },
                      "i":"2"})",
                 TablePretty({}, {}, {}, 42, 2), GetTable({}, {}, {}, 42), 2)

TEST_DECODE_WIRE(Table2, Table,
                 R"({"table":{
                          "second_struct":{"value1":"harpo", "value2":"groucho"}
                      },
                      "i":"2"})",
                 TablePretty({}, "harpo", "groucho", {}, 2), GetTable({}, "harpo", "groucho", {}),
                 2)

TEST_DECODE_WIRE(Table3, Table,
                 R"({"table":{
                          "second_struct":{
                              "value1":"harpo", "value2":"groucho"},
                          "third_union":{"variant_i":"42"}},
                      "i":"2"})",
                 TablePretty({}, "harpo", "groucho", 42, 2), GetTable({}, "harpo", "groucho", 42),
                 2)

TEST_DECODE_WIRE(Table4, Table, R"({"table":{
                                         "first_int16":"1"
                                     },
                                     "i":"2"})",
                 TablePretty(1, {}, {}, {}, 2), GetTable(1, {}, {}, {}), 2)

TEST_DECODE_WIRE(Table5, Table,
                 R"({"table":{
                          "first_int16":"1",
                          "third_union":{"variant_i":"42"}
                      },
                      "i":"2"})",
                 TablePretty(1, {}, {}, 42, 2), GetTable(1, {}, {}, 42), 2)

TEST_DECODE_WIRE(Table6, Table,
                 R"({"table":{
                          "first_int16":"1",
                          "second_struct":{
                              "value1":"harpo", "value2":"groucho"}
                      },
                      "i":"2"})",
                 TablePretty(1, "harpo", "groucho", {}, 2), GetTable(1, "harpo", "groucho", {}), 2)

TEST_DECODE_WIRE(Table7, Table,
                 R"({"table":{
                          "first_int16":"1",
                          "second_struct":{
                              "value1":"harpo", "value2":"groucho"},
                          "third_union":{"variant_i":"42"}
                      },
                      "i":"2"})",
                 TablePretty(1, "harpo", "groucho", 42, 2), GetTable(1, "harpo", "groucho", 42), 2)

// TODO(DX-1476): Add a test that exercises what happens when we encounter an
// unknown type in a table.

// Handle Tests

namespace {

class HandleSupport {
 public:
  HandleSupport() {
    zx::channel::create(0, &out1_, &out2_);
    json_ = "{" + HandleToJson("ch", out2_.get()) + "}";
    pretty_ = "{ " + HandleToPretty("ch", out2_.get()) + " }";
  }
  zx::channel handle() { return std::move(out2_); }

  template <typename Interface>
  fidl::InterfaceHandle<Interface> interface() {
    return fidl::InterfaceHandle<Interface>(std::move(out2_));
  }

  std::string GetJSON() { return json_; }
  std::string GetPretty() { return pretty_; }

 private:
  zx::channel out1_;
  zx::channel out2_;
  std::string json_;
  std::string pretty_;
};

}  // namespace

TEST_F(WireParserTest, ParseHandle) {
  HandleSupport support;
  TEST_DECODE_WIRE_BODY(Handle, support.GetJSON(), support.GetPretty(), support.handle());
}
TEST_F(WireParserTest, ParseNullableHandle) {
  HandleSupport support;
  TEST_DECODE_WIRE_BODY(NullableHandle, support.GetJSON(), support.GetPretty(), support.handle());
}
TEST_F(WireParserTest, ParseProtocol) {
  HandleSupport support;
  TEST_DECODE_WIRE_BODY(Protocol, support.GetJSON(), support.GetPretty(),
                        support.interface<test::fidlcodec::examples::ParamProtocol>());
}

namespace {

class HandleStructSupport {
 public:
  HandleStructSupport() {
    zx::channel::create(0, &out1_, &out2_);
    zx::channel::create(0, &out3_, &out4_);
    json_ = "{\"hs\":{" + HandleToJson("h1", out1_.get()) + "," + HandleToJson("h2", out2_.get()) +
            "," + HandleToJson("h3", out3_.get()) + "}}";
    pretty_ = "{\n  hs: #gre#test.fidlcodec.examples/HandleStruct#rst# = {\n    " +
              HandleToPretty("h1", out1_.get()) + "\n    " + HandleToPretty("h2", out2_.get()) +
              "\n    " + HandleToPretty("h3", out3_.get()) + "\n  }\n}";
  }
  test::fidlcodec::examples::HandleStruct handle_struct() {
    test::fidlcodec::examples::HandleStruct hs;
    hs.h1 = std::move(out1_);
    hs.h2 = std::move(out2_);
    hs.h3 = std::move(out3_);
    return hs;
  }
  std::string GetJSON() { return json_; }
  std::string GetPretty() { return pretty_; }

 private:
  zx::channel out1_;
  zx::channel out2_;
  zx::channel out3_;
  zx::channel out4_;

  std::string json_;
  std::string pretty_;
};

}  // namespace

TEST_F(WireParserTest, ParseHandleStruct) {
  HandleStructSupport support;
  TEST_DECODE_WIRE_BODY(HandleStructMessage, support.GetJSON(), support.GetPretty(),
                        support.handle_struct());
}

namespace {

class HandleTableSupport {
 public:
  HandleTableSupport() {
    zx::channel::create(0, &out1_, &out2_);
    json_ = "{\"t\":{" + HandleToJson("h1", out1_.get()) + ",\"s1\":{\"sh1\":\"00000000\"," +
            HandleToJson("sh2", out2_.get()) + "}}}";
    pretty_ =
        "{\n"
        "  t: #gre#test.fidlcodec.examples/HandleTable#rst# = {\n"
        "    " +
        HandleToPretty("h1", out1_.get()) +
        "\n"
        "    s1: #gre#test.fidlcodec.examples/OptHandleStruct#rst# = {\n"
        "      sh1: #gre#handle#rst# = #red#00000000#rst#\n"
        "      " +
        HandleToPretty("sh2", out2_.get()) +
        "\n"
        "    }\n"
        "  }\n"
        "}";
  }
  test::fidlcodec::examples::HandleTable handle_table() {
    test::fidlcodec::examples::HandleTable t;
    t.set_h1(std::move(out1_));
    test::fidlcodec::examples::OptHandleStruct s;
    s.sh2 = std::move(out2_);
    t.set_s1(std::move(s));
    return t;
  }
  std::string GetJSON() { return json_; }
  std::string GetPretty() { return pretty_; }

 private:
  zx::channel out1_;
  zx::channel out2_;

  std::string json_;
  std::string pretty_;
};

}  // namespace

TEST_F(WireParserTest, ParseHandleTable) {
  HandleTableSupport support;
  TEST_DECODE_WIRE_BODY(HandleTableMessage, support.GetJSON(), support.GetPretty(),
                        support.handle_table());
}

namespace {

class TraversalOrderSupport {
 public:
  TraversalOrderSupport() {
    zx::channel::create(0, &sh1_, &sh2_);
    zx::channel::create(0, &h1_, &h2_);
    json_ = "{\"t\":{\"s\":{" + HandleToJson("sh1", sh1_.get()) + "," +
            HandleToJson("sh2", sh2_.get()) + "}," + HandleToJson("h1", h1_.get()) + "," +
            HandleToJson("h2", h2_.get()) + "}}";
    pretty_ =
        "{\n  t: #gre#test.fidlcodec.examples/TraversalOrder#rst# = {\n    "
        "s: #gre#test.fidlcodec.examples/OptHandleStruct#rst# = {\n      " +
        HandleToPretty("sh1", sh1_.get()) + "\n      " + HandleToPretty("sh2", sh2_.get()) +
        "\n    }\n    " + HandleToPretty("h1", h1_.get()) + "\n    " +
        HandleToPretty("h2", h2_.get()) + "\n  }\n}";
  }
  test::fidlcodec::examples::TraversalOrder TraversalOrder() {
    test::fidlcodec::examples::TraversalOrder t;
    auto s = std::make_unique<test::fidlcodec::examples::OptHandleStruct>();
    s->sh1 = std::move(sh1_);
    s->sh2 = std::move(sh2_);
    t.s = std::move(s);
    t.h1 = std::move(h1_);
    t.h2 = std::move(h2_);
    return t;
  }
  std::string GetJSON() { return json_; }
  std::string GetPretty() { return pretty_; }

 private:
  zx::channel sh1_;
  zx::channel sh2_;
  zx::channel h1_;
  zx::channel h2_;

  std::string json_;
  std::string pretty_;
};

}  // namespace

TEST_F(WireParserTest, ParseTraversalOrder) {
  TraversalOrderSupport support;
  TEST_DECODE_WIRE_BODY(TraversalOrderMessage, support.GetJSON(), support.GetPretty(),
                        support.TraversalOrder());
}

namespace {

class TraversalMainSupport {
 public:
  TraversalMainSupport() {
    zx::channel::create(0, &out1_, &out2_);
    json_ = R"JSON({"v":[{"x":"10","y":{"a":"20",)JSON" + HandleToJson("b", out1_.get()) +
            R"JSON(}},{"x":"30","y":{"a":"40",)JSON" + HandleToJson("b", out2_.get()) +
            R"JSON(}}],"s":{"a":"50","b":"00000000"}})JSON";
    pretty_ =
        "{\n"
        "  v: #gre#vector<test.fidlcodec.examples/TraversalMain>#rst# = [\n"
        "    {\n"
        "      x: #gre#uint32#rst# = #blu#10#rst#\n"
        "      y: #gre#test.fidlcodec.examples/TraversalStruct#rst# = {\n"
        "        a: #gre#uint32#rst# = #blu#20#rst#\n"
        "        " +
        HandleToPretty("b", out1_.get()) +
        "\n"
        "      }\n"
        "    }\n"
        "    {\n"
        "      x: #gre#uint32#rst# = #blu#30#rst#\n"
        "      y: #gre#test.fidlcodec.examples/TraversalStruct#rst# = {\n"
        "        a: #gre#uint32#rst# = #blu#40#rst#\n"
        "        " +
        HandleToPretty("b", out2_.get()) +
        "\n"
        "      }\n"
        "    }\n"
        "  ]\n"
        "  s: #gre#test.fidlcodec.examples/TraversalStruct#rst# = { "
        "a: #gre#uint32#rst# = #blu#50#rst#, "
        "b: #gre#handle#rst# = #red#00000000#rst# }\n"
        "}";
  }
  std::vector<std::unique_ptr<test::fidlcodec::examples::TraversalMain>> GetV() {
    std::vector<std::unique_ptr<test::fidlcodec::examples::TraversalMain>> result;
    auto object1 = std::make_unique<test::fidlcodec::examples::TraversalMain>();
    object1->x = 10;
    auto object2 = std::make_unique<test::fidlcodec::examples::TraversalStruct>();
    object2->a = 20;
    object2->b = std::move(out1_);
    object1->y = std::move(object2);
    result.emplace_back(std::move(object1));
    auto object3 = std::make_unique<test::fidlcodec::examples::TraversalMain>();
    object3->x = 30;
    auto object4 = std::make_unique<test::fidlcodec::examples::TraversalStruct>();
    object4->a = 40;
    object4->b = std::move(out2_);
    object3->y = std::move(object4);
    result.emplace_back(std::move(object3));
    return result;
  }

  std::unique_ptr<test::fidlcodec::examples::TraversalStruct> GetS() {
    auto result = std::make_unique<test::fidlcodec::examples::TraversalStruct>();
    result->a = 50;
    return result;
  }

  std::string GetJSON() { return json_; }
  std::string GetPretty() { return pretty_; }

 private:
  zx::channel out1_;
  zx::channel out2_;

  std::string json_;
  std::string pretty_;
};

}  // namespace

TEST_F(WireParserTest, ParseTraversalMain) {
  TraversalMainSupport support_v1;
  TEST_DECODE_WIRE_BODY(TraversalMainMessage, support_v1.GetJSON(), support_v1.GetPretty(),
                        support_v1.GetV(), support_v1.GetS());
}

// Corrupt data tests

TEST_F(WireParserTest, BadSchemaPrintHex) {
  std::vector<std::unique_ptr<std::istream>> library_files;
  // i32 in the schema is missing "subtype": "int32"
  std::string bad_schema = R"FIDL({
  "version": "0.0.1",
  "name": "fidl.examples.types",
  "library_dependencies": [],
  "bits_declarations": [],
  "const_declarations": [],
  "enum_declarations": [],
  "interface_declarations": [
    {
      "name": "test.fidlcodec.examples/FidlCodecTestInterface",
      "location": {
        "filename": "../../src/lib/fidl_codec/testdata/types.test.fidl",
        "line": 11,
        "column": 10
      },
      "methods": [
        {
          "ordinal": 913676553315942400,
          "generated_ordinal": 1593056155789170713,
          "name": "Int32",
          "location": {
            "filename": "../../src/lib/fidl_codec/testdata/types.test.fidl",
            "line": 16,
            "column": 5
          },
          "has_request": true,
          "maybe_request": [
            {
              "type": {
                "kind": "primitive"
              },
              "name": "i32",
              "location": {
                "filename": "../../src/lib/fidl_codec/testdata/types.test.fidl",
                "line": 16,
                "column": 17
              },
              "size": 4,
              "max_out_of_line": 0,
              "alignment": 4,
              "offset": 16,
              "max_handles": 0,
              "field_shape_old": {
                "offset": 16,
                "padding": 0
              },
              "field_shape_v1": {
                "offset": 16,
                "padding": 0
              }
            }
          ],
          "maybe_request_size": 24,
          "maybe_request_alignment": 8,
          "maybe_request_type_shape_old": {
            "inline_size": 24,
            "alignment": 8,
            "depth": 0,
            "max_handles": 0,
            "max_out_of_line": 0,
            "has_padding": true,
            "has_flexible_envelope": false,
            "contains_union": false
          },
          "maybe_request_type_shape_v1": {
            "inline_size": 24,
            "alignment": 8,
            "depth": 0,
            "max_handles": 0,
            "max_out_of_line": 0,
            "has_padding": true,
            "has_flexible_envelope": false,
            "contains_union": false
          },
          "has_response": false,
          "is_composed": false
        }
      ]
    }
  ],
  "struct_declarations": [],
  "table_declarations": [],
  "union_declarations": [],
  "xunion_declarations": []
})FIDL";
  std::unique_ptr<std::istream> file =
      std::make_unique<std::istringstream>(std::istringstream(bad_schema));
  library_files.push_back(std::move(file));
  LibraryReadError err;
  LibraryLoader loader(&library_files, &err);
  ASSERT_TRUE(err.value == LibraryReadError::ErrorValue::kOk);
  fidl::MessageBuffer buffer;
  fidl::Message message = buffer.CreateEmptyMessage();

  InterceptRequest<test::fidlcodec::examples::FidlCodecTestInterface>(
      message, [](fidl::InterfacePtr<test::fidlcodec::examples::FidlCodecTestInterface>& ptr) {
        ptr->Int32(kUninitialized);
      });

  fidl_message_header_t header = message.header();

  zx_handle_info_t* handle_infos = nullptr;
  if (message.handles().size() > 0) {
    handle_infos = new zx_handle_info_t[message.handles().size()];
    for (uint32_t i = 0; i < message.handles().size(); ++i) {
      handle_infos[i].handle = message.handles().data()[i];
      handle_infos[i].type = ZX_OBJ_TYPE_NONE;
      handle_infos[i].rights = 0;
    }
  }

  const std::vector<const InterfaceMethod*>* methods = loader.GetByOrdinal(header.ordinal);
  ASSERT_NE(methods, nullptr);
  ASSERT_TRUE(!methods->empty());

  const InterfaceMethod* method = (*methods)[0];
  // If this is null, you probably have to update the schema above.
  ASSERT_NE(method, nullptr);

  std::unique_ptr<fidl_codec::StructValue> decoded_request;
  std::stringstream error_stream;
  fidl_codec::DecodeRequest(method, message.bytes().data(), message.bytes().size(), handle_infos,
                            message.handles().size(), &decoded_request, error_stream);
  rapidjson::Document actual;
  if (decoded_request != nullptr) {
    decoded_request->ExtractJson(actual.GetAllocator(), actual);
  }

  // Checks that an invalid type generates an invalid value.
  ASSERT_STREQ(actual["i32"].GetString(), "(invalid)");

  delete[] handle_infos;
}

// Checks that MessageDecoder::DecodeValue doesn't core dump with a null type.
TEST_F(WireParserTest, DecodeNullTypeValue) {
  std::stringstream error_stream;
  fidl_message_header_t header;
  MessageDecoder decoder(reinterpret_cast<uint8_t*>(&header), sizeof(header), nullptr, 0,
                         error_stream);
  decoder.DecodeValue(nullptr);
}

}  // namespace fidl_codec
