pub struct TextBuffer {
rope: ropey::Rope,
}
impl TextBuffer {
pub fn new(content: &str) -> Self {
Self { rope: ropey::Rope::from_str(content) }
}
pub fn get_text(&self) -> String {
self.rope.to_string()
}
pub fn len_chars(&self) -> usize {
self.rope.len_chars()
}
pub fn is_empty(&self) -> bool {
self.rope.len_chars() == 0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_text_buffer_new_empty() {
let buffer = TextBuffer::new("");
assert!(buffer.is_empty());
assert_eq!(buffer.len_chars(), 0);
assert_eq!(buffer.get_text(), "");
}
#[test]
fn test_text_buffer_with_content() {
let content = "Hello, world!";
let buffer = TextBuffer::new(content);
assert!(!buffer.is_empty());
assert_eq!(buffer.len_chars(), 13);
assert_eq!(buffer.get_text(), content);
}
#[test]
fn test_text_buffer_len_chars() {
let buffer = TextBuffer::new("abcdef");
assert_eq!(buffer.len_chars(), 6);
let buffer = TextBuffer::new("line1\nline2\nline3");
assert_eq!(buffer.len_chars(), 17);
let buffer = TextBuffer::new("café");
assert_eq!(buffer.len_chars(), 4);
let buffer = TextBuffer::new("🦀");
assert_eq!(buffer.len_chars(), 1);
}
#[test]
fn test_text_buffer_large_content() {
let content: String = (0..10_000)
.map(|i| format!("Line number {}", i))
.collect::<Vec<_>>()
.join("\n");
let buffer = TextBuffer::new(&content);
assert!(!buffer.is_empty());
assert_eq!(buffer.len_chars(), content.len());
let text = buffer.get_text();
assert_eq!(text, content);
assert!(text.starts_with("Line number 0"));
assert!(text.contains("Line number 5000"));
assert!(text.ends_with("Line number 9999"));
}
#[test]
fn test_text_buffer_new_returns_valid_buffer() {
let content = "Hello, DSCode!";
let buffer = TextBuffer::new(content);
assert_eq!(buffer.get_text(), content);
}
#[test]
fn test_text_buffer_get_text_preserves_unicode() {
let content = "cafe\u{301} 🦀 Rust"; let buffer = TextBuffer::new(content);
assert_eq!(buffer.get_text(), content);
}
#[test]
fn test_text_buffer_is_empty_variations() {
assert!(TextBuffer::new("").is_empty());
assert!(!TextBuffer::new(" ").is_empty()); assert!(!TextBuffer::new("\n").is_empty()); assert!(!TextBuffer::new("\t").is_empty()); }
#[test]
fn test_text_buffer_len_chars_multibyte() {
let buffer = TextBuffer::new("🦀🦀🦀");
assert_eq!(buffer.len_chars(), 3);
let buffer = TextBuffer::new("日本語");
assert_eq!(buffer.len_chars(), 3);
}
#[test]
fn test_text_buffer_large_multiline() {
let line_count = 50_000;
let content: String = (0..line_count)
.map(|i| format!("line {}", i))
.collect::<Vec<_>>()
.join("\n");
let buffer = TextBuffer::new(&content);
assert!(!buffer.is_empty());
assert_eq!(buffer.get_text(), content);
}
}