| // 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_object.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 <rapidjson/stringbuffer.h> |
| #include <rapidjson/writer.h> |
| #include <test/fidlcodec/examples/cpp/fidl.h> |
| |
| #include "src/lib/fidl_codec/fidl_codec_test.h" |
| #include "src/lib/fidl_codec/json_visitor.h" |
| #include "src/lib/fidl_codec/wire_parser.h" |
| |
| namespace fidl_codec { |
| |
| const Colors FakeColors(/*new_reset=*/"#rst#", /*new_red=*/"#red#", /*new_green=*/"#gre#", |
| /*new_blue=*/"#blu#", /*new_white_on_magenta=*/"#wom#", |
| /*new_yellow_background=*/"#yeb#"); |
| |
| class WireObjectTest : public ::testing::Test { |
| public: |
| void TestPrintObject(const Value& value, const char* pretty_print, const char* json) { |
| // Checks that we can pretty print an object (or a value). |
| std::stringstream result; |
| PrettyPrinter printer(result, FakeColors, false, "", 100, /*header_on_every_line=*/false); |
| value.PrettyPrint(nullptr, printer); |
| ASSERT_EQ(result.str(), pretty_print) |
| << "expected = " << pretty_print << " actual = " << result.str(); |
| |
| // Checks that we can use Display size. |
| value.DisplaySize(nullptr, 1); |
| value.DisplaySize(nullptr, 100); |
| value.DisplaySize(nullptr, 1000); |
| |
| // Checks that we can use the JSON visitor. |
| rapidjson::Document actual; |
| JsonVisitor visitor(&actual, &actual.GetAllocator()); |
| value.Visit(&visitor, nullptr); |
| rapidjson::StringBuffer actual_string; |
| rapidjson::Writer<rapidjson::StringBuffer> actual_w(actual_string); |
| actual.Accept(actual_w); |
| std::string actual_json = actual_string.GetString(); |
| ASSERT_EQ(json, actual_json) << "expected = " << json << " and actual = " << actual_json; |
| } |
| |
| protected: |
| void SetUp() override { |
| loader_ = GetLoader(); |
| ASSERT_NE(loader_, nullptr); |
| } |
| |
| LibraryLoader* loader() const { return loader_; } |
| |
| private: |
| LibraryLoader* loader_; |
| }; |
| |
| #define TEST_PRINT_OBJECT(_testname, field, pretty_print, json) \ |
| TEST_F(WireObjectTest, Parse##_testname) { TestPrintObject(field, pretty_print, json); } |
| |
| class TableValueWithNullFields : public TableValue { |
| public: |
| TableValueWithNullFields(LibraryLoader* loader) : TableValue(GetTableDefinition(loader)) { |
| AddMember("first_int16", std::make_unique<IntegerValue>(1000, true)); |
| AddMember("third_union", nullptr); |
| } |
| |
| private: |
| const Table& GetTableDefinition(LibraryLoader* loader) { |
| Library* library = loader->GetLibraryFromName("test.fidlcodec.examples"); |
| FX_DCHECK(library != nullptr); |
| const Table* table = library->GetTable("test.fidlcodec.examples/ValueTable"); |
| FX_DCHECK(table != nullptr); |
| return *table; |
| } |
| }; |
| |
| TEST_PRINT_OBJECT(TableValue, TableValueWithNullFields(loader()), |
| "{ first_int16: #gre#int16#rst# = #blu#-1000#rst# }", |
| "{\"first_int16\":\"-1000\"}"); |
| |
| TEST_PRINT_OBJECT(InvalidValue, InvalidValue(), "#red#invalid#rst#", "\"(invalid)\""); |
| |
| } // namespace fidl_codec |