diff --git a/crates/project/src/project_tests.rs b/crates/project/src/project_tests.rs index 04c6893d09..817afe058c 100644 --- a/crates/project/src/project_tests.rs +++ b/crates/project/src/project_tests.rs @@ -67,7 +67,10 @@ async fn test_populate_and_search(cx: &mut gpui::TestAppContext) { } #[gpui::test] -async fn test_managing_language_servers(cx: &mut gpui::TestAppContext) { +async fn test_managing_language_servers( + deterministic: Arc, + cx: &mut gpui::TestAppContext, +) { cx.foreground().forbid_parking(); let mut rust_language = Language::new( @@ -127,45 +130,6 @@ async fn test_managing_language_servers(cx: &mut gpui::TestAppContext) { let project = Project::test(fs.clone(), ["/the-root".as_ref()], cx).await; - // Open a buffer before languages have been added - let json_buffer = project - .update(cx, |project, cx| { - project.open_local_buffer("/the-root/package.json", cx) - }) - .await - .unwrap(); - - // Assert that this buffer does not have a language - assert!(json_buffer.read_with(cx, |buffer, _| { buffer.language().is_none() })); - - // Now we add the languages to the project, and subscribe to the watcher - project.update(cx, |project, cx| { - // Get a handle to the channel and clear out default item - let mut recv = project.languages.subscribe(); - recv.blocking_recv(); - - // Add, then wait to be notified that JSON has been added - project.languages.add(Arc::new(json_language)); - recv.blocking_recv(); - - // Add, then wait to be notified that Rust has been added - project.languages.add(Arc::new(rust_language)); - recv.blocking_recv(); - // Uncommenting this would cause the thread to block indefinitely: - // recv.blocking_recv(); - - // Force the assignment, we know the watcher has been notified - // but have no way to wait for the watcher to assign to the project - project.assign_language_to_buffer(&json_buffer, cx); - }); - - // Assert that the opened buffer does have a language, and that it is JSON - let name = json_buffer.read_with(cx, |buffer, _| buffer.language().map(|l| l.name())); - assert_eq!(name, Some("JSON".into())); - - // Close the JSON buffer we opened - cx.update(|_| drop(json_buffer)); - // Open a buffer without an associated language server. let toml_buffer = project .update(cx, |project, cx| { @@ -174,13 +138,27 @@ async fn test_managing_language_servers(cx: &mut gpui::TestAppContext) { .await .unwrap(); - // Open a buffer with an associated language server. + // Open a buffer with an associated language server before the language for it has been loaded. let rust_buffer = project .update(cx, |project, cx| { project.open_local_buffer("/the-root/test.rs", cx) }) .await .unwrap(); + rust_buffer.read_with(cx, |buffer, _| { + assert_eq!(buffer.language().map(|l| l.name()), None); + }); + + // Now we add the languages to the project, and ensure they get assigned to all + // the relevant open buffers. + project.update(cx, |project, _| { + project.languages.add(Arc::new(json_language)); + project.languages.add(Arc::new(rust_language)); + }); + deterministic.run_until_parked(); + rust_buffer.read_with(cx, |buffer, _| { + assert_eq!(buffer.language().map(|l| l.name()), Some("Rust".into())); + }); // A server is started up, and it is notified about Rust files. let mut fake_rust_server = fake_rust_servers.next().await.unwrap();