Skip to content

Commit 0a2272e

Browse files
committed
test(sdk): Test the RoomEvents' methods.
This patch adds unit tests for the `RoomEvents`' methods.
1 parent cec8f37 commit 0a2272e

File tree

2 files changed

+389
-0
lines changed

2 files changed

+389
-0
lines changed

crates/matrix-sdk/src/event_cache/linked_chunk/mod.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -852,6 +852,12 @@ impl ChunkIdentifierGenerator {
852852
#[repr(transparent)]
853853
pub struct ChunkIdentifier(u64);
854854

855+
impl PartialEq<u64> for ChunkIdentifier {
856+
fn eq(&self, other: &u64) -> bool {
857+
self.0 == *other
858+
}
859+
}
860+
855861
/// The position of something inside a [`Chunk`].
856862
///
857863
/// It's a pair of a chunk position and an item index.

crates/matrix-sdk/src/event_cache/store.rs

Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,386 @@ impl fmt::Debug for RoomEvents {
137137
formatter.debug_struct("RoomEvents").field("chunk", &self.chunks).finish()
138138
}
139139
}
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

Comments
 (0)