forked from Mirrors/helix
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.6 KiB
Rust
150 lines
3.6 KiB
Rust
use helix_core::Rope;
|
|
use tokio::task::JoinHandle;
|
|
|
|
use crate::diff::{DiffHandle, Hunk};
|
|
|
|
impl DiffHandle {
|
|
fn new_test(diff_base: &str, doc: &str) -> (DiffHandle, JoinHandle<()>) {
|
|
DiffHandle::new_with_handle(
|
|
Rope::from_str(diff_base),
|
|
Rope::from_str(doc),
|
|
Default::default(),
|
|
)
|
|
}
|
|
async fn into_diff(self, handle: JoinHandle<()>) -> Vec<Hunk> {
|
|
let hunks = self.hunks;
|
|
// dropping the channel terminates the task
|
|
drop(self.channel);
|
|
handle.await.unwrap();
|
|
let hunks = hunks.lock();
|
|
Vec::clone(&*hunks)
|
|
}
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn append_line() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\n", "foo\nbar\n");
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[Hunk {
|
|
before: 1..1,
|
|
after: 1..2
|
|
}]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn prepend_line() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\n", "bar\nfoo\n");
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[Hunk {
|
|
before: 0..0,
|
|
after: 0..1
|
|
}]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn modify() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\nbar\n", "foo bar\nbar\n");
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[Hunk {
|
|
before: 0..1,
|
|
after: 0..1
|
|
}]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn delete_line() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\nfoo bar\nbar\n", "foo\nbar\n");
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[Hunk {
|
|
before: 1..2,
|
|
after: 1..1
|
|
}]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn delete_line_and_modify() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\nbar\ntest\nfoo", "foo\ntest\nfoo bar");
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[
|
|
Hunk {
|
|
before: 1..2,
|
|
after: 1..1
|
|
},
|
|
Hunk {
|
|
before: 3..4,
|
|
after: 2..3
|
|
},
|
|
]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn add_use() {
|
|
let (differ, handle) = DiffHandle::new_test(
|
|
"use ropey::Rope;\nuse tokio::task::JoinHandle;\n",
|
|
"use ropey::Rope;\nuse ropey::RopeSlice;\nuse tokio::task::JoinHandle;\n",
|
|
);
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[Hunk {
|
|
before: 1..1,
|
|
after: 1..2
|
|
},]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn update_document() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\nbar\ntest\nfoo", "foo\nbar\ntest\nfoo");
|
|
differ.update_document(Rope::from_str("foo\ntest\nfoo bar"), false);
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[
|
|
Hunk {
|
|
before: 1..2,
|
|
after: 1..1
|
|
},
|
|
Hunk {
|
|
before: 3..4,
|
|
after: 2..3
|
|
},
|
|
]
|
|
)
|
|
}
|
|
|
|
#[tokio::test]
|
|
async fn update_base() {
|
|
let (differ, handle) = DiffHandle::new_test("foo\ntest\nfoo bar", "foo\ntest\nfoo bar");
|
|
differ.update_diff_base(Rope::from_str("foo\nbar\ntest\nfoo"));
|
|
let line_diffs = differ.into_diff(handle).await;
|
|
assert_eq!(
|
|
&line_diffs,
|
|
&[
|
|
Hunk {
|
|
before: 1..2,
|
|
after: 1..1
|
|
},
|
|
Hunk {
|
|
before: 3..4,
|
|
after: 2..3
|
|
},
|
|
]
|
|
)
|
|
}
|