// Copyright (c) 2011 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 <Cocoa/Cocoa.h>

#include "base/mac/scoped_nsobject.h"
#include "base/memory/ref_counted.h"
#import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/platform_test.h"
#include "ui/base/clipboard/clipboard_util_mac.h"
#import "ui/base/cocoa/find_pasteboard.h"

// A subclass of FindPasteboard that doesn't write to the real find pasteboard.
@interface FindPasteboardTesting : FindPasteboard {
 @public
  int notificationCount_;
 @private
  scoped_refptr<ui::UniquePasteboard> pboard_;
}
- (NSPasteboard*)findPboard;

- (void)callback:(id)sender;

// These are for checking that pasteboard content is copied to/from the
// FindPasteboard correctly.
- (NSString*)findPboardText;
- (void)setFindPboardText:(NSString*)text;
@end

@implementation FindPasteboardTesting

- (NSPasteboard*)findPboard {
  // This method is called by the super class's -init, otherwise initialization
  // would go into this class's -init.
  if (!pboard_)
    pboard_ = new ui::UniquePasteboard;
  return pboard_->get();
}

- (void)callback:(id)sender {
  ++notificationCount_;
}

- (void)setFindPboardText:(NSString*)text {
  [pboard_->get() declareTypes:[NSArray arrayWithObject:NSStringPboardType]
                         owner:nil];
  [pboard_->get() setString:text forType:NSStringPboardType];
}

- (NSString*)findPboardText {
  return [pboard_->get() stringForType:NSStringPboardType];
}
@end

namespace {

class FindPasteboardTest : public CocoaTest {
 public:
  FindPasteboardTest() {}

  void SetUp() override {
    CocoaTest::SetUp();
    pboard_.reset([[FindPasteboardTesting alloc] init]);
    ASSERT_TRUE(pboard_.get());
  }

  void TearDown() override {
    pboard_.reset();
    CocoaTest::TearDown();
  }

 protected:
  base::scoped_nsobject<FindPasteboardTesting> pboard_;
};

TEST_F(FindPasteboardTest, SettingTextUpdatesPboard) {
  [pboard_.get() setFindText:@"text"];
  EXPECT_EQ(
      NSOrderedSame,
      [[pboard_.get() findPboardText] compare:@"text"]);
}

TEST_F(FindPasteboardTest, ReadingFromPboardUpdatesFindText) {
  [pboard_.get() setFindPboardText:@"text"];
  [pboard_.get() loadTextFromPasteboard:nil];
  EXPECT_EQ(
      NSOrderedSame,
      [[pboard_.get() findText] compare:@"text"]);
}

TEST_F(FindPasteboardTest, SendsNotificationWhenTextChanges) {
  [[NSNotificationCenter defaultCenter]
      addObserver:pboard_.get()
         selector:@selector(callback:)
             name:kFindPasteboardChangedNotification
           object:pboard_.get()];
  EXPECT_EQ(0, pboard_.get()->notificationCount_);
  [pboard_.get() setFindText:@"text"];
  EXPECT_EQ(1, pboard_.get()->notificationCount_);
  [pboard_.get() setFindText:@"text"];
  EXPECT_EQ(1, pboard_.get()->notificationCount_);
  [pboard_.get() setFindText:@"other text"];
  EXPECT_EQ(2, pboard_.get()->notificationCount_);

  [pboard_.get() setFindPboardText:@"other text"];
  [pboard_.get() loadTextFromPasteboard:nil];
  EXPECT_EQ(2, pboard_.get()->notificationCount_);

  [pboard_.get() setFindPboardText:@"otherer text"];
  [pboard_.get() loadTextFromPasteboard:nil];
  EXPECT_EQ(3, pboard_.get()->notificationCount_);

  [[NSNotificationCenter defaultCenter] removeObserver:pboard_.get()];
}


}  // namespace
