blob: d7637190c8be6fd1a0f0e8e4dac1da81da8ea186 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ui/base/cocoa/constrained_window/constrained_window_animation.h"
#include <memory>
#include "base/mac/scoped_nsobject.h"
#include "base/message_loop/message_pump_mac.h"
#import "ui/gfx/test/ui_cocoa_test_helper.h"
// This class runs an animation for exactly two frames then end it.
@interface ConstrainedWindowAnimationTestDelegate
: NSObject<NSAnimationDelegate> {
@private
CGFloat frameCount_;
std::unique_ptr<base::MessagePumpNSRunLoop> message_pump_;
}
- (void)runAnimation:(NSAnimation*)animation;
@end
@implementation ConstrainedWindowAnimationTestDelegate
- (id)init {
if ((self = [super init]))
message_pump_.reset(new base::MessagePumpNSRunLoop);
return self;
}
- (float)animation:(NSAnimation*)animation
valueForProgress:(NSAnimationProgress)progress {
++frameCount_;
if (frameCount_ >= 2)
[animation setDuration:0.0];
return frameCount_ == 1 ? 0.2 : 0.6;
}
- (void)animationDidEnd:(NSAnimation*)animation {
EXPECT_EQ(2, frameCount_);
message_pump_->Quit();
}
- (void)runAnimation:(NSAnimation*)animation {
// This class will end the animation after 2 frames. Set a large duration to
// ensure that both frames are processed.
[animation setDuration:600];
[animation setDelegate:self];
[animation startAnimation];
message_pump_->Run(NULL);
}
@end
class ConstrainedWindowAnimationTest : public ui::CocoaTest {
protected:
ConstrainedWindowAnimationTest() : CocoaTest() {
delegate_.reset([[ConstrainedWindowAnimationTestDelegate alloc] init]);
}
base::scoped_nsobject<ConstrainedWindowAnimationTestDelegate> delegate_;
};
// Test the show animation.
TEST_F(ConstrainedWindowAnimationTest, Show) {
base::scoped_nsobject<NSAnimation> animation(
[[ConstrainedWindowAnimationShow alloc] initWithWindow:test_window()]);
[delegate_ runAnimation:animation];
}
// Test the hide animation.
TEST_F(ConstrainedWindowAnimationTest, Hide) {
base::scoped_nsobject<NSAnimation> animation(
[[ConstrainedWindowAnimationHide alloc] initWithWindow:test_window()]);
[delegate_ runAnimation:animation];
}
// Test the pulse animation.
TEST_F(ConstrainedWindowAnimationTest, Pulse) {
base::scoped_nsobject<NSAnimation> animation(
[[ConstrainedWindowAnimationPulse alloc] initWithWindow:test_window()]);
[delegate_ runAnimation:animation];
}