|
|
|
@ -92,6 +92,24 @@ impl RoomEntry { |
|
|
|
self.state.operators = operators.drain(..).collect();
|
|
|
|
self.state.members = members.iter().map(|user| user.name.clone()).collect();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Records that we are now trying to leave the given room.
|
|
|
|
/// If the room is not found, or if its membership status is not `Member`,
|
|
|
|
/// returns an error.
|
|
|
|
#[cfg(test)]
|
|
|
|
pub fn start_leaving(&mut self) -> Result<(), RoomMembershipChangeError> {
|
|
|
|
match self.state.membership {
|
|
|
|
RoomMembership::Member => {
|
|
|
|
self.state.membership = RoomMembership::Leaving;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
membership => Err(RoomMembershipChangeError(
|
|
|
|
membership,
|
|
|
|
RoomMembership::Leaving,
|
|
|
|
)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Contains the mapping from room names to room data and provides a clean
|
|
|
|
@ -212,25 +230,6 @@ impl RoomMap { |
|
|
|
rooms
|
|
|
|
}
|
|
|
|
|
|
|
|
#[allow(dead_code)]
|
|
|
|
/// Records that we are now trying to leave the given room.
|
|
|
|
/// If the room is not found, or if its membership status is not `Member`,
|
|
|
|
/// returns an error.
|
|
|
|
pub fn start_leaving(&mut self, room_name: &str) -> Result<(), RoomError> {
|
|
|
|
let room = self.get_mut_strict(room_name)?;
|
|
|
|
|
|
|
|
match room.state.membership {
|
|
|
|
RoomMembership::Member => {
|
|
|
|
room.state.membership = RoomMembership::Leaving;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
membership => Err(RoomError::MembershipChangeInvalid(
|
|
|
|
RoomMembershipChangeError(membership, RoomMembership::Leaving),
|
|
|
|
)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Records that we have now left the given room.
|
|
|
|
pub fn leave(&mut self, room_name: &str) -> Result<(), RoomError> {
|
|
|
|
let room = self.get_mut_strict(room_name)?;
|
|
|
|
@ -299,17 +298,16 @@ mod tests { |
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn entry_start_joining_error() {
|
|
|
|
let mut room = RoomEntry::new(
|
|
|
|
"bleep".to_string(),
|
|
|
|
RoomState {
|
|
|
|
membership: RoomMembership::Member,
|
|
|
|
..RoomState::default()
|
|
|
|
},
|
|
|
|
);
|
|
|
|
let initial_state = RoomState {
|
|
|
|
membership: RoomMembership::Member,
|
|
|
|
..RoomState::default()
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut room = RoomEntry::new("bleep".to_string(), initial_state.clone());
|
|
|
|
|
|
|
|
room.start_joining().unwrap_err();
|
|
|
|
|
|
|
|
assert_eq!(room.clone_state().membership, RoomMembership::Member);
|
|
|
|
assert_eq!(room.into_state(), initial_state);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
@ -318,7 +316,13 @@ mod tests { |
|
|
|
|
|
|
|
room.start_joining().unwrap();
|
|
|
|
|
|
|
|
assert_eq!(room.clone_state().membership, RoomMembership::Joining);
|
|
|
|
assert_eq!(
|
|
|
|
room.into_state(),
|
|
|
|
RoomState {
|
|
|
|
membership: RoomMembership::Joining,
|
|
|
|
..RoomState::default()
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
@ -356,6 +360,35 @@ mod tests { |
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn entry_start_leaving_error() {
|
|
|
|
let mut room = RoomEntry::new("bleep".to_string(), RoomState::default());
|
|
|
|
|
|
|
|
room.start_leaving().unwrap_err();
|
|
|
|
|
|
|
|
assert_eq!(room.into_state(), RoomState::default());
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn entry_start_leaving_success() {
|
|
|
|
let initial_state = RoomState {
|
|
|
|
membership: RoomMembership::Member,
|
|
|
|
..RoomState::default()
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut room = RoomEntry::new("bleep".to_string(), initial_state.clone());
|
|
|
|
|
|
|
|
room.start_leaving().unwrap();
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
room.into_state(),
|
|
|
|
RoomState {
|
|
|
|
membership: RoomMembership::Leaving,
|
|
|
|
..initial_state
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn map_new_is_empty() {
|
|
|
|
assert_eq!(RoomMap::new().get_room_list(), vec![]);
|
|
|
|
|