Skip to content

Commit 5dff3a6

Browse files
yeah
1 parent c8a6082 commit 5dff3a6

File tree

2 files changed

+116
-1
lines changed

2 files changed

+116
-1
lines changed

crates/pgt_workspace/src/features/completions.rs

+114
Original file line numberDiff line numberDiff line change
@@ -80,3 +80,117 @@ pub(crate) fn get_statement_for_completions<'a>(
8080
.map(|t| t.0)
8181
}
8282
}
83+
84+
#[cfg(test)]
85+
mod tests {
86+
use itertools::Itertools;
87+
use pgt_fs::PgTPath;
88+
use pgt_text_size::TextSize;
89+
90+
use crate::workspace::Document;
91+
92+
use super::get_statement_for_completions;
93+
94+
static CURSOR_POSITION: &str = "€";
95+
96+
fn get_doc_and_pos(sql: &str) -> (Document, TextSize) {
97+
let pos = sql
98+
.find(CURSOR_POSITION)
99+
.expect("Please add cursor position to test sql");
100+
101+
let pos: u32 = pos.try_into().unwrap();
102+
103+
(
104+
Document::new(
105+
PgTPath::new("test.sql"),
106+
sql.replace(CURSOR_POSITION, "").into(),
107+
5,
108+
),
109+
TextSize::new(pos),
110+
)
111+
}
112+
113+
#[test]
114+
fn finds_matching_statement() {
115+
let sql = format!(
116+
r#"
117+
select * from users;
118+
119+
update {}users set email = 'myemail@com';
120+
121+
select 1;
122+
"#,
123+
CURSOR_POSITION
124+
);
125+
126+
let (doc, position) = get_doc_and_pos(sql.as_str());
127+
128+
let (_, _, text) =
129+
get_statement_for_completions(&doc, position).expect("Expected Statement");
130+
131+
assert_eq!(text, "update users set email = 'myemail@com';")
132+
}
133+
134+
#[test]
135+
fn does_not_break_when_no_statements_exist() {
136+
let sql = format!("{}", CURSOR_POSITION);
137+
138+
let (doc, position) = get_doc_and_pos(sql.as_str());
139+
140+
assert_eq!(get_statement_for_completions(&doc, position), None);
141+
}
142+
143+
#[test]
144+
fn does_not_return_overlapping_statements_if_too_close() {
145+
let sql = format!("select * from {}select 1;", CURSOR_POSITION);
146+
147+
let (doc, position) = get_doc_and_pos(sql.as_str());
148+
149+
// make sure these are parsed as two
150+
assert_eq!(doc.iter_statements().try_len().unwrap(), 2);
151+
152+
assert_eq!(get_statement_for_completions(&doc, position), None);
153+
}
154+
155+
#[test]
156+
fn is_fine_with_spaces() {
157+
let sql = format!("select * from {} ;", CURSOR_POSITION);
158+
159+
let (doc, position) = get_doc_and_pos(sql.as_str());
160+
161+
let (_, _, text) =
162+
get_statement_for_completions(&doc, position).expect("Expected Statement");
163+
164+
assert_eq!(text, "select * from ;")
165+
}
166+
167+
#[test]
168+
fn considers_offset() {
169+
let sql = format!("select * from {}", CURSOR_POSITION);
170+
171+
let (doc, position) = get_doc_and_pos(sql.as_str());
172+
173+
let (_, _, text) =
174+
get_statement_for_completions(&doc, position).expect("Expected Statement");
175+
176+
assert_eq!(text, "select * from")
177+
}
178+
179+
#[test]
180+
fn does_not_consider_too_far_offset() {
181+
let sql = format!("select * from {}", CURSOR_POSITION);
182+
183+
let (doc, position) = get_doc_and_pos(sql.as_str());
184+
185+
assert_eq!(get_statement_for_completions(&doc, position), None);
186+
}
187+
188+
#[test]
189+
fn does_not_consider_offset_if_statement_terminated_by_semi() {
190+
let sql = format!("select * from users;{}", CURSOR_POSITION);
191+
192+
let (doc, position) = get_doc_and_pos(sql.as_str());
193+
194+
assert_eq!(get_statement_for_completions(&doc, position), None);
195+
}
196+
}

crates/pgt_workspace/src/workspace/server/document.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ impl Document {
123123
.iter()
124124
.find(|pos| pos.0 == stmt_id)
125125
.map(|(_, range)| {
126-
let final_char = self.content.chars().nth(range.end().into());
126+
let length: usize = range.end().into();
127+
let final_char = self.content.chars().nth(length - 1);
127128
final_char == Some(';')
128129
})
129130
}

0 commit comments

Comments
 (0)