Rewrite test_managing_language_servers to add languages after buffers are open

Isaac Clayton and Antonio Scandurra created

Co-Authored-By: Antonio Scandurra <antonio@zed.dev>

Change summary

crates/project/src/project_tests.rs | 60 +++++++++---------------------
1 file changed, 19 insertions(+), 41 deletions(-)

Detailed changes

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<Deterministic>,
+    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();