Home | History | Annotate | Download | only in cocoa
      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 
     40 namespace ObjcEvilDoers {
     41 
     42 TEST(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 
     60 TEST(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