blob: 811b4c97c90d43d9e85c2ce45b45eb477826b30a [file] [log] [blame]
/*
* Copyright (C) 2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "Test.h"
#include <CoreGraphics/CGGeometry.h>
#include <WebKit/FullscreenTouchSecheuristic.h>
namespace WebKit {
static void configureSecheuristic(FullscreenTouchSecheuristic& secheuristic)
{
secheuristic.setRampUpSpeed(0.25_s);
secheuristic.setRampDownSpeed(1_s);
secheuristic.setGamma(0.1);
secheuristic.setGammaCutoff(0.08);
secheuristic.setSize(CGSizeMake(100, 100));
secheuristic.reset();
}
TEST(FullscreenTouchSecheuristic, Basic)
{
using namespace WebKit;
FullscreenTouchSecheuristic secheuristic;
configureSecheuristic(secheuristic);
ASSERT_EQ(secheuristic.scoreOfNextTouch({0, 0}, 0_s), 0);
ASSERT_EQ(secheuristic.scoreOfNextTouch({0, 0}, .25_s), 0);
ASSERT_GT(secheuristic.scoreOfNextTouch({50, 50}, .25_s), 0);
secheuristic.reset();
secheuristic.setXWeight(0);
secheuristic.setYWeight(1);
ASSERT_EQ(secheuristic.scoreOfNextTouch({0, 0}, 0_s), 0);
ASSERT_EQ(secheuristic.scoreOfNextTouch({50, 0}, .25_s), 0);
ASSERT_GT(secheuristic.scoreOfNextTouch({0, 50}, .25_s), 0);
secheuristic.reset();
secheuristic.setXWeight(1);
secheuristic.setYWeight(0);
ASSERT_EQ(secheuristic.scoreOfNextTouch({0, 0}, 0_s), 0);
ASSERT_EQ(secheuristic.scoreOfNextTouch({0, 50}, .25_s), 0);
ASSERT_GT(secheuristic.scoreOfNextTouch({50, 0}, .25_s), 0);
}
TEST(FullscreenTouchSecheuristic, TapOnceVsTapTwice)
{
using namespace WebKit;
FullscreenTouchSecheuristic twice;
configureSecheuristic(twice);
static const auto tapDelta = 0.25_s;
static const auto tapDuration = 0.1_s;
static const CGPoint location1 {0, 0};
static const CGPoint location2 {50, 50};
auto twiceScore = twice.scoreOfNextTouch(location1, 0_s);
twiceScore = twice.scoreOfNextTouch(location1, tapDuration);
ASSERT_EQ(twiceScore, 0);
FullscreenTouchSecheuristic once;
configureSecheuristic(once);
auto onceScore = once.scoreOfNextTouch(location1, tapDuration);
ASSERT_EQ(onceScore, 0);
for (auto i = 0; i < 20; ++i) {
twiceScore = twice.scoreOfNextTouch(location2, tapDelta);
twiceScore = twice.scoreOfNextTouch(location2, tapDuration);
twiceScore = twice.scoreOfNextTouch(location1, tapDelta);
twiceScore = twice.scoreOfNextTouch(location1, tapDuration);
}
for (auto i = 0; i < 20; ++i) {
onceScore = once.scoreOfNextTouch(location2, tapDelta + tapDuration);
onceScore = once.scoreOfNextTouch(location1, tapDelta + tapDuration);
}
ASSERT_LT(abs(twiceScore - onceScore), 0.01);
}
TEST(FullscreenTouchSecheuristic, WKFullScreenViewControllerParameters)
{
using namespace WebKit;
static const auto tapDelta = 0.25_s;
static const auto tapDuration = 0.1_s;
static const CGPoint locations[] = {
{1556, 1604},
{1883, 1427},
{1460, 1786},
{1930, 1602},
{760, 1430},
{760, 1430},
{200, 1780},
{470, 1280},
{430, 1610},
{2080, 1430},
{2080, 1430},
{1930, 1600},
{760, 1430},
{2570, 1620},
};
FullscreenTouchSecheuristic secheuristic;
secheuristic.setParameters(FullscreenTouchSecheuristicParameters::iosParameters());
secheuristic.setSize(CGSizeMake(2732, 2048));
secheuristic.reset();
size_t successfulTaps = 0;
for (auto& location : locations) {
auto score = secheuristic.scoreOfNextTouch(location, tapDelta + tapDuration);
if (score > secheuristic.requiredScore())
break;
++successfulTaps;
}
ASSERT_LT(successfulTaps, std::size(locations));
}
}