// 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.

#include "base/mac/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
#import "chrome/browser/ui/cocoa/fast_resize_view.h"

namespace {

class FastResizeViewTest : public CocoaTest {
 public:
  FastResizeViewTest() {
    NSRect frame = NSMakeRect(0, 0, 100, 30);
    base::scoped_nsobject<FastResizeView> view(
        [[FastResizeView alloc] initWithFrame:frame]);
    view_ = view.get();
    [[test_window() contentView] addSubview:view_];

    base::scoped_nsobject<NSView> childView(
        [[NSView alloc] initWithFrame:frame]);
    childView_ = childView.get();
    [view_ addSubview:childView_];
  }

  FastResizeView* view_;
  NSView* childView_;
};

TEST_VIEW(FastResizeViewTest, view_);

TEST_F(FastResizeViewTest, TestResizingOfChildren) {
  NSRect squareFrame = NSMakeRect(0, 0, 200, 200);
  NSRect rectFrame = NSMakeRect(1, 1, 150, 300);

  // Test that changing the view's frame also changes the child's frame.
  [view_ setFrame:squareFrame];
  EXPECT_TRUE(NSEqualRects([view_ bounds], [childView_ frame]));

  // Turn fast resize mode on and change the view's frame.  This time, the child
  // should not resize, but it should be anchored to the top left.
  [view_ setFastResizeMode:YES];
  [view_ setFrame:NSMakeRect(15, 30, 250, 250)];
  EXPECT_TRUE(NSEqualSizes([childView_ frame].size, squareFrame.size));
  EXPECT_EQ(NSMinX([view_ bounds]), NSMinX([childView_ frame]));
  EXPECT_EQ(NSMaxY([view_ bounds]), NSMaxY([childView_ frame]));

  // Another resize with fast resize mode on.
  [view_ setFrame:rectFrame];
  EXPECT_TRUE(NSEqualSizes([childView_ frame].size, squareFrame.size));
  EXPECT_EQ(NSMinX([view_ bounds]), NSMinX([childView_ frame]));
  EXPECT_EQ(NSMaxY([view_ bounds]), NSMaxY([childView_ frame]));

  // Turn fast resize mode off.  This should initiate an immediate resize, even
  // though we haven't called setFrame directly.
  [view_ setFastResizeMode:NO];
  EXPECT_TRUE(NSEqualRects([view_ frame], rectFrame));
  EXPECT_TRUE(NSEqualRects([view_ bounds], [childView_ frame]));
}

}  // namespace
