blob: 87c73dd9347e881ef98e262c953188ee15799547 [file] [log] [blame]
/*
* Copyright (c) 2020-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"
#if !defined(__cplusplus)
#error This file must be compiled with C++
#endif
#if __has_feature(cxx_nullptr)
#error This file must be compiled with a version of C++ (98) that doesn't support nullptr
#endif
#pragma mark Helper classes
class IntCounter
{
public:
IntCounter()
: counter_(NULL)
{
}
~IntCounter()
{
if(counter_)
{
(*counter_)--;
}
}
void init(int *counter)
{
counter_ = counter;
if(counter_)
{
(*counter_)++;
}
}
private:
int *counter_;
};
@interface BaseFake98 : NSObject
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithCounter:(int *)counter NS_DESIGNATED_INITIALIZER;
@end
@interface DerivedFake98 : BaseFake98
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)initWithCounter:(int *)counter NS_DESIGNATED_INITIALIZER;
@end
@implementation BaseFake98
{
IntCounter _counter;
}
- (instancetype)initWithCounter:(int *)counter
{
self = [super init];
if(self)
{
_counter.init(counter);
}
return self;
}
@end
@implementation DerivedFake98
- (instancetype)initWithCounter:(int *)counter
{
return [super initWithCounter:counter];
}
@end
#pragma mark Tests
@interface OCMCPlusPlus98Tests : XCTestCase
@end
@implementation OCMCPlusPlus98Tests
- (void)testSetsUpStubReturningNilForIdReturnType
{
id mock = OCMPartialMock([NSArray arrayWithObject:@"Foo"]);
OCMExpect([mock lastObject]).andReturn(nil);
XCTAssertNil([mock lastObject], @"Should have returned stubbed value");
OCMExpect([mock lastObject]).andReturn(Nil);
XCTAssertNil([mock lastObject], @"Should have returned stubbed value");
}
- (void)testPartialMockBaseCXXDestruct
{
int counter = 0;
@autoreleasepool
{
BaseFake98 *fake = [[BaseFake98 alloc] initWithCounter:&counter];
XCTAssertEqual(counter, 1);
id __unused mockFake = OCMPartialMock(fake);
XCTAssertEqual(counter, 1);
}
XCTAssertEqual(counter, 0);
}
- (void)testPartialMockDerivedCXXDestruct
{
int counter = 0;
@autoreleasepool
{
DerivedFake98 *fake = [[DerivedFake98 alloc] initWithCounter:&counter];
XCTAssertEqual(counter, 1);
id __unused mockFake = OCMPartialMock(fake);
XCTAssertEqual(counter, 1);
}
XCTAssertEqual(counter, 0);
}
@end