From 88e664bfd9dfa16efca6a5df142891855667679a Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Thu, 16 Mar 2023 10:40:04 +0100 Subject: [PATCH] Add test for language registration and loading --- crates/language/src/language.rs | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/crates/language/src/language.rs b/crates/language/src/language.rs index 0c05fdccb1739b4b16e81f6244c7e15f5fa72405..84311f9d790bcc401bbe4265bec4ff06587dd1b4 100644 --- a/crates/language/src/language.rs +++ b/crates/language/src/language.rs @@ -1502,3 +1502,76 @@ pub fn range_from_lsp(range: lsp::Range) -> Range> { } start..end } + +#[cfg(test)] +mod tests { + use gpui::TestAppContext; + + use super::*; + + #[gpui::test(iterations = 10)] + async fn test_language_loading(cx: &mut TestAppContext) { + let mut languages = LanguageRegistry::new(Task::ready(())); + languages.set_executor(cx.background()); + let languages = Arc::new(languages); + languages.register( + "/JSON", + LanguageConfig { + name: "JSON".into(), + path_suffixes: vec!["json".into()], + ..Default::default() + }, + tree_sitter_json::language(), + None, + |_| Default::default(), + ); + languages.register( + "/rust", + LanguageConfig { + name: "Rust".into(), + path_suffixes: vec!["rs".into()], + ..Default::default() + }, + tree_sitter_rust::language(), + None, + |_| Default::default(), + ); + assert_eq!( + languages.language_names(), + &[ + "JSON".to_string(), + "Plain Text".to_string(), + "Rust".to_string(), + ] + ); + + let rust1 = languages.language_for_name("Rust"); + let rust2 = languages.language_for_name("Rust"); + + // Ensure language is still listed even if it's being loaded. + assert_eq!( + languages.language_names(), + &[ + "JSON".to_string(), + "Plain Text".to_string(), + "Rust".to_string(), + ] + ); + + let (rust1, rust2) = futures::join!(rust1, rust2); + assert!(Arc::ptr_eq(&rust1.unwrap(), &rust2.unwrap())); + + // Ensure language is still listed even after loading it. + assert_eq!( + languages.language_names(), + &[ + "JSON".to_string(), + "Plain Text".to_string(), + "Rust".to_string(), + ] + ); + + // Loading an unknown language returns an error. + assert!(languages.language_for_name("Unknown").await.is_err()); + } +}