aboutsummaryrefslogtreecommitdiff
path: root/Foundation/GTMLightweightProxyTest.m
blob: ad0961e49ef8476ff35aaf67c9943b4070df9642 (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
//
//  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 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)testProxy {
  id proxy = [[GTMLightweightProxy alloc] initWithRepresentedObject:self];
  STAssertEqualObjects(self, [proxy representedObject], @"Represented object setup failed");
  
  // Check that it identifies itself as a proxy.
  STAssertTrue([proxy isProxy], @"Should identify as a proxy");
  // Check that it passes class requests on
  STAssertTrue([proxy isMemberOfClass:[self class]], @"Should pass class requests through");
  
  // Check that it claims to respond to its selectors.
  STAssertTrue([proxy respondsToSelector:@selector(initWithRepresentedObject:)],
               @"Claims not to respond to initWithRepresentedObject:");
  STAssertTrue([proxy respondsToSelector:@selector(representedObject)],
               @"Claims not to respond to representedObject:");
  STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
               @"Claims not to respond to setRepresentedObject:");
  // Check that it responds to its represented object's selectors
  STAssertTrue([proxy respondsToSelector:@selector(returnYes)],
               @"Claims not to respond to returnYes");
  // ... but not to made up selectors.
  STAssertThrows([proxy someMadeUpMethod], @"Calling a bogus method should throw");
  
  // Check that callthrough works.
  STAssertTrue([proxy returnYes],
               @"Calling through to the represented object failed");
  
  // Check that nilling out the represented object works.
  [proxy setRepresentedObject:nil];
  STAssertTrue([proxy respondsToSelector:@selector(setRepresentedObject:)],
               @"Claims not to respond to setRepresentedObject: after nilling out represented object");
  STAssertFalse([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
  STAssertNoThrow([proxy returnYes],
                  @"Calling through without a represented object should fail silently");
  // ... even when they are made up.
  STAssertNoThrow([proxy someMadeUpMethod], @"Calling a bogus method on a nilled proxy should not throw");
}

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

@end