| // 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 <fuchsia/ui/scenic/cpp/fidl.h> | |
| #include <fuchsia/ui/scenic/cpp/fidl_test_base.h> | |
| #include <lib/gtest/test_loop_fixture.h> | |
| #include <lib/sys/cpp/testing/component_context_provider.h> | |
| #include <lib/sys/cpp/testing/fake_component.h> | |
| #include <gtest/gtest.h> | |
| #include <src/lib/vulkan/imagepipe_view/imagepipe_view.h> | |
| #include "sdk/lib/ui/scenic/cpp/view_ref_pair.h" | |
| namespace { | |
| static constexpr fuchsia::ui::gfx::ViewProperties kViewProperties = { | |
| .bounding_box = {.max = {.x = 100, .y = 50}, .min = {.x = 10, .y = 5}}}; | |
| class MockSession : public fuchsia::ui::scenic::testing::Session_TestBase { | |
| public: | |
| MockSession() : binding_(this) {} | |
| void NotImplemented_(const std::string& name) override {} | |
| void Enqueue(::std::vector<fuchsia::ui::scenic::Command> cmds) override { | |
| for (auto& cmd : cmds) { | |
| if (cmd.is_gfx() && cmd.gfx().is_create_resource() && | |
| cmd.gfx().create_resource().resource.is_shape_node()) { | |
| SendViewPropertiesChangedEvent(); | |
| } | |
| } | |
| } | |
| void SendViewPropertiesChangedEvent() { | |
| fuchsia::ui::gfx::ViewPropertiesChangedEvent view_properties_changed_event = { | |
| .view_id = 0, | |
| .properties = kViewProperties, | |
| }; | |
| fuchsia::ui::gfx::Event event; | |
| event.set_view_properties_changed(view_properties_changed_event); | |
| fuchsia::ui::scenic::Event scenic_event; | |
| scenic_event.set_gfx(std::move(event)); | |
| std::vector<fuchsia::ui::scenic::Event> events; | |
| events.emplace_back(std::move(scenic_event)); | |
| listener_->OnScenicEvent(std::move(events)); | |
| } | |
| void Bind(fidl::InterfaceRequest<::fuchsia::ui::scenic::Session> request, | |
| ::fuchsia::ui::scenic::SessionListenerPtr listener) { | |
| binding_.Bind(std::move(request)); | |
| listener_ = std::move(listener); | |
| } | |
| private: | |
| fidl::Binding<fuchsia::ui::scenic::Session> binding_; | |
| fuchsia::ui::scenic::SessionListenerPtr listener_; | |
| }; | |
| class FakeScenic : public fuchsia::ui::scenic::testing::Scenic_TestBase { | |
| public: | |
| void NotImplemented_(const std::string& name) override {} | |
| void CreateSession( | |
| fidl::InterfaceRequest<fuchsia::ui::scenic::Session> session, | |
| fidl::InterfaceHandle<fuchsia::ui::scenic::SessionListener> listener) override { | |
| mock_session_.Bind(std::move(session), listener.Bind()); | |
| } | |
| fidl::InterfaceRequestHandler<fuchsia::ui::scenic::Scenic> GetHandler( | |
| async_dispatcher_t* dispatcher = nullptr) { | |
| return [this, dispatcher](fidl::InterfaceRequest<fuchsia::ui::scenic::Scenic> request) { | |
| bindings_.AddBinding(this, std::move(request), dispatcher); | |
| }; | |
| } | |
| private: | |
| fidl::BindingSet<fuchsia::ui::scenic::Scenic> bindings_; | |
| MockSession mock_session_; | |
| }; | |
| } // namespace | |
| class ImagePipeViewTest : public gtest::TestLoopFixture { | |
| public: | |
| void SetUp() override { | |
| TestLoopFixture::SetUp(); | |
| fake_scenic_ = std::make_unique<FakeScenic>(); | |
| provider_.service_directory_provider()->AddService(fake_scenic_->GetHandler()); | |
| } | |
| static void OnViewPropertiesChanged(ImagePipeView& view, | |
| fuchsia::ui::gfx::ViewProperties view_properties) { | |
| view.OnViewPropertiesChanged(std::move(view_properties)); | |
| } | |
| sys::testing::ComponentContextProvider provider_; | |
| std::unique_ptr<FakeScenic> fake_scenic_; | |
| std::unique_ptr<ImagePipeView> view_; | |
| float width_ = 0; | |
| float height_ = 0; | |
| }; | |
| TEST_F(ImagePipeViewTest, Initialize) { | |
| ImagePipeView::ResizeCallback resize_callback = [this](float width, float height) { | |
| width_ = width; | |
| height_ = height; | |
| }; | |
| zx::eventpair view_token_0, view_token_1; | |
| EXPECT_EQ(ZX_OK, zx::eventpair::create(0, &view_token_0, &view_token_1)); | |
| auto [view_ref_control, view_ref] = scenic::ViewRefPair::New(); | |
| auto view = ImagePipeView::Create( | |
| provider_.context(), scenic::ToViewToken(std::move(view_token_0)), | |
| std::move(view_ref_control), std::move(view_ref), std::move(resize_callback)); | |
| ASSERT_TRUE(view); | |
| EXPECT_EQ(0.0, width_); | |
| EXPECT_EQ(0.0, height_); | |
| RunLoopUntilIdle(); | |
| EXPECT_EQ(kViewProperties.bounding_box.max.x - kViewProperties.bounding_box.min.x, width_); | |
| EXPECT_EQ(kViewProperties.bounding_box.max.y - kViewProperties.bounding_box.min.y, height_); | |
| } |