mod common;
use common::TestServer;
#[tokio::test]
async fn many_files_hover_each_returns_own_signature() {
let mut server = TestServer::new().await;
for i in 0..10 {
let src = format!("<?php\nfunction fn_{i}(int $x): int {{ return $x; }}\n");
server.open(&format!("c{i}.php"), &src).await;
}
for i in 0..10 {
let resp = server.hover(&format!("c{i}.php"), 1, 10).await;
let contents = resp["result"]["contents"].to_string();
assert!(
contents.contains(&format!("fn_{i}")),
"file c{i}.php hover must mention fn_{i}, got: {contents}"
);
}
}
#[tokio::test]
async fn didchange_followed_by_request_sees_new_state_every_iteration() {
let mut server = TestServer::new().await;
server.open("iter.php", "<?php\n").await;
for v in 2..=8 {
let src = format!("<?php\nfunction iter_{v}(): int {{ return {v}; }}\niter_{v}();\n");
server.change("iter.php", v, &src).await;
let resp = server.hover("iter.php", 1, 10).await;
let contents = resp["result"]["contents"].to_string();
assert!(
contents.contains(&format!("iter_{v}")),
"iteration {v}: hover must see latest name, got: {contents}"
);
let resp = server.references("iter.php", 1, 10, false).await;
let refs = resp["result"].as_array().cloned().unwrap_or_default();
assert_eq!(
refs.len(),
1,
"iteration {v}: expected 1 ref, got {}: {refs:?}",
refs.len()
);
}
}
#[tokio::test]
async fn sustained_hover_volley_all_succeed() {
let mut server = TestServer::new().await;
server
.open(
"pipe.php",
"<?php\nfunction pipeHover(int $x): int { return $x; }\n",
)
.await;
for _ in 0..20 {
let resp = server.hover("pipe.php", 1, 10).await;
assert!(resp["error"].is_null(), "hover errored in volley: {resp:?}");
assert!(
resp["result"]["contents"].to_string().contains("pipeHover"),
"hover content must stay correct across volley"
);
}
}
#[tokio::test]
async fn request_after_close_and_reopen_returns_fresh_data() {
let mut server = TestServer::new().await;
server
.open("ro.php", "<?php\nfunction first(): void {}\n")
.await;
let uri = server.uri("ro.php");
server
.client()
.notify(
"textDocument/didClose",
serde_json::json!({ "textDocument": { "uri": uri } }),
)
.await;
server
.open("ro.php", "<?php\nfunction second(): void {}\n")
.await;
let resp = server.hover("ro.php", 1, 10).await;
let contents = resp["result"]["contents"].to_string();
assert!(
contents.contains("second"),
"hover after close+reopen must see new content, got: {contents}"
);
assert!(
!contents.contains("first"),
"hover must NOT see stale `first` from closed session, got: {contents}"
);
}