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