day dividers: don't remove the final entry if it was already scheduled for removal

This commit is contained in:
Benjamin Bouvier
2024-05-21 12:10:23 +02:00
parent c5f4168dd6
commit 612ed3b603

View File

@@ -142,7 +142,14 @@ impl DayDividerAdjuster {
for (i, item) in items.iter().enumerate().rev() {
if item.is_day_divider() {
// The item is a trailing day divider: remove it.
self.ops.push(DayDividerOperation::Remove(i));
if !self
.ops
.iter()
.any(|op| matches!(op, DayDividerOperation::Remove(j) if i == *j))
{
trace!("removing trailing day divider");
self.ops.push(DayDividerOperation::Remove(i));
}
break;
}
if item.is_event() {
@@ -738,4 +745,30 @@ mod tests {
assert!(iter.next().unwrap().is_remote_event());
assert!(iter.next().is_none());
}
#[test]
fn test_event_read_marker_spurious_day_divider() {
let mut items = ObservableVector::new();
let mut txn = items.transaction();
let mut meta = TimelineInnerMetadata::new(ruma::RoomVersionId::V11, None, None);
let timestamp = MilliSecondsSinceUnixEpoch(uint!(42));
txn.push_back(meta.new_timeline_item(event_with_ts(timestamp)));
txn.push_back(meta.new_timeline_item(VirtualTimelineItem::ReadMarker));
txn.push_back(meta.new_timeline_item(VirtualTimelineItem::DayDivider(timestamp)));
let mut adjuster = DayDividerAdjuster::default();
adjuster.run(&mut txn, &mut meta);
txn.commit();
let mut iter = items.iter();
assert!(iter.next().unwrap().is_day_divider());
assert!(iter.next().unwrap().is_remote_event());
assert!(iter.next().unwrap().is_read_marker());
assert!(iter.next().is_none());
}
}