on master help sign in
lsp: Test changeset_to_changes.
b7da7f8Blaž Hrastnik
helix-lsp/src/client.rs+1−1
@@ -247,7 +247,7 @@ impl Client {
247 .await
247 .await
248 }
248 }
249
249
250− fn changeset_to_changes(
250+ pub fn changeset_to_changes(
251 old_text: &Rope,
251 old_text: &Rope,
252 changeset: &ChangeSet,
252 changeset: &ChangeSet,
253 ) -> Vec<lsp::TextDocumentContentChangeEvent> {
253 ) -> Vec<lsp::TextDocumentContentChangeEvent> {
helix-view/src/document.rs+81−1
@@ -58,7 +58,7 @@ use helix_lsp::lsp;
58use url::Url;
58use url::Url;
59
59
60impl Document {
60impl Document {
61− fn new(state: State) -> Self {
61+ pub fn new(state: State) -> Self {
62 let changes = ChangeSet::new(&state.doc);
62 let changes = ChangeSet::new(&state.doc);
63 let old_state = None;
63 let old_state = None;
64
64
@@ -294,3 +294,83 @@ impl Document {
294 lsp::VersionedTextDocumentIdentifier::new(self.url().unwrap(), self.version)
294 lsp::VersionedTextDocumentIdentifier::new(self.url().unwrap(), self.version)
295 }
295 }
296}
296}
297+
298+#[cfg(test)]
299+mod test {
300+ use super::*;
301+
302+ #[test]
303+ fn changeset_to_changes() {
304+ use helix_core::{Rope, State, Transaction};
305+ // use helix_view::Document;
306+ use helix_lsp::{lsp, Client};
307+ let text = Rope::from("hello");
308+ let mut state = State::new(text);
309+ state.selection = Selection::single(5, 5);
310+ let mut doc = Document::new(state);
311+
312+ // insert
313+
314+ let transaction = Transaction::insert(&doc.state, " world".into());
315+ let old_doc = doc.state.clone();
316+ let changes = Client::changeset_to_changes(&old_doc.doc, transaction.changes());
317+ doc.apply(&transaction);
318+
319+ assert_eq!(
320+ changes,
321+ &[lsp::TextDocumentContentChangeEvent {
322+ range: Some(lsp::Range::new(
323+ lsp::Position::new(0, 5),
324+ lsp::Position::new(0, 5)
325+ )),
326+ text: " world".into(),
327+ range_length: None,
328+ }]
329+ );
330+
331+ // delete
332+
333+ let transaction = transaction.invert(&old_doc);
334+ let old_doc = doc.state.clone();
335+ let changes = Client::changeset_to_changes(&old_doc.doc, transaction.changes());
336+ doc.apply(&transaction);
337+
338+ // line: 0-based.
339+ // col: 0-based, gaps between chars.
340+ // 0 1 2 3 4 5 6 7 8 9 0 1
341+ // |h|e|l|l|o| |w|o|r|l|d|
342+ // -------------
343+ // (0, 5)-(0, 11)
344+ assert_eq!(
345+ changes,
346+ &[lsp::TextDocumentContentChangeEvent {
347+ range: Some(lsp::Range::new(
348+ lsp::Position::new(0, 5),
349+ lsp::Position::new(0, 11)
350+ )),
351+ text: "".into(),
352+ range_length: None,
353+ }]
354+ );
355+
356+ // replace
357+
358+ doc.state.selection = Selection::single(0, 5);
359+ let transaction = Transaction::change_by_selection(&doc.state, |range| {
360+ (range.from(), range.to(), Some("aeiou".into()))
361+ });
362+ let changes = Client::changeset_to_changes(&doc.state.doc, transaction.changes());
363+
364+ assert_eq!(
365+ changes,
366+ &[lsp::TextDocumentContentChangeEvent {
367+ range: Some(lsp::Range::new(
368+ lsp::Position::new(0, 0),
369+ lsp::Position::new(0, 5)
370+ )),
371+ text: "aeiou".into(),
372+ range_length: None,
373+ }]
374+ );
375+ }
376+}