blob: 68a5b562cad0eda85fe59668979da28fb500006c [file] [log] [blame]
/*
* Copyright (c) 2013-2021 Erik Doernenburg and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use these files 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 <XCTest/XCTest.h>
#import "OCMock.h"
#pragma mark Helper classes and protocols for testing
@protocol TestProtocol
+ (NSString *)stringValueClassMethod;
- (int)primitiveValue;
@optional
- (id)objectValue;
- (void)voidWithArgument:(id)argument;
@end
@interface InterfaceForTypedef : NSObject
{
int prop1;
NSObject *prop2;
}
@end
@implementation InterfaceForTypedef
@end
typedef InterfaceForTypedef TypedefInterface;
typedef InterfaceForTypedef *PointerTypedefInterface;
@protocol ProtocolWithTypedefs
- (TypedefInterface *)typedefReturnValue1;
- (PointerTypedefInterface)typedefReturnValue2;
- (void)typedefParameter:(TypedefInterface *)parameter;
@end
@interface OCMockObjectProtocolMocksTests : XCTestCase
@end
@implementation OCMockObjectProtocolMocksTests
#pragma mark Tests
- (void)testCanMockFormalProtocol
{
id mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
[[mock expect] lock];
[mock lock];
[mock verify];
}
- (void)testDescription
{
id mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
XCTAssertEqualObjects([mock description], @"OCProtocolMockObject(NSLocking)");
}
- (void)testRaisesWhenUnknownMethodIsCalledOnProtocol
{
id mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
XCTAssertThrows([mock lowercaseString], @"Should have raised an exception.");
}
- (void)testConformsToMockedProtocol
{
id mock = [OCMockObject mockForProtocol:@protocol(NSLocking)];
XCTAssertTrue([mock conformsToProtocol:@protocol(NSLocking)]);
}
- (void)testRespondsToValidProtocolRequiredSelector
{
id mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
XCTAssertTrue([mock respondsToSelector:@selector(primitiveValue)]);
}
- (void)testRespondsToValidProtocolOptionalSelector
{
id mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
XCTAssertTrue([mock respondsToSelector:@selector(objectValue)]);
}
- (void)testDoesNotRespondToInvalidProtocolSelector
{
id mock = [OCMockObject mockForProtocol:@protocol(TestProtocol)];
XCTAssertFalse([mock respondsToSelector:@selector(testDoesNotRespondToInvalidProtocolSelector)]);
}
- (void)testWithTypedefReturnType
{
id mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
XCTAssertNoThrow([[[mock stub] andReturn:[TypedefInterface new]] typedefReturnValue1], @"Should accept a typedefed return-type");
XCTAssertNoThrow([mock typedefReturnValue1]);
}
- (void)testWithTypedefPointerReturnType
{
id mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
XCTAssertNoThrow([[[mock stub] andReturn:[TypedefInterface new]] typedefReturnValue2], @"Should accept a typedefed return-type");
XCTAssertNoThrow([mock typedefReturnValue2]);
}
- (void)testWithTypedefParameter
{
id mock = [OCMockObject mockForProtocol:@protocol(ProtocolWithTypedefs)];
XCTAssertNoThrow([[mock stub] typedefParameter:nil], @"Should accept a typedefed parameter-type");
XCTAssertNoThrow([mock typedefParameter:nil]);
}
- (void)testReturnDefaultValueWhenUnknownMethodIsCalledOnNiceProtocolMock
{
id mock = [OCMockObject niceMockForProtocol:@protocol(TestProtocol)];
XCTAssertTrue(0 == [mock primitiveValue], @"Should return 0 on unexpected method call (for nice mock).");
[mock verify];
}
- (void)testRaisesAnExceptionWenAnExpectedMethodIsNotCalledOnNiceProtocolMock
{
id mock = [OCMockObject niceMockForProtocol:@protocol(TestProtocol)];
[[mock expect] primitiveValue];
XCTAssertThrows([mock verify], @"Should have raised an exception because method was not called.");
}
- (void)testProtocolClassMethod
{
id mock = OCMProtocolMock(@protocol(TestProtocol));
OCMStub([mock stringValueClassMethod]).andReturn(@"stubbed");
id result = [mock stringValueClassMethod];
XCTAssertEqual(@"stubbed", result, @"Should have stubbed the class method.");
}
- (void)testRefusesToCreateProtocolMockForNilProtocol
{
XCTAssertThrows(OCMProtocolMock(nil));
}
- (void)testArgumentsGetReleasedAfterStopMocking
{
__weak id weakArgument;
id mock = OCMProtocolMock(@protocol(TestProtocol));
@autoreleasepool
{
NSObject *argument = [NSObject new];
weakArgument = argument;
[mock voidWithArgument:argument];
[mock stopMocking];
}
XCTAssertNil(weakArgument);
}
@end