Home | History | Annotate | Download | only in workspace
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ash/wm/workspace/magnetism_matcher.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 
      9 namespace ash {
     10 
     11 // Trivial test case verifying assertions on left edge.
     12 TEST(MagnetismMatcherTest, TrivialLeft) {
     13   const int distance = MagnetismMatcher::kMagneticDistance;
     14   const gfx::Rect initial_bounds(20, 10, 50, 60);
     15   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     16   EXPECT_FALSE(matcher.AreEdgesObscured());
     17   MatchedEdge edge;
     18   EXPECT_FALSE(matcher.ShouldAttach(
     19                    gfx::Rect(initial_bounds.x() - distance - 10,
     20                              initial_bounds.y() - distance - 10, 2, 3), &edge));
     21   EXPECT_FALSE(matcher.AreEdgesObscured());
     22   EXPECT_TRUE(matcher.ShouldAttach(
     23                   gfx::Rect(initial_bounds.x() - 2, initial_bounds.y(), 1, 1),
     24                   &edge));
     25   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
     26   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_LEADING, edge.secondary_edge);
     27 
     28   EXPECT_TRUE(matcher.ShouldAttach(
     29                   gfx::Rect(initial_bounds.x() - 2,
     30                             initial_bounds.y() + distance + 1 , 1, 1),
     31                   &edge));
     32   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
     33   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     34 }
     35 
     36 // Trivial test case verifying assertions on bottom edge.
     37 TEST(MagnetismMatcherTest, TrivialBottom) {
     38   const int distance = MagnetismMatcher::kMagneticDistance;
     39   const gfx::Rect initial_bounds(20, 10, 50, 60);
     40   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     41   EXPECT_FALSE(matcher.AreEdgesObscured());
     42   MatchedEdge edge;
     43   EXPECT_FALSE(matcher.ShouldAttach(
     44                    gfx::Rect(initial_bounds.x() - distance - 10,
     45                              initial_bounds.y() - distance - 10, 2, 3), &edge));
     46   EXPECT_FALSE(matcher.AreEdgesObscured());
     47   EXPECT_TRUE(matcher.ShouldAttach(
     48                   gfx::Rect(initial_bounds.x() - 2,
     49                             initial_bounds.bottom() + 4, 10, 1), &edge));
     50   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     51   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_LEADING, edge.secondary_edge);
     52 
     53   EXPECT_TRUE(matcher.ShouldAttach(
     54                   gfx::Rect(initial_bounds.x() + distance + 1,
     55                             initial_bounds.bottom() + 4, 10, 1), &edge));
     56   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     57   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     58 
     59   EXPECT_TRUE(matcher.ShouldAttach(
     60                   gfx::Rect(initial_bounds.right() - 10 - 1,
     61                             initial_bounds.bottom() + 4, 10, 1), &edge));
     62   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
     63   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_TRAILING, edge.secondary_edge);
     64 }
     65 
     66 // Verifies we don't match an obscured corner.
     67 TEST(MagnetismMatcherTest, ObscureLeading) {
     68   const int distance = MagnetismMatcher::kMagneticDistance;
     69   const gfx::Rect initial_bounds(20, 10, 150, 160);
     70   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
     71   MatchedEdge edge;
     72   // Overlap with the upper right corner.
     73   EXPECT_FALSE(matcher.ShouldAttach(
     74                    gfx::Rect(initial_bounds.right() - distance * 2,
     75                              initial_bounds.y() - distance - 2,
     76                              distance * 3,
     77                              (distance + 2) * 2), &edge));
     78   EXPECT_FALSE(matcher.AreEdgesObscured());
     79   // Verify doesn't match the following which is obscured by first.
     80   EXPECT_FALSE(matcher.ShouldAttach(
     81                    gfx::Rect(initial_bounds.right() + 1,
     82                              initial_bounds.y(),
     83                              distance,
     84                              5), &edge));
     85   // Should match the following which extends into non-overlapping region.
     86   EXPECT_TRUE(matcher.ShouldAttach(
     87                    gfx::Rect(initial_bounds.right() + 1,
     88                              initial_bounds.y() + distance + 1,
     89                              distance,
     90                              15), &edge));
     91   EXPECT_EQ(MAGNETISM_EDGE_RIGHT, edge.primary_edge);
     92   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
     93 }
     94 
     95 // Verifies obscuring one side doesn't obscure the other.
     96 TEST(MagnetismMatcherTest, DontObscureOtherSide) {
     97   const int distance = MagnetismMatcher::kMagneticDistance;
     98   const gfx::Rect initial_bounds(20, 10, 150, 160);
     99   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    100   MatchedEdge edge;
    101   // Overlap with the left side.
    102   EXPECT_FALSE(matcher.ShouldAttach(
    103                    gfx::Rect(initial_bounds.x() - distance + 1,
    104                              initial_bounds.y() + 2,
    105                              distance * 2 + 2,
    106                              initial_bounds.height() + distance * 4), &edge));
    107   EXPECT_FALSE(matcher.AreEdgesObscured());
    108   // Should match the right side since it isn't obscured.
    109   EXPECT_TRUE(matcher.ShouldAttach(
    110                    gfx::Rect(initial_bounds.right() - 1,
    111                              initial_bounds.y() + distance + 1,
    112                              distance,
    113                              5), &edge));
    114   EXPECT_EQ(MAGNETISM_EDGE_RIGHT, edge.primary_edge);
    115   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    116 }
    117 
    118 // Verifies we don't match an obscured center.
    119 TEST(MagnetismMatcherTest, ObscureCenter) {
    120   const int distance = MagnetismMatcher::kMagneticDistance;
    121   const gfx::Rect initial_bounds(20, 10, 150, 160);
    122   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    123   MatchedEdge edge;
    124   // Overlap with the center bottom edge.
    125   EXPECT_FALSE(matcher.ShouldAttach(
    126                    gfx::Rect(100, initial_bounds.bottom() - distance - 2,
    127                              20,
    128                              (distance + 2) * 2), &edge));
    129   EXPECT_FALSE(matcher.AreEdgesObscured());
    130   // Verify doesn't match the following which is obscured by first.
    131   EXPECT_FALSE(matcher.ShouldAttach(
    132                    gfx::Rect(110, initial_bounds.bottom() + 1,
    133                              10, 5), &edge));
    134   // Should match the following which extends into non-overlapping region.
    135   EXPECT_TRUE(matcher.ShouldAttach(
    136                   gfx::Rect(90,
    137                             initial_bounds.bottom() + 1,
    138                             10, 5), &edge));
    139   EXPECT_EQ(MAGNETISM_EDGE_BOTTOM, edge.primary_edge);
    140   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    141 }
    142 
    143 // Verifies we don't match an obscured trailing edge.
    144 TEST(MagnetismMatcherTest, ObscureTrailing) {
    145   const int distance = MagnetismMatcher::kMagneticDistance;
    146   const gfx::Rect initial_bounds(20, 10, 150, 160);
    147   MagnetismMatcher matcher(initial_bounds, kAllMagnetismEdges);
    148   MatchedEdge edge;
    149   // Overlap with the trailing left edge.
    150   EXPECT_FALSE(matcher.ShouldAttach(
    151                    gfx::Rect(initial_bounds.x() - distance - 2,
    152                              150,
    153                              (distance + 2) * 2,
    154                              50), &edge));
    155   EXPECT_FALSE(matcher.AreEdgesObscured());
    156   // Verify doesn't match the following which is obscured by first.
    157   EXPECT_FALSE(matcher.ShouldAttach(
    158                    gfx::Rect(initial_bounds.x() - 4,
    159                              160, 3, 20), &edge));
    160   // Should match the following which extends into non-overlapping region.
    161   EXPECT_TRUE(matcher.ShouldAttach(
    162                    gfx::Rect(initial_bounds.x() - 4,
    163                              140, 3, 20), &edge));
    164   EXPECT_EQ(MAGNETISM_EDGE_LEFT, edge.primary_edge);
    165   EXPECT_EQ(SECONDARY_MAGNETISM_EDGE_NONE, edge.secondary_edge);
    166 }
    167 
    168 }  // namespace ash
    169 
    170