pub mod colors;
pub mod errors;
pub fn get_color_by_name(
color_map: &std::collections::HashMap<String, colors::Color>,
color_name: &str,
) -> Option<(u8, u8, u8)> {
let color_name = color_name.to_lowercase();
if let Some(color) = color_map.get(&color_name) {
return Some((color.r, color.g, color.b));
}
None
}
#[cfg(test)]
mod tests {
use crate::colors::load_colors_from_file;
use crate::colors::{add_color, get_color_by_name, load_colors};
const SAMPLE_JSON: &str = r#"
{
"red": { "r": 255, "g": 0, "b": 0 },
"green": { "r": 0, "g": 255, "b": 0 },
"blue": { "r": 0, "g": 0, "b": 255 }
}
"#;
#[test]
fn test_get_color_by_name() {
let color_map = load_colors().unwrap();
let color = get_color_by_name(&color_map, "red");
assert_eq!(color, Some((255, 0, 0))); }
#[test]
fn test_get_color_by_invalid_name() {
let color_map = load_colors().unwrap();
let color = get_color_by_name(&color_map, "invalid_color");
assert_eq!(color, None);
}
#[test]
fn test_get_color_case_insensitive() {
let color_map = load_colors().unwrap();
let color = get_color_by_name(&color_map, "Red");
assert_eq!(color, Some((255, 0, 0)));
let color_lowercase = get_color_by_name(&color_map, "red");
assert_eq!(color_lowercase, Some((255, 0, 0)));
}
#[test]
fn test_load_colors_success() {
let result = load_colors();
assert!(result.is_ok(), "Failed to load colors.");
}
#[test]
fn test_add_new_color() {
let mut color_map = load_colors().unwrap();
let result = add_color(&mut color_map, "sunset_orange", 255, 94, 77);
assert!(result.is_ok(), "Failed to add new color.");
let color = get_color_by_name(&color_map, "sunset_orange");
assert_eq!(color, Some((255, 94, 77)));
}
#[test]
fn test_add_duplicate_color() {
let mut color_map = load_colors().unwrap();
let result = add_color(&mut color_map, "red", 255, 0, 0);
assert!(result.is_err(), "Added a duplicate color.");
let color = get_color_by_name(&color_map, "red");
assert_eq!(color, Some((255, 0, 0)));
}
#[test]
fn test_load_colors_from_sample_json() {
let color_map =
load_colors_from_file(SAMPLE_JSON).expect("Failed to load colors from sample JSON");
let red = get_color_by_name(&color_map, "red");
assert_eq!(red, Some((255, 0, 0)), "Expected RGB for 'red'");
let green = get_color_by_name(&color_map, "green");
assert_eq!(green, Some((0, 255, 0)), "Expected RGB for 'green'");
let blue = get_color_by_name(&color_map, "blue");
assert_eq!(blue, Some((0, 0, 255)), "Expected RGB for 'blue'");
}
#[test]
fn test_get_invalid_color_from_sample_json() {
let color_map =
load_colors_from_file(SAMPLE_JSON).expect("Failed to load colors from sample JSON");
let color = get_color_by_name(&color_map, "invalid_color");
assert_eq!(color, None, "Expected None for an invalid color");
}
#[test]
fn test_get_color_case_insensitive_from_sample_json() {
let color_map =
load_colors_from_file(SAMPLE_JSON).expect("Failed to load colors from sample JSON");
let red_upper = get_color_by_name(&color_map, "Red");
assert_eq!(red_upper, Some((255, 0, 0)), "Expected RGB for 'Red'");
let red_lower = get_color_by_name(&color_map, "red");
assert_eq!(red_lower, Some((255, 0, 0)), "Expected RGB for 'red'");
}
#[test]
fn test_add_new_color_with_sample_json() {
let mut color_map =
load_colors_from_file(SAMPLE_JSON).expect("Failed to load colors from sample JSON");
let result = add_color(&mut color_map, "sunset_orange", 255, 94, 77);
assert!(result.is_ok(), "Failed to add new color to color map");
let color = get_color_by_name(&color_map, "sunset_orange");
assert_eq!(
color,
Some((255, 94, 77)),
"Expected RGB for 'sunset_orange'"
);
}
#[test]
fn test_add_duplicate_color_with_sample_json() {
let mut color_map =
load_colors_from_file(SAMPLE_JSON).expect("Failed to load colors from sample JSON");
let result = add_color(&mut color_map, "red", 255, 0, 0);
assert!(
result.is_err(),
"Expected an error when adding a duplicate color"
);
let color = get_color_by_name(&color_map, "red");
assert_eq!(color, Some((255, 0, 0)), "Expected existing RGB for 'red'");
}
}