@@ -570,7 +570,7 @@ mod tests {
spawn_in_terminal.label,
format!(
"test label for 1234 and โฆ{}",
- &long_value[..=MAX_DISPLAY_VARIABLE_LENGTH]
+ &long_value[long_value.len() - MAX_DISPLAY_VARIABLE_LENGTH..]
),
"Human-readable label should have long substitutions trimmed"
);
@@ -791,7 +791,7 @@ mod tests {
assert_eq!(
task_names(&tasks_picker, cx),
vec![
- "hello from โฆth.odd_extension:1:1".to_string(),
+ "hello from โฆh.odd_extension:1:1".to_string(),
"opened now: /dir".to_string()
],
"Second opened buffer should fill the context, labels should be trimmed if long enough"
@@ -820,7 +820,7 @@ mod tests {
assert_eq!(
task_names(&tasks_picker, cx),
vec![
- "hello from โฆithout_extension:2:3".to_string(),
+ "hello from โฆthout_extension:2:3".to_string(),
"opened now: /dir".to_string()
],
"Opened buffer should fill the context, labels should be trimmed if long enough"
@@ -49,10 +49,15 @@ pub fn truncate(s: &str, max_chars: usize) -> &str {
pub fn truncate_and_trailoff(s: &str, max_chars: usize) -> String {
debug_assert!(max_chars >= 5);
+ // If the string's byte length is <= max_chars, walking the string can be skipped since the
+ // number of chars is <= the number of bytes.
+ if s.len() <= max_chars {
+ return s.to_string();
+ }
let truncation_ix = s.char_indices().map(|(i, _)| i).nth(max_chars);
match truncation_ix {
- Some(length) => s[..length].to_string() + "โฆ",
- None => s.to_string(),
+ Some(index) => s[..index].to_string() + "โฆ",
+ _ => s.to_string(),
}
}
@@ -61,10 +66,19 @@ pub fn truncate_and_trailoff(s: &str, max_chars: usize) -> String {
pub fn truncate_and_remove_front(s: &str, max_chars: usize) -> String {
debug_assert!(max_chars >= 5);
- let truncation_ix = s.char_indices().map(|(i, _)| i).nth_back(max_chars);
+ // If the string's byte length is <= max_chars, walking the string can be skipped since the
+ // number of chars is <= the number of bytes.
+ if s.len() <= max_chars {
+ return s.to_string();
+ }
+ let suffix_char_length = max_chars.saturating_sub(1);
+ let truncation_ix = s
+ .char_indices()
+ .map(|(i, _)| i)
+ .nth_back(suffix_char_length);
match truncation_ix {
- Some(length) => "โฆ".to_string() + &s[length..],
- None => s.to_string(),
+ Some(index) if index > 0 => "โฆ".to_string() + &s[index..],
+ _ => s.to_string(),
}
}
@@ -795,11 +809,25 @@ mod tests {
#[test]
fn test_truncate_and_trailoff() {
assert_eq!(truncate_and_trailoff("", 5), "");
+ assert_eq!(truncate_and_trailoff("aaaaaa", 7), "aaaaaa");
+ assert_eq!(truncate_and_trailoff("aaaaaa", 6), "aaaaaa");
+ assert_eq!(truncate_and_trailoff("aaaaaa", 5), "aaaaaโฆ");
assert_eq!(truncate_and_trailoff("รจรจรจรจรจรจ", 7), "รจรจรจรจรจรจ");
assert_eq!(truncate_and_trailoff("รจรจรจรจรจรจ", 6), "รจรจรจรจรจรจ");
assert_eq!(truncate_and_trailoff("รจรจรจรจรจรจ", 5), "รจรจรจรจรจโฆ");
}
+ #[test]
+ fn test_truncate_and_remove_front() {
+ assert_eq!(truncate_and_remove_front("", 5), "");
+ assert_eq!(truncate_and_remove_front("aaaaaa", 7), "aaaaaa");
+ assert_eq!(truncate_and_remove_front("aaaaaa", 6), "aaaaaa");
+ assert_eq!(truncate_and_remove_front("aaaaaa", 5), "โฆaaaaa");
+ assert_eq!(truncate_and_remove_front("รจรจรจรจรจรจ", 7), "รจรจรจรจรจรจ");
+ assert_eq!(truncate_and_remove_front("รจรจรจรจรจรจ", 6), "รจรจรจรจรจรจ");
+ assert_eq!(truncate_and_remove_front("รจรจรจรจรจรจ", 5), "โฆรจรจรจรจรจ");
+ }
+
#[test]
fn test_numeric_prefix_str_method() {
let target = "1a";