aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_editor/src/folding_ranges.rs55
-rw-r--r--crates/test_utils/src/lib.rs38
2 files changed, 63 insertions, 30 deletions
diff --git a/crates/ra_editor/src/folding_ranges.rs b/crates/ra_editor/src/folding_ranges.rs
index 8aabb5e0b..a1699d449 100644
--- a/crates/ra_editor/src/folding_ranges.rs
+++ b/crates/ra_editor/src/folding_ranges.rs
@@ -120,54 +120,65 @@ fn contiguous_range_for_comment<'a>(
120#[cfg(test)] 120#[cfg(test)]
121mod tests { 121mod tests {
122 use super::*; 122 use super::*;
123 use test_utils::extract_ranges;
124
125 fn do_check(text: &str, fold_kinds: &[FoldKind]) {
126 let (ranges, text) = extract_ranges(text);
127 let file = File::parse(&text);
128 let folds = folding_ranges(&file);
129
130 assert_eq!(folds.len(), ranges.len());
131 for ((fold, range), fold_kind) in folds.into_iter().zip(ranges.into_iter()).zip(fold_kinds.into_iter()) {
132 assert_eq!(fold.range.start(), range.start());
133 assert_eq!(fold.range.end(), range.end());
134 assert_eq!(&fold.kind, fold_kind);
135 }
136 }
123 137
124 #[test] 138 #[test]
125 fn test_fold_comments() { 139 fn test_fold_comments() {
126 let text = r#" 140 let text = r#"
127// Hello 141<|>// Hello
128// this is a multiline 142// this is a multiline
129// comment 143// comment
130// 144//<|>
131 145
132// But this is not 146// But this is not
133 147
134fn main() { 148fn main() {
135 // We should 149 <|>// We should
136 // also 150 // also
137 // fold 151 // fold
138 // this one. 152 // this one.<|>
153 <|>//! But this one is different
154 //! because it has another flavor<|>
155 <|>/* As does this
156 multiline comment */<|>
139}"#; 157}"#;
140 158
141 let file = File::parse(&text); 159 let fold_kinds = &[
142 let folds = folding_ranges(&file); 160 FoldKind::Comment,
143 assert_eq!(folds.len(), 2); 161 FoldKind::Comment,
144 assert_eq!(folds[0].range.start(), 1.into()); 162 FoldKind::Comment,
145 assert_eq!(folds[0].range.end(), 46.into()); 163 FoldKind::Comment,
146 assert_eq!(folds[0].kind, FoldKind::Comment); 164 ];
147 165 do_check(text, fold_kinds);
148 assert_eq!(folds[1].range.start(), 84.into());
149 assert_eq!(folds[1].range.end(), 137.into());
150 assert_eq!(folds[1].kind, FoldKind::Comment);
151 } 166 }
152 167
153 #[test] 168 #[test]
154 fn test_fold_imports() { 169 fn test_fold_imports() {
155 let text = r#" 170 let text = r#"
156use std::{ 171<|>use std::{
157 str, 172 str,
158 vec, 173 vec,
159 io as iop 174 io as iop
160}; 175};<|>
161 176
162fn main() { 177fn main() {
163}"#; 178}"#;
164 179
165 let file = File::parse(&text); 180 let folds = &[FoldKind::Imports];
166 let folds = folding_ranges(&file); 181 do_check(text, folds);
167 assert_eq!(folds.len(), 1);
168 assert_eq!(folds[0].range.start(), 1.into());
169 assert_eq!(folds[0].range.end(), 46.into());
170 assert_eq!(folds[0].kind, FoldKind::Imports);
171 } 182 }
172 183
173 184
diff --git a/crates/test_utils/src/lib.rs b/crates/test_utils/src/lib.rs
index 068eb80ce..ee73153f0 100644
--- a/crates/test_utils/src/lib.rs
+++ b/crates/test_utils/src/lib.rs
@@ -38,22 +38,44 @@ pub fn assert_eq_dbg(expected: &str, actual: &impl fmt::Debug) {
38} 38}
39 39
40pub fn extract_offset(text: &str) -> (TextUnit, String) { 40pub fn extract_offset(text: &str) -> (TextUnit, String) {
41 let cursor = "<|>"; 41 match try_extract_offset(text) {
42 let cursor_pos = match text.find(cursor) {
43 None => panic!("text should contain cursor marker"), 42 None => panic!("text should contain cursor marker"),
44 Some(pos) => pos, 43 Some(result) => result,
45 }; 44 }
45}
46
47pub fn try_extract_offset(text: &str) -> Option<(TextUnit, String)> {
48 let cursor = "<|>";
49 let cursor_pos = text.find(cursor)?;
46 let mut new_text = String::with_capacity(text.len() - cursor.len()); 50 let mut new_text = String::with_capacity(text.len() - cursor.len());
47 new_text.push_str(&text[..cursor_pos]); 51 new_text.push_str(&text[..cursor_pos]);
48 new_text.push_str(&text[cursor_pos + cursor.len()..]); 52 new_text.push_str(&text[cursor_pos + cursor.len()..]);
49 let cursor_pos = TextUnit::from(cursor_pos as u32); 53 let cursor_pos = TextUnit::from(cursor_pos as u32);
50 (cursor_pos, new_text) 54 Some((cursor_pos, new_text))
51} 55}
52 56
53pub fn extract_range(text: &str) -> (TextRange, String) { 57pub fn extract_range(text: &str) -> (TextRange, String) {
54 let (start, text) = extract_offset(text); 58 match try_extract_range(text) {
55 let (end, text) = extract_offset(&text); 59 None => panic!("text should contain cursor marker"),
56 (TextRange::from_to(start, end), text) 60 Some(result) => result,
61 }
62}
63
64pub fn try_extract_range(text: &str) -> Option<(TextRange, String)> {
65 let (start, text) = try_extract_offset(text)?;
66 let (end, text) = try_extract_offset(&text)?;
67 Some((TextRange::from_to(start, end), text))
68}
69
70pub fn extract_ranges(text: &str) -> (Vec<TextRange>, String) {
71 let mut ranges = Vec::new();
72 let mut text = String::from(text);
73 while let Some((range, new_text)) = try_extract_range(&text) {
74 text = new_text;
75 ranges.push(range);
76 }
77
78 (ranges, text)
57} 79}
58 80
59pub fn add_cursor(text: &str, offset: TextUnit) -> String { 81pub fn add_cursor(text: &str, offset: TextUnit) -> String {