aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMLightweightProxyTest.m
blob: cdf29b65a780f698920eda660cc1f30071894f1d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
//
//  GTMLightweightProxyTest.m
//
//  Copyright 2006-2008 Google Inc.
//
//  Licensed under the Apache License, Version 2.0 (the "License"); you may not
//  use this file except in compliance with the License.  You may obtain a copy
//  of the License at
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
//  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
//  License for the specific language governing permissions and limitations under
//  the License.
//

#import "GTMSenTestCase.h"
#import "GTMLightweightProxy.h"

@interface GTMLightweightProxy (GTMLightweightProxyTest)
- (id)init;
@end

@interface GTMLightweightProxyTest : GTMTestCase
- (BOOL)returnYes;
@end

// Declare a non-existent method that we can call without compiler warnings.
@interface GTMLightweightProxyTest (GTMLightweightProxyTestMadeUpMethodDeclaration)
- (void)someMadeUpMethod;
@end

@implementation GTMLightweightProxyTest

- (void)testInit {
  id proxy = [[[GTMLightweightProxy alloc]
               initWithRepresentedObject:self] autorelease];
  XCTAssertNotNil(proxy);

  proxy = [[[GTMLightweightProxy alloc] init] autorelease];
  XCTAssertNotNil(proxy);
}

- (void)testProxy {
  id proxy
    = [[[GTMLightweightProxy alloc] initWithRepresentedObject:self] autorelease];
  XCTAssertEqualObjects(self, [proxy representedObject],
                        @"Represented object setup failed");

  // Check that it identifies itself as a proxy.
  XCTAssertTrue([proxy isProxy], @"Should identify as a proxy");
  // Check that it passes class requests on
  XCTAssertTrue([proxy isMemberOfClass:[self class]],
                @"Should pass class requests through");

  // Check that it claims to respond to its selectors.
  XCTAssertTrue([proxy respondsToSelector:@selector(initWithRepresentedObject:)],
                @"Claims not to respond to initWithRepresentedObject:");
  XCTAssertTrue([proxy respondsToSelector:@selector(representedObject)],
                @"Claims not to respond to representedObject:");
  XCTAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
                @"Claims not to respond to setRepresentedObject:");
  // Check that it responds to its represented object's selectors
  XCTAssertTrue([proxy respondsToSelector:@selector(returnYes)],
                @"Claims not to respond to returnYes");
  // ... but not to made up selectors.
#if !(__IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_3_2 || __IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_4_0)
  // Exceptions thrown by - (void)doesNotRecognizeSelector:(SEL)aSelector
  // does not get caught on iOS 3.2 and greater.
  // http://openradar.appspot.com/radar?id=420401
  XCTAssertThrows([proxy someMadeUpMethod],
                  @"Calling a bogus method should throw");
#endif

  // Check that callthrough works.
  XCTAssertTrue([proxy returnYes],
                @"Calling through to the represented object failed");

  // Check that nilling out the represented object works.
  [proxy setRepresentedObject:nil];
  XCTAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
                @"Claims not to respond to setRepresentedObject: after nilling"
                @" out represented object");
  XCTAssertFalse([proxy respondsToSelector:@selector(returnYes)],
                  @"Claims to respond to returnYes after nilling out represented"
                  @" object");
  // Calling through once the represented object is nil should fail silently
  XCTAssertNoThrow([proxy returnYes],
                    @"Calling through without a represented object should fail"
                    @" silently");

  // ... even when they are made up.
#if !(__IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_3_2 || __IPHONE_OS_VERSION_MIN_REQUIRED == __IPHONE_4_0)
  // Exceptions thrown by - (void)doesNotRecognizeSelector:(SEL)aSelector
  // does not get caught on iOS 3.2 and greater.
  // http://openradar.appspot.com/radar?id=420401

  XCTAssertNoThrow([proxy someMadeUpMethod],
                   @"Calling a bogus method on a nilled proxy should not throw");
#endif

}

// Simple method to test calling through the proxy.
- (BOOL)returnYes {
  return YES;
}

@end