@@ -137,3 +137,386 @@ impl fmt::Debug for RoomEvents {
137
137
formatter. debug_struct ( "RoomEvents" ) . field ( "chunk" , & self . chunks ) . finish ( )
138
138
}
139
139
}
140
+
141
+ #[ cfg( test) ]
142
+ mod tests {
143
+ use assert_matches2:: assert_let;
144
+ use matrix_sdk_test:: { EventBuilder , ALICE } ;
145
+ use ruma:: { events:: room:: message:: RoomMessageEventContent , EventId , OwnedEventId } ;
146
+
147
+ use super :: * ;
148
+
149
+ fn new_event ( event_builder : & EventBuilder , event_id : & str ) -> ( OwnedEventId , Event ) {
150
+ let event_id = EventId :: parse ( event_id) . unwrap ( ) ;
151
+
152
+ let event = SyncTimelineEvent :: new ( event_builder. make_sync_message_event_with_id (
153
+ * ALICE ,
154
+ & event_id,
155
+ RoomMessageEventContent :: text_plain ( "foo" ) ,
156
+ ) ) ;
157
+
158
+ ( event_id, event)
159
+ }
160
+
161
+ #[ test]
162
+ fn test_new_room_events_has_zero_events ( ) {
163
+ let room_events = RoomEvents :: new ( ) ;
164
+
165
+ assert_eq ! ( room_events. chunks. len( ) , 0 ) ;
166
+ }
167
+
168
+ #[ test]
169
+ fn test_push_events ( ) {
170
+ let event_builder = EventBuilder :: new ( ) ;
171
+
172
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
173
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
174
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
175
+
176
+ let mut room_events = RoomEvents :: new ( ) ;
177
+
178
+ room_events. push_events ( [ event_0, event_1] ) ;
179
+ room_events. push_events ( [ event_2] ) ;
180
+
181
+ {
182
+ let mut events = room_events. events ( ) ;
183
+
184
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
185
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
186
+ assert_eq ! ( position. index( ) , 0 ) ;
187
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
188
+
189
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
190
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
191
+ assert_eq ! ( position. index( ) , 1 ) ;
192
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
193
+
194
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
195
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
196
+ assert_eq ! ( position. index( ) , 2 ) ;
197
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
198
+
199
+ assert ! ( events. next( ) . is_none( ) ) ;
200
+ }
201
+ }
202
+
203
+ #[ test]
204
+ fn test_push_events_with_duplicates ( ) {
205
+ let event_builder = EventBuilder :: new ( ) ;
206
+
207
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
208
+
209
+ let mut room_events = RoomEvents :: new ( ) ;
210
+
211
+ room_events. push_events ( [ event_0. clone ( ) ] ) ;
212
+ room_events. push_events ( [ event_0] ) ;
213
+
214
+ {
215
+ let mut events = room_events. events ( ) ;
216
+
217
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
218
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
219
+ assert_eq ! ( position. index( ) , 0 ) ;
220
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
221
+
222
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
223
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
224
+ assert_eq ! ( position. index( ) , 1 ) ;
225
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
226
+
227
+ assert ! ( events. next( ) . is_none( ) ) ;
228
+ }
229
+ }
230
+
231
+ #[ test]
232
+ fn test_push_gap ( ) {
233
+ let event_builder = EventBuilder :: new ( ) ;
234
+
235
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
236
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
237
+
238
+ let mut room_events = RoomEvents :: new ( ) ;
239
+
240
+ room_events. push_events ( [ event_0] ) ;
241
+ room_events. push_gap ( Gap { prev_token : "hello" . to_owned ( ) } ) ;
242
+ room_events. push_events ( [ event_1] ) ;
243
+
244
+ {
245
+ let mut events = room_events. events ( ) ;
246
+
247
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
248
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
249
+ assert_eq ! ( position. index( ) , 0 ) ;
250
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
251
+
252
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
253
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
254
+ assert_eq ! ( position. index( ) , 0 ) ;
255
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
256
+
257
+ assert ! ( events. next( ) . is_none( ) ) ;
258
+ }
259
+
260
+ {
261
+ let mut chunks = room_events. chunks ( ) ;
262
+
263
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
264
+ assert ! ( chunk. is_items( ) ) ;
265
+
266
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
267
+ assert ! ( chunk. is_gap( ) ) ;
268
+
269
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
270
+ assert ! ( chunk. is_items( ) ) ;
271
+
272
+ assert ! ( chunks. next( ) . is_none( ) ) ;
273
+ }
274
+ }
275
+
276
+ #[ test]
277
+ fn test_insert_events_at ( ) {
278
+ let event_builder = EventBuilder :: new ( ) ;
279
+
280
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
281
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
282
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
283
+
284
+ let mut room_events = RoomEvents :: new ( ) ;
285
+
286
+ room_events. push_events ( [ event_0, event_1] ) ;
287
+
288
+ let position_of_event_1 = room_events
289
+ . events ( )
290
+ . find_map ( |( position, event) | {
291
+ ( event. event_id ( ) . unwrap ( ) == event_id_1) . then_some ( position)
292
+ } )
293
+ . unwrap ( ) ;
294
+
295
+ room_events. insert_events_at ( [ event_2] , position_of_event_1) . unwrap ( ) ;
296
+
297
+ {
298
+ let mut events = room_events. events ( ) ;
299
+
300
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
301
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
302
+ assert_eq ! ( position. index( ) , 0 ) ;
303
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
304
+
305
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
306
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
307
+ assert_eq ! ( position. index( ) , 1 ) ;
308
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
309
+
310
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
311
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
312
+ assert_eq ! ( position. index( ) , 2 ) ;
313
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
314
+
315
+ assert ! ( events. next( ) . is_none( ) ) ;
316
+ }
317
+ }
318
+
319
+ #[ test]
320
+ fn test_insert_events_at_with_dupicates ( ) {
321
+ let event_builder = EventBuilder :: new ( ) ;
322
+
323
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
324
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
325
+
326
+ let mut room_events = RoomEvents :: new ( ) ;
327
+
328
+ room_events. push_events ( [ event_0, event_1. clone ( ) ] ) ;
329
+
330
+ let position_of_event_1 = room_events
331
+ . events ( )
332
+ . find_map ( |( position, event) | {
333
+ ( event. event_id ( ) . unwrap ( ) == event_id_1) . then_some ( position)
334
+ } )
335
+ . unwrap ( ) ;
336
+
337
+ room_events. insert_events_at ( [ event_1] , position_of_event_1) . unwrap ( ) ;
338
+
339
+ {
340
+ let mut events = room_events. events ( ) ;
341
+
342
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
343
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
344
+ assert_eq ! ( position. index( ) , 0 ) ;
345
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
346
+
347
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
348
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
349
+ assert_eq ! ( position. index( ) , 1 ) ;
350
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
351
+
352
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
353
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
354
+ assert_eq ! ( position. index( ) , 2 ) ;
355
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
356
+
357
+ assert ! ( events. next( ) . is_none( ) ) ;
358
+ }
359
+ }
360
+ #[ test]
361
+ fn test_insert_gap_at ( ) {
362
+ let event_builder = EventBuilder :: new ( ) ;
363
+
364
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
365
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
366
+
367
+ let mut room_events = RoomEvents :: new ( ) ;
368
+
369
+ room_events. push_events ( [ event_0, event_1] ) ;
370
+
371
+ let position_of_event_1 = room_events
372
+ . events ( )
373
+ . find_map ( |( position, event) | {
374
+ ( event. event_id ( ) . unwrap ( ) == event_id_1) . then_some ( position)
375
+ } )
376
+ . unwrap ( ) ;
377
+
378
+ room_events
379
+ . insert_gap_at ( Gap { prev_token : "hello" . to_owned ( ) } , position_of_event_1)
380
+ . unwrap ( ) ;
381
+
382
+ {
383
+ let mut events = room_events. events ( ) ;
384
+
385
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
386
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
387
+ assert_eq ! ( position. index( ) , 0 ) ;
388
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
389
+
390
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
391
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
392
+ assert_eq ! ( position. index( ) , 0 ) ;
393
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
394
+
395
+ assert ! ( events. next( ) . is_none( ) ) ;
396
+ }
397
+
398
+ {
399
+ let mut chunks = room_events. chunks ( ) ;
400
+
401
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
402
+ assert ! ( chunk. is_items( ) ) ;
403
+
404
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
405
+ assert ! ( chunk. is_gap( ) ) ;
406
+
407
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
408
+ assert ! ( chunk. is_items( ) ) ;
409
+
410
+ assert ! ( chunks. next( ) . is_none( ) ) ;
411
+ }
412
+ }
413
+
414
+ #[ test]
415
+ fn test_replace_gap_at ( ) {
416
+ let event_builder = EventBuilder :: new ( ) ;
417
+
418
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
419
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
420
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
421
+
422
+ let mut room_events = RoomEvents :: new ( ) ;
423
+
424
+ room_events. push_events ( [ event_0] ) ;
425
+ room_events. push_gap ( Gap { prev_token : "hello" . to_owned ( ) } ) ;
426
+
427
+ let chunk_identifier_of_gap = room_events
428
+ . chunks ( )
429
+ . find_map ( |chunk| chunk. is_gap ( ) . then_some ( chunk. first_position ( ) ) )
430
+ . unwrap ( )
431
+ . chunk_identifier ( ) ;
432
+
433
+ room_events. replace_gap_at ( [ event_1, event_2] , chunk_identifier_of_gap) . unwrap ( ) ;
434
+
435
+ {
436
+ let mut events = room_events. events ( ) ;
437
+
438
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
439
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
440
+ assert_eq ! ( position. index( ) , 0 ) ;
441
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
442
+
443
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
444
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
445
+ assert_eq ! ( position. index( ) , 0 ) ;
446
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
447
+
448
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
449
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
450
+ assert_eq ! ( position. index( ) , 1 ) ;
451
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
452
+
453
+ assert ! ( events. next( ) . is_none( ) ) ;
454
+ }
455
+
456
+ {
457
+ let mut chunks = room_events. chunks ( ) ;
458
+
459
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
460
+ assert ! ( chunk. is_items( ) ) ;
461
+
462
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
463
+ assert ! ( chunk. is_items( ) ) ;
464
+
465
+ assert ! ( chunks. next( ) . is_none( ) ) ;
466
+ }
467
+ }
468
+
469
+ #[ test]
470
+ fn test_replace_gap_at_with_duplicates ( ) {
471
+ let event_builder = EventBuilder :: new ( ) ;
472
+
473
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
474
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
475
+
476
+ let mut room_events = RoomEvents :: new ( ) ;
477
+
478
+ room_events. push_events ( [ event_0. clone ( ) ] ) ;
479
+ room_events. push_gap ( Gap { prev_token : "hello" . to_owned ( ) } ) ;
480
+
481
+ let chunk_identifier_of_gap = room_events
482
+ . chunks ( )
483
+ . find_map ( |chunk| chunk. is_gap ( ) . then_some ( chunk. first_position ( ) ) )
484
+ . unwrap ( )
485
+ . chunk_identifier ( ) ;
486
+
487
+ room_events. replace_gap_at ( [ event_0, event_1] , chunk_identifier_of_gap) . unwrap ( ) ;
488
+
489
+ {
490
+ let mut events = room_events. events ( ) ;
491
+
492
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
493
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
494
+ assert_eq ! ( position. index( ) , 0 ) ;
495
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
496
+
497
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
498
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
499
+ assert_eq ! ( position. index( ) , 0 ) ;
500
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
501
+
502
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
503
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
504
+ assert_eq ! ( position. index( ) , 1 ) ;
505
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
506
+
507
+ assert ! ( events. next( ) . is_none( ) ) ;
508
+ }
509
+
510
+ {
511
+ let mut chunks = room_events. chunks ( ) ;
512
+
513
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
514
+ assert ! ( chunk. is_items( ) ) ;
515
+
516
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
517
+ assert ! ( chunk. is_items( ) ) ;
518
+
519
+ assert ! ( chunks. next( ) . is_none( ) ) ;
520
+ }
521
+ }
522
+ }
0 commit comments