From 8fd16592929efb4ff58c20dcd94798743a28c6e4 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sat, 10 Jan 2015 11:48:20 -0800 Subject: [PATCH] Better unit test hygiene, and renamed buffer len() to grapheme_count(). --- src/buffer/line.rs | 1 + src/buffer/mod.rs | 87 ++++---- src/buffer/node.rs | 514 +++++++++++++++++++++++---------------------- src/editor.rs | 10 +- src/term_ui.rs | 6 +- 5 files changed, 313 insertions(+), 305 deletions(-) diff --git a/src/buffer/line.rs b/src/buffer/line.rs index 476056e..6a19cc6 100644 --- a/src/buffer/line.rs +++ b/src/buffer/line.rs @@ -688,6 +688,7 @@ impl<'a> Iterator for LineGraphemeVisIter<'a> { // Line tests //========================================================================= +#[cfg(test)] mod tests { use super::{Line, LineEnding, LineGraphemeIter, LineGraphemeVisIter}; const TAB_WIDTH: usize = 4; diff --git a/src/buffer/mod.rs b/src/buffer/mod.rs index ec63d7d..6de2135 100644 --- a/src/buffer/mod.rs +++ b/src/buffer/mod.rs @@ -33,7 +33,7 @@ impl Buffer { } - pub fn len(&self) -> usize { + pub fn grapheme_count(&self) -> usize { self.text.grapheme_count } @@ -44,7 +44,7 @@ impl Buffer { pub fn get_grapheme<'a>(&'a self, index: usize) -> &'a str { - if index >= self.len() { + if index >= self.grapheme_count() { panic!("Buffer::get_grapheme(): index past last grapheme."); } else { @@ -54,7 +54,7 @@ impl Buffer { pub fn get_grapheme_width(&self, index: usize, tab_width: usize) -> usize { - if index >= self.len() { + if index >= self.grapheme_count() { panic!("Buffer::get_grapheme_width(): index past last grapheme."); } else { @@ -117,7 +117,7 @@ impl Buffer { pub fn pos_vis_2d_to_closest_1d(&self, pos: (usize, usize), tab_width: usize) -> usize { if pos.0 >= self.line_count() { - return self.len(); + return self.grapheme_count(); } else { let gs = self.pos_2d_to_closest_1d((pos.0, 0)); @@ -171,7 +171,7 @@ impl Buffer { panic!("Buffer::remove_text(): pos_a must be less than or equal to pos_b."); } // Bounds error - else if pos_b > self.len() { + else if pos_b > self.grapheme_count() { panic!("Buffer::remove_text(): attempt to remove text past the end of buffer."); } // Complete removal of all text @@ -218,7 +218,7 @@ impl Buffer { if pos_b < pos_a { panic!("Buffer::string_from_range(): pos_a must be less than or equal to pos_b."); } - else if pos_b > self.len() { + else if pos_b > self.grapheme_count() { panic!("Buffer::string_from_range(): specified range is past end of buffer text."); } @@ -364,6 +364,7 @@ enum Operation { // TESTS //================================================================ +#[cfg(test)] mod tests { use super::{Buffer, Operation, BufferGraphemeIter, BufferLineIter}; @@ -375,7 +376,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 9); + assert!(buf.grapheme_count() == 9); assert!(buf.text.line_count == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -398,7 +399,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 11); + assert!(buf.grapheme_count() == 11); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -424,7 +425,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 17); + assert!(buf.grapheme_count() == 17); assert!(buf.text.line_count == 3); assert!(Some("A") == iter.next()); assert!(Some("g") == iter.next()); @@ -456,7 +457,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 17); + assert!(buf.grapheme_count() == 17); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -488,7 +489,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 16); + assert!(buf.grapheme_count() == 16); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -519,7 +520,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 16); + assert!(buf.grapheme_count() == 16); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -550,7 +551,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 16); + assert!(buf.grapheme_count() == 16); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -582,7 +583,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 16); + assert!(buf.grapheme_count() == 16); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -614,7 +615,7 @@ mod tests { let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 20); + assert!(buf.grapheme_count() == 20); assert!(buf.text.line_count == 7); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -646,14 +647,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_text(0, 3); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 26); + assert!(buf.grapheme_count() == 26); assert!(buf.text.line_count == 5); assert!(Some("t") == iter.next()); assert!(Some("h") == iter.next()); @@ -690,14 +691,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_text(0, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 17); + assert!(buf.grapheme_count() == 17); assert!(buf.text.line_count == 4); assert!(Some("p") == iter.next()); assert!(Some("l") == iter.next()); @@ -725,14 +726,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_text(5, 17); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 17); + assert!(buf.grapheme_count() == 17); assert!(buf.text.line_count == 4); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -760,14 +761,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_text(23, 29); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 23); + assert!(buf.grapheme_count() == 23); assert!(buf.text.line_count == 6); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -801,14 +802,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_text(17, 29); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 17); + assert!(buf.grapheme_count() == 17); assert!(buf.text.line_count == 4); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -836,14 +837,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.len() == 12); + assert!(buf.grapheme_count() == 12); assert!(buf.text.line_count == 2); buf.remove_text(3, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 3); + assert!(buf.grapheme_count() == 3); assert!(buf.text.line_count == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -857,14 +858,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\nworld!", 0); - assert!(buf.len() == 15); + assert!(buf.grapheme_count() == 15); assert!(buf.text.line_count == 3); buf.remove_text(5, 15); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 5); + assert!(buf.grapheme_count() == 5); assert!(buf.text.line_count == 2); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -880,14 +881,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.len() == 12); + assert!(buf.grapheme_count() == 12); assert!(buf.text.line_count == 2); buf.remove_text(3, 11); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 4); + assert!(buf.grapheme_count() == 4); assert!(buf.text.line_count == 1); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -902,14 +903,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hello\nworld!", 0); - assert!(buf.len() == 12); + assert!(buf.grapheme_count() == 12); assert!(buf.text.line_count == 2); buf.remove_text(8, 12); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 8); + assert!(buf.grapheme_count() == 8); assert!(buf.text.line_count == 2); assert!(Some("H") == iter.next()); assert!(Some("e") == iter.next()); @@ -928,14 +929,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("12\n34\n56\n78", 0); - assert!(buf.len() == 11); + assert!(buf.grapheme_count() == 11); assert!(buf.text.line_count == 4); buf.remove_text(4, 11); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 4); + assert!(buf.grapheme_count() == 4); assert!(buf.text.line_count == 2); assert!(Some("1") == iter.next()); assert!(Some("2") == iter.next()); @@ -950,14 +951,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("1234567890", 0); - assert!(buf.len() == 10); + assert!(buf.grapheme_count() == 10); assert!(buf.text.line_count == 1); buf.remove_text(9, 10); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 9); + assert!(buf.grapheme_count() == 9); assert!(buf.text.line_count == 1); assert!(Some("1") == iter.next()); assert!(Some("2") == iter.next()); @@ -977,14 +978,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_lines(0, 3); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 13); + assert!(buf.grapheme_count() == 13); assert!(buf.text.line_count == 3); assert!(Some("o") == iter.next()); assert!(Some("f") == iter.next()); @@ -1008,14 +1009,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_lines(1, 4); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 13); + assert!(buf.grapheme_count() == 13); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); @@ -1039,14 +1040,14 @@ mod tests { let mut buf = Buffer::new(); buf.insert_text("Hi\nthere\npeople\nof\nthe\nworld!", 0); - assert!(buf.len() == 29); + assert!(buf.grapheme_count() == 29); assert!(buf.text.line_count == 6); buf.remove_lines(3, 6); let mut iter = buf.grapheme_iter(); - assert!(buf.len() == 15); + assert!(buf.grapheme_count() == 15); assert!(buf.text.line_count == 3); assert!(Some("H") == iter.next()); assert!(Some("i") == iter.next()); diff --git a/src/buffer/node.rs b/src/buffer/node.rs index 44f61db..6e179e9 100644 --- a/src/buffer/node.rs +++ b/src/buffer/node.rs @@ -919,269 +919,275 @@ impl<'a> Iterator for BufferNodeLineIter<'a> { // TESTS //==================================================================== -#[test] -fn merge_line_with_next_recursive_1() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there!", 0); - - assert!(node.grapheme_count == 10); - assert!(node.line_count == 2); - - node.merge_line_with_next_recursive(0, None); - - let mut iter = node.grapheme_iter(); - - assert!(node.grapheme_count == 9); - assert!(node.line_count == 1); - assert!(Some("H") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some(" ") == 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("!") == iter.next()); - assert!(None == iter.next()); -} +#[cfg(test)] +mod tests { + use super::BufferNode; + use super::super::line::LineEnding; - -#[test] -fn merge_line_with_next_recursive_2() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there\n people \nof the\n world!", 0); + #[test] + fn merge_line_with_next_recursive_1() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there!", 0); + + assert!(node.grapheme_count == 10); + assert!(node.line_count == 2); + + node.merge_line_with_next_recursive(0, None); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 9); + assert!(node.line_count == 1); + assert!(Some("H") == iter.next()); + assert!(Some("i") == iter.next()); + assert!(Some(" ") == 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("!") == iter.next()); + assert!(None == iter.next()); + } - assert!(node.grapheme_count == 33); - assert!(node.line_count == 5); - node.merge_line_with_next_recursive(2, None); + #[test] + fn merge_line_with_next_recursive_2() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there\n people \nof the\n world!", 0); + + assert!(node.grapheme_count == 33); + assert!(node.line_count == 5); + + node.merge_line_with_next_recursive(2, None); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 32); + assert!(node.line_count == 4); + assert!(Some("H") == iter.next()); + assert!(Some("i") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); + assert!(Some("o") == iter.next()); + assert!(Some("f") == iter.next()); + assert!(Some(" ") == 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("!") == iter.next()); + assert!(None == iter.next()); + } - let mut iter = node.grapheme_iter(); - assert!(node.grapheme_count == 32); - assert!(node.line_count == 4); - assert!(Some("H") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("f") == iter.next()); - assert!(Some(" ") == 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("!") == iter.next()); - assert!(None == iter.next()); -} - - -#[test] -fn merge_line_with_next_recursive_3() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there\n people \nof the\n world!", 0); + #[test] + fn merge_line_with_next_recursive_3() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there\n people \nof the\n world!", 0); + + assert!(node.grapheme_count == 33); + assert!(node.line_count == 5); + + node.merge_line_with_next_recursive(0, None); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 32); + assert!(node.line_count == 4); + assert!(Some("H") == iter.next()); + assert!(Some("i") == iter.next()); + assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some("o") == iter.next()); + assert!(Some("f") == iter.next()); + assert!(Some(" ") == 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("!") == iter.next()); + assert!(None == iter.next()); + } - assert!(node.grapheme_count == 33); - assert!(node.line_count == 5); - node.merge_line_with_next_recursive(0, None); + #[test] + fn pull_out_line_recursive_1() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there\n people \nof the\n world!", 0); + + assert!(node.grapheme_count == 33); + assert!(node.line_count == 5); + + let line = node.pull_out_line_recursive(0).unwrap(); + assert!(line.as_str() == "Hi"); + assert!(line.ending == LineEnding::LF); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 30); + assert!(node.line_count == 4); + assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some("o") == iter.next()); + assert!(Some("f") == iter.next()); + assert!(Some(" ") == 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("!") == iter.next()); + assert!(None == iter.next()); + } - let mut iter = node.grapheme_iter(); - assert!(node.grapheme_count == 32); - assert!(node.line_count == 4); - assert!(Some("H") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("f") == iter.next()); - assert!(Some(" ") == 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("!") == iter.next()); - assert!(None == iter.next()); -} - - -#[test] -fn pull_out_line_recursive_1() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there\n people \nof the\n world!", 0); + #[test] + fn pull_out_line_recursive_2() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there\n people \nof the\n world!", 0); + + assert!(node.grapheme_count == 33); + assert!(node.line_count == 5); + + let line = node.pull_out_line_recursive(2).unwrap(); + assert!(line.as_str() == " people "); + assert!(line.ending == LineEnding::LF); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 24); + assert!(node.line_count == 4); + assert!(Some("H") == iter.next()); + assert!(Some("i") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some(" ") == 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("o") == iter.next()); + assert!(Some("f") == iter.next()); + assert!(Some(" ") == 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("!") == iter.next()); + assert!(None == iter.next()); + } - assert!(node.grapheme_count == 33); - assert!(node.line_count == 5); - let line = node.pull_out_line_recursive(0).unwrap(); - assert!(line.as_str() == "Hi"); - assert!(line.ending == LineEnding::LF); + #[test] + fn pull_out_line_recursive_3() { + let mut node = BufferNode::new(); + node.insert_text("Hi\n there\n people \nof the\n world!", 0); + + assert!(node.grapheme_count == 33); + assert!(node.line_count == 5); + + let line = node.pull_out_line_recursive(4).unwrap(); + assert!(line.as_str() == " world!"); + assert!(line.ending == LineEnding::None); + + let mut iter = node.grapheme_iter(); + + assert!(node.grapheme_count == 26); + assert!(node.line_count == 4); + assert!(Some("H") == iter.next()); + assert!(Some("i") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(Some("o") == iter.next()); + assert!(Some("f") == iter.next()); + assert!(Some(" ") == iter.next()); + assert!(Some("t") == iter.next()); + assert!(Some("h") == iter.next()); + assert!(Some("e") == iter.next()); + assert!(Some("\n") == iter.next()); + assert!(None == iter.next()); + } - let mut iter = node.grapheme_iter(); - - assert!(node.grapheme_count == 30); - assert!(node.line_count == 4); - assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("f") == iter.next()); - assert!(Some(" ") == 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("!") == iter.next()); - assert!(None == iter.next()); -} - - -#[test] -fn pull_out_line_recursive_2() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there\n people \nof the\n world!", 0); - - assert!(node.grapheme_count == 33); - assert!(node.line_count == 5); - - let line = node.pull_out_line_recursive(2).unwrap(); - assert!(line.as_str() == " people "); - assert!(line.ending == LineEnding::LF); - - let mut iter = node.grapheme_iter(); - - assert!(node.grapheme_count == 24); - assert!(node.line_count == 4); - assert!(Some("H") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == 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("o") == iter.next()); - assert!(Some("f") == iter.next()); - assert!(Some(" ") == 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("!") == iter.next()); - assert!(None == iter.next()); -} - - -#[test] -fn pull_out_line_recursive_3() { - let mut node = BufferNode::new(); - node.insert_text("Hi\n there\n people \nof the\n world!", 0); - - assert!(node.grapheme_count == 33); - assert!(node.line_count == 5); - - let line = node.pull_out_line_recursive(4).unwrap(); - assert!(line.as_str() == " world!"); - assert!(line.ending == LineEnding::None); - - let mut iter = node.grapheme_iter(); - - assert!(node.grapheme_count == 26); - assert!(node.line_count == 4); - assert!(Some("H") == iter.next()); - assert!(Some("i") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some(" ") == 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(" ") == 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!(Some(" ") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(Some("o") == iter.next()); - assert!(Some("f") == iter.next()); - assert!(Some(" ") == iter.next()); - assert!(Some("t") == iter.next()); - assert!(Some("h") == iter.next()); - assert!(Some("e") == iter.next()); - assert!(Some("\n") == iter.next()); - assert!(None == iter.next()); -} - +} \ No newline at end of file diff --git a/src/editor.rs b/src/editor.rs index 99e1378..fca62f1 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -270,7 +270,7 @@ impl Editor { pub fn insert_text_at_grapheme(&mut self, text: &str, pos: usize) { self.dirty = true; - let buf_len = self.buffer.len(); + let buf_len = self.buffer.grapheme_count(); self.buffer.insert_text(text, if pos < buf_len {pos} else {buf_len}); } @@ -294,7 +294,7 @@ impl Editor { pub fn remove_text_in_front_of_cursor(&mut self, grapheme_count: usize) { let pos_a = self.cursor.range.1; - let pos_b = if (pos_a + grapheme_count) <= self.buffer.len() {pos_a + grapheme_count} else {self.buffer.len()}; + let pos_b = if (pos_a + grapheme_count) <= self.buffer.grapheme_count() {pos_a + grapheme_count} else {self.buffer.grapheme_count()}; // Remove text self.buffer.remove_text(pos_a, pos_b); @@ -331,7 +331,7 @@ impl Editor { } pub fn cursor_to_end_of_buffer(&mut self) { - let end = self.buffer.len(); + let end = self.buffer.grapheme_count(); self.cursor.range = (end, end); self.cursor.update_vis_start(&(self.buffer), self.tab_width); @@ -355,11 +355,11 @@ impl Editor { } pub fn cursor_right(&mut self, n: usize) { - if self.cursor.range.1 <= (self.buffer.len() - n) { + if self.cursor.range.1 <= (self.buffer.grapheme_count() - n) { self.cursor.range.1 += n; } else { - self.cursor.range.1 = self.buffer.len(); + self.cursor.range.1 = self.buffer.grapheme_count(); } self.cursor.range.0 = self.cursor.range.1; diff --git a/src/term_ui.rs b/src/term_ui.rs index 44648e6..2c20b53 100644 --- a/src/term_ui.rs +++ b/src/term_ui.rs @@ -296,8 +296,8 @@ impl TermUI { self.rb.print(c1.1 + 1, c1.0, rustbox::RB_NORMAL, foreground, background, name.as_slice()); // Percentage position in document - let percentage: usize = if editor.buffer.len() > 0 { - (((editor.cursor.range.0 as f32) / (editor.buffer.len() as f32)) * 100.0) as usize + let percentage: usize = if editor.buffer.grapheme_count() > 0 { + (((editor.cursor.range.0 as f32) / (editor.buffer.grapheme_count() as f32)) * 100.0) as usize } else { 100 @@ -400,7 +400,7 @@ impl TermUI { // Print cursor if it's at the end of the text, and thus wasn't printed // already. - if editor.cursor.range.0 >= editor.buffer.len() { + if editor.cursor.range.0 >= editor.buffer.grapheme_count() { let vis_cursor_pos = editor.buffer.pos_1d_to_closest_vis_2d(editor.cursor.range.0, editor.tab_width); if (vis_cursor_pos.0 >= editor.view_pos.0) && (vis_cursor_pos.1 >= editor.view_pos.1) { let print_cursor_pos = (vis_cursor_pos.0 - editor.view_pos.0 + c1.0, vis_cursor_pos.1 - editor.view_pos.1 + c1.1);