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

#include "base/mac/foundation_util.h"
#include "ios/chrome/test/base/scoped_block_swizzler.h"
#include "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#include "testing/platform_test.h"

#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif

// Class containing two methods that will be swizzled by the unittests.
@interface ScopedBlockSwizzlerTestClass : NSObject

// An NSString property that will be accessed by one of the swizzled methods.
@property(nonatomic, copy) NSString* value;

+ (NSString*)classMethodToSwizzle;
- (NSString*)instanceMethodToSwizzle;
@end

namespace {

NSString* const kOriginalClassValue = @"Bar";
NSString* const kSwizzledClassValue = @"Foo";
NSString* const kOriginalInstanceValue = @"Bizz";
NSString* const kSwizzledInstanceValue = @"Buzz";

// Tests that swizzling a class method works properly.
TEST(ScopedBlockSwizzlerTest, SwizzlingClassMethods) {
  EXPECT_NSEQ(kOriginalClassValue,
              [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);

  {
    id block = ^NSString*(id self) { return kSwizzledClassValue; };
    ScopedBlockSwizzler swizzler([ScopedBlockSwizzlerTestClass class],
                                 @selector(classMethodToSwizzle), block);
    EXPECT_NSEQ(kSwizzledClassValue,
                [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
  }

  EXPECT_NSEQ(kOriginalClassValue,
              [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
}

// Tests that swizzling an instance method works properly.
TEST(ScopedBlockSwizzlerTest, SwizzlingInstanceMethod) {
  ScopedBlockSwizzlerTestClass* target =
      [[ScopedBlockSwizzlerTestClass alloc] init];
  target.value = kSwizzledInstanceValue;

  EXPECT_NSEQ(kOriginalInstanceValue, [target instanceMethodToSwizzle]);
  EXPECT_FALSE([[target instanceMethodToSwizzle]
      isEqualToString:kSwizzledInstanceValue]);

  {
    id block = ^NSString*(id self) {
      return base::mac::ObjCCastStrict<ScopedBlockSwizzlerTestClass>(self)
          .value;
    };
    ScopedBlockSwizzler swizzler([ScopedBlockSwizzlerTestClass class],
                                 @selector(instanceMethodToSwizzle), block);
    EXPECT_NSEQ(kSwizzledInstanceValue, [target instanceMethodToSwizzle]);
  }

  EXPECT_NSEQ(kOriginalInstanceValue, [target instanceMethodToSwizzle]);
}

// Tests that calling |ScopedBlockSwizzler::reset()| properly unswizzles the
// method.
TEST(ScopedBlockSwizzlerTest, TestReset) {
  EXPECT_NSEQ(kOriginalClassValue,
              [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);

  id block = ^NSString*(id self) { return kSwizzledClassValue; };
  std::unique_ptr<ScopedBlockSwizzler> swizzler(
      new ScopedBlockSwizzler([ScopedBlockSwizzlerTestClass class],
                              @selector(classMethodToSwizzle), block));
  EXPECT_NSEQ(kSwizzledClassValue,
              [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);

  swizzler.reset();
  EXPECT_NSEQ(kOriginalClassValue,
              [ScopedBlockSwizzlerTestClass classMethodToSwizzle]);
}

}  // namespace

#pragma mark - ScopedBlockSwizzlerTestClass

@implementation ScopedBlockSwizzlerTestClass

@synthesize value = _value;

+ (NSString*)classMethodToSwizzle {
  return kOriginalClassValue;
}

- (NSString*)instanceMethodToSwizzle {
  return kOriginalInstanceValue;
}

@end
