15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/disambiguation_popup_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// these constants are copied from the implementation class
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDisambiguationPopupMaxScale = 5.0;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const float kDisambiguationPopupMinScale = 2.0;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // unnamed namespace
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DisambiguationPopupHelperUnittest : public testing::Test {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisambiguationPopupHelperUnittest()
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : kScreenSize_(640, 480)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      , kVisibleContentSize_(640, 480)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      , kImplScale_(1) { }
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size kScreenSize_;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Size kVisibleContentSize_;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kImplScale_;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, ClipByViewport) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tap_rect(1000, 1000, 10, 10);
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(1));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_rects[0] = gfx::Rect(-20, -20, 10, 10);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect zoom_rect;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &zoom_rect);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_LE(kDisambiguationPopupMinScale, scale);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale));
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size)));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, MiniTarget) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tap_rect(-5, -5, 20, 20);
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(1));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_rects[0] = gfx::Rect(10, 10, 1, 1);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect zoom_rect;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &zoom_rect);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDisambiguationPopupMaxScale, scale);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(zoom_rect.Contains(target_rects[0]));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size)));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DisambiguationPopupHelperUnittest, LongLinks) {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect tap_rect(10, 10, 20, 20);
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebVector<blink::WebRect> target_rects(static_cast<size_t>(2));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_rects[0] = gfx::Rect(15, 15, 1000, 5);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  target_rects[1] = gfx::Rect(15, 25, 1000, 5);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect zoom_rect;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float scale = DisambiguationPopupHelper::ComputeZoomAreaAndScaleFactor(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tap_rect, target_rects, kScreenSize_, kVisibleContentSize_, kImplScale_,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &zoom_rect);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kVisibleContentSize_).Contains(zoom_rect));
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kDisambiguationPopupMaxScale, scale);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(zoom_rect.Contains(tap_rect));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size scaled_size = ToCeiledSize(ScaleSize(zoom_rect.size(), scale));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gfx::Rect(kScreenSize_).Contains(gfx::Rect(scaled_size)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace content
89