use super::*;
#[test]
fn indexes_watched_style_file_changes_from_disk() {
let workspace_root =
std::env::temp_dir().join(format!("omena-lsp-server-watched-{}", std::process::id()));
let src_dir = workspace_root.join("src");
let style_path = src_dir.join("App.module.scss");
let _ = std::fs::remove_dir_all(&workspace_root);
let create_dir_result = std::fs::create_dir_all(&src_dir);
assert!(
create_dir_result.is_ok(),
"create watched fixture directory: {:?}",
create_dir_result.err(),
);
let write_result = std::fs::write(&style_path, ".fromDisk { color: red; }");
assert!(
write_result.is_ok(),
"write watched style fixture: {:?}",
write_result.err(),
);
let workspace_uri = format!("file://{}", workspace_root.display());
let style_uri = format!("file://{}", style_path.display());
let mut state = LspShellState::default();
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"workspaceFolders": [
{
"uri": workspace_uri,
"name": "watched",
},
],
},
}),
);
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "workspace/didChangeWatchedFiles",
"params": {
"changes": [
{
"uri": style_uri,
"type": 2,
},
],
},
}),
);
let indexed = state
.document(style_uri.as_str())
.and_then(|document| document.style_summary.as_ref());
assert_eq!(
indexed.map(|summary| summary.selector_names.clone()),
Some(vec!["fromDisk".to_string()]),
);
assert_eq!(state.snapshot().watched_file_event_count, 1);
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "textDocument/didOpen",
"params": {
"textDocument": {
"uri": style_uri,
"languageId": "scss",
"version": 1,
"text": ".openBuffer { color: blue; }",
},
},
}),
);
let write_while_open_result = std::fs::write(&style_path, ".diskUpdate { color: green; }");
assert!(
write_while_open_result.is_ok(),
"write watched open-buffer fixture: {:?}",
write_while_open_result.err(),
);
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "workspace/didChangeWatchedFiles",
"params": {
"changes": [
{
"uri": style_uri,
"type": 2,
},
],
},
}),
);
let open_buffer = state
.document(style_uri.as_str())
.and_then(|document| document.style_summary.as_ref());
assert_eq!(
open_buffer.map(|summary| summary.selector_names.clone()),
Some(vec!["openBuffer".to_string()]),
);
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "textDocument/didClose",
"params": {
"textDocument": {
"uri": style_uri,
},
},
}),
);
let reloaded_after_close = state
.document(style_uri.as_str())
.and_then(|document| document.style_summary.as_ref());
assert_eq!(
reloaded_after_close.map(|summary| summary.selector_names.clone()),
Some(vec!["diskUpdate".to_string()]),
);
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "workspace/didChangeWatchedFiles",
"params": {
"changes": [
{
"uri": style_uri,
"type": 3,
},
],
},
}),
);
assert!(state.document(style_uri.as_str()).is_none());
let _ = std::fs::remove_dir_all(&workspace_root);
}
#[test]
fn defers_workspace_style_file_index_until_initialized_notification() {
let workspace_root = std::env::temp_dir().join(format!(
"omena-lsp-server-initial-index-{}",
std::process::id()
));
let src_dir = workspace_root.join("src");
let style_path = src_dir.join("Initial.module.scss");
let _ = std::fs::remove_dir_all(&workspace_root);
let create_dir_result = std::fs::create_dir_all(&src_dir);
assert!(
create_dir_result.is_ok(),
"create initial-index fixture directory: {:?}",
create_dir_result.err(),
);
let write_result = std::fs::write(&style_path, ".initial { color: red; }");
assert!(
write_result.is_ok(),
"write initial-index style fixture: {:?}",
write_result.err(),
);
let workspace_uri = format!("file://{}", workspace_root.display());
let style_uri = format!("file://{}", style_path.display());
let mut state = LspShellState::default();
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"workspaceFolders": [
{
"uri": workspace_uri,
"name": "initial-index",
},
],
},
}),
);
let not_indexed_yet = state
.document(style_uri.as_str())
.and_then(|document| document.style_summary.as_ref());
assert!(not_indexed_yet.is_none());
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"method": "initialized",
"params": {},
}),
);
let indexed = state
.document(style_uri.as_str())
.and_then(|document| document.style_summary.as_ref());
assert_eq!(
indexed.map(|summary| summary.selector_names.clone()),
Some(vec!["initial".to_string()]),
);
let _ = std::fs::remove_dir_all(&workspace_root);
}
#[test]
fn bounds_workspace_style_indexing_by_budget() {
let workspace_root = std::env::temp_dir().join(format!(
"omena-lsp-server-index-budget-{}",
std::process::id()
));
let src_dir = workspace_root.join("src");
let style_path = src_dir.join("Budget.module.scss");
let _ = std::fs::remove_dir_all(&workspace_root);
let create_dir_result = std::fs::create_dir_all(&src_dir);
assert!(
create_dir_result.is_ok(),
"create index-budget fixture directory: {:?}",
create_dir_result.err(),
);
let write_result = std::fs::write(&style_path, ".budget { color: red; }");
assert!(
write_result.is_ok(),
"write index-budget style fixture: {:?}",
write_result.err(),
);
let workspace_uri = format!("file://{}", workspace_root.display());
let style_uri = format!("file://{}", style_path.display());
let mut state = LspShellState::default();
handle_lsp_message(
&mut state,
json!({
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"workspaceFolders": [
{
"uri": workspace_uri,
"name": "index-budget",
},
],
},
}),
);
let mut budget = WorkspaceStyleIndexBudget::with_limits(1, 1, 0);
index_workspace_style_files_with_budget(&mut state, &mut budget);
assert!(state.document(style_uri.as_str()).is_none());
assert_eq!(state.snapshot().workspace_style_index_exhausted_count, 1);
let _ = std::fs::remove_dir_all(&workspace_root);
}