|  | @@ -34,35 +34,107 @@
 | 
	
		
			
				|  |  |  #import <UIKit/UIKit.h>
 | 
	
		
			
				|  |  |  #import <XCTest/XCTest.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#import <gRPC/GRXBufferedPipe.h>
 | 
	
		
			
				|  |  |  #import <gRPC/GRXWriter.h>
 | 
	
		
			
				|  |  |  #import <gRPC/GRXWriteable.h>
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -@interface RxLibraryUnitTests : XCTestCase
 | 
	
		
			
				|  |  | +// A mock of a GRXSingleValueHandler block that can be queried for how many times it was called and
 | 
	
		
			
				|  |  | +// what were the last values passed to it.
 | 
	
		
			
				|  |  | +//
 | 
	
		
			
				|  |  | +// TODO(jcanizales): Move this to a test util library, and add tests for it.
 | 
	
		
			
				|  |  | +@interface CapturingSingleValueHandler : NSObject
 | 
	
		
			
				|  |  | +@property (nonatomic, readonly) void (^block)(id value, NSError *errorOrNil);
 | 
	
		
			
				|  |  | +@property (nonatomic, readonly) NSUInteger timesCalled;
 | 
	
		
			
				|  |  | +@property (nonatomic, readonly) id value;
 | 
	
		
			
				|  |  | +@property (nonatomic, readonly) NSError *errorOrNil;
 | 
	
		
			
				|  |  | ++ (instancetype)handler;
 | 
	
		
			
				|  |  | +@end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +@implementation CapturingSingleValueHandler
 | 
	
		
			
				|  |  | ++ (instancetype)handler {
 | 
	
		
			
				|  |  | +  return [[self alloc] init];
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- (GRXSingleValueHandler)block {
 | 
	
		
			
				|  |  | +  return ^(id value, NSError *errorOrNil) {
 | 
	
		
			
				|  |  | +    ++_timesCalled;
 | 
	
		
			
				|  |  | +    _value = value;
 | 
	
		
			
				|  |  | +    _errorOrNil = errorOrNil;
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +@end
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@interface RxLibraryUnitTests : XCTestCase
 | 
	
		
			
				|  |  |  @end
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @implementation RxLibraryUnitTests
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- (void)setUp {
 | 
	
		
			
				|  |  | -    [super setUp];
 | 
	
		
			
				|  |  | -    // Put setup code here. This method is called before the invocation of each test method in the class.
 | 
	
		
			
				|  |  | +#pragma mark Writeable
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- (void)testWriteableSingleValueHandlerIsCalledForValue {
 | 
	
		
			
				|  |  | +  // Given:
 | 
	
		
			
				|  |  | +  CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
 | 
	
		
			
				|  |  | +  id anyValue = @7;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // If:
 | 
	
		
			
				|  |  | +  id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleValueHandler:handler.block];
 | 
	
		
			
				|  |  | +  [writeable writeValue:anyValue];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Then:
 | 
	
		
			
				|  |  | +  XCTAssertEqual(handler.timesCalled, 1);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.value, anyValue);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.errorOrNil, nil);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- (void)tearDown {
 | 
	
		
			
				|  |  | -    // Put teardown code here. This method is called after the invocation of each test method in the class.
 | 
	
		
			
				|  |  | -    [super tearDown];
 | 
	
		
			
				|  |  | +- (void)testWriteableSingleValueHandlerIsCalledForError {
 | 
	
		
			
				|  |  | +  // Given:
 | 
	
		
			
				|  |  | +  CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
 | 
	
		
			
				|  |  | +  NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // If:
 | 
	
		
			
				|  |  | +  id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleValueHandler:handler.block];
 | 
	
		
			
				|  |  | +  [writeable writesFinishedWithError:anyError];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Then:
 | 
	
		
			
				|  |  | +  XCTAssertEqual(handler.timesCalled, 1);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.value, nil);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.errorOrNil, anyError);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- (void)testExample {
 | 
	
		
			
				|  |  | -    // This is an example of a functional test case.
 | 
	
		
			
				|  |  | -    XCTAssert(YES, @"Pass");
 | 
	
		
			
				|  |  | +#pragma mark BufferedPipe
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +- (void)testBufferedPipePropagatesValue {
 | 
	
		
			
				|  |  | +  // Given:
 | 
	
		
			
				|  |  | +  CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
 | 
	
		
			
				|  |  | +  id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleValueHandler:handler.block];
 | 
	
		
			
				|  |  | +  id anyValue = @7;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // If:
 | 
	
		
			
				|  |  | +  GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
 | 
	
		
			
				|  |  | +  [pipe startWithWriteable:writeable];
 | 
	
		
			
				|  |  | +  [pipe writeValue:anyValue];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Then:
 | 
	
		
			
				|  |  | +  XCTAssertEqual(handler.timesCalled, 1);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.value, anyValue);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.errorOrNil, nil);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -- (void)testPerformanceExample {
 | 
	
		
			
				|  |  | -    // This is an example of a performance test case.
 | 
	
		
			
				|  |  | -    [self measureBlock:^{
 | 
	
		
			
				|  |  | -        // Put the code you want to measure the time of here.
 | 
	
		
			
				|  |  | -    }];
 | 
	
		
			
				|  |  | +- (void)testBufferedPipePropagatesError {
 | 
	
		
			
				|  |  | +  // Given:
 | 
	
		
			
				|  |  | +  CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
 | 
	
		
			
				|  |  | +  id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleValueHandler:handler.block];
 | 
	
		
			
				|  |  | +  NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // If:
 | 
	
		
			
				|  |  | +  GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
 | 
	
		
			
				|  |  | +  [pipe startWithWriteable:writeable];
 | 
	
		
			
				|  |  | +  [pipe writesFinishedWithError:anyError];
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // Then:
 | 
	
		
			
				|  |  | +  XCTAssertEqual(handler.timesCalled, 1);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.value, nil);
 | 
	
		
			
				|  |  | +  XCTAssertEqualObjects(handler.errorOrNil, anyError);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @end
 |