riscv-etrace 0.10.0

Decoder and tracer for RISC-V efficient instruction tracing
Documentation
// Copyright (C) 2026 FZI Forschungszentrum Informatik
// SPDX-License-Identifier: Apache-2.0
//! Tests for ReturnStack for VecStack

use crate::types::stack::ReturnStack;
use crate::types::stack::StaticStack;

macro_rules! underflow_test {
    ($n:ident, $stack_type:ty) => {
        #[test]
        fn $n() {
            let mut s = <$stack_type>::new(2).unwrap();
            assert_eq!(s.pop(), None);
            assert_eq!(s.depth(), 0);

            s.push(10);
            s.pop();
            assert_eq!(s.pop(), None);
        }
    };
}

macro_rules! return_stack_implementation {
    ($n:ident, $stack_type:ty) => {
        #[test]
        fn $n() {
            let mut s = <$stack_type>::new(3).unwrap();
            s.push(1);
            s.push(2);
            s.push(3);
            assert_eq!(s.depth(), 3);
            assert_eq!(s.max_depth(), 3);

            s.push(4);
            assert_eq!(s.depth(), 3);
            assert_eq!(s.pop(), Some(4));
            assert_eq!(s.pop(), Some(3));
            assert_eq!(s.pop(), Some(2));
            assert_eq!(s.pop(), None);
        }
    };
}

underflow_test!(static_stack_under, StaticStack<2>);
return_stack_implementation!(static_implementation, StaticStack<3>);

#[cfg(feature = "alloc")]
mod box_stack_test {
    use super::*;
    use crate::types::stack::BoxStack;

    return_stack_implementation!(boxstack_implementation, BoxStack);
    underflow_test!(boxstack_stack_under, BoxStack);
    #[test]
    fn test_box_return_stack() {
        let mut box_stack = BoxStack::new(3).unwrap();
        assert!(box_stack.pop().is_none(), "Expected box to be empty");
        box_stack.push(10);
        box_stack.push(555);
        box_stack.push(10000);

        assert_eq!(box_stack.pop(), Some(10000));
        assert_eq!(box_stack.pop(), Some(555));

        box_stack.push(35);
        assert_eq!(box_stack.pop(), Some(35));
        assert_eq!(box_stack.pop(), Some(10));
        assert_eq!(box_stack.pop(), None);
        assert_eq!(box_stack.pop(), None);
    }

    #[test]
    fn test_boxstack_zero_size() {
        let box_stack = BoxStack::new(0);
        assert!(box_stack.is_none());
    }
}

#[cfg(feature = "alloc")]
mod vec_stack_test {
    use super::*;
    use crate::types::stack::VecStack;

    #[test]
    fn test_aliases_vec_return_stack() {
        let mut vec_stack = VecStack::new(4).unwrap();
        vec_stack.push(5);
        vec_stack.push(10);
        vec_stack.push(15);

        assert_eq!(vec_stack.pop(), Some(15));
        assert_eq!(vec_stack.max_depth(), 4)
    }

    #[test]
    fn test_vec_push_overflow() {
        let mut vec_stack = VecStack::new(3).unwrap();
        vec_stack.push_back(5);
        vec_stack.push_back(10);
        vec_stack.push_back(15);
        vec_stack.push_front(0);

        assert_eq!(vec_stack.pop_back(), Some(10));
        assert_eq!(vec_stack.pop_front(), Some(0));
        assert_eq!(vec_stack.depth(), 1);
        assert_eq!(vec_stack.pop_back(), Some(5));
        assert_eq!(vec_stack.pop_back(), None);
    }

    #[test]
    fn test_vec_stack_reusability() {
        let mut vec_stack = VecStack::new(2).unwrap();
        vec_stack.push(1);
        vec_stack.push(2);
        vec_stack.pop();
        vec_stack.pop();
        vec_stack.push(3);
        assert_eq!(vec_stack.pop(), Some(3));
        assert_eq!(vec_stack.depth(), 0)
    }

    #[test]
    fn test_vec_zero_cap() {
        let mut vec_stack = VecStack::new(0).unwrap();
        vec_stack.push(1);
        assert_eq!(vec_stack.depth(), 0);
        assert_eq!(vec_stack.pop(), None);
    }
}

#[test]
fn none_return_static() {
    let s = StaticStack::<2>::new(3);
    assert!(s.is_none());
}