123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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 "ios/testing/scoped_block_swizzler.h"
- #include "base/mac/foundation_util.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";
- using ScopedBlockSwizzlerTest = PlatformTest;
- // Tests that swizzling a class method works properly.
- TEST_F(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_F(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_F(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
|