必要條件
本教學課程以編譯 FIDL 教學課程為基礎。如要進一步瞭解其他 FIDL 教學課程,請參閱總覽。
總覽
本教學課程說明如何建立單元測試,用來當做探索 HLCPP 繫結的「遊樂場」,藉此在程式碼中加入 HLCPP FIDL 繫結。
本文件說明如何完成下列工作:
範例程式碼位於 //examples/fidl/hlcpp/unittests/
的 Fuchsia 結帳畫面中。如要按照本教學課程操作來編寫所有程式碼,您可以移除範例程式碼:
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