1use crate::{assets::Assets, build_window_options, build_workspace, AppState};
2use client::{test::FakeHttpClient, ChannelList, Client, UserStore};
3use gpui::{AssetSource, MutableAppContext};
4use language::LanguageRegistry;
5use parking_lot::Mutex;
6use postage::watch;
7use project::fs::FakeFs;
8use std::sync::Arc;
9use theme::{Theme, ThemeRegistry, DEFAULT_THEME_NAME};
10use workspace::Settings;
11
12#[cfg(test)]
13#[ctor::ctor]
14fn init_logger() {
15 env_logger::init();
16}
17
18pub fn test_app_state(cx: &mut MutableAppContext) -> Arc<AppState> {
19 let mut entry_openers = Vec::new();
20 editor::init(cx, &mut entry_openers);
21 let (settings_tx, settings) = watch::channel_with(build_settings(cx));
22 let themes = ThemeRegistry::new(Assets, cx.font_cache().clone());
23 let http = FakeHttpClient::with_404_response();
24 let client = Client::new(http.clone());
25 let user_store = cx.add_model(|cx| UserStore::new(client.clone(), http, cx));
26 let mut languages = LanguageRegistry::new();
27 languages.add(Arc::new(language::Language::new(
28 language::LanguageConfig {
29 name: "Rust".to_string(),
30 path_suffixes: vec!["rs".to_string()],
31 ..Default::default()
32 },
33 Some(tree_sitter_rust::language()),
34 )));
35 Arc::new(AppState {
36 settings_tx: Arc::new(Mutex::new(settings_tx)),
37 settings,
38 themes,
39 languages: Arc::new(languages),
40 channel_list: cx.add_model(|cx| ChannelList::new(user_store.clone(), client.clone(), cx)),
41 client,
42 user_store,
43 fs: Arc::new(FakeFs::new()),
44 entry_openers: Arc::from(entry_openers),
45 build_window_options: &build_window_options,
46 build_workspace: &build_workspace,
47 })
48}
49
50fn build_settings(cx: &gpui::AppContext) -> Settings {
51 lazy_static::lazy_static! {
52 static ref DEFAULT_THEME: parking_lot::Mutex<Option<Arc<Theme>>> = Default::default();
53 static ref FONTS: Vec<Arc<Vec<u8>>> = Assets
54 .list("fonts")
55 .into_iter()
56 .map(|f| Arc::new(Assets.load(&f).unwrap().to_vec()))
57 .collect();
58 }
59
60 cx.platform().fonts().add_fonts(&FONTS).unwrap();
61
62 let mut theme_guard = DEFAULT_THEME.lock();
63 let theme = if let Some(theme) = theme_guard.as_ref() {
64 theme.clone()
65 } else {
66 let theme = ThemeRegistry::new(Assets, cx.font_cache().clone())
67 .get(DEFAULT_THEME_NAME)
68 .expect("failed to load default theme in tests");
69 *theme_guard = Some(theme.clone());
70 theme
71 };
72
73 Settings::new("Inconsolata", cx.font_cache(), theme).unwrap()
74}