1// Copyright (c) 2013 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 "chrome/browser/chromeos/accessibility/magnification_manager.h" 6 7#include "ash/magnifier/magnifier_constants.h" 8#include "ash/test/ash_test_base.h" 9#include "base/prefs/pref_service.h" 10#include "chrome/browser/chrome_notification_types.h" 11#include "chrome/common/pref_names.h" 12#include "chrome/test/base/testing_profile.h" 13#include "content/public/browser/notification_service.h" 14#include "testing/gtest/include/gtest/gtest.h" 15 16namespace chromeos { 17namespace { 18 19class MockMagnificationObserver : public content::NotificationObserver { 20 public: 21 MockMagnificationObserver() : observed_(false), 22 observed_enabled_(false), 23 observed_type_(ash::kDefaultMagnifierType) { 24 registrar_.Add( 25 this, 26 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER, 27 content::NotificationService::AllSources()); 28 } 29 30 bool observed() const { return observed_; } 31 bool observed_enabled() const { return observed_enabled_; } 32 ash::MagnifierType observed_type() const { return observed_type_; } 33 34 void reset() { observed_ = false; } 35 36 private: 37 // content::NotificationObserver implimentation: 38 virtual void Observe(int type, 39 const content::NotificationSource& source, 40 const content::NotificationDetails& details) OVERRIDE { 41 switch (type) { 42 case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER: 43 AccessibilityStatusEventDetails* accessibility_status = 44 content::Details<AccessibilityStatusEventDetails>(details).ptr(); 45 46 observed_ = true; 47 observed_enabled_ = accessibility_status->enabled; 48 observed_type_ = accessibility_status->magnifier_type; 49 } 50 } 51 52 bool observed_; 53 bool observed_enabled_; 54 ash::MagnifierType observed_type_; 55 56 content::NotificationRegistrar registrar_; 57}; 58 59void EnableMagnifier() { 60 return MagnificationManager::Get()->SetMagnifierEnabled(true); 61} 62 63void DisableMagnifier() { 64 return MagnificationManager::Get()->SetMagnifierEnabled(false); 65} 66 67bool IsMagnifierEnabled() { 68 return MagnificationManager::Get()->IsMagnifierEnabled(); 69} 70 71ash::MagnifierType GetMagnifierType() { 72 return MagnificationManager::Get()->GetMagnifierType(); 73} 74 75void SetMagnifierType(ash::MagnifierType type) { 76 return MagnificationManager::Get()->SetMagnifierType(type); 77} 78 79} // namespace 80 81class MagnificationManagerTest : public ash::test::AshTestBase { 82 public: 83 MagnificationManagerTest() { 84 } 85 86 virtual void SetUp() OVERRIDE { 87 ash::test::AshTestBase::SetUp(); 88 MagnificationManager::Initialize(); 89 ASSERT_TRUE(MagnificationManager::Get()); 90 MagnificationManager::Get()->SetProfileForTest(&profile_); 91 } 92 93 virtual void TearDown() OVERRIDE { 94 MagnificationManager::Shutdown(); 95 ash::test::AshTestBase::TearDown(); 96 } 97 98 TestingProfile profile_; 99}; 100 101TEST_F(MagnificationManagerTest, MagnificationObserver) { 102 MockMagnificationObserver observer; 103 104 EXPECT_FALSE(observer.observed()); 105 106 // Set full screen magnifier, and confirm the observer is called. 107 EnableMagnifier(); 108 SetMagnifierType(ash::MAGNIFIER_FULL); 109 EXPECT_TRUE(observer.observed()); 110 EXPECT_TRUE(observer.observed_enabled()); 111 EXPECT_EQ(observer.observed_type(), ash::MAGNIFIER_FULL); 112 EXPECT_EQ(GetMagnifierType(), ash::MAGNIFIER_FULL); 113 observer.reset(); 114 115 // Set full screen magnifier again, and confirm the observer is not called. 116 SetMagnifierType(ash::MAGNIFIER_FULL); 117 EXPECT_FALSE(observer.observed()); 118 EXPECT_EQ(GetMagnifierType(), ash::MAGNIFIER_FULL); 119 observer.reset(); 120} 121 122TEST_F(MagnificationManagerTest, ChangeType) { 123 // Set full screen magnifier, and confirm the status is set successfully. 124 EnableMagnifier(); 125 SetMagnifierType(ash::MAGNIFIER_FULL); 126 EXPECT_TRUE(IsMagnifierEnabled()); 127 EXPECT_EQ(GetMagnifierType(), ash::MAGNIFIER_FULL); 128 129 // Set partial screen magnifier, and confirm the change is ignored. 130 SetMagnifierType(ash::MAGNIFIER_PARTIAL); 131 EXPECT_TRUE(IsMagnifierEnabled()); 132 EXPECT_EQ(GetMagnifierType(), ash::MAGNIFIER_FULL); 133 134 // Disables magnifier, and confirm the status is set successfully. 135 DisableMagnifier(); 136 EXPECT_FALSE(IsMagnifierEnabled()); 137 EXPECT_EQ(GetMagnifierType(), ash::MAGNIFIER_FULL); 138} 139 140} // namespace chromeos 141