blob: bfb5e21fecf4555637c8d87837aedf326abfb632 [file] [log] [blame]
// Copyright 2016 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/viewsv1/cpp/fidl.h>
#include <zx/eventpair.h>
#include "gtest/gtest.h"
#include "lib/component/cpp/connect.h"
#include "lib/component/cpp/startup_context.h"
#include "lib/fidl/cpp/binding.h"
#include "lib/fxl/time/time_delta.h"
#include "lib/fxl/time/time_point.h"
#include "lib/ui/tests/mocks/mock_view_container_listener.h"
#include "lib/ui/tests/mocks/mock_view_listener.h"
#include "lib/ui/tests/mocks/mock_view_tree_listener.h"
extern std::unique_ptr<component::StartupContext> g_startup_context;
namespace view_manager {
namespace test {
class ViewManagerTest : public ::testing::Test {
protected:
static void SetUpTestCase() {
view_manager_ = g_startup_context->ConnectToEnvironmentService<
::fuchsia::ui::viewsv1::ViewManager>();
}
static ::fuchsia::ui::viewsv1::ViewManagerPtr view_manager_;
};
::fuchsia::ui::viewsv1::ViewManagerPtr ViewManagerTest::view_manager_;
TEST_F(ViewManagerTest, CreateAViewManager) {
ASSERT_TRUE(view_manager_.is_bound());
}
TEST_F(ViewManagerTest, CreateAView) {
ASSERT_TRUE(view_manager_.is_bound());
// Create and bind a mock view listener
::fuchsia::ui::viewsv1::ViewListenerPtr view_listener;
mozart::test::MockViewListener mock_view_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewListener> view_listener_binding(
&mock_view_listener, view_listener.NewRequest());
// Create a view
::fuchsia::ui::viewsv1::ViewPtr view;
zx::eventpair view_owner_token, view_token;
if (zx::eventpair::create(0u, &view_owner_token, &view_token) != ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
view_manager_->CreateView2(view.NewRequest(), std::move(view_token),
std::move(view_listener), "test_view");
}
TEST_F(ViewManagerTest, CreateAChildView) {
// Create and bind a mock view listener for a parent view
::fuchsia::ui::viewsv1::ViewListenerPtr parent_view_listener;
mozart::test::MockViewListener parent_mock_view_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewListener>
child_view_listener_binding(&parent_mock_view_listener,
parent_view_listener.NewRequest());
// Create a parent view
::fuchsia::ui::viewsv1::ViewPtr parent_view;
zx::eventpair parent_view_owner_token, parent_view_token;
if (zx::eventpair::create(0u, &parent_view_owner_token, &parent_view_token) !=
ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
view_manager_->CreateView2(
parent_view.NewRequest(), std::move(parent_view_token),
std::move(parent_view_listener), "parent_test_view");
::fuchsia::ui::viewsv1::ViewContainerPtr parent_view_container;
parent_view->GetContainer(parent_view_container.NewRequest());
// Create and bind a mock view listener for a child view
::fuchsia::ui::viewsv1::ViewListenerPtr child_view_listener;
mozart::test::MockViewListener child_mock_view_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewListener>
parent_view_listener_binding(&child_mock_view_listener,
child_view_listener.NewRequest());
// Create a child view
::fuchsia::ui::viewsv1::ViewPtr child_view;
zx::eventpair child_view_owner_token, child_view_token;
if (zx::eventpair::create(0u, &child_view_owner_token, &child_view_token) !=
ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
view_manager_->CreateView2(child_view.NewRequest(),
std::move(child_view_token),
std::move(child_view_listener), "test_view");
// Add the view to the parent
parent_view_container->AddChild2(0, std::move(child_view_owner_token));
// Remove the view from the parent
zx::eventpair new_child_view_owner_token, new_child_view_token;
if (zx::eventpair::create(0u, &new_child_view_owner_token,
&new_child_view_token) != ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
parent_view_container->RemoveChild2(0, new_child_view_token.NewRequest());
// If we had a ViewContainerListener, we would still not get a OnViewAttached
// since the view hasn't had enough time to be resolved
}
TEST_F(ViewManagerTest, SetChildProperties) {
int32_t parent_view_width = 800;
int32_t parent_view_height = 600;
uint32_t parent_key = 0;
uint32_t parent_scene_version = 1;
uint32_t invalidation_count = 0;
int32_t child_view_width = 800;
int32_t child_view_height = 600;
uint32_t child_key = 0;
uint32_t child_scene_version = 1;
// Create tree
::fuchsia::ui::viewsv1::ViewTreePtr tree;
::fuchsia::ui::viewsv1::ViewTreeListenerPtr tree_listener;
mozart::test::MockViewTreeListener mock_tree_view_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewTreeListener> tree_listener_binding(
&mock_tree_view_listener, tree_listener.NewRequest());
view_manager_->CreateViewTree(tree.NewRequest(), std::move(tree_listener),
"test_view_tree");
// Get tree's container and wire up listener
::fuchsia::ui::viewsv1::ViewContainerPtr tree_container;
tree->GetContainer(tree_container.NewRequest());
::fuchsia::ui::viewsv1::ViewContainerListenerPtr tree_container_listener;
mozart::test::MockViewContainerListener mock_tree_container_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewContainerListener>
tree_container_listener_binding(&mock_tree_container_listener,
tree_container_listener.NewRequest());
tree_container->SetListener(std::move(tree_container_listener));
// Create and bind a mock view listener for a parent view
::fuchsia::ui::viewsv1::ViewListenerPtr parent_view_listener;
mozart::test::MockViewListener parent_mock_view_listener;
fidl::Binding<::fuchsia::ui::viewsv1::ViewListener>
child_view_listener_binding(&parent_mock_view_listener,
parent_view_listener.NewRequest());
// Create a parent view
::fuchsia::ui::viewsv1::ViewPtr parent_view;
zx::eventpair parent_view_owner_token, parent_view_token;
if (zx::eventpair::create(0u, &parent_view_owner_token, &parent_view_token) !=
ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
view_manager_->CreateView2(
parent_view.NewRequest(), std::move(parent_view_token),
std::move(parent_view_listener), "parent_test_view");
// Add root view to tree
tree_container->AddChild2(parent_key, std::move(parent_view_owner_token));
auto parent_view_properties = ::fuchsia::ui::viewsv1::ViewProperties::New();
parent_view_properties->view_layout =
::fuchsia::ui::viewsv1::ViewLayout::New();
parent_view_properties->view_layout->size = fuchsia::math::Size::New();
parent_view_properties->view_layout->size->width = parent_view_width;
parent_view_properties->view_layout->size->height = parent_view_height;
parent_view_properties->view_layout->inset = mozart::Inset::New();
tree_container->SetChildProperties(parent_key, parent_scene_version,
std::move(parent_view_properties));
::fuchsia::ui::viewsv1::ViewContainerPtr parent_view_container;
parent_view->GetContainer(parent_view_container.NewRequest());
// Create and bind a mock view listener for a child view
::fuchsia::ui::viewsv1::ViewListenerPtr child_view_listener;
mozart::test::MockViewListener child_mock_view_listener(
[&invalidation_count, child_view_width,
child_view_height](mozart::ViewInvalidationPtr invalidation) {
EXPECT_TRUE(invalidation->properties);
EXPECT_EQ(child_view_width,
invalidation->properties->view_layout->size->width);
EXPECT_EQ(child_view_height,
invalidation->properties->view_layout->size->height);
invalidation_count++;
});
fidl::Binding<::fuchsia::ui::viewsv1::ViewListener>
parent_view_listener_binding(&child_mock_view_listener,
child_view_listener.NewRequest());
// Create a child view
::fuchsia::ui::viewsv1::ViewPtr child_view;
zx::eventpair child_view_owner_token, child_view_token;
if (zx::eventpair::create(0u, &child_view_owner_token, &child_view_token) !=
ZX_OK)
FXL_NOTREACHED() << "failed to create tokens.";
view_manager_->CreateView2(child_view.NewRequest(),
std::move(child_view_token),
std::move(child_view_listener), "test_view");
// Add the view to the parent
parent_view_container->AddChild2(child_key,
std::move(child_view_owner_token));
auto view_properties = ::fuchsia::ui::viewsv1::ViewProperties::New();
view_properties->view_layout = ::fuchsia::ui::viewsv1::ViewLayout::New();
view_properties->view_layout->size = fuchsia::math::Size::New();
view_properties->view_layout->size->width = child_view_width;
view_properties->view_layout->size->height = child_view_height;
view_properties->view_layout->inset = mozart::Inset::New();
parent_view_container->SetChildProperties(child_key, child_scene_version,
std::move(view_properties));
RUN_MESSAGE_LOOP_WHILE(invalidation_count == 0);
EXPECT_EQ(1u, invalidation_count);
// If we had a ViewContainerListener, we would still not get a OnViewAttached
// since the view hasn't had enough time to be resolved
}
} // namespace test
} // namespace view_manager