diff options
Diffstat (limited to 'crates/ra_ssr/src/tests.rs')
-rw-r--r-- | crates/ra_ssr/src/tests.rs | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/crates/ra_ssr/src/tests.rs b/crates/ra_ssr/src/tests.rs index 523035b31..63d527894 100644 --- a/crates/ra_ssr/src/tests.rs +++ b/crates/ra_ssr/src/tests.rs | |||
@@ -1,6 +1,6 @@ | |||
1 | use crate::{MatchFinder, SsrRule}; | 1 | use crate::{MatchFinder, SsrRule}; |
2 | use expect::{expect, Expect}; | 2 | use expect::{expect, Expect}; |
3 | use ra_db::{salsa::Durability, FileId, SourceDatabaseExt}; | 3 | use ra_db::{salsa::Durability, FileId, FilePosition, SourceDatabaseExt}; |
4 | use rustc_hash::FxHashSet; | 4 | use rustc_hash::FxHashSet; |
5 | use std::sync::Arc; | 5 | use std::sync::Arc; |
6 | use test_utils::mark; | 6 | use test_utils::mark; |
@@ -59,15 +59,21 @@ fn parser_undefined_placeholder_in_replacement() { | |||
59 | ); | 59 | ); |
60 | } | 60 | } |
61 | 61 | ||
62 | pub(crate) fn single_file(code: &str) -> (ra_ide_db::RootDatabase, FileId) { | 62 | /// `code` may optionally contain a cursor marker `<|>`. If it doesn't, then the position will be |
63 | /// the start of the file. | ||
64 | pub(crate) fn single_file(code: &str) -> (ra_ide_db::RootDatabase, FilePosition) { | ||
63 | use ra_db::fixture::WithFixture; | 65 | use ra_db::fixture::WithFixture; |
64 | use ra_ide_db::symbol_index::SymbolsDatabase; | 66 | use ra_ide_db::symbol_index::SymbolsDatabase; |
65 | let (db, file_id) = ra_ide_db::RootDatabase::with_single_file(code); | 67 | let (mut db, position) = if code.contains(test_utils::CURSOR_MARKER) { |
66 | let mut db = db; | 68 | ra_ide_db::RootDatabase::with_position(code) |
69 | } else { | ||
70 | let (db, file_id) = ra_ide_db::RootDatabase::with_single_file(code); | ||
71 | (db, FilePosition { file_id, offset: 0.into() }) | ||
72 | }; | ||
67 | let mut local_roots = FxHashSet::default(); | 73 | let mut local_roots = FxHashSet::default(); |
68 | local_roots.insert(ra_db::fixture::WORKSPACE); | 74 | local_roots.insert(ra_db::fixture::WORKSPACE); |
69 | db.set_local_roots_with_durability(Arc::new(local_roots), Durability::HIGH); | 75 | db.set_local_roots_with_durability(Arc::new(local_roots), Durability::HIGH); |
70 | (db, file_id) | 76 | (db, position) |
71 | } | 77 | } |
72 | 78 | ||
73 | fn assert_ssr_transform(rule: &str, input: &str, expected: Expect) { | 79 | fn assert_ssr_transform(rule: &str, input: &str, expected: Expect) { |
@@ -75,8 +81,8 @@ fn assert_ssr_transform(rule: &str, input: &str, expected: Expect) { | |||
75 | } | 81 | } |
76 | 82 | ||
77 | fn assert_ssr_transforms(rules: &[&str], input: &str, expected: Expect) { | 83 | fn assert_ssr_transforms(rules: &[&str], input: &str, expected: Expect) { |
78 | let (db, file_id) = single_file(input); | 84 | let (db, position) = single_file(input); |
79 | let mut match_finder = MatchFinder::new(&db); | 85 | let mut match_finder = MatchFinder::in_context(&db, position); |
80 | for rule in rules { | 86 | for rule in rules { |
81 | let rule: SsrRule = rule.parse().unwrap(); | 87 | let rule: SsrRule = rule.parse().unwrap(); |
82 | match_finder.add_rule(rule); | 88 | match_finder.add_rule(rule); |
@@ -85,10 +91,10 @@ fn assert_ssr_transforms(rules: &[&str], input: &str, expected: Expect) { | |||
85 | if edits.is_empty() { | 91 | if edits.is_empty() { |
86 | panic!("No edits were made"); | 92 | panic!("No edits were made"); |
87 | } | 93 | } |
88 | assert_eq!(edits[0].file_id, file_id); | 94 | assert_eq!(edits[0].file_id, position.file_id); |
89 | // Note, db.file_text is not necessarily the same as `input`, since fixture parsing alters | 95 | // Note, db.file_text is not necessarily the same as `input`, since fixture parsing alters |
90 | // stuff. | 96 | // stuff. |
91 | let mut actual = db.file_text(file_id).to_string(); | 97 | let mut actual = db.file_text(position.file_id).to_string(); |
92 | edits[0].edit.apply(&mut actual); | 98 | edits[0].edit.apply(&mut actual); |
93 | expected.assert_eq(&actual); | 99 | expected.assert_eq(&actual); |
94 | } | 100 | } |
@@ -106,34 +112,34 @@ fn print_match_debug_info(match_finder: &MatchFinder, file_id: FileId, snippet: | |||
106 | } | 112 | } |
107 | 113 | ||
108 | fn assert_matches(pattern: &str, code: &str, expected: &[&str]) { | 114 | fn assert_matches(pattern: &str, code: &str, expected: &[&str]) { |
109 | let (db, file_id) = single_file(code); | 115 | let (db, position) = single_file(code); |
110 | let mut match_finder = MatchFinder::new(&db); | 116 | let mut match_finder = MatchFinder::in_context(&db, position); |
111 | match_finder.add_search_pattern(pattern.parse().unwrap()); | 117 | match_finder.add_search_pattern(pattern.parse().unwrap()); |
112 | let matched_strings: Vec<String> = | 118 | let matched_strings: Vec<String> = |
113 | match_finder.matches().flattened().matches.iter().map(|m| m.matched_text()).collect(); | 119 | match_finder.matches().flattened().matches.iter().map(|m| m.matched_text()).collect(); |
114 | if matched_strings != expected && !expected.is_empty() { | 120 | if matched_strings != expected && !expected.is_empty() { |
115 | print_match_debug_info(&match_finder, file_id, &expected[0]); | 121 | print_match_debug_info(&match_finder, position.file_id, &expected[0]); |
116 | } | 122 | } |
117 | assert_eq!(matched_strings, expected); | 123 | assert_eq!(matched_strings, expected); |
118 | } | 124 | } |
119 | 125 | ||
120 | fn assert_no_match(pattern: &str, code: &str) { | 126 | fn assert_no_match(pattern: &str, code: &str) { |
121 | let (db, file_id) = single_file(code); | 127 | let (db, position) = single_file(code); |
122 | let mut match_finder = MatchFinder::new(&db); | 128 | let mut match_finder = MatchFinder::in_context(&db, position); |
123 | match_finder.add_search_pattern(pattern.parse().unwrap()); | 129 | match_finder.add_search_pattern(pattern.parse().unwrap()); |
124 | let matches = match_finder.matches().flattened().matches; | 130 | let matches = match_finder.matches().flattened().matches; |
125 | if !matches.is_empty() { | 131 | if !matches.is_empty() { |
126 | print_match_debug_info(&match_finder, file_id, &matches[0].matched_text()); | 132 | print_match_debug_info(&match_finder, position.file_id, &matches[0].matched_text()); |
127 | panic!("Got {} matches when we expected none: {:#?}", matches.len(), matches); | 133 | panic!("Got {} matches when we expected none: {:#?}", matches.len(), matches); |
128 | } | 134 | } |
129 | } | 135 | } |
130 | 136 | ||
131 | fn assert_match_failure_reason(pattern: &str, code: &str, snippet: &str, expected_reason: &str) { | 137 | fn assert_match_failure_reason(pattern: &str, code: &str, snippet: &str, expected_reason: &str) { |
132 | let (db, file_id) = single_file(code); | 138 | let (db, position) = single_file(code); |
133 | let mut match_finder = MatchFinder::new(&db); | 139 | let mut match_finder = MatchFinder::in_context(&db, position); |
134 | match_finder.add_search_pattern(pattern.parse().unwrap()); | 140 | match_finder.add_search_pattern(pattern.parse().unwrap()); |
135 | let mut reasons = Vec::new(); | 141 | let mut reasons = Vec::new(); |
136 | for d in match_finder.debug_where_text_equal(file_id, snippet) { | 142 | for d in match_finder.debug_where_text_equal(position.file_id, snippet) { |
137 | if let Some(reason) = d.match_failure_reason() { | 143 | if let Some(reason) = d.match_failure_reason() { |
138 | reasons.push(reason.to_owned()); | 144 | reasons.push(reason.to_owned()); |
139 | } | 145 | } |