use crate::helpers::hir_helpers::*;
use syster::ide::AnalysisHost;
use syster::ide::completions;
#[test]
fn test_completion_with_incomplete_type_reference() {
let incomplete_source = r#"
part def Vehicle;
part def Car;
part x :
"#;
let mut host = AnalysisHost::new();
let _errors = host.set_file_content("test.sysml", incomplete_source);
let analysis = host.analysis();
let file_id = analysis.get_file_id("test.sysml").unwrap();
let items = completions(analysis.symbol_index(), file_id, 3, 17, None);
let labels: Vec<_> = items.iter().map(|i| i.label.as_ref()).collect();
assert!(
labels.contains(&"Vehicle"),
"Incomplete syntax should still suggest Vehicle. Got: {:?}",
labels
);
}
#[test]
fn test_completion_with_partial_word() {
let incomplete_source = r#"
part def Vehicle;
part def Van;
part def Car;
part x : Veh
"#;
let mut host = AnalysisHost::new();
let _errors = host.set_file_content("test.sysml", incomplete_source);
let analysis = host.analysis();
let file_id = analysis.get_file_id("test.sysml").unwrap();
let items = completions(analysis.symbol_index(), file_id, 4, 20, None);
let labels: Vec<_> = items.iter().map(|i| i.label.as_ref()).collect();
assert!(
labels.contains(&"Vehicle"),
"Typing 'Veh' should suggest Vehicle. Got: {:?}",
labels
);
}
#[test]
fn test_completion_with_no_word_at_all() {
let incomplete_source = r#"
part def Widget;
part def Gadget;
part myPart :
"#;
let mut host = AnalysisHost::new();
let _errors = host.set_file_content("test.sysml", incomplete_source);
let analysis = host.analysis();
let file_id = analysis.get_file_id("test.sysml").unwrap();
let items = completions(analysis.symbol_index(), file_id, 3, 21, None);
let labels: Vec<_> = items.iter().map(|i| i.label.as_ref()).collect();
assert!(
labels.contains(&"Widget") && labels.contains(&"Gadget"),
"Empty completion context should suggest all types. Got: {:?}",
labels
);
}
#[test]
fn test_completion_suggests_available_types() {
let source = r#"
part def Engine;
part def Wheel;
part def Chassis;
"#;
let (mut host, file_id) = analysis_from_sysml(source);
let analysis = host.analysis();
let items = completions(analysis.symbol_index(), file_id, 3, 0, None);
let labels: Vec<_> = items.iter().map(|i| i.label.as_ref()).collect();
assert!(
labels.contains(&"Engine"),
"Should suggest Engine. Got: {:?}",
labels
);
assert!(
labels.contains(&"Wheel"),
"Should suggest Wheel. Got: {:?}",
labels
);
assert!(
labels.contains(&"Chassis"),
"Should suggest Chassis. Got: {:?}",
labels
);
}
#[test]
fn test_completion_from_imported_scope() {
let source = r#"
package Base {
part def Widget;
part def Gadget;
}
package Consumer {
import Base::*;
part w : W;
}
"#;
let (mut host, file_id) = analysis_from_sysml(source);
let analysis = host.analysis();
let items = completions(analysis.symbol_index(), file_id, 7, 21, None);
let labels: Vec<_> = items.iter().map(|i| i.label.as_ref()).collect();
assert!(
labels.contains(&"Widget"),
"Should suggest Widget from import. Got: {:?}",
labels
);
}
#[test]
fn test_completion_has_correct_kind() {
let source = r#"
package Pkg {
part def Vehicle;
}
"#;
let (mut host, file_id) = analysis_from_sysml(source);
let analysis = host.analysis();
let items = completions(analysis.symbol_index(), file_id, 2, 20, None);
let vehicle_item = items.iter().find(|i| i.label.as_ref() == "Vehicle");
assert!(vehicle_item.is_some(), "Should find Vehicle in completions");
assert_eq!(
vehicle_item.unwrap().kind,
syster::ide::CompletionKind::Definition,
"Vehicle should have Definition kind"
);
}
#[test]
fn test_completion_empty_file() {
let source = "";
let (mut host, file_id) = analysis_from_sysml(source);
let analysis = host.analysis();
let items = completions(analysis.symbol_index(), file_id, 0, 0, None);
let _ = items;
}
#[test]
fn test_completion_at_file_end() {
let source = "part def Vehicle;";
let (mut host, file_id) = analysis_from_sysml(source);
let analysis = host.analysis();
let items = completions(analysis.symbol_index(), file_id, 0, 17, None);
let _ = items;
}