/*
 *  Copyright (c) 2004-2015 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/OCMConstraint.h>


@interface OCMConstraintTests : XCTestCase
{
	BOOL didCallCustomConstraint;
}

@end


@implementation OCMConstraintTests

- (void)setUp
{
	didCallCustomConstraint = NO;
}

- (void)testAnyAcceptsAnything
{
	OCMConstraint *constraint = [OCMAnyConstraint constraint];
	XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted a value.");
	XCTAssertTrue([constraint evaluate:@"bar"], @"Should have accepted another value.");
	XCTAssertTrue([constraint evaluate:nil], @"Should have accepted nil.");
}

- (void)testIsNilAcceptsOnlyNil
{
	OCMConstraint *constraint = [OCMIsNilConstraint constraint];
	
	XCTAssertFalse([constraint evaluate:@"foo"], @"Should not have accepted a value.");
	XCTAssertTrue([constraint evaluate:nil], @"Should have accepted nil.");	
}

- (void)testIsNotNilAcceptsAnythingButNil
{
	OCMConstraint *constraint = [OCMIsNotNilConstraint constraint];
	
	XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted a value.");
	XCTAssertFalse([constraint evaluate:nil], @"Should not have accepted nil.");	
}

- (void)testNotEqualAcceptsAnythingButValue
{
	OCMIsNotEqualConstraint *constraint = [OCMIsNotEqualConstraint constraint];
	constraint->testValue = @"foo";
	
	XCTAssertFalse([constraint evaluate:@"foo"], @"Should not have accepted value.");
	XCTAssertTrue([constraint evaluate:@"bar"], @"Should have accepted other value.");	
	XCTAssertTrue([constraint evaluate:nil], @"Should have accepted nil.");	
}


- (BOOL)checkArg:(id)theArg
{
	didCallCustomConstraint = YES;
	return [theArg isEqualToString:@"foo"];
}

- (void)testUsesPlainMethod
{
	OCMConstraint *constraint = CONSTRAINT(@selector(checkArg:));

	XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
	XCTAssertTrue(didCallCustomConstraint, @"Should have used custom method.");
	XCTAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
}


- (BOOL)checkArg:(id)theArg withValue:(id)value
{
	didCallCustomConstraint = YES;
	return [theArg isEqual:value];
}

- (void)testUsesMethodWithValue
{
	OCMConstraint *constraint = CONSTRAINTV(@selector(checkArg:withValue:), @"foo");

	XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
	XCTAssertTrue(didCallCustomConstraint, @"Should have used custom method.");
	XCTAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
}


- (void)testRaisesExceptionWhenConstraintMethodDoesNotTakeArgument
{
	XCTAssertThrows(CONSTRAINTV(@selector(checkArg:), @"bar"), @"Should have thrown for invalid constraint method.");
}


- (void)testRaisesExceptionOnUnknownSelector
{
    // We use a selector that this test does not implement
	XCTAssertThrows(CONSTRAINTV(@selector(arrayWithArray:), @"bar"), @"Should have thrown for unknown constraint method.");
}


-(void)testUsesBlock
{
	BOOL (^checkForFooBlock)(id) = ^(id value)
		{
			return [value isEqualToString:@"foo"];
		};
	
	OCMBlockConstraint *constraint = [[OCMBlockConstraint alloc] initWithConstraintBlock:checkForFooBlock];

	XCTAssertTrue([constraint evaluate:@"foo"], @"Should have accepted foo.");
	XCTAssertFalse([constraint evaluate:@"bar"], @"Should not have accepted bar.");
}

-(void)testBlockConstraintCanCaptureArgument 
{
	__block NSString *captured;
	BOOL (^captureArgBlock)(id) = ^(id value)
		{
			captured = value;
			return YES;
		};
	
	OCMBlockConstraint *constraint = [[OCMBlockConstraint alloc] initWithConstraintBlock:captureArgBlock];

	[constraint evaluate:@"foo"];
	XCTAssertEqualObjects(@"foo", captured, @"Should have captured value from last invocation.");
	[constraint evaluate:@"bar"];
	XCTAssertEqualObjects(@"bar", captured, @"Should have captured value from last invocation.");
}

- (void)testEvaluateNilBlockReturnsNo
{
    OCMBlockConstraint *constraint = [[OCMBlockConstraint alloc] initWithConstraintBlock:nil];
    
    XCTAssertFalse([constraint evaluate:@"foo"]);
}

@end
