blob: cde7e692fd676198cf1ecd6594d291f5df1420b5 [file] [log] [blame] [edit]
// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <memory>
#include "cobalt/page_visibility/page_visibility_state.h"
#include "base/debug/stack_trace.h"
#include "base/logging.h"
#include "cobalt/base/application_state.h"
#include "cobalt/page_visibility/visibility_state.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace cobalt {
namespace page_visibility {
namespace {
using ::testing::_;
class MockPageVisibilityStateObserver : public PageVisibilityState::Observer {
public:
static std::unique_ptr<MockPageVisibilityStateObserver> Create() {
return std::unique_ptr<MockPageVisibilityStateObserver>(
new ::testing::StrictMock<MockPageVisibilityStateObserver>());
}
MOCK_METHOD1(OnWindowFocusChanged, void(bool has_focus));
MOCK_METHOD1(OnVisibilityStateChanged,
void(VisibilityState visibility_state));
protected:
MockPageVisibilityStateObserver() {}
};
TEST(PageVisibilityStateTest, DefaultConstructor) {
PageVisibilityState state;
EXPECT_TRUE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
}
TEST(PageVisibilityStateTest, InitialStateConstructorStarted) {
PageVisibilityState state(base::kApplicationStateStarted);
EXPECT_TRUE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
}
TEST(PageVisibilityStateTest, TransitionsAndObservations) {
PageVisibilityState state(base::kApplicationStateStarted);
std::unique_ptr<MockPageVisibilityStateObserver> observer =
MockPageVisibilityStateObserver::Create();
EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
EXPECT_TRUE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
state.AddObserver(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(false));
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStatePaused);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(true));
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStateStarted);
EXPECT_TRUE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(false));
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStatePaused);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateHidden));
EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStateSuspended);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnVisibilityStateChanged(kVisibilityStateVisible));
EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStatePaused);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(true));
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStateStarted);
EXPECT_TRUE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
state.RemoveObserver(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStatePaused);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateVisible, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
EXPECT_CALL(*observer, OnWindowFocusChanged(_)).Times(0);
EXPECT_CALL(*observer, OnVisibilityStateChanged(_)).Times(0);
state.SetApplicationState(base::kApplicationStateSuspended);
EXPECT_FALSE(state.HasWindowFocus());
EXPECT_EQ(kVisibilityStateHidden, state.GetVisibilityState());
::testing::Mock::VerifyAndClearExpectations(observer.get());
}
} // namespace
} // namespace page_visibility
} // namespace cobalt