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/common/mac/objc_method_swizzle.h"
6
7#include "base/mac/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  base::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