blob: bd28bcdba4fdfc00c5fd334040a51ae353b9e312 [file] [log] [blame]
// 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_);
}