// Copyright 2013 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 "chrome/browser/ui/cocoa/screen_capture_notification_ui_cocoa.h"

#include "base/bind.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/cocoa/cocoa_test_helper.h"

@interface ScreenCaptureNotificationController (ExposedForTesting)
- (NSButton*)stopButton;
- (NSButton*)minimizeButton;
@end

@implementation ScreenCaptureNotificationController (ExposedForTesting)
- (NSButton*)stopButton {
  return stopButton_;
}

- (NSButton*)minimizeButton {
  return minimizeButton_;
}
@end

class ScreenCaptureNotificationUICocoaTest : public CocoaTest {
 public:
  ScreenCaptureNotificationUICocoaTest()
      : callback_called_(0) {
  }

  virtual void TearDown() OVERRIDE {
    callback_called_ = 0;
    target_.reset();
    EXPECT_EQ(0, callback_called_);

    CocoaTest::TearDown();
  }

  void StopCallback() {
    ++callback_called_;
  }

 protected:
  ScreenCaptureNotificationController* controller() {
    return target_->windowController_.get();
  }

  scoped_ptr<ScreenCaptureNotificationUICocoa> target_;
  int callback_called_;

  DISALLOW_COPY_AND_ASSIGN(ScreenCaptureNotificationUICocoaTest);
};

TEST_F(ScreenCaptureNotificationUICocoaTest, CreateAndDestroy) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
}

TEST_F(ScreenCaptureNotificationUICocoaTest, CreateAndStart) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));
}

TEST_F(ScreenCaptureNotificationUICocoaTest, LongTitle) {
  target_.reset(new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16(
      "Very long title, with very very very very very very very very "
      "very very very very very very very very very very very very many "
      "words")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));
  // The elided label sometimes is a few pixels longer than the max width. So
  // allow a 5px off from the 1000px maximium.
  EXPECT_LE(NSWidth([[controller() window] frame]), 1005);
}

TEST_F(ScreenCaptureNotificationUICocoaTest, ShortTitle) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));
  EXPECT_EQ(460, NSWidth([[controller() window] frame]));
}

TEST_F(ScreenCaptureNotificationUICocoaTest, ClickStop) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));

  [[controller() stopButton] performClick:nil];
  EXPECT_EQ(1, callback_called_);
}

TEST_F(ScreenCaptureNotificationUICocoaTest, CloseWindow) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));

  [[controller() window] close];

  EXPECT_EQ(1, callback_called_);
}

TEST_F(ScreenCaptureNotificationUICocoaTest, MinimizeWindow) {
  target_.reset(
      new ScreenCaptureNotificationUICocoa(base::UTF8ToUTF16("Title")));
  target_->OnStarted(
      base::Bind(&ScreenCaptureNotificationUICocoaTest::StopCallback,
                 base::Unretained(this)));

  [[controller() minimizeButton] performClick:nil];

  EXPECT_EQ(0, callback_called_);
  EXPECT_TRUE([[controller() window] isMiniaturized]);
}
