blob: f152452b01373dcd7bde2c7f5d4526b2bfd154cd [file] [log] [blame]
Jorge Canizales62951152015-05-26 14:32:12 -07001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Jorge Canizales62951152015-05-26 14:32:12 -07004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Jorge Canizales62951152015-05-26 14:32:12 -07008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Jorge Canizales62951152015-05-26 14:32:12 -070010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Jorge Canizales62951152015-05-26 14:32:12 -070016 *
17 */
18
19#import <UIKit/UIKit.h>
20#import <XCTest/XCTest.h>
21
Jorge Canizalesc42a38e2015-06-21 14:44:25 -070022#import <RxLibrary/GRXBufferedPipe.h>
23#import <RxLibrary/GRXWriteable.h>
24#import <RxLibrary/GRXWriter.h>
Jorge Canizalesad0965e2015-05-27 13:01:21 -070025
Jorge Canizales6caf9112015-05-28 22:40:24 -070026// A mock of a GRXSingleValueHandler block that can be queried for how many times it was called and
27// what were the last values passed to it.
28//
29// TODO(jcanizales): Move this to a test util library, and add tests for it.
30@interface CapturingSingleValueHandler : NSObject
31@property (nonatomic, readonly) void (^block)(id value, NSError *errorOrNil);
32@property (nonatomic, readonly) NSUInteger timesCalled;
33@property (nonatomic, readonly) id value;
34@property (nonatomic, readonly) NSError *errorOrNil;
35+ (instancetype)handler;
36@end
Jorge Canizales62951152015-05-26 14:32:12 -070037
Jorge Canizales6caf9112015-05-28 22:40:24 -070038@implementation CapturingSingleValueHandler
39+ (instancetype)handler {
40 return [[self alloc] init];
41}
42
Jorge Canizalesf95ddba2015-08-12 10:51:56 -070043- (GRXSingleHandler)block {
Jorge Canizales6caf9112015-05-28 22:40:24 -070044 return ^(id value, NSError *errorOrNil) {
45 ++_timesCalled;
46 _value = value;
47 _errorOrNil = errorOrNil;
48 };
49}
50@end
51
Jorge Canizales232b6a82016-03-11 12:26:27 -080052// TODO(jcanizales): Split into one file per tested class.
53
Jorge Canizales6caf9112015-05-28 22:40:24 -070054@interface RxLibraryUnitTests : XCTestCase
Jorge Canizales62951152015-05-26 14:32:12 -070055@end
56
57@implementation RxLibraryUnitTests
58
Jorge Canizales6caf9112015-05-28 22:40:24 -070059#pragma mark Writeable
60
Jorge Canizalesf95ddba2015-08-12 10:51:56 -070061- (void)testWriteableSingleHandlerIsCalledForValue {
Jorge Canizales6caf9112015-05-28 22:40:24 -070062 // Given:
63 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
64 id anyValue = @7;
65
66 // If:
Jorge Canizalesf95ddba2015-08-12 10:51:56 -070067 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
Jorge Canizales6caf9112015-05-28 22:40:24 -070068 [writeable writeValue:anyValue];
Jorge Canizales232b6a82016-03-11 12:26:27 -080069 [writeable writesFinishedWithError:nil];
Jorge Canizales6caf9112015-05-28 22:40:24 -070070
71 // Then:
72 XCTAssertEqual(handler.timesCalled, 1);
73 XCTAssertEqualObjects(handler.value, anyValue);
74 XCTAssertEqualObjects(handler.errorOrNil, nil);
Jorge Canizales62951152015-05-26 14:32:12 -070075}
76
Jorge Canizalesf95ddba2015-08-12 10:51:56 -070077- (void)testWriteableSingleHandlerIsCalledForError {
Jorge Canizales6caf9112015-05-28 22:40:24 -070078 // Given:
79 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
80 NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil];
81
82 // If:
Jorge Canizalesf95ddba2015-08-12 10:51:56 -070083 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
Jorge Canizales6caf9112015-05-28 22:40:24 -070084 [writeable writesFinishedWithError:anyError];
85
86 // Then:
87 XCTAssertEqual(handler.timesCalled, 1);
88 XCTAssertEqualObjects(handler.value, nil);
89 XCTAssertEqualObjects(handler.errorOrNil, anyError);
Jorge Canizales62951152015-05-26 14:32:12 -070090}
91
Jorge Canizales232b6a82016-03-11 12:26:27 -080092- (void)testWriteableSingleHandlerIsCalledOnlyOnce_ValueThenError {
93 // Given:
94 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
95 id anyValue = @7;
96 NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil];
97
98 // If:
99 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
100 [writeable writeValue:anyValue];
101 [writeable writesFinishedWithError:anyError];
102
103 // Then:
104 XCTAssertEqual(handler.timesCalled, 1);
105 XCTAssertEqualObjects(handler.value, anyValue);
106 XCTAssertEqualObjects(handler.errorOrNil, nil);
107}
108
109- (void)testWriteableSingleHandlerIsCalledOnlyOnce_ValueThenValue {
110 // Given:
111 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
112 id anyValue = @7;
113
114 // If:
115 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
116 [writeable writeValue:anyValue];
117 [writeable writeValue:anyValue];
118 [writeable writesFinishedWithError:nil];
119
120 // Then:
121 XCTAssertEqual(handler.timesCalled, 1);
122 XCTAssertEqualObjects(handler.value, anyValue);
123 XCTAssertEqualObjects(handler.errorOrNil, nil);
124}
125
126- (void)testWriteableSingleHandlerFailsOnEmptyWriter {
127 // Given:
128 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
129
130 // If:
131 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
132 [writeable writesFinishedWithError:nil];
133
134 // Then:
135 XCTAssertEqual(handler.timesCalled, 1);
136 XCTAssertEqualObjects(handler.value, nil);
137 XCTAssertNotNil(handler.errorOrNil);
138}
139
Jorge Canizales6caf9112015-05-28 22:40:24 -0700140#pragma mark BufferedPipe
141
142- (void)testBufferedPipePropagatesValue {
143 // Given:
144 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
Jorge Canizalesf95ddba2015-08-12 10:51:56 -0700145 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
Jorge Canizales6caf9112015-05-28 22:40:24 -0700146 id anyValue = @7;
147
148 // If:
149 GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
150 [pipe startWithWriteable:writeable];
151 [pipe writeValue:anyValue];
152
153 // Then:
154 XCTAssertEqual(handler.timesCalled, 1);
155 XCTAssertEqualObjects(handler.value, anyValue);
156 XCTAssertEqualObjects(handler.errorOrNil, nil);
Jorge Canizales62951152015-05-26 14:32:12 -0700157}
158
Jorge Canizales6caf9112015-05-28 22:40:24 -0700159- (void)testBufferedPipePropagatesError {
160 // Given:
161 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
Jorge Canizalesf95ddba2015-08-12 10:51:56 -0700162 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
Jorge Canizales6caf9112015-05-28 22:40:24 -0700163 NSError *anyError = [NSError errorWithDomain:@"domain" code:7 userInfo:nil];
164
165 // If:
166 GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
167 [pipe startWithWriteable:writeable];
168 [pipe writesFinishedWithError:anyError];
169
170 // Then:
171 XCTAssertEqual(handler.timesCalled, 1);
172 XCTAssertEqualObjects(handler.value, nil);
173 XCTAssertEqualObjects(handler.errorOrNil, anyError);
Jorge Canizales62951152015-05-26 14:32:12 -0700174}
175
Test User9656eca2016-02-18 14:47:22 -0800176- (void)testBufferedPipeFinishWriteWhilePaused {
177 // Given:
178 CapturingSingleValueHandler *handler = [CapturingSingleValueHandler handler];
179 id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:handler.block];
180 id anyValue = @7;
181
182 // If:
183 GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
184 // Write something, then finish
185 [pipe writeValue:anyValue];
186 [pipe writesFinishedWithError:nil];
187 // then start the writeable
188 [pipe startWithWriteable:writeable];
189
190 // Then:
191 XCTAssertEqual(handler.timesCalled, 1);
192 XCTAssertEqualObjects(handler.value, anyValue);
193 XCTAssertEqualObjects(handler.errorOrNil, nil);
194}
195
Jorge Canizales62951152015-05-26 14:32:12 -0700196@end