1// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "chrome/browser/ui/cocoa/objc_method_swizzle.h" 6 7#include "base/memory/scoped_nsobject.h" 8#include "testing/gtest/include/gtest/gtest.h" 9 10@interface ObjcMethodSwizzleTest : NSObject 11- (id)self; 12 13- (NSInteger)one; 14- (NSInteger)two; 15@end 16 17@implementation ObjcMethodSwizzleTest : NSObject 18- (id)self { 19 return [super self]; 20} 21 22- (NSInteger)one { 23 return 1; 24} 25- (NSInteger)two { 26 return 2; 27} 28@end 29 30@interface ObjcMethodSwizzleTest (ObjcMethodSwizzleTestCategory) 31- (NSUInteger)hash; 32@end 33 34@implementation ObjcMethodSwizzleTest (ObjcMethodSwizzleTestCategory) 35- (NSUInteger)hash { 36 return [super hash]; 37} 38@end 39 40namespace ObjcEvilDoers { 41 42TEST(ObjcMethodSwizzleTest, GetImplementedInstanceMethod) { 43 EXPECT_EQ(class_getInstanceMethod([NSObject class], @selector(dealloc)), 44 GetImplementedInstanceMethod([NSObject class], @selector(dealloc))); 45 EXPECT_EQ(class_getInstanceMethod([NSObject class], @selector(self)), 46 GetImplementedInstanceMethod([NSObject class], @selector(self))); 47 EXPECT_EQ(class_getInstanceMethod([NSObject class], @selector(hash)), 48 GetImplementedInstanceMethod([NSObject class], @selector(hash))); 49 50 Class testClass = [ObjcMethodSwizzleTest class]; 51 EXPECT_EQ(class_getInstanceMethod(testClass, @selector(self)), 52 GetImplementedInstanceMethod(testClass, @selector(self))); 53 EXPECT_NE(class_getInstanceMethod([NSObject class], @selector(self)), 54 class_getInstanceMethod(testClass, @selector(self))); 55 56 EXPECT_TRUE(class_getInstanceMethod(testClass, @selector(dealloc))); 57 EXPECT_FALSE(GetImplementedInstanceMethod(testClass, @selector(dealloc))); 58} 59 60TEST(ObjcMethodSwizzleTest, SwizzleImplementedInstanceMethods) { 61 scoped_nsobject<ObjcMethodSwizzleTest> object( 62 [[ObjcMethodSwizzleTest alloc] init]); 63 EXPECT_EQ([object one], 1); 64 EXPECT_EQ([object two], 2); 65 66 Class testClass = [object class]; 67 SwizzleImplementedInstanceMethods(testClass, @selector(one), @selector(two)); 68 EXPECT_EQ([object one], 2); 69 EXPECT_EQ([object two], 1); 70 71 SwizzleImplementedInstanceMethods(testClass, @selector(one), @selector(two)); 72 EXPECT_EQ([object one], 1); 73 EXPECT_EQ([object two], 2); 74} 75 76} // namespace ObjcEvilDoers 77