@@ -61,6 +61,9 @@ impl RoomEvents {
61
61
}
62
62
63
63
/// Deduplicate `events` considering all events in `Self::chunks`.
64
+ ///
65
+ /// For the moment, duplicated events will be logged but not removed from
66
+ /// the resulting iterator.
64
67
fn deduplicate < ' a , I > ( & ' a self , events : I ) -> impl Iterator < Item = Event > + ' a
65
68
where
66
69
I : Iterator < Item = Event > + ' a ,
@@ -169,3 +172,290 @@ impl fmt::Debug for RoomEvents {
169
172
formatter. debug_struct ( "RoomEvents" ) . field ( "chunk" , & self . chunks ) . finish ( )
170
173
}
171
174
}
175
+
176
+ #[ cfg( test) ]
177
+ mod tests {
178
+ use assert_matches2:: assert_let;
179
+ use matrix_sdk_test:: { EventBuilder , ALICE } ;
180
+ use ruma:: { events:: room:: message:: RoomMessageEventContent , EventId , OwnedEventId } ;
181
+
182
+ use super :: * ;
183
+
184
+ fn new_event ( event_builder : & EventBuilder , event_id : & str ) -> ( OwnedEventId , Event ) {
185
+ let event_id = EventId :: parse ( event_id) . unwrap ( ) ;
186
+
187
+ let event = SyncTimelineEvent :: new ( event_builder. make_sync_message_event_with_id (
188
+ * ALICE ,
189
+ & event_id,
190
+ RoomMessageEventContent :: text_plain ( "foo" ) ,
191
+ ) ) ;
192
+
193
+ ( event_id, event)
194
+ }
195
+
196
+ #[ test]
197
+ fn test_new_room_events_has_zero_events ( ) {
198
+ let room_events = RoomEvents :: new ( ) ;
199
+
200
+ assert_eq ! ( room_events. chunks. len( ) , 0 ) ;
201
+ }
202
+
203
+ #[ test]
204
+ fn test_push_events ( ) {
205
+ let event_builder = EventBuilder :: new ( ) ;
206
+
207
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
208
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
209
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
210
+
211
+ let mut room_events = RoomEvents :: new ( ) ;
212
+
213
+ room_events. push_events ( [ event_0, event_1] ) ;
214
+ room_events. push_events ( [ event_2] ) ;
215
+
216
+ {
217
+ let mut events = room_events. events ( ) ;
218
+
219
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
220
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
221
+ assert_eq ! ( position. index( ) , 0 ) ;
222
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
223
+
224
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
225
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
226
+ assert_eq ! ( position. index( ) , 1 ) ;
227
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
228
+
229
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
230
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
231
+ assert_eq ! ( position. index( ) , 2 ) ;
232
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
233
+
234
+ assert ! ( events. next( ) . is_none( ) ) ;
235
+ }
236
+ }
237
+
238
+ #[ test]
239
+ fn test_push_events_duplicated_event ( ) {
240
+ let event_builder = EventBuilder :: new ( ) ;
241
+
242
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
243
+
244
+ let mut room_events = RoomEvents :: new ( ) ;
245
+
246
+ room_events. push_events ( [ event_0. clone ( ) , event_0] ) ;
247
+
248
+ {
249
+ let mut events = room_events. events ( ) ;
250
+
251
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
252
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
253
+ assert_eq ! ( position. index( ) , 0 ) ;
254
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
255
+
256
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
257
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
258
+ assert_eq ! ( position. index( ) , 1 ) ;
259
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
260
+
261
+ assert ! ( events. next( ) . is_none( ) ) ;
262
+ }
263
+ }
264
+
265
+ #[ test]
266
+ fn test_push_gap ( ) {
267
+ let event_builder = EventBuilder :: new ( ) ;
268
+
269
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
270
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
271
+
272
+ let mut room_events = RoomEvents :: new ( ) ;
273
+
274
+ room_events. push_events ( [ event_0] ) ;
275
+ room_events. push_gap ( Gap { prev_token : "hello" . to_owned ( ) } ) ;
276
+ room_events. push_events ( [ event_1] ) ;
277
+
278
+ {
279
+ let mut events = room_events. events ( ) ;
280
+
281
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
282
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
283
+ assert_eq ! ( position. index( ) , 0 ) ;
284
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
285
+
286
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
287
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
288
+ assert_eq ! ( position. index( ) , 0 ) ;
289
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
290
+
291
+ assert ! ( events. next( ) . is_none( ) ) ;
292
+ }
293
+
294
+ {
295
+ let mut chunks = room_events. chunks ( ) ;
296
+
297
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
298
+ assert ! ( chunk. is_items( ) ) ;
299
+
300
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
301
+ assert ! ( chunk. is_gap( ) ) ;
302
+
303
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
304
+ assert ! ( chunk. is_items( ) ) ;
305
+
306
+ assert ! ( chunks. next( ) . is_none( ) ) ;
307
+ }
308
+ }
309
+
310
+ #[ test]
311
+ fn test_insert_events_at ( ) {
312
+ let event_builder = EventBuilder :: new ( ) ;
313
+
314
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
315
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
316
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
317
+
318
+ let mut room_events = RoomEvents :: new ( ) ;
319
+
320
+ room_events. push_events ( [ event_0, event_1] ) ;
321
+
322
+ let position_of_event_1 = room_events
323
+ . events ( )
324
+ . find_map ( |( position, event) | {
325
+ ( event. event_id ( ) . unwrap ( ) == event_id_1) . then_some ( position)
326
+ } )
327
+ . unwrap ( ) ;
328
+
329
+ room_events. insert_events_at ( [ event_2] , position_of_event_1) . unwrap ( ) ;
330
+
331
+ {
332
+ let mut events = room_events. events ( ) ;
333
+
334
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
335
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
336
+ assert_eq ! ( position. index( ) , 0 ) ;
337
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
338
+
339
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
340
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
341
+ assert_eq ! ( position. index( ) , 1 ) ;
342
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
343
+
344
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
345
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
346
+ assert_eq ! ( position. index( ) , 2 ) ;
347
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
348
+
349
+ assert ! ( events. next( ) . is_none( ) ) ;
350
+ }
351
+ }
352
+
353
+ #[ test]
354
+ fn test_insert_gap_at ( ) {
355
+ let event_builder = EventBuilder :: new ( ) ;
356
+
357
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
358
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
359
+
360
+ let mut room_events = RoomEvents :: new ( ) ;
361
+
362
+ room_events. push_events ( [ event_0, event_1] ) ;
363
+
364
+ let position_of_event_1 = room_events
365
+ . events ( )
366
+ . find_map ( |( position, event) | {
367
+ ( event. event_id ( ) . unwrap ( ) == event_id_1) . then_some ( position)
368
+ } )
369
+ . unwrap ( ) ;
370
+
371
+ room_events
372
+ . insert_gap_at ( Gap { prev_token : "hello" . to_owned ( ) } , position_of_event_1)
373
+ . unwrap ( ) ;
374
+
375
+ {
376
+ let mut events = room_events. events ( ) ;
377
+
378
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
379
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
380
+ assert_eq ! ( position. index( ) , 0 ) ;
381
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
382
+
383
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
384
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
385
+ assert_eq ! ( position. index( ) , 0 ) ;
386
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
387
+
388
+ assert ! ( events. next( ) . is_none( ) ) ;
389
+ }
390
+
391
+ {
392
+ let mut chunks = room_events. chunks ( ) ;
393
+
394
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
395
+ assert ! ( chunk. is_items( ) ) ;
396
+
397
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
398
+ assert ! ( chunk. is_gap( ) ) ;
399
+
400
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
401
+ assert ! ( chunk. is_items( ) ) ;
402
+
403
+ assert ! ( chunks. next( ) . is_none( ) ) ;
404
+ }
405
+ }
406
+
407
+ #[ test]
408
+ fn test_replace_gap_at ( ) {
409
+ let event_builder = EventBuilder :: new ( ) ;
410
+
411
+ let ( event_id_0, event_0) = new_event ( & event_builder, "$ev0" ) ;
412
+ let ( event_id_1, event_1) = new_event ( & event_builder, "$ev1" ) ;
413
+ let ( event_id_2, event_2) = new_event ( & event_builder, "$ev2" ) ;
414
+
415
+ let mut room_events = RoomEvents :: new ( ) ;
416
+
417
+ room_events. push_events ( [ event_0] ) ;
418
+ room_events. push_gap ( Gap { prev_token : "hello" . to_owned ( ) } ) ;
419
+
420
+ let chunk_identifier_of_gap = room_events
421
+ . chunks ( )
422
+ . find_map ( |chunk| chunk. is_gap ( ) . then_some ( chunk. first_position ( ) ) )
423
+ . unwrap ( )
424
+ . chunk_identifier ( ) ;
425
+
426
+ room_events. replace_gap_at ( [ event_1, event_2] , chunk_identifier_of_gap) . unwrap ( ) ;
427
+
428
+ {
429
+ let mut events = room_events. events ( ) ;
430
+
431
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
432
+ assert_eq ! ( position. chunk_identifier( ) , 0 ) ;
433
+ assert_eq ! ( position. index( ) , 0 ) ;
434
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_0) ;
435
+
436
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
437
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
438
+ assert_eq ! ( position. index( ) , 0 ) ;
439
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_1) ;
440
+
441
+ assert_let ! ( Some ( ( position, event) ) = events. next( ) ) ;
442
+ assert_eq ! ( position. chunk_identifier( ) , 2 ) ;
443
+ assert_eq ! ( position. index( ) , 1 ) ;
444
+ assert_eq ! ( event. event_id( ) . unwrap( ) , event_id_2) ;
445
+
446
+ assert ! ( events. next( ) . is_none( ) ) ;
447
+ }
448
+
449
+ {
450
+ let mut chunks = room_events. chunks ( ) ;
451
+
452
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
453
+ assert ! ( chunk. is_items( ) ) ;
454
+
455
+ assert_let ! ( Some ( chunk) = chunks. next( ) ) ;
456
+ assert ! ( chunk. is_items( ) ) ;
457
+
458
+ assert ! ( chunks. next( ) . is_none( ) ) ;
459
+ }
460
+ }
461
+ }
0 commit comments