From 6d7ea11598ae4b2909bb41e66b30fadbb3ddeebf Mon Sep 17 00:00:00 2001 From: chris west Date: Sat, 19 Nov 2022 13:45:01 -0800 Subject: [PATCH] theme tests --- src/config.rs | 50 +++++++++++++++++++++++++++++++++++++++++++----- tests/pink.theme | 15 +++++++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 tests/pink.theme diff --git a/src/config.rs b/src/config.rs index e0867f9..6d9e9b6 100644 --- a/src/config.rs +++ b/src/config.rs @@ -13,7 +13,7 @@ use { std::{ collections::HashMap, fs::OpenOptions, - io::{Read, Result}, + io::{self, Read, Result}, sync::{Arc, RwLock}, }, }; @@ -65,7 +65,7 @@ wrap 0 scroll 0 # Path to theme file, if any -theme ~/.config/phetch/pink.theme +# theme ~/.config/phetch/pink.theme # Inline Theme ui.cursor white bold @@ -232,9 +232,19 @@ fn parse(text: &str) -> Result { if homevar.is_err() && val.contains('~') { return Err(error!("$HOME not set, can't decode `~`")); } - cfg.theme = load_file(&val.replace('~', &homevar.unwrap())) - .map_err(|e| error!("error loading theme: {}", e))? - .theme + cfg.theme = match load_file(&val.replace('~', &homevar.unwrap())) { + Ok(cfg) => cfg.theme, + Err(e) => { + if matches!(e.kind(), io::ErrorKind::NotFound) { + return Err(error!( + "error loading theme: File not found on line {}: {}", + linenum, val + )); + } else { + return Err(error!("error loading theme: {:?}", e)); + } + } + }; } // color scheme @@ -359,4 +369,34 @@ mod tests { let res = parse("tls true\nencoding what\n"); assert!(res.is_err()); } + + #[test] + fn test_missing_theme() { + if let Err(e) = parse("theme /dont/exists.txt") { + assert_eq!( + format!("{}", e), + "error loading theme: File not found on line 1: /dont/exists.txt" + ); + } + } + + #[test] + fn test_theme_file() { + use crate::theme::to_words; + + let cfg = parse("theme ./tests/pink.theme").unwrap(); + assert_eq!(to_words(cfg.theme.item_text), "magenta"); + assert_eq!(to_words(cfg.theme.item_menu), "magenta"); + assert_eq!(to_words(cfg.theme.item_error), "red"); + assert_eq!(to_words(cfg.theme.ui_menu), "cyan"); + } + + #[test] + fn test_theme() { + use crate::theme::to_words; + + let cfg = parse("item.text green\nitem.download red underline").unwrap(); + assert_eq!(to_words(cfg.theme.item_text), "green"); + assert_eq!(to_words(cfg.theme.item_download), "red underline"); + } } diff --git a/tests/pink.theme b/tests/pink.theme new file mode 100644 index 0000000..a1e5c2a --- /dev/null +++ b/tests/pink.theme @@ -0,0 +1,15 @@ +# phetch theme +ui.cursor red +ui.number white +ui.menu cyan +ui.text white + +item.text magenta +item.menu magenta +item.error red +item.search magenta +item.telnet magenta +item.external magenta +item.download magenta underline +item.media magenta underline +item.unsupported magentabg white