smart_keymap/key/
layered.rs

1#![doc = include_str!("doc_de_layered.md")]
2
3use core::fmt::Debug;
4use core::marker::Copy;
5
6use serde::Deserialize;
7
8use crate::input;
9use crate::key;
10
11pub use crate::init::LAYER_COUNT;
12
13/// The type used for layer index.
14pub type LayerIndex = usize;
15
16/// The type used for set of active layers in ModifierKey.
17/// (Limited to [MAX_BITSET_LAYER] layers.)
18pub type LayerBitset = u32;
19
20/// The maximum number of layers that can be represented in a [LayerBitset].
21pub const MAX_BITSET_LAYER: usize = 8 * core::mem::size_of::<LayerBitset>() - 1;
22
23/// Modifier layer key affects what layers are active.
24#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
25pub enum ModifierKey {
26    /// Activates the given layer when the held.
27    Hold(LayerIndex),
28    /// Sets the set of active layers to the given layers when the key is pressed.
29    SetActiveLayers(LayerBitset),
30    /// Sets the default layer.
31    Default(LayerIndex),
32}
33
34impl ModifierKey {
35    /// Create a new [ModifierKey] that activates the given layer when held.
36    pub const fn hold(layer: LayerIndex) -> Self {
37        ModifierKey::Hold(layer)
38    }
39
40    /// Create a new [ModifierKey] that sets the active layers to the given slice of layers when pressed.
41    ///
42    /// Each LayerIndex in the slice must be less than [MAX_BITSET_LAYER].
43    pub const fn set_active_layers(layers: &[LayerIndex]) -> Self {
44        let mut bitset = 0;
45
46        let mut idx = 0;
47        while idx < layers.len() {
48            let layer = layers[idx];
49            if layer < MAX_BITSET_LAYER {
50                bitset |= 1 << layer;
51            } else {
52                panic!("LayerIndex must be less than MAX_BITSET_LAYER");
53            }
54            idx += 1;
55        }
56
57        ModifierKey::SetActiveLayers(bitset)
58    }
59
60    /// Create a new [ModifierKey] that sets the active layers bitset.
61    pub const fn set_active_layers_from_bitset(bitset: LayerBitset) -> Self {
62        ModifierKey::SetActiveLayers(bitset)
63    }
64
65    /// Create a new [ModifierKey] that sets the default layer.
66    pub const fn default(layer: LayerIndex) -> Self {
67        ModifierKey::Default(layer)
68    }
69
70    /// Create a new [input::PressedKey] and [key::ScheduledEvent] for the given keymap index.
71    ///
72    /// Pressing a [ModifierKey::Hold] emits a [LayerEvent::LayerActivated] event.
73    pub fn new_pressed_key(&self) -> (ModifierKeyState, LayerEvent) {
74        match self {
75            ModifierKey::Hold(layer) => {
76                let pks = ModifierKeyState(*self);
77                let event = LayerEvent::LayerActivated(*layer);
78                (pks, event)
79            }
80            ModifierKey::SetActiveLayers(layer_set) => {
81                let pks = ModifierKeyState(*self);
82                let event = LayerEvent::LayersSet(*layer_set);
83                (pks, event)
84            }
85            ModifierKey::Default(layer) => {
86                let pks = ModifierKeyState(*self);
87                let event = LayerEvent::DefaultLayerSet(*layer);
88                (pks, event)
89            }
90        }
91    }
92}
93
94impl key::Key for ModifierKey {
95    type Context = crate::init::Context;
96    type Event = crate::init::Event;
97    type PendingKeyState = crate::init::PendingKeyState;
98    type KeyState = crate::init::KeyState;
99
100    fn new_pressed_key(
101        &self,
102        _context: &Self::Context,
103        key_path: key::KeyPath,
104    ) -> (
105        key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
106        key::KeyEvents<Self::Event>,
107    ) {
108        let keymap_index: u16 = key_path.keymap_index();
109        let (m_ks, lmod_ev) = self.new_pressed_key();
110        let pks = key::PressedKeyResult::Resolved(m_ks.into());
111        let pke = key::KeyEvents::event(key::Event::key_event(keymap_index, lmod_ev)).into_events();
112        (pks, pke)
113    }
114
115    fn handle_event(
116        &self,
117        _pending_state: &mut Self::PendingKeyState,
118        _context: &Self::Context,
119        _key_path: key::KeyPath,
120        _event: key::Event<Self::Event>,
121    ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
122        panic!()
123    }
124
125    fn lookup(
126        &self,
127        _path: &[u16],
128    ) -> &dyn key::Key<
129        Context = Self::Context,
130        Event = Self::Event,
131        PendingKeyState = Self::PendingKeyState,
132        KeyState = Self::KeyState,
133    > {
134        self
135    }
136}
137
138impl From<LayerEvent> for () {
139    fn from(_: LayerEvent) -> Self {}
140}
141
142/// Tracks state of active layers.
143pub trait LayerState: Copy + Debug {
144    /// Activate the given layer.
145    fn activate(&mut self, layer: LayerIndex);
146    /// Deactivate the given layer.
147    fn deactivate(&mut self, layer: LayerIndex);
148    /// Get the active layers, from highest active layer to lowest.
149    fn active_layers(&self) -> impl Iterator<Item = LayerIndex>;
150}
151
152impl<const L: usize> LayerState for [bool; L] {
153    fn activate(&mut self, layer_index: LayerIndex) {
154        debug_assert!(
155            layer_index < L,
156            "layer must be less than array length of {}",
157            L
158        );
159        self[layer_index - 1] = true;
160    }
161
162    fn deactivate(&mut self, layer_index: LayerIndex) {
163        debug_assert!(
164            layer_index < L,
165            "layer must be less than array length of {}",
166            L
167        );
168        self[layer_index - 1] = false;
169    }
170
171    fn active_layers(&self) -> impl Iterator<Item = LayerIndex> {
172        self.iter()
173            .enumerate()
174            .rev()
175            .filter_map(|(i, &active)| if active { Some(i + 1) } else { None })
176    }
177}
178
179/// [crate::key::Context] for [LayeredKey] that tracks active layers.
180#[derive(Debug, Clone, Copy)]
181pub struct Context {
182    default_layer: Option<LayerIndex>,
183    active_layers: [bool; LAYER_COUNT],
184}
185
186/// The default [Context] with no active layers.
187pub const DEFAULT_CONTEXT: Context = Context {
188    default_layer: None,
189    active_layers: [false; LAYER_COUNT],
190};
191
192impl Context {
193    /// Create a new [Context].
194    pub const fn new() -> Self {
195        DEFAULT_CONTEXT
196    }
197}
198
199impl Default for Context {
200    fn default() -> Self {
201        DEFAULT_CONTEXT
202    }
203}
204
205impl Context {
206    /// Activate the given layer.
207    pub fn activate_layer(&mut self, layer: LayerIndex) {
208        self.active_layers.activate(layer);
209    }
210
211    /// Get the active layers.
212    pub fn layer_state(&self) -> &[bool; LAYER_COUNT] {
213        &self.active_layers
214    }
215
216    /// Updates the context with the [LayerEvent].
217    pub fn handle_event(&mut self, event: LayerEvent) {
218        match event {
219            LayerEvent::LayerActivated(layer) => {
220                self.active_layers.activate(layer);
221            }
222            LayerEvent::LayerDeactivated(layer) => {
223                self.active_layers.deactivate(layer);
224            }
225            LayerEvent::LayersSet(layer_set) => {
226                let max_layer = LAYER_COUNT.min(MAX_BITSET_LAYER + 1);
227
228                // layer 0 is always active.
229                for li in 1..max_layer {
230                    if (layer_set & (1 << li)) != 0 {
231                        self.active_layers.activate(li);
232                    } else {
233                        self.active_layers.deactivate(li);
234                    }
235                }
236            }
237            LayerEvent::DefaultLayerSet(0) => self.default_layer = None,
238            LayerEvent::DefaultLayerSet(layer) => self.default_layer = Some(layer),
239        }
240    }
241}
242
243/// Errors when constructing Layers.
244#[derive(Debug, Clone, Copy, PartialEq)]
245pub enum LayersError {
246    /// Trying to construct more layers than the Layers can store.
247    Overflow,
248}
249
250impl core::fmt::Display for LayersError {
251    // This trait requires `fmt` with this exact signature.
252    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
253        write!(f, "LayersError::Overflow")
254    }
255}
256
257/// Trait for layers of [LayeredKey].
258pub trait Layers<K: key::Key>: Copy + Debug {
259    /// Get the highest active key, if any, for the given [LayerState].
260    fn highest_active_key<LS: LayerState>(
261        &self,
262        layer_state: &LS,
263        default_layer: Option<LayerIndex>,
264    ) -> Option<(LayerIndex, &K)>;
265    /// Constructs layers; return Err if the iterable has more keys than Layers can store.
266    fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError>;
267}
268
269impl<K: key::Key + Copy, const L: usize> Layers<K> for [Option<K>; L] {
270    fn highest_active_key<LS: LayerState>(
271        &self,
272        layer_state: &LS,
273        default_layer: Option<LayerIndex>,
274    ) -> Option<(LayerIndex, &K)> {
275        for layer_index in layer_state.active_layers() {
276            if self[layer_index - 1].is_some() {
277                return self[layer_index - 1].as_ref().map(|k| (layer_index, k));
278            }
279        }
280
281        match default_layer {
282            Some(layer_index) if self[layer_index - 1].is_some() => {
283                self[layer_index - 1].as_ref().map(|k| (layer_index, k))
284            }
285            _ => None,
286        }
287    }
288
289    fn from_iterable<I: IntoIterator<Item = Option<K>>>(keys: I) -> Result<Self, LayersError> {
290        let mut layered: [Option<K>; L] = [None; L];
291        for (i, maybe_key) in keys.into_iter().enumerate() {
292            if i < L {
293                layered[i] = maybe_key;
294            } else {
295                return Err(LayersError::Overflow);
296            }
297        }
298        Ok(layered)
299    }
300}
301
302/// Constructs an array of keys for the given array.
303pub const fn layered_keys<K: Copy, const L: usize>(
304    keys: [Option<K>; L],
305) -> [Option<K>; LAYER_COUNT] {
306    let mut layered: [Option<K>; LAYER_COUNT] = [None; LAYER_COUNT];
307
308    if L > LAYER_COUNT {
309        panic!("Too many layers for layered_keys");
310    }
311
312    let mut i = 0;
313
314    while i < L {
315        layered[i] = keys[i];
316        i += 1;
317    }
318
319    layered
320}
321
322/// A key whose behavior depends on which layer is active.
323#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
324pub struct LayeredKey<K: key::Key + Copy + PartialEq> {
325    /// The base key, used when no layers are active.
326    pub base: K,
327    /// The layered keys, used when the corresponding layer is active.
328    #[serde(deserialize_with = "deserialize_layered")]
329    #[serde(bound(deserialize = "K: Deserialize<'de>"))]
330    pub layered: [Option<K>; LAYER_COUNT],
331}
332
333/// Deserialize a [Layers].
334fn deserialize_layered<'de, K, L: Layers<K>, D>(deserializer: D) -> Result<L, D::Error>
335where
336    K: key::Key + Deserialize<'de>,
337    D: serde::Deserializer<'de>,
338{
339    let keys_vec: heapless::Vec<Option<K>, 64> = Deserialize::deserialize(deserializer)?;
340
341    L::from_iterable(keys_vec).map_err(serde::de::Error::custom)
342}
343
344impl<K: key::Key + Copy + PartialEq> LayeredKey<K> {
345    /// Constructs a new [LayeredKey].
346    pub const fn new<const L: usize>(base: K, layered: [Option<K>; L]) -> Self {
347        let layered = layered_keys(layered);
348        Self { base, layered }
349    }
350}
351
352impl<K: key::Key + Copy + PartialEq> LayeredKey<K>
353where
354    for<'c> &'c K::Context: Into<&'c Context>,
355{
356    /// Presses the key, using the highest active key, if any.
357    fn new_pressed_key(
358        &self,
359        context: &K::Context,
360        key_path: key::KeyPath,
361    ) -> (
362        key::PressedKeyResult<K::PendingKeyState, K::KeyState>,
363        key::KeyEvents<K::Event>,
364    ) {
365        let layer_context: &Context = context.into();
366        let (layer, passthrough_key) = self
367            .layered
368            .highest_active_key(layer_context.layer_state(), layer_context.default_layer)
369            .unwrap_or((0, &self.base));
370
371        // PRESSED KEY PATH: add Layer (0 = base, n = layer_index)
372        let (pkr, pke) = passthrough_key.new_pressed_key(context, key_path);
373        (pkr.append_path_item(layer as u16), pke)
374    }
375}
376
377impl<
378        K: key::Key<
379                Context = crate::init::Context,
380                Event = crate::init::Event,
381                PendingKeyState = crate::init::PendingKeyState,
382                KeyState = crate::init::KeyState,
383            > + Copy
384            + PartialEq,
385    > key::Key for LayeredKey<K>
386{
387    type Context = crate::init::Context;
388    type Event = crate::init::Event;
389    type PendingKeyState = crate::init::PendingKeyState;
390    type KeyState = crate::init::KeyState;
391
392    fn new_pressed_key(
393        &self,
394        context: &Self::Context,
395        key_path: key::KeyPath,
396    ) -> (
397        key::PressedKeyResult<Self::PendingKeyState, Self::KeyState>,
398        key::KeyEvents<Self::Event>,
399    ) {
400        self.new_pressed_key(context, key_path)
401    }
402
403    fn handle_event(
404        &self,
405        _pending_state: &mut Self::PendingKeyState,
406        _context: &Self::Context,
407        _key_path: key::KeyPath,
408        _event: key::Event<Self::Event>,
409    ) -> (Option<key::NewPressedKey>, key::KeyEvents<Self::Event>) {
410        panic!()
411    }
412
413    fn lookup(
414        &self,
415        path: &[u16],
416    ) -> &dyn key::Key<
417        Context = Self::Context,
418        Event = Self::Event,
419        PendingKeyState = Self::PendingKeyState,
420        KeyState = Self::KeyState,
421    > {
422        match path {
423            [] => self,
424            [0, path @ ..] => self.base.lookup(path),
425            [layer_index, path @ ..] => self.layered[(layer_index - 1) as usize]
426                .as_ref()
427                .unwrap()
428                .lookup(path),
429        }
430    }
431}
432
433/// Events from [ModifierKey] which affect [Context].
434#[derive(Debug, Clone, Copy, Eq, PartialEq)]
435pub enum LayerEvent {
436    /// Activates the given layer.
437    LayerActivated(LayerIndex),
438    /// Deactivates the given layer.
439    LayerDeactivated(LayerIndex),
440    /// Sets the active layers to the given set of layers.
441    LayersSet(LayerBitset),
442    /// Changes the default layer.
443    DefaultLayerSet(LayerIndex),
444}
445
446/// [crate::key::KeyState] of [ModifierKey].
447#[derive(Debug, Clone, Copy, PartialEq)]
448pub struct ModifierKeyState(ModifierKey);
449
450impl ModifierKeyState {
451    /// Handle the given event for the given key.
452    pub fn handle_event(
453        &mut self,
454        keymap_index: u16,
455        event: key::Event<LayerEvent>,
456    ) -> Option<LayerEvent> {
457        let ModifierKeyState(key) = self;
458        match key {
459            ModifierKey::Hold(layer) => match event {
460                key::Event::Input(input::Event::Release { keymap_index: ki }) => {
461                    if keymap_index == ki {
462                        Some(LayerEvent::LayerDeactivated(*layer))
463                    } else {
464                        None
465                    }
466                }
467                _ => None,
468            },
469            ModifierKey::SetActiveLayers(_layer_set) => None,
470            ModifierKey::Default(layer) => match event {
471                key::Event::Input(input::Event::Release { keymap_index: ki }) => {
472                    if keymap_index == ki {
473                        Some(LayerEvent::DefaultLayerSet(*layer))
474                    } else {
475                        None
476                    }
477                }
478                _ => None,
479            },
480        }
481    }
482}
483
484#[cfg(test)]
485mod tests {
486    use super::*;
487
488    use key::keyboard;
489
490    use key::KeyOutput;
491
492    use key::composite::KeyState;
493
494    #[test]
495    fn test_pressing_hold_modifier_key_emits_event_activate_layer() {
496        let layer = 1;
497        let key = ModifierKey::Hold(layer);
498
499        let (_pressed_key, layer_event) = key.new_pressed_key();
500
501        assert_eq!(LayerEvent::LayerActivated(layer), layer_event);
502    }
503
504    #[test]
505    fn test_releasing_hold_modifier_key_emits_event_deactivate_layer() {
506        // Assemble: press a Hold layer modifier key
507        let layer = 1;
508        let key = ModifierKey::Hold(layer);
509        let keymap_index = 9; // arbitrary
510        let (mut pressed_key_state, _) = key.new_pressed_key();
511
512        // Act: the modifier key handles "release key" input event
513        let actual_events = pressed_key_state
514            .handle_event(
515                keymap_index,
516                key::Event::Input(input::Event::Release { keymap_index }),
517            )
518            .into_iter()
519            .next();
520
521        // Assert: the pressed key should have emitted a layer deactivation event
522        let first_ev = actual_events.into_iter().next();
523        if let Some(actual_layer_event) = first_ev {
524            let expected_layer_event = LayerEvent::LayerDeactivated(layer);
525            assert_eq!(expected_layer_event, actual_layer_event);
526        } else {
527            panic!("Expected Some LayerDeactivated event");
528        }
529    }
530
531    #[test]
532    fn test_releasing_different_hold_modifier_key_does_not_emit_event() {
533        // Assemble: press a Hold layer modifier key
534        let layer = 1;
535        let key = ModifierKey::Hold(layer);
536        let keymap_index = 9; // arbitrary
537        let (mut pressed_key_state, _) = key.new_pressed_key();
538
539        // Act: the modifier key handles "release key" input event for a different key
540        let different_keymap_index = keymap_index + 1;
541        let different_key_released_ev = key::Event::Input(input::Event::Release {
542            keymap_index: different_keymap_index,
543        });
544        let actual_events = pressed_key_state
545            .handle_event(keymap_index, different_key_released_ev)
546            .into_iter()
547            .next();
548
549        // Assert: the pressed key should not emit an event
550        if actual_events.is_some() {
551            panic!("Expected no event emitted");
552        }
553    }
554
555    #[test]
556    fn test_context_handling_event_adjusts_active_layers() {
557        let mut context: Context = Context::default();
558
559        context.handle_event(LayerEvent::LayerActivated(2));
560
561        let actual_active_layers = &context.active_layers[0..3];
562        assert_eq!(&[false, true, false], actual_active_layers);
563    }
564
565    #[test]
566    fn test_pressing_layered_key_acts_as_base_key_when_no_layers_active() {
567        // Assemble
568        let context = key::composite::Context::default();
569        let expected_key = keyboard::Key::new(0x04);
570        let layered_key = LayeredKey::new(
571            expected_key,
572            [
573                Some(keyboard::Key::new(0x05)),
574                Some(keyboard::Key::new(0x06)),
575                Some(keyboard::Key::new(0x07)),
576            ],
577        );
578
579        // Act: without activating a layer, press the layered key
580        let keymap_index = 9; // arbitrary
581        let key_path = key::key_path(keymap_index);
582        let (actual_key_state, _actual_event) = layered_key.new_pressed_key(&context, key_path);
583
584        // Assert
585        let expected_key_state: KeyState = KeyState::Keyboard(expected_key.new_pressed_key());
586        assert_eq!(expected_key_state, actual_key_state.unwrap_resolved(),);
587    }
588
589    #[test]
590    fn test_pressing_layered_key_when_no_layers_active_has_key_code() {
591        use key::KeyState as _;
592
593        // Assemble
594        let context = key::composite::Context::default();
595        let expected_key = keyboard::Key::new(0x04);
596        let layered_key = LayeredKey::new(
597            expected_key,
598            [
599                Some(keyboard::Key::new(0x05)),
600                Some(keyboard::Key::new(0x06)),
601                Some(keyboard::Key::new(0x07)),
602            ],
603        );
604
605        // Act: without activating a layer, press the layered key
606        let keymap_index = 9; // arbitrary
607        let key_path = key::key_path(keymap_index);
608        let (actual_pressed_key, _event) = layered_key.new_pressed_key(&context, key_path);
609
610        let actual_key_output = actual_pressed_key.unwrap_resolved().key_output();
611
612        // Assert
613        let expected_pressed_key_state = expected_key.new_pressed_key();
614        let expected_key_output = Some(expected_pressed_key_state.key_output());
615        assert_eq!(expected_key_output, actual_key_output);
616        assert_eq!(Some(KeyOutput::from_key_code(0x04)), actual_key_output,);
617    }
618
619    // Terminology:
620    //   "defined layer" = LayeredKey.layered[] is Some for that layer;
621    //   "active layer" = Context.active_layers[] = true for that layer.
622
623    #[test]
624    fn test_pressing_layered_key_falls_through_undefined_active_layers() {
625        use key::Context as _;
626
627        // Assemble: layered key (with no layered definitions)
628        let mut context = key::composite::Context::default();
629        let expected_key = keyboard::Key::new(0x04);
630        let layered_key = LayeredKey::new(expected_key, [None, None, None]);
631
632        // Act: activate all layers, press layered key
633        context.handle_event(key::Event::key_event(
634            0,
635            LayerEvent::LayerActivated(1).into(),
636        ));
637        context.handle_event(key::Event::key_event(
638            0,
639            LayerEvent::LayerActivated(2).into(),
640        ));
641        context.handle_event(key::Event::key_event(
642            0,
643            LayerEvent::LayerActivated(3).into(),
644        ));
645        let keymap_index = 9; // arbitrary
646        let key_path = key::key_path(keymap_index);
647        let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
648
649        // Assert
650        let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
651        assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
652    }
653
654    #[test]
655    fn test_pressing_layered_key_acts_as_highest_defined_active_layer() {
656        use key::Context as _;
657
658        // Assemble: layered key (with no layered definitions)
659        let mut context = key::composite::Context::default();
660        let expected_key = keyboard::Key::new(0x09);
661        let layered_key = LayeredKey::new(
662            keyboard::Key::new(0x04),
663            [
664                Some(keyboard::Key::new(0x05)),
665                Some(keyboard::Key::new(0x06)),
666                Some(expected_key),
667            ],
668        );
669
670        // Act: activate all layers, press layered key
671        context.handle_event(key::Event::key_event(
672            0,
673            LayerEvent::LayerActivated(1).into(),
674        ));
675        context.handle_event(key::Event::key_event(
676            0,
677            LayerEvent::LayerActivated(2).into(),
678        ));
679        context.handle_event(key::Event::key_event(
680            0,
681            LayerEvent::LayerActivated(3).into(),
682        ));
683        let keymap_index = 9; // arbitrary
684        let key_path = key::key_path(keymap_index);
685        let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
686
687        // Assert
688        let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
689        assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
690    }
691
692    #[test]
693    fn test_pressing_layered_key_with_some_transparency_acts_as_highest_defined_active_layer() {
694        use key::Context as _;
695
696        // Assemble: layered key (with no layered definitions)
697        let mut context = key::composite::Context::default();
698        let expected_key = keyboard::Key::new(0x09);
699        let layered_key = LayeredKey::new(
700            keyboard::Key::new(0x04),
701            [Some(expected_key), Some(keyboard::Key::new(0x06)), None],
702        );
703
704        // Act: activate all layers, press layered key
705        context.handle_event(key::Event::key_event(
706            0,
707            LayerEvent::LayerActivated(1).into(),
708        ));
709        context.handle_event(key::Event::key_event(
710            0,
711            LayerEvent::LayerActivated(3).into(),
712        ));
713        let keymap_index = 9; // arbitrary
714        let key_path = key::key_path(keymap_index);
715        let (actual_pressed_key, _actual_event) = layered_key.new_pressed_key(&context, key_path);
716
717        // Assert
718        let expected_pressed_key = KeyState::Keyboard(expected_key.new_pressed_key());
719        assert_eq!(expected_pressed_key, actual_pressed_key.unwrap_resolved(),);
720    }
721
722    #[test]
723    fn test_deserialize_json_option_keyboard() {
724        let actual: Option<key::keyboard::Key> =
725            serde_json::from_str(r#"{"key_code": 4}"#).unwrap();
726        let expected: Option<key::keyboard::Key> = Some(keyboard::Key::new(0x04));
727        assert_eq!(expected, actual);
728    }
729
730    #[test]
731    fn test_deserialize_json_vec1_option_keyboard() {
732        let actual: heapless::Vec<Option<key::keyboard::Key>, 1> =
733            serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
734        let mut expected: heapless::Vec<Option<key::keyboard::Key>, 1> = heapless::Vec::new();
735        expected.push(Some(keyboard::Key::new(0x04))).unwrap();
736        assert_eq!(expected, actual);
737    }
738
739    #[test]
740    fn test_deserialize_json_array1_option_keyboard() {
741        let actual: [Option<key::keyboard::Key>; 1] =
742            serde_json::from_str(r#"[{"key_code": 4}]"#).unwrap();
743        let expected: [Option<key::keyboard::Key>; 1] = [Some(keyboard::Key::new(0x04))];
744        assert_eq!(expected, actual);
745    }
746
747    #[test]
748    fn test_deserialize_json_layered_key_keyboard_0layer() {
749        let actual_key: LayeredKey<key::keyboard::Key> =
750            serde_json::from_str(r#"{"base": {"key_code": 4}, "layered": []}"#).unwrap();
751        let expected_key: LayeredKey<key::keyboard::Key> =
752            LayeredKey::new(key::keyboard::Key::new(0x04), []);
753        assert_eq!(expected_key, actual_key);
754    }
755
756    #[test]
757    fn test_layer_state_array_active_layers() {
758        let mut layer_state: [bool; 5] = [false; 5];
759        layer_state.activate(1);
760        layer_state.activate(2);
761        layer_state.activate(4);
762        let actual_active_layers: Vec<LayerIndex> = layer_state.active_layers().collect();
763        let expected_active_layers: Vec<LayerIndex> = vec![4, 2, 1];
764
765        assert_eq!(expected_active_layers, actual_active_layers);
766    }
767}