blob: a8c507eab67f13d2112eba48448624e53611422e [file] [log] [blame]
// Copyright 2020 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/input/gfx_legacy_contender.h"
#include <gtest/gtest.h>
namespace lib_ui_input_tests {
namespace {
using scenic_impl::input::GestureResponse;
using scenic_impl::input::GfxLegacyContender;
using scenic_impl::input::InternalPointerEvent;
using scenic_impl::input::StreamId;
constexpr StreamId kStreamId = 1;
TEST(GfxLegacyContenderTest, ShouldGetYESResponseForEachMessage) {
uint64_t num_responses = 0;
auto contender = GfxLegacyContender(
/*respond*/
[&num_responses](GestureResponse response) {
++num_responses;
EXPECT_EQ(response, GestureResponse::kYes);
},
/*deliver_events_to_client*/ [](auto) {},
/*self_destruct*/ [] {});
EXPECT_EQ(num_responses, 0u);
contender.UpdateStream(kStreamId, /*event*/ {}, /*is_end_of_stream*/ false);
EXPECT_EQ(num_responses, 1u);
contender.UpdateStream(kStreamId, /*event*/ {}, /*is_end_of_stream*/ false);
EXPECT_EQ(num_responses, 2u);
contender.UpdateStream(kStreamId, /*event*/ {}, /*is_end_of_stream*/ true);
EXPECT_EQ(num_responses, 3u);
}
TEST(GfxLegacyContenderTest, ShouldGetAllEventsOnWin) {
constexpr StreamId kStreamId = 1;
std::vector<InternalPointerEvent> last_delivered_events;
auto contender = GfxLegacyContender(
/*respond*/ [](auto) {}, /*deliver_events_to_client*/
[&last_delivered_events](const std::vector<InternalPointerEvent>& events) {
last_delivered_events = events;
},
/*self_destruct*/ [] {});
// No events delivered before being awarded a win.
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ false);
EXPECT_TRUE(last_delivered_events.empty());
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 1}, /*is_end_of_stream*/ false);
EXPECT_TRUE(last_delivered_events.empty());
// All previous events should be delivered on win.
contender.EndContest(kStreamId, /*awarded_win*/ true);
ASSERT_EQ(last_delivered_events.size(), 2u);
EXPECT_EQ(last_delivered_events[0].timestamp, 0);
EXPECT_EQ(last_delivered_events[1].timestamp, 1);
// Subsequent events are delivered immediately.
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 2}, /*is_end_of_stream*/ false);
ASSERT_EQ(last_delivered_events.size(), 1u);
EXPECT_EQ(last_delivered_events[0].timestamp, 2);
}
TEST(GfxLegacyContenderTest, ShouldSelfDestructOnLoss) {
bool deliver_called = false;
bool self_destruct_called = false;
auto contender = GfxLegacyContender(
/*respond*/ [](auto) {},
/*deliver_events_to_client*/ [&deliver_called](auto) { deliver_called = true; },
/*self_destruct*/ [&self_destruct_called] { self_destruct_called = true; });
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ false);
EXPECT_FALSE(deliver_called);
EXPECT_FALSE(self_destruct_called);
// Should self-destruct on loss.
contender.EndContest(kStreamId, /*awarded_win*/ false);
EXPECT_FALSE(deliver_called);
EXPECT_TRUE(self_destruct_called);
}
TEST(GfxLegacyContenderTest, ShouldSelfDescructOnStreamEndAfterWin) {
uint64_t num_delivered_events = 0;
bool self_destruct_called = false;
auto contender = GfxLegacyContender(
/*respond*/ [](auto) {},
/*deliver_events_to_client*/
[&num_delivered_events](auto events) { num_delivered_events += events.size(); },
/*self_destruct*/ [&self_destruct_called] { self_destruct_called = true; });
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ false);
EXPECT_EQ(num_delivered_events, 0u);
EXPECT_FALSE(self_destruct_called);
// Win the contest. Deliver events.
contender.EndContest(kStreamId, /*awarded_win*/ true);
EXPECT_EQ(num_delivered_events, 1u);
EXPECT_FALSE(self_destruct_called);
// No destruction while stream is ongoing.
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ false);
EXPECT_EQ(num_delivered_events, 2u);
EXPECT_FALSE(self_destruct_called);
// Deliver the last event and then self destruct on stream end.
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ true);
EXPECT_EQ(num_delivered_events, 3u);
EXPECT_TRUE(self_destruct_called);
}
TEST(GfxLegacyContenderTest, ShouldSelfDescructOnWinAfterStreamEnd) {
uint64_t num_delivered_events = 0;
bool self_destruct_called = false;
auto contender = GfxLegacyContender(
/*respond*/ [](auto) {},
/*deliver_events_to_client*/
[&num_delivered_events](auto events) { num_delivered_events += events.size(); },
/*self_destruct*/ [&self_destruct_called] { self_destruct_called = true; });
contender.UpdateStream(kStreamId, /*event*/ {.timestamp = 0}, /*is_end_of_stream*/ true);
EXPECT_EQ(num_delivered_events, 0u);
EXPECT_FALSE(self_destruct_called);
// Win the contest. Deliver events.
contender.EndContest(kStreamId, /*awarded_win*/ true);
EXPECT_EQ(num_delivered_events, 1u);
EXPECT_TRUE(self_destruct_called);
}
} // namespace
} // namespace lib_ui_input_tests