base: fix empty room name calculation

Step 3.iii of the naming algorithm[0] covers name calculation for empty
rooms; however, it isn't an else condition for steps 3.i and 3.ii. It's a
final conditional in the algorithm before returning the name. The
current implementation treats it as an else condition.

To fix this, use step 3.i and 3.ii to calculate a room name then check
if the user is alone. If alone, return "Empty room (was...)" containing
any former member names. If alone and there aren't any former members,
return "Empty room"

Fixes #133

[0] https://matrix.org/docs/spec/client_server/latest#calculating-the-display-name-for-a-room
master
Austin Ray 2021-05-21 19:18:11 -04:00
parent 5670700f7f
commit 59c8652ce8
No known key found for this signature in database
GPG Key ID: 89D6C2B99503DC49
1 changed files with 31 additions and 2 deletions

View File

@ -160,7 +160,7 @@ fn calculate_room_name(
let invited_joined = invited_member_count + joined_member_count; let invited_joined = invited_member_count + joined_member_count;
let invited_joined_minus_one = invited_joined.saturating_sub(1); let invited_joined_minus_one = invited_joined.saturating_sub(1);
if heroes_count >= invited_joined_minus_one { let names = if heroes_count >= invited_joined_minus_one {
let mut names = heroes; let mut names = heroes;
// stabilize ordering // stabilize ordering
names.sort_unstable(); names.sort_unstable();
@ -173,7 +173,18 @@ fn calculate_room_name(
// the `else`? // the `else`?
format!("{}, and {} others", names.join(", "), (invited_joined - heroes_count)) format!("{}, and {} others", names.join(", "), (invited_joined - heroes_count))
} else { } else {
"".to_string()
};
// User is alone.
if invited_joined <= 1 {
if names.is_empty() {
"Empty room".to_string() "Empty room".to_string()
} else {
format!("Empty room (was {})", names)
}
} else {
names
} }
} }
@ -194,5 +205,23 @@ mod tests {
actual = calculate_room_name(5, 0, vec!["a", "b", "c"]); actual = calculate_room_name(5, 0, vec!["a", "b", "c"]);
assert_eq!("a, b, c, and 2 others", actual); assert_eq!("a, b, c, and 2 others", actual);
actual = calculate_room_name(0, 0, vec![]);
assert_eq!("Empty room", actual);
actual = calculate_room_name(1, 0, vec![]);
assert_eq!("Empty room", actual);
actual = calculate_room_name(0, 1, vec![]);
assert_eq!("Empty room", actual);
actual = calculate_room_name(1, 0, vec!["a"]);
assert_eq!("Empty room (was a)", actual);
actual = calculate_room_name(1, 0, vec!["a", "b"]);
assert_eq!("Empty room (was a, b)", actual);
actual = calculate_room_name(1, 0, vec!["a", "b", "c"]);
assert_eq!("Empty room (was a, b, c)", actual);
} }
} }