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