use domain::{ DefaultAgentTerminalInterface, IdeaLanguage, IdeaUserSettings, ProjectIconRef, ProjectIconSet, ProjectSettings, ThemeColor, MAX_PROJECT_ICON_NAME_LEN, }; #[test] fn legacy_settings_documents_keep_additive_defaults() { let user: IdeaUserSettings = serde_json::from_str(r#"{"defaultAgentTerminalInterface":"ideaCli"}"#).unwrap(); assert_eq!( user.default_agent_terminal_interface, Some(DefaultAgentTerminalInterface::IdeaCli) ); assert_eq!(user.language, None); let project: ProjectSettings = serde_json::from_str(r##"{"themeColor":"#123ABC"}"##).unwrap(); assert_eq!( project.theme_color.as_ref().map(ThemeColor::as_str), Some("#123ABC") ); assert_eq!(project.icon, None); } #[test] fn language_roundtrips_as_stable_codes_and_rejects_unknown_values() { for (language, wire) in [(IdeaLanguage::Fr, "fr"), (IdeaLanguage::En, "en")] { let settings = IdeaUserSettings { default_agent_terminal_interface: None, language: Some(language), }; let json = serde_json::to_string(&settings).unwrap(); assert_eq!( serde_json::from_str::(&json).unwrap()["language"], wire ); assert_eq!( serde_json::from_str::(&json).unwrap(), settings ); } assert!(serde_json::from_str::(r#"{"language":"de"}"#).is_err()); } #[test] fn project_icon_roundtrips_for_every_known_set() { for (set, wire) in [ (ProjectIconSet::Emoji, "emoji"), (ProjectIconSet::Devicon, "devicon"), (ProjectIconSet::SimpleIcons, "simple-icons"), (ProjectIconSet::Lucide, "lucide"), (ProjectIconSet::Idea, "idea"), ] { let settings = ProjectSettings { theme_color: None, icon: Some(ProjectIconRef::new(set, "arrow-up.circle_2").unwrap()), }; let value = serde_json::to_value(&settings).unwrap(); assert_eq!(value["icon"]["set"], wire); assert_eq!(value["icon"]["name"], "arrow-up.circle_2"); assert_eq!( serde_json::from_value::(value).unwrap(), settings ); } } #[test] fn legacy_project_icon_sets_remain_accepted() { for wire in ["devicon", "simple-icons", "lucide", "idea"] { let icon: ProjectIconRef = serde_json::from_value(serde_json::json!({ "set": wire, "name": "legacy-icon" })) .unwrap(); assert_eq!(icon.name(), "legacy-icon"); } } #[test] fn project_icon_rejects_unknown_sets_and_unstable_or_oversized_names() { assert!( serde_json::from_str::(r#"{"set":"font-awesome","name":"star"}"#).is_err() ); for invalid in [ "", " leading", "two words", "étoile", "slash/name", ".", "-star", "star-", ] { assert!( ProjectIconRef::new(ProjectIconSet::Lucide, invalid).is_err(), "accepted {invalid:?}" ); } assert!(ProjectIconRef::new( ProjectIconSet::Idea, "x".repeat(MAX_PROJECT_ICON_NAME_LEN + 1) ) .is_err()); }