2022-04-19 07:21:31 +02:00
|
|
|
use std::{
|
|
|
|
io::{Read, Write},
|
2022-05-01 02:47:53 +02:00
|
|
|
ops::RangeInclusive,
|
2022-04-19 07:21:31 +02:00
|
|
|
};
|
|
|
|
|
2022-05-01 02:44:54 +02:00
|
|
|
use helix_core::diagnostic::Severity;
|
2022-04-19 07:21:31 +02:00
|
|
|
use helix_term::application::Application;
|
2022-05-01 02:44:54 +02:00
|
|
|
use helix_view::doc;
|
2022-04-19 07:21:31 +02:00
|
|
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_write() -> anyhow::Result<()> {
|
2022-04-26 02:25:16 +02:00
|
|
|
let mut file = tempfile::NamedTempFile::new()?;
|
2022-04-19 07:21:31 +02:00
|
|
|
|
|
|
|
test_key_sequence(
|
2022-06-11 05:35:34 +02:00
|
|
|
&mut helpers::app_with_file(file.path())?,
|
2022-06-14 04:18:17 +02:00
|
|
|
Some("ithe gostak distims the doshes<ret><esc>:w<ret>"),
|
2022-04-19 07:21:31 +02:00
|
|
|
None,
|
2022-05-23 06:24:18 +02:00
|
|
|
false,
|
2022-04-19 07:21:31 +02:00
|
|
|
)
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
file.as_file_mut().flush()?;
|
|
|
|
file.as_file_mut().sync_all()?;
|
|
|
|
|
|
|
|
let mut file_content = String::new();
|
|
|
|
file.as_file_mut().read_to_string(&mut file_content)?;
|
2022-05-23 06:24:18 +02:00
|
|
|
|
|
|
|
assert_eq!(
|
2022-06-14 04:18:17 +02:00
|
|
|
helpers::platform_line("the gostak distims the doshes"),
|
2022-05-23 06:24:18 +02:00
|
|
|
file_content
|
|
|
|
);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::test]
|
|
|
|
async fn test_write_quit() -> anyhow::Result<()> {
|
|
|
|
let mut file = tempfile::NamedTempFile::new()?;
|
|
|
|
|
|
|
|
test_key_sequence(
|
2022-06-11 05:35:34 +02:00
|
|
|
&mut helpers::app_with_file(file.path())?,
|
2022-06-14 04:18:17 +02:00
|
|
|
Some("ithe gostak distims the doshes<ret><esc>:wq<ret>"),
|
2022-05-23 06:24:18 +02:00
|
|
|
None,
|
|
|
|
true,
|
|
|
|
)
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
file.as_file_mut().flush()?;
|
|
|
|
file.as_file_mut().sync_all()?;
|
|
|
|
|
|
|
|
let mut file_content = String::new();
|
|
|
|
file.as_file_mut().read_to_string(&mut file_content)?;
|
|
|
|
|
2022-04-29 22:27:35 +02:00
|
|
|
assert_eq!(
|
2022-06-14 04:18:17 +02:00
|
|
|
helpers::platform_line("the gostak distims the doshes"),
|
2022-04-29 22:27:35 +02:00
|
|
|
file_content
|
|
|
|
);
|
2022-04-19 07:21:31 +02:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2022-05-01 02:47:53 +02:00
|
|
|
#[tokio::test]
|
2022-05-01 04:34:52 +02:00
|
|
|
#[ignore]
|
2022-05-01 02:47:53 +02:00
|
|
|
async fn test_write_concurrent() -> anyhow::Result<()> {
|
2022-04-26 02:25:16 +02:00
|
|
|
let mut file = tempfile::NamedTempFile::new()?;
|
2022-05-01 02:47:53 +02:00
|
|
|
let mut command = String::new();
|
|
|
|
const RANGE: RangeInclusive<i32> = 1..=5000;
|
|
|
|
|
|
|
|
for i in RANGE {
|
|
|
|
let cmd = format!("%c{}<esc>:w<ret>", i);
|
|
|
|
command.push_str(&cmd);
|
|
|
|
}
|
|
|
|
|
|
|
|
test_key_sequence(
|
2022-06-11 05:35:34 +02:00
|
|
|
&mut helpers::app_with_file(file.path())?,
|
2022-05-01 02:47:53 +02:00
|
|
|
Some(&command),
|
|
|
|
None,
|
2022-05-23 06:24:18 +02:00
|
|
|
false,
|
2022-05-01 02:47:53 +02:00
|
|
|
)
|
|
|
|
.await?;
|
|
|
|
|
|
|
|
file.as_file_mut().flush()?;
|
|
|
|
file.as_file_mut().sync_all()?;
|
|
|
|
|
|
|
|
let mut file_content = String::new();
|
|
|
|
file.as_file_mut().read_to_string(&mut file_content)?;
|
|
|
|
assert_eq!(RANGE.end().to_string(), file_content);
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2022-04-19 07:21:31 +02:00
|
|
|
#[tokio::test]
|
2022-05-01 04:34:52 +02:00
|
|
|
#[ignore]
|
2022-05-01 02:44:54 +02:00
|
|
|
async fn test_write_fail_mod_flag() -> anyhow::Result<()> {
|
2022-04-30 06:35:00 +02:00
|
|
|
let file = helpers::new_readonly_tempfile()?;
|
|
|
|
|
2022-05-01 02:44:54 +02:00
|
|
|
test_key_sequences(
|
2022-06-11 05:35:34 +02:00
|
|
|
&mut helpers::app_with_file(file.path())?,
|
2022-05-01 02:44:54 +02:00
|
|
|
vec![
|
|
|
|
(
|
2022-05-01 02:47:53 +02:00
|
|
|
None,
|
2022-05-01 02:44:54 +02:00
|
|
|
Some(&|app| {
|
|
|
|
let doc = doc!(app.editor);
|
|
|
|
assert!(!doc.is_modified());
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
(
|
2022-05-01 02:47:53 +02:00
|
|
|
Some("ihello<esc>"),
|
2022-05-01 02:44:54 +02:00
|
|
|
Some(&|app| {
|
|
|
|
let doc = doc!(app.editor);
|
|
|
|
assert!(doc.is_modified());
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
(
|
2022-05-01 02:47:53 +02:00
|
|
|
Some(":w<ret>"),
|
2022-05-01 02:44:54 +02:00
|
|
|
Some(&|app| {
|
|
|
|
assert_eq!(&Severity::Error, app.editor.get_status().unwrap().1);
|
|
|
|
|
|
|
|
let doc = doc!(app.editor);
|
|
|
|
assert!(doc.is_modified());
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
],
|
2022-05-23 06:24:18 +02:00
|
|
|
false,
|
2022-04-19 07:21:31 +02:00
|
|
|
)
|
|
|
|
.await?;
|
|
|
|
|
2022-05-01 02:44:54 +02:00
|
|
|
Ok(())
|
|
|
|
}
|
2022-04-19 07:21:31 +02:00
|
|
|
|
2022-05-01 02:44:54 +02:00
|
|
|
#[tokio::test]
|
2022-05-01 04:34:52 +02:00
|
|
|
#[ignore]
|
2022-05-01 02:44:54 +02:00
|
|
|
async fn test_write_fail_new_path() -> anyhow::Result<()> {
|
2022-04-30 06:35:00 +02:00
|
|
|
let file = helpers::new_readonly_tempfile()?;
|
|
|
|
|
2022-05-01 02:44:54 +02:00
|
|
|
test_key_sequences(
|
|
|
|
&mut Application::new(Args::default(), Config::default())?,
|
|
|
|
vec![
|
|
|
|
(
|
2022-05-01 02:47:53 +02:00
|
|
|
None,
|
2022-05-01 02:44:54 +02:00
|
|
|
Some(&|app| {
|
|
|
|
let doc = doc!(app.editor);
|
2022-04-30 06:35:00 +02:00
|
|
|
assert_ne!(
|
|
|
|
Some(&Severity::Error),
|
|
|
|
app.editor.get_status().map(|status| status.1)
|
|
|
|
);
|
2022-05-01 02:44:54 +02:00
|
|
|
assert_eq!(None, doc.path());
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
(
|
2022-04-30 06:35:00 +02:00
|
|
|
Some(&format!(":w {}<ret>", file.path().to_string_lossy())),
|
2022-05-01 02:44:54 +02:00
|
|
|
Some(&|app| {
|
|
|
|
let doc = doc!(app.editor);
|
2022-04-30 06:35:00 +02:00
|
|
|
assert_eq!(
|
|
|
|
Some(&Severity::Error),
|
|
|
|
app.editor.get_status().map(|status| status.1)
|
|
|
|
);
|
2022-05-01 02:44:54 +02:00
|
|
|
assert_eq!(None, doc.path());
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
],
|
2022-05-23 06:24:18 +02:00
|
|
|
false,
|
2022-05-01 02:44:54 +02:00
|
|
|
)
|
|
|
|
.await?;
|
2022-04-19 07:21:31 +02:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|