blob: 47d62b22fbe9af66baf7017bdffa53b71d6b17f7 [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 "src/ui/scenic/lib/flatland/hanging_get_helper.h"
#include <lib/syslog/cpp/macros.h>
#include <gtest/gtest.h>
using fuchsia::ui::scenic::internal::GraphLinkStatus;
using fuchsia::ui::scenic::internal::LayoutInfo;
using fuchsia::ui::scenic::internal::Vec2;
namespace flatland {
namespace test {
TEST(HangingGetHelperTest, HangingGetProducesValidResponse) {
HangingGetHelper<Vec2> helper;
std::optional<Vec2> data;
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_FALSE(data);
helper.Update(Vec2{1.0f, 2.0f});
EXPECT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{1.0f, 2.0f}, data.value()));
}
TEST(HangingGetHelperTest, NonHangingGetProducesValidResponse) {
HangingGetHelper<Vec2> helper;
helper.Update(Vec2{1.0f, 2.0f});
std::optional<Vec2> data;
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{1.0f, 2.0f}, data.value()));
}
TEST(HangingGetHelperTest, DataOverrideResultsInFinalValue) {
HangingGetHelper<Vec2> helper;
helper.Update(Vec2{1.0f, 2.0f});
helper.Update(Vec2{3.0f, 4.0f});
helper.Update(Vec2{5.0f, 6.0f});
std::optional<Vec2> data;
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{5.0f, 6.0f}, data.value()));
}
TEST(HangingGetHelperTest, DataOverrideInBatches) {
HangingGetHelper<Vec2> helper;
std::optional<Vec2> data;
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_FALSE(data);
helper.Update(Vec2{1.0f, 2.0f});
EXPECT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{1.0f, 2.0f}, data.value()));
helper.Update(Vec2{3.0f, 4.0f});
helper.Update(Vec2{5.0f, 6.0f});
EXPECT_TRUE(fidl::Equals(Vec2{1.0f, 2.0f}, data.value()));
data.reset();
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{5.0f, 6.0f}, data.value()));
}
TEST(HangingGetHelperTest, DuplicateDataIsIgnored) {
HangingGetHelper<Vec2> helper;
std::optional<Vec2> data;
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_FALSE(data);
helper.Update(Vec2{1.0f, 2.0f});
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{1.0f, 2.0f}, data.value()));
data.reset();
helper.SetCallback([&](Vec2 d) { data = d; });
EXPECT_FALSE(data);
helper.Update(Vec2{1.0f, 2.0f});
EXPECT_FALSE(data);
helper.Update(Vec2{3.0f, 4.0f});
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(Vec2{3.0f, 4.0f}, data.value()));
}
TEST(HangingGetHelperTest, EnumDuplicateDataIsIgnored) {
HangingGetHelper<GraphLinkStatus> helper;
std::optional<GraphLinkStatus> data;
helper.SetCallback([&](GraphLinkStatus d) { data = std::move(d); });
EXPECT_FALSE(data);
helper.Update(GraphLinkStatus::CONNECTED_TO_DISPLAY);
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(GraphLinkStatus::CONNECTED_TO_DISPLAY, data.value()));
data.reset();
helper.SetCallback([&](GraphLinkStatus d) { data = std::move(d); });
EXPECT_FALSE(data);
helper.Update(GraphLinkStatus::CONNECTED_TO_DISPLAY);
EXPECT_FALSE(data);
helper.Update(GraphLinkStatus::DISCONNECTED_FROM_DISPLAY);
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(GraphLinkStatus::DISCONNECTED_FROM_DISPLAY, data.value()));
}
TEST(HangingGetHelperTest, TableDuplicateDataIsIgnored) {
HangingGetHelper<LayoutInfo> helper;
std::optional<LayoutInfo> data;
helper.SetCallback([&](LayoutInfo d) { data = std::move(d); });
EXPECT_FALSE(data);
LayoutInfo info;
info.set_logical_size(Vec2{1.0f, 2.0f});
info.set_pixel_scale(Vec2{3.f, 4.f});
{
LayoutInfo info2;
info.Clone(&info2);
helper.Update(std::move(info2));
}
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(info, data.value()));
data.reset();
helper.SetCallback([&](LayoutInfo d) { data = std::move(d); });
EXPECT_FALSE(data);
{
LayoutInfo info3;
info.Clone(&info3);
helper.Update(std::move(info3));
}
EXPECT_FALSE(data);
// Updating just one part of the table is enough for it to not be a duplicate.
LayoutInfo new_info;
new_info.set_logical_size(Vec2{5.0f, 6.0f});
{
LayoutInfo info4;
new_info.Clone(&info4);
helper.Update(std::move(info4));
}
ASSERT_TRUE(data);
EXPECT_TRUE(fidl::Equals(new_info, data.value()));
}
} // namespace test
} // namespace flatland