必要條件
本教學課程是以編譯 FIDL 教學課程為基礎。 如要進一步瞭解其他 FIDL 教學課程,請參閱總覽。
總覽
本教學課程將詳細說明如何將 HLCPP FIDL 繫結加入 建立能做為「遊樂場」單元測試的單元測試的 探索 HLCPP 繫結
本文件說明如何完成以下工作:
範例程式碼位於 Fuchsia 結帳時,
//examples/fidl/hlcpp/unittests/
。如果想編寫完整的程式碼
按照本教學課程操作時,您可以移除範例程式碼:
rm -r examples/fidl/hlcpp/unittests/*
編寫 C++ 主機測試
將 gtest 虛設常式新增至
examples/fidl/hlcpp/unittests/main.cc
:#include <gtest/gtest.h> namespace { } // namespace
定義
test
,然後透過$host_toolchain
為測試建立依附元件。 若要執行此操作,請在examples/fidl/hlcpp/unittests/BUILD.gn
中新增以下內容:import("//build/test.gni") group("unittests") { testonly = true deps = [ ":example-cpp-host-test($host_toolchain)" ] } test("example-cpp-host-test") { sources = [ "main.cc" ] deps = [ "//src/lib/fxl/test:gtest_main" ] }
在設定中新增測試套件:
fx set product.board --with //examples/fidl/hlcpp/unittests
執行空白測試套件:
fx test -vo example-cpp-host-test
您應該會看到測試輸出內容,指出未執行任何測試。 因為尚未加入任何測試
將 HLCPP FIDL 繫結新增為依附元件
參照 FIDL 目標,在 HLCPP 繫結中新增依附元件
新的 test
目標應如下所示:
test("example-cpp-host-test") {
sources = [ "main.cc" ]
deps = [
"//examples/fidl/fuchsia.examples:fuchsia.examples_hlcpp",
"//src/lib/fxl/test:gtest_main",
]
}
(選用) 如要查看新產生的繫結:
- 使用
fx build
重新建構。 - 切換到產生的檔案目錄:
out/default/fidling/gen/examples/fidl/fuchsia.examples/fuchsia/examples
,其中 產生的檔案會存放在這個資料夾中 如果您設定了其他建構輸出內容,可能需要變更out/default
目錄。您可以使用fx get-build-dir
檢查建構輸出目錄。
如要進一步瞭解如何找出產生的繫結程式碼,請參閱 查看產生的繫結程式碼。
在 C++ 程式碼中加入 HLCPP 繫結
如要納入繫結,請在頂端加入以下 include 陳述式
examples/fidl/hlcpp/unittests/main.cc
#include <fuchsia/examples/cpp/fidl.h>
檢查及使用產生的繫結程式碼
您現在可以參照產生的程式碼來編寫部分測試。如要 如需繫結相關資訊,請參閱 HLCPP 繫結參考資料。
您也可以使用一些程式碼範例著手開始作業。您可以在
main.cc
中的匿名命名空間:
TEST(FidlExamples, Bits) {
auto flags = fuchsia::examples::FileMode::READ | fuchsia::examples::FileMode::WRITE;
ASSERT_EQ(static_cast<uint16_t>(flags), 0b11);
flags |= fuchsia::examples::FileMode::EXECUTE;
ASSERT_EQ(flags, fuchsia::examples::FileModeMask);
}
TEST(FidlExamples, Enums) {
ASSERT_EQ(static_cast<uint32_t>(fuchsia::examples::LocationType::MUSEUM), 1u);
}
TEST(FidlExamples, Structs) {
fuchsia::examples::Color default_color;
ASSERT_EQ(default_color.id, 0u);
ASSERT_EQ(default_color.name, "red");
fuchsia::examples::Color blue = {1, "blue"};
ASSERT_EQ(blue.id, 1u);
}
TEST(FidlExamples, Unions) {
auto int_val = fuchsia::examples::JsonValue::WithIntValue(1);
ASSERT_EQ(int_val.Which(), fuchsia::examples::JsonValue::Tag::kIntValue);
ASSERT_TRUE(int_val.is_int_value());
auto str_val = fuchsia::examples::JsonValue::WithStringValue("1");
ASSERT_EQ(str_val.Which(), fuchsia::examples::JsonValue::Tag::kStringValue);
ASSERT_TRUE(str_val.is_string_value());
fuchsia::examples::JsonValuePtr other_int_val = std::make_unique<fuchsia::examples::JsonValue>();
other_int_val->set_int_value(5);
ASSERT_EQ(other_int_val->int_value(), 5);
}
TEST(FidlExamples, Tables) {
fuchsia::examples::User user;
ASSERT_FALSE(user.has_age());
user.set_age(100);
*user.mutable_age() += 100;
ASSERT_EQ(user.age(), 200);
user.clear_age();
ASSERT_TRUE(user.IsEmpty());
}
如要重新建構並重新執行測試,請執行以下指令:
fx test -vo example-cpp-host-test