@@ -11,6 +11,11 @@ import RealmSwift
11
11
import RxRealm
12
12
import RxTests
13
13
14
+ func delay( delay: Double , closure: ( ) -> Void ) {
15
+ dispatch_after ( dispatch_time ( DISPATCH_TIME_NOW, Int64 ( delay * Double( NSEC_PER_SEC) ) ) ,
16
+ dispatch_get_main_queue ( ) , closure)
17
+ }
18
+
14
19
class Message : Object , Equatable {
15
20
dynamic var text = " "
16
21
convenience init ( _ text: String ) {
@@ -25,25 +30,19 @@ func ==(lhs: Message, rhs: Message) -> Bool {
25
30
26
31
class RxRealm_Tests : XCTestCase {
27
32
28
- var bag : DisposeBag ! = DisposeBag ( )
29
-
30
- override func setUp( ) {
31
- super. setUp ( )
32
- Realm . Configuration. defaultConfiguration. inMemoryIdentifier = " MemoryRealm "
33
+ private func realmInMemory( name: String ) -> Realm {
34
+ var conf = Realm . Configuration ( )
35
+ conf. inMemoryIdentifier = name
36
+ return try ! Realm ( configuration: conf)
33
37
}
34
38
35
- override func tearDown( ) {
36
- bag = nil
37
- super. tearDown ( )
38
- }
39
-
40
39
private func clearRealm( realm: Realm ) {
41
40
try ! realm. write {
42
41
realm. deleteAll ( )
43
42
}
44
43
}
45
44
46
- private func addObject ( realm: Realm , text: String ) {
45
+ private func addMessage ( realm: Realm , text: String ) {
47
46
try ! realm. write {
48
47
realm. add ( Message ( text) )
49
48
}
@@ -53,8 +52,9 @@ class RxRealm_Tests: XCTestCase {
53
52
let expectation1 = expectationWithDescription ( " Results<Message> first " )
54
53
let expectation2 = expectationWithDescription ( " Results<Message> second " )
55
54
56
- let realm = try ! Realm ( )
55
+ let realm = realmInMemory ( #function )
57
56
clearRealm ( realm)
57
+ let bag = DisposeBag ( )
58
58
59
59
let scheduler = TestScheduler ( initialClock: 0 )
60
60
let observer = scheduler. createObserver ( Results < Message > )
@@ -70,27 +70,30 @@ class RxRealm_Tests: XCTestCase {
70
70
71
71
messages $. subscribe ( observer) . addDisposableTo ( bag)
72
72
73
- addObject ( realm, text: " first " )
73
+ addMessage ( realm, text: " first(Results) " )
74
74
75
- performSelector ( #selector( addSecondMessage) , withObject: nil , afterDelay: 0.1 )
75
+ delay ( 0.1 ) {
76
+ self . addMessage ( realm, text: " second(Results) " )
77
+ }
76
78
77
79
scheduler. start ( )
78
80
79
81
waitForExpectationsWithTimeout ( 0.5 ) { error in
80
82
XCTAssertTrue ( error == nil )
81
83
XCTAssertEqual ( observer. events. count, 2 )
82
84
let results = observer. events. last!. value. element!
83
- XCTAssertTrue ( results. first! == Message ( " first " ) )
84
- XCTAssertTrue ( results. last! == Message ( " second " ) )
85
+ XCTAssertTrue ( results. first! == Message ( " first(Results) " ) )
86
+ XCTAssertTrue ( results. last! == Message ( " second(Results) " ) )
85
87
}
86
88
}
87
89
88
90
func testEmittedArrayValues( ) {
89
91
let expectation1 = expectationWithDescription ( " Array<Message> first " )
90
92
let expectation2 = expectationWithDescription ( " Array<Message> second " )
91
93
92
- let realm = try ! Realm ( )
94
+ let realm = realmInMemory ( #function )
93
95
clearRealm ( realm)
96
+ let bag = DisposeBag ( )
94
97
95
98
let scheduler = TestScheduler ( initialClock: 0 )
96
99
let observer = scheduler. createObserver ( Array < Message > )
@@ -106,21 +109,142 @@ class RxRealm_Tests: XCTestCase {
106
109
107
110
messages $. subscribe ( observer) . addDisposableTo ( bag)
108
111
109
- addObject ( realm, text: " first " )
112
+ addMessage ( realm, text: " first(Array) " )
110
113
111
- performSelector ( #selector( addSecondMessage) , withObject: nil , afterDelay: 0.1 )
114
+ delay ( 0.1 ) {
115
+ self . addMessage ( realm, text: " second(Array) " )
116
+ }
112
117
113
118
scheduler. start ( )
114
119
115
120
waitForExpectationsWithTimeout ( 0.5 ) { error in
116
121
XCTAssertTrue ( error == nil )
117
122
XCTAssertEqual ( observer. events. count, 2 )
118
- XCTAssertTrue ( observer. events. first!. value. element! == [ Message ( " first " ) ] )
119
- XCTAssertTrue ( observer. events. last!. value. element! == [ Message ( " first " ) , Message ( " second " ) ] )
123
+ XCTAssertTrue ( observer. events. first!. value. element! == [ Message ( " first(Array) " ) ] )
124
+ XCTAssertTrue ( observer. events. last!. value. element! == [ Message ( " first(Array) " ) , Message ( " second(Array) " ) ] )
120
125
}
121
126
}
122
127
123
- func addSecondMessage( ) {
124
- addObject ( try ! Realm ( ) , text: " second " )
128
+ func testEmittedChangeset( ) {
129
+ let expectation1 = expectationWithDescription ( " did emit all changeset values " )
130
+
131
+ let realm = realmInMemory ( #function)
132
+ clearRealm ( realm)
133
+ let bag = DisposeBag ( )
134
+
135
+ let scheduler = TestScheduler ( initialClock: 0 )
136
+ let observer = scheduler. createObserver ( String)
137
+
138
+ //initial data
139
+ addMessage ( realm, text: " first(Changeset) " )
140
+
141
+ let messages $ = realm. objects ( Message) . asObservableChangeset ( ) . shareReplay ( 1 )
142
+ messages $. scan ( 0 ) { count, _ in
143
+ return count+ 1
144
+ }
145
+ . filter { $0 == 3 }
146
+ . subscribeNext { _ in expectation1. fulfill ( ) }
147
+ . addDisposableTo ( bag)
148
+
149
+ messages $
150
+ . map { result, changes in
151
+ if let changes = changes {
152
+ return " count: \( result. count) inserted: \( changes. inserted) deleted: \( changes. deleted) updated: \( changes. updated) "
153
+ } else {
154
+ return " count: \( result. count) "
155
+ }
156
+ }
157
+ . subscribe ( observer) . addDisposableTo ( bag)
158
+
159
+ //insert
160
+ delay ( 0.25 ) {
161
+ self . addMessage ( realm, text: " second(Changeset) " )
162
+ }
163
+ //update
164
+ delay ( 0.5 ) {
165
+ try ! realm. write {
166
+ realm. delete ( realm. objects ( Message) . filter ( " text='first(Changeset)' " ) . first!)
167
+ realm. objects ( Message) . filter ( " text='second(Changeset)' " ) . first!. text = " third(Changeset) "
168
+ }
169
+ }
170
+ //coalesced
171
+ delay ( 0.7 ) {
172
+ self . addMessage ( realm, text: " first(Changeset) " )
173
+ }
174
+ delay ( 0.7 ) {
175
+ try ! realm. write {
176
+ realm. delete ( realm. objects ( Message) . filter ( " text='first(Changeset)' " ) . first!)
177
+ }
178
+ }
179
+
180
+ waitForExpectationsWithTimeout ( 0.75 ) { error in
181
+ XCTAssertTrue ( error == nil )
182
+ XCTAssertEqual ( observer. events. count, 3 )
183
+ XCTAssertEqual ( observer. events [ 0 ] . value. element!, " count:1 " )
184
+ XCTAssertEqual ( observer. events [ 1 ] . value. element!, " count:2 inserted:[1] deleted:[] updated:[] " )
185
+ XCTAssertEqual ( observer. events [ 2 ] . value. element!, " count:1 inserted:[] deleted:[0] updated:[1] " )
186
+ }
187
+ }
188
+
189
+ func testEmittedArrayChangeset( ) {
190
+ let expectation1 = expectationWithDescription ( " did emit all array changeset values " )
191
+
192
+ let realm = realmInMemory ( #function)
193
+ clearRealm ( realm)
194
+ let bag = DisposeBag ( )
195
+
196
+ let scheduler = TestScheduler ( initialClock: 0 )
197
+ let observer = scheduler. createObserver ( String)
198
+
199
+ //initial data
200
+ addMessage ( realm, text: " first(ArrayChangeset) " )
201
+
202
+ let messages $ = realm. objects ( Message) . asObservableArrayChangeset ( ) . shareReplay ( 1 )
203
+ messages $. scan ( 0 ) { count, _ in
204
+ return count+ 1
205
+ }
206
+ . filter { $0 == 3 }
207
+ . subscribeNext { _ in expectation1. fulfill ( ) }
208
+ . addDisposableTo ( bag)
209
+
210
+ messages $
211
+ . map { result, changes in
212
+ if let changes = changes {
213
+ return " count: \( result. count) inserted: \( changes. inserted) deleted: \( changes. deleted) updated: \( changes. updated) "
214
+ } else {
215
+ return " count: \( result. count) "
216
+ }
217
+ }
218
+ . subscribe ( observer) . addDisposableTo ( bag)
219
+
220
+ //insert
221
+ delay ( 0.25 ) {
222
+ self . addMessage ( realm, text: " second(ArrayChangeset) " )
223
+ }
224
+ //update
225
+ delay ( 0.5 ) {
226
+ try ! realm. write {
227
+ realm. delete ( realm. objects ( Message) . filter ( " text='first(ArrayChangeset)' " ) . first!)
228
+ realm. objects ( Message) . filter ( " text='second(ArrayChangeset)' " ) . first!. text = " third(ArrayChangeset) "
229
+ }
230
+ }
231
+ //coalesced
232
+ delay ( 0.7 ) {
233
+ self . addMessage ( realm, text: " first(ArrayChangeset) " )
234
+ }
235
+ delay ( 0.7 ) {
236
+ try ! realm. write {
237
+ realm. delete ( realm. objects ( Message) . filter ( " text='first(ArrayChangeset)' " ) . first!)
238
+ }
239
+ }
240
+
241
+ waitForExpectationsWithTimeout ( 0.75 ) { error in
242
+ XCTAssertTrue ( error == nil )
243
+ XCTAssertEqual ( observer. events. count, 3 )
244
+ XCTAssertEqual ( observer. events [ 0 ] . value. element!, " count:1 " )
245
+ XCTAssertEqual ( observer. events [ 1 ] . value. element!, " count:2 inserted:[1] deleted:[] updated:[] " )
246
+ XCTAssertEqual ( observer. events [ 2 ] . value. element!, " count:1 inserted:[] deleted:[0] updated:[1] " )
247
+ }
125
248
}
249
+
126
250
}
0 commit comments