// Copyright (c) 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/nsview_additions.h"

#include "base/mac/scoped_nsobject.h"
#import "chrome/browser/ui/cocoa/cocoa_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"

typedef CocoaTest NSViewChromeAdditionsTest;

@interface ParentView : NSView {
 @private
  int removeCount_;
  int addCount_;
}

@property(readonly, nonatomic) int removeCount;
@property(readonly, nonatomic) int addCount;

@end

@implementation ParentView

@synthesize removeCount = removeCount_;
@synthesize addCount = addCount_;

- (void)willRemoveSubview:(NSView*)view {
  ++removeCount_;
}

- (void)didAddSubview:(NSView*)view {
  ++addCount_;
}

@end

TEST_F(NSViewChromeAdditionsTest, BelowAboveView) {
  base::scoped_nsobject<NSView> parent(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child1(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child2(
      [[NSView alloc] initWithFrame:NSZeroRect]);

  [parent addSubview:child1];
  [parent addSubview:child2];
  EXPECT_TRUE([child1 cr_isBelowView:child2]);
  EXPECT_FALSE([child1 cr_isAboveView:child2]);
  EXPECT_FALSE([child2 cr_isBelowView:child1]);
  EXPECT_TRUE([child2 cr_isAboveView:child1]);

  [child1 removeFromSuperview];
  [child2 removeFromSuperview];
  [parent addSubview:child2];
  [parent addSubview:child1];
  EXPECT_FALSE([child1 cr_isBelowView:child2]);
  EXPECT_TRUE([child1 cr_isAboveView:child2]);
  EXPECT_TRUE([child2 cr_isBelowView:child1]);
  EXPECT_FALSE([child2 cr_isAboveView:child1]);
}

TEST_F(NSViewChromeAdditionsTest, EnsurePosition) {
  base::scoped_nsobject<NSView> parent(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child1(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child2(
      [[NSView alloc] initWithFrame:NSZeroRect]);

  [parent addSubview:child1];
  [parent cr_ensureSubview:child2
              isPositioned:NSWindowAbove
                relativeTo:child1];
  EXPECT_NSEQ([[parent subviews] objectAtIndex:0], child1);
  EXPECT_NSEQ([[parent subviews] objectAtIndex:1], child2);

  [child2 removeFromSuperview];
  [parent cr_ensureSubview:child2
              isPositioned:NSWindowBelow
                relativeTo:child1];
  EXPECT_NSEQ([[parent subviews] objectAtIndex:0], child2);
  EXPECT_NSEQ([[parent subviews] objectAtIndex:1], child1);
}

// Verify that no view is removed or added when no change is needed.
TEST_F(NSViewChromeAdditionsTest, EnsurePositionNoChange) {
  base::scoped_nsobject<ParentView> parent(
      [[ParentView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child1(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  base::scoped_nsobject<NSView> child2(
      [[NSView alloc] initWithFrame:NSZeroRect]);
  [parent addSubview:child1];
  [parent addSubview:child2];

  EXPECT_EQ(0, [parent removeCount]);
  EXPECT_EQ(2, [parent addCount]);
  [parent cr_ensureSubview:child2
              isPositioned:NSWindowAbove
                relativeTo:child1];
  EXPECT_EQ(0, [parent removeCount]);
  EXPECT_EQ(2, [parent addCount]);
}
