mcu_scheme/
scheme_fidelity.rs1use mcu_dynamiccolor::{DynamicScheme, DynamicSchemeOptions, Platform, SpecVersion, Variant};
7use mcu_hct::Hct;
8use std::ops::Deref;
9
10pub struct SchemeFidelity {
26 scheme: DynamicScheme,
27}
28
29impl SchemeFidelity {
30 pub fn new(source_color_hct: Hct, is_dark: bool, contrast_level: f64) -> Self {
38 let scheme = DynamicScheme::new(DynamicSchemeOptions::new(
39 source_color_hct,
40 Variant::Fidelity,
41 contrast_level,
42 is_dark,
43 ));
44 Self { scheme }
45 }
46
47 pub fn with_options(
57 source_color_hct: Hct,
58 is_dark: bool,
59 contrast_level: f64,
60 platform: Platform,
61 spec_version: SpecVersion,
62 ) -> Self {
63 let mut options =
64 DynamicSchemeOptions::new(source_color_hct, Variant::Fidelity, contrast_level, is_dark);
65 options.platform = Some(platform);
66 options.spec_version = Some(spec_version);
67 Self {
68 scheme: DynamicScheme::new(options),
69 }
70 }
71}
72
73impl Deref for SchemeFidelity {
74 type Target = DynamicScheme;
75
76 fn deref(&self) -> &Self::Target {
77 &self.scheme
78 }
79}
80
81#[cfg(test)]
82mod tests {
83 use super::*;
84
85 #[test]
86 fn test_new_light_mode() {
87 let source = Hct::from_int(0xFF0000FF);
88 let scheme = SchemeFidelity::new(source, false, 0.0);
89
90 assert_eq!(scheme.variant, Variant::Fidelity);
91 assert!(!scheme.is_dark);
92 assert_eq!(scheme.contrast_level, 0.0);
93 }
94
95 #[test]
96 fn test_new_dark_mode() {
97 let source = Hct::from_int(0xFF0000FF);
98 let scheme = SchemeFidelity::new(source, true, 0.0);
99
100 assert_eq!(scheme.variant, Variant::Fidelity);
101 assert!(scheme.is_dark);
102 }
103
104 #[test]
105 fn test_contrast_levels() {
106 let source = Hct::from_int(0xFF0000FF);
107
108 let low = SchemeFidelity::new(source, false, -1.0);
109 assert_eq!(low.contrast_level, -1.0);
110
111 let high = SchemeFidelity::new(source, false, 1.0);
112 assert_eq!(high.contrast_level, 1.0);
113 }
114
115 #[test]
116 fn test_with_options() {
117 let source = Hct::from_int(0xFF0000FF);
118 let scheme =
119 SchemeFidelity::with_options(source, true, 0.5, Platform::Watch, SpecVersion::Spec2025);
120
121 assert_eq!(scheme.variant, Variant::Fidelity);
122 assert!(scheme.is_dark);
123 assert_eq!(scheme.contrast_level, 0.5);
124 assert_eq!(scheme.platform, Platform::Watch);
125 assert_eq!(scheme.spec_version, SpecVersion::Spec2021);
127 }
128
129 #[test]
130 fn test_deref_access() {
131 let source = Hct::from_int(0xFF0000FF);
132 let scheme = SchemeFidelity::new(source, false, 0.0);
133
134 let _primary = &scheme.primary_palette;
136 let _secondary = &scheme.secondary_palette;
137 let _argb = scheme.source_color_argb;
138 }
139}
140
141