| /* |
| * 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 "OCMArg.h" |
| #import "OCMConstraint.h" |
| #import "OCMPassByRefSetter.h" |
| |
| #if TARGET_OS_IPHONE |
| #define NSRect CGRect |
| #define NSZeroRect CGRectZero |
| #define NSMakeRect CGRectMake |
| #define valueWithRect valueWithCGRect |
| #endif |
| |
| @interface OCMArgTests : XCTestCase |
| |
| @end |
| |
| |
| @implementation OCMArgTests |
| |
| - (void)testValueMacroCreatesCorrectValueObjects |
| { |
| NSRange range = NSMakeRange(5, 5); |
| XCTAssertEqualObjects(OCMOCK_VALUE(range), [NSValue valueWithRange:range]); |
| #ifndef __arm64__ |
| // This should work everywhere but I can't get it to work on arm64 |
| XCTAssertEqualObjects(OCMOCK_VALUE((BOOL){YES}), @YES); |
| #endif |
| XCTAssertEqualObjects(OCMOCK_VALUE(42), @42); |
| #if !TARGET_OS_IPHONE |
| XCTAssertEqualObjects(OCMOCK_VALUE(NSZeroRect), [NSValue valueWithRect:NSZeroRect]); |
| #endif |
| XCTAssertEqualObjects(OCMOCK_VALUE([@"0123456789" rangeOfString:@"56789"]), [NSValue valueWithRange:range]); |
| } |
| |
| - (void)testIsKindOfClassCheck |
| { |
| OCMBlockConstraint *constraint = [OCMArg isKindOfClass:[NSString class]]; |
| |
| XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted \"foo\"."); |
| XCTAssertFalse([constraint evaluate:[NSArray array]], @"Should not have accepted other value."); |
| XCTAssertFalse([constraint evaluate:nil], @"Should not have accepted nil."); |
| } |
| |
| - (void)testResolvesSpecialAnySelectorToAnyConstraint |
| { |
| SEL anySelector = [OCMArg anySelector]; |
| NSValue *anySelectorValue = [NSValue valueWithBytes:&anySelector objCType:@encode(SEL)]; |
| |
| XCTAssertTrue([[OCMArg resolveSpecialValues:anySelectorValue] isKindOfClass:[OCMAnyConstraint class]]); |
| } |
| |
| - (void)testDoesNotTreatOtherSelectorsAsSpecialValue |
| { |
| NSValue *arbitrary = [NSValue value:NSSelectorFromString(@"someSelector") withObjCType:@encode(SEL)]; |
| XCTAssertEqual([OCMArg resolveSpecialValues:arbitrary], arbitrary, @"Should have returned selector as is."); |
| } |
| |
| - (void)testResolvesSpecialAnyPointerToAnyConstraint |
| { |
| void *anyPointer = [OCMArg anyPointer]; |
| NSValue *anyPointerValue = [NSValue valueWithPointer:anyPointer]; |
| |
| XCTAssertTrue([[OCMArg resolveSpecialValues:anyPointerValue] isKindOfClass:[OCMAnyConstraint class]]); |
| } |
| |
| - (void)testResolvesPassByRefSetterValueToSetterInstance |
| { |
| NSNumber *value = @1; |
| OCMPassByRefSetter *setter = [[OCMPassByRefSetter alloc] initWithValue:value]; |
| NSValue *passByRefSetterValue = [NSValue value:&setter withObjCType:@encode(void *)]; |
| XCTAssertEqual([OCMArg resolveSpecialValues:passByRefSetterValue], setter, @"Should have unwrapped setter instance."); |
| } |
| |
| - (void)testDoesNotModifyOtherPointersToObjects |
| { |
| NSValue *objectPointer = [NSValue value:&self withObjCType:@encode(void *)]; |
| XCTAssertEqual([OCMArg resolveSpecialValues:objectPointer], objectPointer, @"Should have returned value as is."); |
| } |
| |
| - (void)testHandlesNonObjectPointersGracefully |
| { |
| long numberThatRepresentsInValidClassPointer = 0x08; |
| long *pointer = &numberThatRepresentsInValidClassPointer; |
| NSValue *nonObjectPointerValue = [NSValue value:&pointer withObjCType:@encode(void *)]; |
| XCTAssertEqual([OCMArg resolveSpecialValues:nonObjectPointerValue], nonObjectPointerValue, @"Should have returned value as is."); |
| } |
| |
| @end |