Added a bunch more tests for Buffer, and fixed line removal code.

This commit is contained in:
Nathan Vegdahl 2014-12-31 00:31:42 -08:00
parent 720246142e
commit f0f6980b6d
2 changed files with 355 additions and 20 deletions

View File

@ -75,6 +75,7 @@ impl Buffer {
// All other cases
else {
self.root.remove_lines_recursive(line_a, line_b);
self.root.set_last_line_ending_recursive();
}
}
@ -301,10 +302,11 @@ impl<'a> Iterator<&'a str> for BufferGraphemeIter<'a> {
fn insert_text() {
let mut buf = Buffer::new();
buf.insert_text("Hello world!", 0);
buf.insert_text("Hello 世界!", 0);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 9);
assert!(buf.root.line_count == 1);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
@ -312,6 +314,285 @@ fn insert_text() {
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_with_newlines() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 11);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_1() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("Again ", 0);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 17);
assert!(buf.root.line_count == 3);
assert!(Some("A") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_2() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text(" again", 5);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 17);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_3() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("again", 6);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 16);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_4() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("again", 11);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 16);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_5() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("again", 2);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 16);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_6() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("again", 8);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 16);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn insert_text_in_non_empty_buffer_7() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n 世界\r\n!", 0);
buf.insert_text("\nag\n\nain\n", 2);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 20);
assert!(buf.root.line_count == 7);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("g") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("a") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("n") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn remove_lines_1() {
let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
assert!(buf.len() == 29);
assert!(buf.root.line_count == 6);
buf.remove_lines(0, 3);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 13);
assert!(buf.root.line_count == 3);
assert!(Some("o") == iter.next());
assert!(Some("f") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("t") == iter.next());
assert!(Some("h") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("w") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("r") == iter.next());
@ -323,27 +604,64 @@ fn insert_text() {
#[test]
fn insert_text_with_newlines() {
fn remove_lines_2() {
let mut buf = Buffer::new();
buf.insert_text("Hello\n world\r\n!", 0);
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
assert!(buf.len() == 29);
assert!(buf.root.line_count == 6);
buf.remove_lines(1, 4);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 13);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("t") == iter.next());
assert!(Some("h") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some(" ") == iter.next());
assert!(Some("w") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("r") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("d") == iter.next());
assert!(Some("\r\n") == iter.next());
assert!(Some("!") == iter.next());
assert!(None == iter.next());
}
#[test]
fn remove_lines_3() {
let mut buf = Buffer::new();
buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0);
assert!(buf.len() == 29);
assert!(buf.root.line_count == 6);
buf.remove_lines(3, 6);
let mut iter = buf.grapheme_iter();
assert!(buf.len() == 15);
assert!(buf.root.line_count == 3);
assert!(Some("H") == iter.next());
assert!(Some("i") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("t") == iter.next());
assert!(Some("h") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("r") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("\n") == iter.next());
assert!(Some("p") == iter.next());
assert!(Some("e") == iter.next());
assert!(Some("o") == iter.next());
assert!(Some("p") == iter.next());
assert!(Some("l") == iter.next());
assert!(Some("e") == iter.next());
assert!(None == iter.next());
}

View File

@ -323,17 +323,6 @@ impl BufferNode {
let mut temp_node = BufferNode::new();
if let BufferNodeData::Branch(ref mut left, ref mut right) = self.data {
// Left node completely removed
if line_a == 0 && line_b >= left.line_count {
remove_left = true;
}
// Left node partially removed
else if line_a < left.line_count {
let a = line_a;
let b = min(left.line_count, line_b);
left.remove_lines_recursive(a, b);
}
// Right node completely removed
if line_a <= left.line_count && line_b >= (left.line_count + right.line_count) {
remove_right = true;
@ -345,6 +334,17 @@ impl BufferNode {
right.remove_lines_recursive(a, b);
}
// Left node completely removed
if line_a == 0 && line_b >= left.line_count {
remove_left = true;
}
// Left node partially removed
else if line_a < left.line_count {
let a = line_a;
let b = min(left.line_count, line_b);
left.remove_lines_recursive(a, b);
}
// Set up for node removal
if remove_left && remove_right {
panic!("remove_lines_recursive(): attempting to completely remove both left and right nodes. This should never happen!");
@ -370,4 +370,21 @@ impl BufferNode {
}
/// Ensures that the last line in the node tree has no
/// ending line break.
pub fn set_last_line_ending_recursive(&mut self) {
match self.data {
BufferNodeData::Branch(_, ref mut right) => {
right.set_last_line_ending_recursive();
},
BufferNodeData::Leaf(ref mut line) => {
line.ending = LineEnding::None;
},
}
self.update_stats();
}
}