on master help sign in
fix test::plain
d3b051dSkyler Hawthorne
helix-core/src/movement.rs+6−6
@@ -1474,7 +1474,7 @@ mod test {
1474 let text = Rope::from(s.as_str());
1474 let text = Rope::from(s.as_str());
1475 let selection =
1475 let selection =
1476 selection.transform(|r| move_prev_paragraph(text.slice(..), r, 1, Movement::Move));
1476 selection.transform(|r| move_prev_paragraph(text.slice(..), r, 1, Movement::Move));
1477− let actual = crate::test::plain(&s, &selection);
1477+ let actual = crate::test::plain(s.as_ref(), &selection);
1478 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1478 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1479 }
1479 }
1480 }
1480 }
@@ -1497,7 +1497,7 @@ mod test {
1497 let text = Rope::from(s.as_str());
1497 let text = Rope::from(s.as_str());
1498 let selection =
1498 let selection =
1499 selection.transform(|r| move_prev_paragraph(text.slice(..), r, 2, Movement::Move));
1499 selection.transform(|r| move_prev_paragraph(text.slice(..), r, 2, Movement::Move));
1500− let actual = crate::test::plain(&s, &selection);
1500+ let actual = crate::test::plain(s.as_ref(), &selection);
1501 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1501 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1502 }
1502 }
1503 }
1503 }
@@ -1520,7 +1520,7 @@ mod test {
1520 let text = Rope::from(s.as_str());
1520 let text = Rope::from(s.as_str());
1521 let selection = selection
1521 let selection = selection
1522 .transform(|r| move_prev_paragraph(text.slice(..), r, 1, Movement::Extend));
1522 .transform(|r| move_prev_paragraph(text.slice(..), r, 1, Movement::Extend));
1523− let actual = crate::test::plain(&s, &selection);
1523+ let actual = crate::test::plain(s.as_ref(), &selection);
1524 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1524 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1525 }
1525 }
1526 }
1526 }
@@ -1562,7 +1562,7 @@ mod test {
1562 let text = Rope::from(s.as_str());
1562 let text = Rope::from(s.as_str());
1563 let selection =
1563 let selection =
1564 selection.transform(|r| move_next_paragraph(text.slice(..), r, 1, Movement::Move));
1564 selection.transform(|r| move_next_paragraph(text.slice(..), r, 1, Movement::Move));
1565− let actual = crate::test::plain(&s, &selection);
1565+ let actual = crate::test::plain(s.as_ref(), &selection);
1566 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1566 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1567 }
1567 }
1568 }
1568 }
@@ -1585,7 +1585,7 @@ mod test {
1585 let text = Rope::from(s.as_str());
1585 let text = Rope::from(s.as_str());
1586 let selection =
1586 let selection =
1587 selection.transform(|r| move_next_paragraph(text.slice(..), r, 2, Movement::Move));
1587 selection.transform(|r| move_next_paragraph(text.slice(..), r, 2, Movement::Move));
1588− let actual = crate::test::plain(&s, &selection);
1588+ let actual = crate::test::plain(s.as_ref(), &selection);
1589 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1589 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1590 }
1590 }
1591 }
1591 }
@@ -1608,7 +1608,7 @@ mod test {
1608 let text = Rope::from(s.as_str());
1608 let text = Rope::from(s.as_str());
1609 let selection = selection
1609 let selection = selection
1610 .transform(|r| move_next_paragraph(text.slice(..), r, 1, Movement::Extend));
1610 .transform(|r| move_next_paragraph(text.slice(..), r, 1, Movement::Extend));
1611− let actual = crate::test::plain(&s, &selection);
1611+ let actual = crate::test::plain(s.as_ref(), &selection);
1612 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1612 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
1613 }
1613 }
1614 }
1614 }
helix-core/src/test.rs+98−4
@@ -1,5 +1,6 @@
1//! Test helpers.
1//! Test helpers.
2use crate::{Range, Selection};
2use crate::{Range, Selection};
3+use ropey::Rope;
3use smallvec::SmallVec;
4use smallvec::SmallVec;
4use std::cmp::Reverse;
5use std::cmp::Reverse;
5use unicode_segmentation::UnicodeSegmentation;
6use unicode_segmentation::UnicodeSegmentation;
@@ -148,10 +149,12 @@ pub fn print(s: &str) -> (String, Selection) {
148/// "#[a|]#b#(|c)#".to_owned()
149/// "#[a|]#b#(|c)#".to_owned()
149/// );
150/// );
150/// ```
151/// ```
151−pub fn plain(s: &str, selection: &Selection) -> String {
152+pub fn plain<R: Into<Rope>>(s: R, selection: &Selection) -> String {
153+ let s = s.into();
152 let primary = selection.primary_index();
154 let primary = selection.primary_index();
153− let mut out = String::with_capacity(s.len() + 5 * selection.len());
155+ let mut out = String::with_capacity(s.len_bytes() + 5 * selection.len());
154− out.push_str(s);
156+ out.push_str(&s.to_string());
157+
155 let mut insertion: Vec<_> = selection
158 let mut insertion: Vec<_> = selection
156 .iter()
159 .iter()
157 .enumerate()
160 .enumerate()
@@ -164,7 +167,9 @@ pub fn plain(s: &str, selection: &Selection) -> String {
164 (false, false) => [(range.anchor, ")#"), (range.head, "#(|")],
167 (false, false) => [(range.anchor, ")#"), (range.head, "#(|")],
165 }
168 }
166 })
169 })
170+ .map(|(char_idx, marker)| (s.char_to_byte(char_idx), marker))
167 .collect();
171 .collect();
172+
168 // insert in reverse order
173 // insert in reverse order
169 insertion.sort_unstable_by_key(|k| Reverse(k.0));
174 insertion.sort_unstable_by_key(|k| Reverse(k.0));
170 for (i, s) in insertion {
175 for (i, s) in insertion {
@@ -173,7 +178,6 @@ pub fn plain(s: &str, selection: &Selection) -> String {
173 out
178 out
174}
179}
175
180
176−#[allow(clippy::module_inception)]
177#[cfg(test)]
181#[cfg(test)]
178#[allow(clippy::module_inception)]
182#[allow(clippy::module_inception)]
179mod test {
183mod test {
@@ -289,4 +293,94 @@ mod test {
289 print("hello #[|👨‍👩‍👧‍👦]# goodbye")
293 print("hello #[|👨‍👩‍👧‍👦]# goodbye")
290 );
294 );
291 }
295 }
296+
297+ #[test]
298+ fn plain_single() {
299+ assert_eq!("#[|h]#ello", plain("hello", &Selection::single(1, 0)));
300+ assert_eq!("#[h|]#ello", plain("hello", &Selection::single(0, 1)));
301+ assert_eq!("#[|hell]#o", plain("hello", &Selection::single(4, 0)));
302+ assert_eq!("#[hell|]#o", plain("hello", &Selection::single(0, 4)));
303+ assert_eq!("#[|hello]#", plain("hello", &Selection::single(5, 0)));
304+ assert_eq!("#[hello|]#", plain("hello", &Selection::single(0, 5)));
305+ }
306+
307+ #[test]
308+ fn plain_multi() {
309+ assert_eq!(
310+ plain(
311+ "hello",
312+ &Selection::new(
313+ SmallVec::from_slice(&[Range::new(1, 0), Range::new(5, 4)]),
314+ 0
315+ )
316+ ),
317+ String::from("#[|h]#ell#(|o)#")
318+ );
319+ assert_eq!(
320+ plain(
321+ "hello",
322+ &Selection::new(
323+ SmallVec::from_slice(&[Range::new(0, 1), Range::new(4, 5)]),
324+ 0
325+ )
326+ ),
327+ String::from("#[h|]#ell#(o|)#")
328+ );
329+ assert_eq!(
330+ plain(
331+ "hello",
332+ &Selection::new(
333+ SmallVec::from_slice(&[Range::new(2, 0), Range::new(5, 3)]),
334+ 0
335+ )
336+ ),
337+ String::from("#[|he]#l#(|lo)#")
338+ );
339+ assert_eq!(
340+ plain(
341+ "hello\r\nhello\r\nhello\r\n",
342+ &Selection::new(
343+ SmallVec::from_slice(&[
344+ Range::new(7, 5),
345+ Range::new(21, 19),
346+ Range::new(14, 12)
347+ ]),
348+ 0
349+ )
350+ ),
351+ String::from("hello#[|\r\n]#hello#(|\r\n)#hello#(|\r\n)#")
352+ );
353+ }
354+
355+ #[test]
356+ fn plain_multi_byte_code_point() {
357+ assert_eq!(
358+ plain("„“", &Selection::single(1, 0)),
359+ String::from("#[|„]#“")
360+ );
361+ assert_eq!(
362+ plain("„“", &Selection::single(2, 1)),
363+ String::from("„#[|“]#")
364+ );
365+ assert_eq!(
366+ plain("„“", &Selection::single(0, 1)),
367+ String::from("#[„|]#“")
368+ );
369+ assert_eq!(
370+ plain("„“", &Selection::single(1, 2)),
371+ String::from("„#[“|]#")
372+ );
373+ assert_eq!(
374+ plain("they said „hello“", &Selection::single(11, 10)),
375+ String::from("they said #[|„]#hello“")
376+ );
377+ }
378+
379+ #[test]
380+ fn plain_multi_code_point_grapheme() {
381+ assert_eq!(
382+ plain("hello 👨‍👩‍👧‍👦 goodbye", &Selection::single(13, 6)),
383+ String::from("hello #[|👨‍👩‍👧‍👦]# goodbye")
384+ );
385+ }
292}
386}
helix-core/src/textobject.rs+3−3
@@ -437,7 +437,7 @@ mod test {
437 let text = Rope::from(s.as_str());
437 let text = Rope::from(s.as_str());
438 let selection = selection
438 let selection = selection
439 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Inside, 1));
439 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Inside, 1));
440− let actual = crate::test::plain(&s, &selection);
440+ let actual = crate::test::plain(s.as_ref(), &selection);
441 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
441 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
442 }
442 }
443 }
443 }
@@ -460,7 +460,7 @@ mod test {
460 let text = Rope::from(s.as_str());
460 let text = Rope::from(s.as_str());
461 let selection = selection
461 let selection = selection
462 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Inside, 2));
462 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Inside, 2));
463− let actual = crate::test::plain(&s, &selection);
463+ let actual = crate::test::plain(s.as_ref(), &selection);
464 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
464 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
465 }
465 }
466 }
466 }
@@ -491,7 +491,7 @@ mod test {
491 let text = Rope::from(s.as_str());
491 let text = Rope::from(s.as_str());
492 let selection = selection
492 let selection = selection
493 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Around, 1));
493 .transform(|r| textobject_paragraph(text.slice(..), r, TextObject::Around, 1));
494− let actual = crate::test::plain(&s, &selection);
494+ let actual = crate::test::plain(s.as_ref(), &selection);
495 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
495 assert_eq!(actual, expected, "\nbefore: `{:?}`", before);
496 }
496 }
497 }
497 }
helix-term/tests/test/helpers.rs+2−2
@@ -65,7 +65,7 @@ pub async fn test_key_sequences(
65
65
66 for (i, (in_keys, test_fn)) in inputs.into_iter().enumerate() {
66 for (i, (in_keys, test_fn)) in inputs.into_iter().enumerate() {
67 let (view, doc) = current_ref!(app.editor);
67 let (view, doc) = current_ref!(app.editor);
68− let state = test::plain(&doc.text().to_string(), doc.selection(view.id));
68+ let state = test::plain(doc.text().slice(..), doc.selection(view.id));
69
69
70 log::debug!("executing test with document state:\n\n-----\n\n{}", state);
70 log::debug!("executing test with document state:\n\n-----\n\n{}", state);
71
71
@@ -81,7 +81,7 @@ pub async fn test_key_sequences(
81
81
82 if !app_exited {
82 if !app_exited {
83 let (view, doc) = current_ref!(app.editor);
83 let (view, doc) = current_ref!(app.editor);
84− let state = test::plain(&doc.text().to_string(), doc.selection(view.id));
84+ let state = test::plain(doc.text().slice(..), doc.selection(view.id));
85
85
86 log::debug!(
86 log::debug!(
87 "finished running test with document state:\n\n-----\n\n{}",
87 "finished running test with document state:\n\n-----\n\n{}",